mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-02 09:20:22 +08:00
Normalize canonical API formats
This commit is contained in:
@@ -549,7 +549,7 @@ async fn gateway_locally_denies_claude_messages_after_execution_runtime_miss_wit
|
||||
"/v1/messages",
|
||||
"claude",
|
||||
"chat",
|
||||
"claude:chat",
|
||||
"claude:messages",
|
||||
"{\"model\":\"claude-sonnet-4-5\",\"messages\":[]}",
|
||||
"请求缺少本地执行所需的认证、模型或配置上下文,无法选择上游提供商",
|
||||
)
|
||||
@@ -577,7 +577,7 @@ async fn gateway_locally_denies_claude_messages_stream_after_execution_runtime_m
|
||||
"/v1/messages",
|
||||
"claude",
|
||||
"chat",
|
||||
"claude:chat",
|
||||
"claude:messages",
|
||||
"{\"model\":\"claude-sonnet-4-5\",\"messages\":[],\"stream\":true}",
|
||||
"请求缺少本地执行所需的认证、模型或配置上下文,无法选择上游提供商",
|
||||
)
|
||||
@@ -619,7 +619,7 @@ async fn gateway_locally_denies_gemini_generate_after_execution_runtime_miss_wit
|
||||
"/v1beta/models/gemini-2.5-pro:generateContent",
|
||||
"gemini",
|
||||
"chat",
|
||||
"gemini:chat",
|
||||
"gemini:generate_content",
|
||||
"{\"contents\":[]}",
|
||||
"请求缺少本地执行所需的认证、模型或配置上下文,无法选择上游提供商",
|
||||
)
|
||||
@@ -633,7 +633,7 @@ async fn gateway_locally_denies_gemini_v1_generate_after_execution_runtime_miss_
|
||||
"/v1/models/gemini-2.5-pro:generateContent",
|
||||
"gemini",
|
||||
"chat",
|
||||
"gemini:chat",
|
||||
"gemini:generate_content",
|
||||
"{\"contents\":[]}",
|
||||
"请求缺少本地执行所需的认证、模型或配置上下文,无法选择上游提供商",
|
||||
)
|
||||
@@ -647,7 +647,7 @@ async fn gateway_locally_denies_gemini_stream_after_execution_runtime_miss_witho
|
||||
"/v1beta/models/gemini-2.5-pro:streamGenerateContent",
|
||||
"gemini",
|
||||
"chat",
|
||||
"gemini:chat",
|
||||
"gemini:generate_content",
|
||||
"{\"contents\":[]}",
|
||||
"请求缺少本地执行所需的认证、模型或配置上下文,无法选择上游提供商",
|
||||
)
|
||||
@@ -691,7 +691,7 @@ async fn gateway_locally_denies_gemini_files_root_after_execution_runtime_miss_w
|
||||
"/v1beta/files?view=BASIC",
|
||||
"gemini",
|
||||
"files",
|
||||
"gemini:chat",
|
||||
"gemini:generate_content",
|
||||
None,
|
||||
"当前 Gemini Files 请求无法在本地执行:没有匹配到可用的执行路径",
|
||||
)
|
||||
@@ -707,7 +707,7 @@ async fn gateway_locally_denies_gemini_files_download_after_execution_runtime_mi
|
||||
"/v1beta/files/file-123:download?alt=media",
|
||||
"gemini",
|
||||
"files",
|
||||
"gemini:chat",
|
||||
"gemini:generate_content",
|
||||
None,
|
||||
"当前 Gemini Files 请求无法在本地执行:没有匹配到可用的执行路径",
|
||||
)
|
||||
@@ -723,7 +723,7 @@ async fn gateway_locally_denies_gemini_files_upload_after_execution_runtime_miss
|
||||
"/upload/v1beta/files?uploadType=resumable",
|
||||
"gemini",
|
||||
"files",
|
||||
"gemini:chat",
|
||||
"gemini:generate_content",
|
||||
Some("{\"file\":{}}"),
|
||||
"当前 Gemini Files 请求无法在本地执行:没有匹配到可用的执行路径",
|
||||
)
|
||||
|
||||
@@ -573,7 +573,7 @@ async fn gateway_executes_openai_chat_cross_format_upstream_stream_via_local_fin
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-openai-chat-gemini-finalize-local-1".to_string(),
|
||||
endpoint_api_format: "gemini:chat".to_string(),
|
||||
endpoint_api_format: "gemini:generate_content".to_string(),
|
||||
endpoint_api_family: Some("gemini".to_string()),
|
||||
endpoint_kind: Some("chat".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -581,11 +581,11 @@ async fn gateway_executes_openai_chat_cross_format_upstream_stream_via_local_fin
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "api_key".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["gemini:chat".to_string()]),
|
||||
key_api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:chat": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
model_id: "model-openai-chat-gemini-finalize-local-1".to_string(),
|
||||
global_model_id: "global-model-openai-chat-gemini-finalize-local-1".to_string(),
|
||||
global_model_name: "gpt-5".to_string(),
|
||||
@@ -595,7 +595,7 @@ async fn gateway_executes_openai_chat_cross_format_upstream_stream_via_local_fin
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "gemini-2.5-pro-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["gemini:chat".to_string()]),
|
||||
api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -628,7 +628,7 @@ async fn gateway_executes_openai_chat_cross_format_upstream_stream_via_local_fin
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-openai-chat-gemini-finalize-local-1".to_string(),
|
||||
"provider-openai-chat-gemini-finalize-local-1".to_string(),
|
||||
"gemini:chat".to_string(),
|
||||
"gemini:generate_content".to_string(),
|
||||
Some("gemini".to_string()),
|
||||
Some("chat".to_string()),
|
||||
true,
|
||||
@@ -660,7 +660,7 @@ async fn gateway_executes_openai_chat_cross_format_upstream_stream_via_local_fin
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["gemini:chat"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
encrypt_python_fernet_plaintext(
|
||||
DEVELOPMENT_ENCRYPTION_KEY,
|
||||
"sk-upstream-openai-chat-gemini-finalize",
|
||||
@@ -668,7 +668,7 @@ async fn gateway_executes_openai_chat_cross_format_upstream_stream_via_local_fin
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"gemini:chat": 1})),
|
||||
Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
@@ -1009,7 +1009,7 @@ async fn gateway_executes_openai_chat_cross_format_tool_use_upstream_stream_via_
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-openai-chat-claude-tool-finalize-local-1".to_string(),
|
||||
endpoint_api_format: "claude:chat".to_string(),
|
||||
endpoint_api_format: "claude:messages".to_string(),
|
||||
endpoint_api_family: Some("claude".to_string()),
|
||||
endpoint_kind: Some("chat".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -1017,11 +1017,11 @@ async fn gateway_executes_openai_chat_cross_format_tool_use_upstream_stream_via_
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "api_key".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["claude:chat".to_string()]),
|
||||
key_api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:chat": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:messages": 1})),
|
||||
model_id: "model-openai-chat-claude-tool-finalize-local-1".to_string(),
|
||||
global_model_id: "global-model-openai-chat-claude-tool-finalize-local-1".to_string(),
|
||||
global_model_name: "gpt-5".to_string(),
|
||||
@@ -1031,7 +1031,7 @@ async fn gateway_executes_openai_chat_cross_format_tool_use_upstream_stream_via_
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "claude-sonnet-4-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["claude:chat".to_string()]),
|
||||
api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -1064,7 +1064,7 @@ async fn gateway_executes_openai_chat_cross_format_tool_use_upstream_stream_via_
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-openai-chat-claude-tool-finalize-local-1".to_string(),
|
||||
"provider-openai-chat-claude-tool-finalize-local-1".to_string(),
|
||||
"claude:chat".to_string(),
|
||||
"claude:messages".to_string(),
|
||||
Some("claude".to_string()),
|
||||
Some("chat".to_string()),
|
||||
true,
|
||||
@@ -1096,7 +1096,7 @@ async fn gateway_executes_openai_chat_cross_format_tool_use_upstream_stream_via_
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["claude:chat"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
encrypt_python_fernet_plaintext(
|
||||
DEVELOPMENT_ENCRYPTION_KEY,
|
||||
"sk-upstream-openai-chat-claude-tool-finalize",
|
||||
@@ -1104,7 +1104,7 @@ async fn gateway_executes_openai_chat_cross_format_tool_use_upstream_stream_via_
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"claude:chat": 1})),
|
||||
Some(serde_json::json!({"claude:messages": 1})),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
@@ -1462,19 +1462,19 @@ async fn gateway_skips_openai_chat_antigravity_cross_format_sync_candidate_as_tr
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-openai-chat-antigravity-finalize-local-1".to_string(),
|
||||
endpoint_api_format: "gemini:chat".to_string(),
|
||||
endpoint_api_format: "gemini:generate_content".to_string(),
|
||||
endpoint_api_family: Some("gemini".to_string()),
|
||||
endpoint_kind: Some("chat".to_string()),
|
||||
endpoint_is_active: true,
|
||||
key_id: "key-openai-chat-antigravity-finalize-local-1".to_string(),
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "api_key".to_string(),
|
||||
key_auth_type: "oauth".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["gemini:chat".to_string()]),
|
||||
key_api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:chat": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
model_id: "model-openai-chat-antigravity-finalize-local-1".to_string(),
|
||||
global_model_id: "global-model-openai-chat-antigravity-finalize-local-1".to_string(),
|
||||
global_model_name: "gpt-5".to_string(),
|
||||
@@ -1484,7 +1484,7 @@ async fn gateway_skips_openai_chat_antigravity_cross_format_sync_candidate_as_tr
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "claude-sonnet-4-5".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["gemini:chat".to_string()]),
|
||||
api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -1517,7 +1517,7 @@ async fn gateway_skips_openai_chat_antigravity_cross_format_sync_candidate_as_tr
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-openai-chat-antigravity-finalize-local-1".to_string(),
|
||||
"provider-openai-chat-antigravity-finalize-local-1".to_string(),
|
||||
"gemini:chat".to_string(),
|
||||
"gemini:generate_content".to_string(),
|
||||
Some("gemini".to_string()),
|
||||
Some("chat".to_string()),
|
||||
true,
|
||||
@@ -1541,13 +1541,13 @@ async fn gateway_skips_openai_chat_antigravity_cross_format_sync_candidate_as_tr
|
||||
"key-openai-chat-antigravity-finalize-local-1".to_string(),
|
||||
"provider-openai-chat-antigravity-finalize-local-1".to_string(),
|
||||
"prod".to_string(),
|
||||
"api_key".to_string(),
|
||||
"oauth".to_string(),
|
||||
None,
|
||||
true,
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["gemini:chat"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
encrypt_python_fernet_plaintext(
|
||||
DEVELOPMENT_ENCRYPTION_KEY,
|
||||
"sk-upstream-openai-chat-antigravity-finalize",
|
||||
@@ -1555,7 +1555,7 @@ async fn gateway_skips_openai_chat_antigravity_cross_format_sync_candidate_as_tr
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"gemini:chat": 1})),
|
||||
Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
@@ -1822,7 +1822,7 @@ async fn gateway_executes_openai_chat_cross_format_claude_upstream_sync_via_loca
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-openai-chat-claude-direct-sync-1".to_string(),
|
||||
endpoint_api_format: "claude:chat".to_string(),
|
||||
endpoint_api_format: "claude:messages".to_string(),
|
||||
endpoint_api_family: Some("claude".to_string()),
|
||||
endpoint_kind: Some("chat".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -1830,11 +1830,11 @@ async fn gateway_executes_openai_chat_cross_format_claude_upstream_sync_via_loca
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "api_key".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["claude:chat".to_string()]),
|
||||
key_api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:chat": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:messages": 1})),
|
||||
model_id: "model-openai-chat-claude-direct-sync-1".to_string(),
|
||||
global_model_id: "global-model-openai-chat-claude-direct-sync-1".to_string(),
|
||||
global_model_name: "gpt-5".to_string(),
|
||||
@@ -1844,7 +1844,7 @@ async fn gateway_executes_openai_chat_cross_format_claude_upstream_sync_via_loca
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "claude-sonnet-4-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["claude:chat".to_string()]),
|
||||
api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -1877,7 +1877,7 @@ async fn gateway_executes_openai_chat_cross_format_claude_upstream_sync_via_loca
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-openai-chat-claude-direct-sync-1".to_string(),
|
||||
"provider-openai-chat-claude-direct-sync-1".to_string(),
|
||||
"claude:chat".to_string(),
|
||||
"claude:messages".to_string(),
|
||||
Some("claude".to_string()),
|
||||
Some("chat".to_string()),
|
||||
true,
|
||||
@@ -1907,7 +1907,7 @@ async fn gateway_executes_openai_chat_cross_format_claude_upstream_sync_via_loca
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["claude:chat"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
encrypt_python_fernet_plaintext(
|
||||
DEVELOPMENT_ENCRYPTION_KEY,
|
||||
"sk-upstream-openai-chat-claude-direct-sync",
|
||||
@@ -1915,7 +1915,7 @@ async fn gateway_executes_openai_chat_cross_format_claude_upstream_sync_via_loca
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"claude:chat": 1})),
|
||||
Some(serde_json::json!({"claude:messages": 1})),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
@@ -2173,7 +2173,7 @@ async fn gateway_executes_openai_chat_cross_format_gemini_upstream_sync_via_loca
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-openai-chat-gemini-direct-sync-1".to_string(),
|
||||
endpoint_api_format: "gemini:chat".to_string(),
|
||||
endpoint_api_format: "gemini:generate_content".to_string(),
|
||||
endpoint_api_family: Some("gemini".to_string()),
|
||||
endpoint_kind: Some("chat".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -2181,11 +2181,11 @@ async fn gateway_executes_openai_chat_cross_format_gemini_upstream_sync_via_loca
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "api_key".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["gemini:chat".to_string()]),
|
||||
key_api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:chat": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
model_id: "model-openai-chat-gemini-direct-sync-1".to_string(),
|
||||
global_model_id: "global-model-openai-chat-gemini-direct-sync-1".to_string(),
|
||||
global_model_name: "gpt-5".to_string(),
|
||||
@@ -2195,7 +2195,7 @@ async fn gateway_executes_openai_chat_cross_format_gemini_upstream_sync_via_loca
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "gemini-2.5-pro-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["gemini:chat".to_string()]),
|
||||
api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -2228,7 +2228,7 @@ async fn gateway_executes_openai_chat_cross_format_gemini_upstream_sync_via_loca
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-openai-chat-gemini-direct-sync-1".to_string(),
|
||||
"provider-openai-chat-gemini-direct-sync-1".to_string(),
|
||||
"gemini:chat".to_string(),
|
||||
"gemini:generate_content".to_string(),
|
||||
Some("gemini".to_string()),
|
||||
Some("chat".to_string()),
|
||||
true,
|
||||
@@ -2258,7 +2258,7 @@ async fn gateway_executes_openai_chat_cross_format_gemini_upstream_sync_via_loca
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["gemini:chat"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
encrypt_python_fernet_plaintext(
|
||||
DEVELOPMENT_ENCRYPTION_KEY,
|
||||
"sk-upstream-openai-chat-gemini-direct-sync",
|
||||
@@ -2266,7 +2266,7 @@ async fn gateway_executes_openai_chat_cross_format_gemini_upstream_sync_via_loca
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"gemini:chat": 1})),
|
||||
Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
|
||||
@@ -82,7 +82,7 @@ async fn gateway_executes_openai_responses_cross_format_upstream_stream_via_loca
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-openai-cli-gemini-finalize-local-1".to_string(),
|
||||
endpoint_api_format: "gemini:cli".to_string(),
|
||||
endpoint_api_format: "gemini:generate_content".to_string(),
|
||||
endpoint_api_family: Some("gemini".to_string()),
|
||||
endpoint_kind: Some("cli".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -90,11 +90,11 @@ async fn gateway_executes_openai_responses_cross_format_upstream_stream_via_loca
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "bearer".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["gemini:cli".to_string()]),
|
||||
key_api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:cli": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
model_id: "model-openai-cli-gemini-finalize-local-1".to_string(),
|
||||
global_model_id: "global-model-openai-cli-gemini-finalize-local-1".to_string(),
|
||||
global_model_name: "gpt-5".to_string(),
|
||||
@@ -104,7 +104,7 @@ async fn gateway_executes_openai_responses_cross_format_upstream_stream_via_loca
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "gemini-2.5-pro-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["gemini:cli".to_string()]),
|
||||
api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -137,7 +137,7 @@ async fn gateway_executes_openai_responses_cross_format_upstream_stream_via_loca
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-openai-cli-gemini-finalize-local-1".to_string(),
|
||||
"provider-openai-cli-gemini-finalize-local-1".to_string(),
|
||||
"gemini:cli".to_string(),
|
||||
"gemini:generate_content".to_string(),
|
||||
Some("gemini".to_string()),
|
||||
Some("cli".to_string()),
|
||||
true,
|
||||
@@ -169,7 +169,7 @@ async fn gateway_executes_openai_responses_cross_format_upstream_stream_via_loca
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
encrypt_python_fernet_plaintext(
|
||||
DEVELOPMENT_ENCRYPTION_KEY,
|
||||
"sk-upstream-openai-cli-gemini-finalize",
|
||||
@@ -177,7 +177,7 @@ async fn gateway_executes_openai_responses_cross_format_upstream_stream_via_loca
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"gemini:cli": 1})),
|
||||
Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
@@ -540,7 +540,7 @@ async fn gateway_executes_openai_responses_cross_format_function_call_upstream_s
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-openai-cli-gemini-tool-finalize-local-1".to_string(),
|
||||
endpoint_api_format: "gemini:cli".to_string(),
|
||||
endpoint_api_format: "gemini:generate_content".to_string(),
|
||||
endpoint_api_family: Some("gemini".to_string()),
|
||||
endpoint_kind: Some("cli".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -548,11 +548,11 @@ async fn gateway_executes_openai_responses_cross_format_function_call_upstream_s
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "bearer".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["gemini:cli".to_string()]),
|
||||
key_api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:cli": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
model_id: "model-openai-cli-gemini-tool-finalize-local-1".to_string(),
|
||||
global_model_id: "global-model-openai-cli-gemini-tool-finalize-local-1".to_string(),
|
||||
global_model_name: "gpt-5".to_string(),
|
||||
@@ -562,7 +562,7 @@ async fn gateway_executes_openai_responses_cross_format_function_call_upstream_s
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "gemini-2.5-pro-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["gemini:cli".to_string()]),
|
||||
api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -595,7 +595,7 @@ async fn gateway_executes_openai_responses_cross_format_function_call_upstream_s
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-openai-cli-gemini-tool-finalize-local-1".to_string(),
|
||||
"provider-openai-cli-gemini-tool-finalize-local-1".to_string(),
|
||||
"gemini:cli".to_string(),
|
||||
"gemini:generate_content".to_string(),
|
||||
Some("gemini".to_string()),
|
||||
Some("cli".to_string()),
|
||||
true,
|
||||
@@ -627,7 +627,7 @@ async fn gateway_executes_openai_responses_cross_format_function_call_upstream_s
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
encrypt_python_fernet_plaintext(
|
||||
DEVELOPMENT_ENCRYPTION_KEY,
|
||||
"sk-upstream-openai-cli-gemini-tool-finalize",
|
||||
@@ -635,7 +635,7 @@ async fn gateway_executes_openai_responses_cross_format_function_call_upstream_s
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"gemini:cli": 1})),
|
||||
Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
@@ -1010,7 +1010,7 @@ async fn gateway_executes_openai_responses_antigravity_cross_format_upstream_str
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-openai-cli-antigravity-finalize-local-1".to_string(),
|
||||
endpoint_api_format: "gemini:cli".to_string(),
|
||||
endpoint_api_format: "gemini:generate_content".to_string(),
|
||||
endpoint_api_family: Some("gemini".to_string()),
|
||||
endpoint_kind: Some("cli".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -1018,11 +1018,11 @@ async fn gateway_executes_openai_responses_antigravity_cross_format_upstream_str
|
||||
key_name: "oauth".to_string(),
|
||||
key_auth_type: "oauth".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["gemini:cli".to_string()]),
|
||||
key_api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:cli": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
model_id: "model-openai-cli-antigravity-finalize-local-1".to_string(),
|
||||
global_model_id: "global-model-openai-cli-antigravity-finalize-local-1".to_string(),
|
||||
global_model_name: "gpt-5".to_string(),
|
||||
@@ -1032,7 +1032,7 @@ async fn gateway_executes_openai_responses_antigravity_cross_format_upstream_str
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "claude-sonnet-4-5".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["gemini:cli".to_string()]),
|
||||
api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -1065,7 +1065,7 @@ async fn gateway_executes_openai_responses_antigravity_cross_format_upstream_str
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-openai-cli-antigravity-finalize-local-1".to_string(),
|
||||
"provider-openai-cli-antigravity-finalize-local-1".to_string(),
|
||||
"gemini:cli".to_string(),
|
||||
"gemini:generate_content".to_string(),
|
||||
Some("gemini".to_string()),
|
||||
Some("cli".to_string()),
|
||||
true,
|
||||
@@ -1100,12 +1100,12 @@ async fn gateway_executes_openai_responses_antigravity_cross_format_upstream_str
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
encrypt_python_fernet_plaintext(DEVELOPMENT_ENCRYPTION_KEY, "__placeholder__")
|
||||
.expect("placeholder api key should encrypt"),
|
||||
Some(encrypted_auth_config),
|
||||
None,
|
||||
Some(serde_json::json!({"gemini:cli": 1})),
|
||||
Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
|
||||
@@ -556,7 +556,7 @@ async fn gateway_executes_kiro_claude_cli_sync_upstream_stream_via_local_finaliz
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["claude", "kiro"])),
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-sonnet-4"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -567,7 +567,7 @@ async fn gateway_executes_kiro_claude_cli_sync_upstream_stream_via_local_finaliz
|
||||
Some(5),
|
||||
Some(4_102_444_800),
|
||||
Some(serde_json::json!(["claude", "kiro"])),
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-sonnet-4"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -581,7 +581,7 @@ async fn gateway_executes_kiro_claude_cli_sync_upstream_stream_via_local_finaliz
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-kiro-cli-finalize-local-1".to_string(),
|
||||
endpoint_api_format: "claude:cli".to_string(),
|
||||
endpoint_api_format: "claude:messages".to_string(),
|
||||
endpoint_api_family: Some("claude".to_string()),
|
||||
endpoint_kind: Some("cli".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -589,11 +589,11 @@ async fn gateway_executes_kiro_claude_cli_sync_upstream_stream_via_local_finaliz
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "bearer".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["claude:cli".to_string()]),
|
||||
key_api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:cli": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:messages": 1})),
|
||||
model_id: "model-kiro-cli-finalize-local-1".to_string(),
|
||||
global_model_id: "global-model-kiro-cli-finalize-local-1".to_string(),
|
||||
global_model_name: "claude-sonnet-4".to_string(),
|
||||
@@ -603,7 +603,7 @@ async fn gateway_executes_kiro_claude_cli_sync_upstream_stream_via_local_finaliz
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "claude-sonnet-4-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["claude:cli".to_string()]),
|
||||
api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -636,7 +636,7 @@ async fn gateway_executes_kiro_claude_cli_sync_upstream_stream_via_local_finaliz
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-kiro-cli-finalize-local-1".to_string(),
|
||||
"provider-kiro-cli-finalize-local-1".to_string(),
|
||||
"claude:cli".to_string(),
|
||||
"claude:messages".to_string(),
|
||||
Some("claude".to_string()),
|
||||
Some("cli".to_string()),
|
||||
true,
|
||||
@@ -684,7 +684,7 @@ async fn gateway_executes_kiro_claude_cli_sync_upstream_stream_via_local_finaliz
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
encrypt_python_fernet_plaintext(DEVELOPMENT_ENCRYPTION_KEY, "__placeholder__")
|
||||
.expect("api key should encrypt"),
|
||||
Some(
|
||||
@@ -695,7 +695,7 @@ async fn gateway_executes_kiro_claude_cli_sync_upstream_stream_via_local_finaliz
|
||||
.expect("auth config should encrypt"),
|
||||
),
|
||||
None,
|
||||
Some(serde_json::json!({"claude:cli": 1})),
|
||||
Some(serde_json::json!({"claude:messages": 1})),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"enabled": true, "node_id":"proxy-node-kiro-cli-finalize-local"})),
|
||||
|
||||
@@ -51,7 +51,7 @@ async fn gateway_executes_claude_chat_sync_same_format_via_local_finalize_respon
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["claude"])),
|
||||
Some(serde_json::json!(["claude:chat"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-sonnet-4"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -62,7 +62,7 @@ async fn gateway_executes_claude_chat_sync_same_format_via_local_finalize_respon
|
||||
Some(5),
|
||||
Some(4_102_444_800_i64),
|
||||
Some(serde_json::json!(["claude"])),
|
||||
Some(serde_json::json!(["claude:chat"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-sonnet-4"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -76,7 +76,7 @@ async fn gateway_executes_claude_chat_sync_same_format_via_local_finalize_respon
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-claude-chat-finalize-local-1".to_string(),
|
||||
endpoint_api_format: "claude:chat".to_string(),
|
||||
endpoint_api_format: "claude:messages".to_string(),
|
||||
endpoint_api_family: Some("claude".to_string()),
|
||||
endpoint_kind: Some("chat".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -84,11 +84,11 @@ async fn gateway_executes_claude_chat_sync_same_format_via_local_finalize_respon
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "api_key".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["claude:chat".to_string()]),
|
||||
key_api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:chat": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:messages": 1})),
|
||||
model_id: "model-claude-chat-finalize-local-1".to_string(),
|
||||
global_model_id: "global-model-claude-chat-finalize-local-1".to_string(),
|
||||
global_model_name: "claude-sonnet-4".to_string(),
|
||||
@@ -98,7 +98,7 @@ async fn gateway_executes_claude_chat_sync_same_format_via_local_finalize_respon
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "claude-sonnet-4-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["claude:chat".to_string()]),
|
||||
api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -131,7 +131,7 @@ async fn gateway_executes_claude_chat_sync_same_format_via_local_finalize_respon
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-claude-chat-finalize-local-1".to_string(),
|
||||
"provider-claude-chat-finalize-local-1".to_string(),
|
||||
"claude:chat".to_string(),
|
||||
"claude:messages".to_string(),
|
||||
Some("claude".to_string()),
|
||||
Some("chat".to_string()),
|
||||
true,
|
||||
@@ -163,7 +163,7 @@ async fn gateway_executes_claude_chat_sync_same_format_via_local_finalize_respon
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["claude:chat"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
encrypt_python_fernet_plaintext(
|
||||
DEVELOPMENT_ENCRYPTION_KEY,
|
||||
"sk-upstream-claude-chat-finalize",
|
||||
@@ -171,7 +171,7 @@ async fn gateway_executes_claude_chat_sync_same_format_via_local_finalize_respon
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"claude:chat": 1})),
|
||||
Some(serde_json::json!({"claude:messages": 1})),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
@@ -499,7 +499,7 @@ async fn gateway_executes_claude_chat_sync_upstream_stream_via_local_finalize_re
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["claude"])),
|
||||
Some(serde_json::json!(["claude:chat"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-sonnet-4"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -510,7 +510,7 @@ async fn gateway_executes_claude_chat_sync_upstream_stream_via_local_finalize_re
|
||||
Some(5),
|
||||
Some(4_102_444_800_i64),
|
||||
Some(serde_json::json!(["claude"])),
|
||||
Some(serde_json::json!(["claude:chat"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-sonnet-4"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -524,7 +524,7 @@ async fn gateway_executes_claude_chat_sync_upstream_stream_via_local_finalize_re
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-claude-chat-stream-finalize-local-1".to_string(),
|
||||
endpoint_api_format: "claude:chat".to_string(),
|
||||
endpoint_api_format: "claude:messages".to_string(),
|
||||
endpoint_api_family: Some("claude".to_string()),
|
||||
endpoint_kind: Some("chat".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -532,11 +532,11 @@ async fn gateway_executes_claude_chat_sync_upstream_stream_via_local_finalize_re
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "api_key".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["claude:chat".to_string()]),
|
||||
key_api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:chat": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:messages": 1})),
|
||||
model_id: "model-claude-chat-stream-finalize-local-1".to_string(),
|
||||
global_model_id: "global-model-claude-chat-stream-finalize-local-1".to_string(),
|
||||
global_model_name: "claude-sonnet-4".to_string(),
|
||||
@@ -546,7 +546,7 @@ async fn gateway_executes_claude_chat_sync_upstream_stream_via_local_finalize_re
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "claude-sonnet-4-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["claude:chat".to_string()]),
|
||||
api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -579,7 +579,7 @@ async fn gateway_executes_claude_chat_sync_upstream_stream_via_local_finalize_re
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-claude-chat-stream-finalize-local-1".to_string(),
|
||||
"provider-claude-chat-stream-finalize-local-1".to_string(),
|
||||
"claude:chat".to_string(),
|
||||
"claude:messages".to_string(),
|
||||
Some("claude".to_string()),
|
||||
Some("chat".to_string()),
|
||||
true,
|
||||
@@ -611,7 +611,7 @@ async fn gateway_executes_claude_chat_sync_upstream_stream_via_local_finalize_re
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["claude:chat"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
encrypt_python_fernet_plaintext(
|
||||
DEVELOPMENT_ENCRYPTION_KEY,
|
||||
"sk-upstream-claude-chat-stream-finalize",
|
||||
@@ -619,7 +619,7 @@ async fn gateway_executes_claude_chat_sync_upstream_stream_via_local_finalize_re
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"claude:chat": 1})),
|
||||
Some(serde_json::json!({"claude:messages": 1})),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
@@ -952,7 +952,7 @@ async fn gateway_executes_claude_cli_sync_upstream_stream_via_local_finalize_res
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["claude"])),
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-code"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -963,7 +963,7 @@ async fn gateway_executes_claude_cli_sync_upstream_stream_via_local_finalize_res
|
||||
Some(5),
|
||||
Some(4_102_444_800_i64),
|
||||
Some(serde_json::json!(["claude"])),
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-code"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -977,7 +977,7 @@ async fn gateway_executes_claude_cli_sync_upstream_stream_via_local_finalize_res
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-claude-cli-finalize-local-1".to_string(),
|
||||
endpoint_api_format: "claude:cli".to_string(),
|
||||
endpoint_api_format: "claude:messages".to_string(),
|
||||
endpoint_api_family: Some("claude".to_string()),
|
||||
endpoint_kind: Some("cli".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -985,11 +985,11 @@ async fn gateway_executes_claude_cli_sync_upstream_stream_via_local_finalize_res
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "bearer".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["claude:cli".to_string()]),
|
||||
key_api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:cli": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:messages": 1})),
|
||||
model_id: "model-claude-cli-finalize-local-1".to_string(),
|
||||
global_model_id: "global-model-claude-cli-finalize-local-1".to_string(),
|
||||
global_model_name: "claude-code".to_string(),
|
||||
@@ -999,7 +999,7 @@ async fn gateway_executes_claude_cli_sync_upstream_stream_via_local_finalize_res
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "claude-code-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["claude:cli".to_string()]),
|
||||
api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -1032,7 +1032,7 @@ async fn gateway_executes_claude_cli_sync_upstream_stream_via_local_finalize_res
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-claude-cli-finalize-local-1".to_string(),
|
||||
"provider-claude-cli-finalize-local-1".to_string(),
|
||||
"claude:cli".to_string(),
|
||||
"claude:messages".to_string(),
|
||||
Some("claude".to_string()),
|
||||
Some("cli".to_string()),
|
||||
true,
|
||||
@@ -1064,7 +1064,7 @@ async fn gateway_executes_claude_cli_sync_upstream_stream_via_local_finalize_res
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
encrypt_python_fernet_plaintext(
|
||||
DEVELOPMENT_ENCRYPTION_KEY,
|
||||
"sk-upstream-claude-cli-finalize",
|
||||
@@ -1072,7 +1072,7 @@ async fn gateway_executes_claude_cli_sync_upstream_stream_via_local_finalize_res
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"claude:cli": 1})),
|
||||
Some(serde_json::json!({"claude:messages": 1})),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
|
||||
@@ -56,7 +56,7 @@ async fn gateway_executes_gemini_chat_sync_same_format_via_local_finalize_respon
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["gemini"])),
|
||||
Some(serde_json::json!(["gemini:chat"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
Some(serde_json::json!(["gemini-2.5-pro"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -67,7 +67,7 @@ async fn gateway_executes_gemini_chat_sync_same_format_via_local_finalize_respon
|
||||
Some(5),
|
||||
Some(4_102_444_800_i64),
|
||||
Some(serde_json::json!(["gemini"])),
|
||||
Some(serde_json::json!(["gemini:chat"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
Some(serde_json::json!(["gemini-2.5-pro"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -81,7 +81,7 @@ async fn gateway_executes_gemini_chat_sync_same_format_via_local_finalize_respon
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-gemini-chat-finalize-local-1".to_string(),
|
||||
endpoint_api_format: "gemini:chat".to_string(),
|
||||
endpoint_api_format: "gemini:generate_content".to_string(),
|
||||
endpoint_api_family: Some("gemini".to_string()),
|
||||
endpoint_kind: Some("chat".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -89,11 +89,11 @@ async fn gateway_executes_gemini_chat_sync_same_format_via_local_finalize_respon
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "api_key".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["gemini:chat".to_string()]),
|
||||
key_api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:chat": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
model_id: "model-gemini-chat-finalize-local-1".to_string(),
|
||||
global_model_id: "global-model-gemini-chat-finalize-local-1".to_string(),
|
||||
global_model_name: "gemini-2.5-pro".to_string(),
|
||||
@@ -103,7 +103,7 @@ async fn gateway_executes_gemini_chat_sync_same_format_via_local_finalize_respon
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "gemini-2.5-pro-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["gemini:chat".to_string()]),
|
||||
api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -136,7 +136,7 @@ async fn gateway_executes_gemini_chat_sync_same_format_via_local_finalize_respon
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-gemini-chat-finalize-local-1".to_string(),
|
||||
"provider-gemini-chat-finalize-local-1".to_string(),
|
||||
"gemini:chat".to_string(),
|
||||
"gemini:generate_content".to_string(),
|
||||
Some("gemini".to_string()),
|
||||
Some("chat".to_string()),
|
||||
true,
|
||||
@@ -172,7 +172,7 @@ async fn gateway_executes_gemini_chat_sync_same_format_via_local_finalize_respon
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["gemini:chat"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
encrypt_python_fernet_plaintext(
|
||||
DEVELOPMENT_ENCRYPTION_KEY,
|
||||
"sk-upstream-gemini-chat-finalize",
|
||||
@@ -180,7 +180,7 @@ async fn gateway_executes_gemini_chat_sync_same_format_via_local_finalize_respon
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"gemini:chat": 1})),
|
||||
Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
@@ -552,7 +552,7 @@ async fn gateway_executes_gemini_chat_sync_upstream_stream_via_local_finalize_re
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["gemini"])),
|
||||
Some(serde_json::json!(["gemini:chat"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
Some(serde_json::json!(["gemini-2.5-pro"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -563,7 +563,7 @@ async fn gateway_executes_gemini_chat_sync_upstream_stream_via_local_finalize_re
|
||||
Some(5),
|
||||
Some(4_102_444_800_i64),
|
||||
Some(serde_json::json!(["gemini"])),
|
||||
Some(serde_json::json!(["gemini:chat"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
Some(serde_json::json!(["gemini-2.5-pro"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -577,7 +577,7 @@ async fn gateway_executes_gemini_chat_sync_upstream_stream_via_local_finalize_re
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-gemini-chat-stream-finalize-local-1".to_string(),
|
||||
endpoint_api_format: "gemini:chat".to_string(),
|
||||
endpoint_api_format: "gemini:generate_content".to_string(),
|
||||
endpoint_api_family: Some("gemini".to_string()),
|
||||
endpoint_kind: Some("chat".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -585,11 +585,11 @@ async fn gateway_executes_gemini_chat_sync_upstream_stream_via_local_finalize_re
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "api_key".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["gemini:chat".to_string()]),
|
||||
key_api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:chat": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
model_id: "model-gemini-chat-stream-finalize-local-1".to_string(),
|
||||
global_model_id: "global-model-gemini-chat-stream-finalize-local-1".to_string(),
|
||||
global_model_name: "gemini-2.5-pro".to_string(),
|
||||
@@ -599,7 +599,7 @@ async fn gateway_executes_gemini_chat_sync_upstream_stream_via_local_finalize_re
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "gemini-2.5-pro-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["gemini:chat".to_string()]),
|
||||
api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -632,7 +632,7 @@ async fn gateway_executes_gemini_chat_sync_upstream_stream_via_local_finalize_re
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-gemini-chat-stream-finalize-local-1".to_string(),
|
||||
"provider-gemini-chat-stream-finalize-local-1".to_string(),
|
||||
"gemini:chat".to_string(),
|
||||
"gemini:generate_content".to_string(),
|
||||
Some("gemini".to_string()),
|
||||
Some("chat".to_string()),
|
||||
true,
|
||||
@@ -668,7 +668,7 @@ async fn gateway_executes_gemini_chat_sync_upstream_stream_via_local_finalize_re
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["gemini:chat"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
encrypt_python_fernet_plaintext(
|
||||
DEVELOPMENT_ENCRYPTION_KEY,
|
||||
"sk-upstream-gemini-chat-stream-finalize",
|
||||
@@ -676,7 +676,7 @@ async fn gateway_executes_gemini_chat_sync_upstream_stream_via_local_finalize_re
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"gemini:chat": 1})),
|
||||
Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
@@ -1038,7 +1038,7 @@ async fn gateway_executes_gemini_cli_sync_upstream_stream_via_local_finalize_res
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["gemini"])),
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
Some(serde_json::json!(["gemini-cli"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -1049,7 +1049,7 @@ async fn gateway_executes_gemini_cli_sync_upstream_stream_via_local_finalize_res
|
||||
Some(5),
|
||||
Some(4_102_444_800_i64),
|
||||
Some(serde_json::json!(["gemini"])),
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
Some(serde_json::json!(["gemini-cli"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -1063,7 +1063,7 @@ async fn gateway_executes_gemini_cli_sync_upstream_stream_via_local_finalize_res
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-gemini-cli-finalize-local-1".to_string(),
|
||||
endpoint_api_format: "gemini:cli".to_string(),
|
||||
endpoint_api_format: "gemini:generate_content".to_string(),
|
||||
endpoint_api_family: Some("gemini".to_string()),
|
||||
endpoint_kind: Some("cli".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -1071,11 +1071,11 @@ async fn gateway_executes_gemini_cli_sync_upstream_stream_via_local_finalize_res
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "bearer".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["gemini:cli".to_string()]),
|
||||
key_api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:cli": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
model_id: "model-gemini-cli-finalize-local-1".to_string(),
|
||||
global_model_id: "global-model-gemini-cli-finalize-local-1".to_string(),
|
||||
global_model_name: "gemini-cli".to_string(),
|
||||
@@ -1085,7 +1085,7 @@ async fn gateway_executes_gemini_cli_sync_upstream_stream_via_local_finalize_res
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "gemini-cli-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["gemini:cli".to_string()]),
|
||||
api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -1118,7 +1118,7 @@ async fn gateway_executes_gemini_cli_sync_upstream_stream_via_local_finalize_res
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-gemini-cli-finalize-local-1".to_string(),
|
||||
"provider-gemini-cli-finalize-local-1".to_string(),
|
||||
"gemini:cli".to_string(),
|
||||
"gemini:generate_content".to_string(),
|
||||
Some("gemini".to_string()),
|
||||
Some("cli".to_string()),
|
||||
true,
|
||||
@@ -1154,7 +1154,7 @@ async fn gateway_executes_gemini_cli_sync_upstream_stream_via_local_finalize_res
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
encrypt_python_fernet_plaintext(
|
||||
DEVELOPMENT_ENCRYPTION_KEY,
|
||||
"sk-upstream-gemini-cli-finalize",
|
||||
@@ -1162,7 +1162,7 @@ async fn gateway_executes_gemini_cli_sync_upstream_stream_via_local_finalize_res
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"gemini:cli": 1})),
|
||||
Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
@@ -1538,7 +1538,7 @@ async fn gateway_executes_antigravity_gemini_cli_sync_upstream_stream_via_local_
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["gemini", "antigravity"])),
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
Some(serde_json::json!(["gemini-cli"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -1549,7 +1549,7 @@ async fn gateway_executes_antigravity_gemini_cli_sync_upstream_stream_via_local_
|
||||
Some(5),
|
||||
Some(4_102_444_800_i64),
|
||||
Some(serde_json::json!(["gemini", "antigravity"])),
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
Some(serde_json::json!(["gemini-cli"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -1563,7 +1563,7 @@ async fn gateway_executes_antigravity_gemini_cli_sync_upstream_stream_via_local_
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-antigravity-cli-finalize-local-1".to_string(),
|
||||
endpoint_api_format: "gemini:cli".to_string(),
|
||||
endpoint_api_format: "gemini:generate_content".to_string(),
|
||||
endpoint_api_family: Some("gemini".to_string()),
|
||||
endpoint_kind: Some("cli".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -1571,11 +1571,11 @@ async fn gateway_executes_antigravity_gemini_cli_sync_upstream_stream_via_local_
|
||||
key_name: "oauth".to_string(),
|
||||
key_auth_type: "oauth".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["gemini:cli".to_string()]),
|
||||
key_api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:cli": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
model_id: "model-antigravity-cli-finalize-local-1".to_string(),
|
||||
global_model_id: "global-model-antigravity-cli-finalize-local-1".to_string(),
|
||||
global_model_name: "gemini-cli".to_string(),
|
||||
@@ -1585,7 +1585,7 @@ async fn gateway_executes_antigravity_gemini_cli_sync_upstream_stream_via_local_
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "claude-sonnet-4-5".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["gemini:cli".to_string()]),
|
||||
api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -1618,7 +1618,7 @@ async fn gateway_executes_antigravity_gemini_cli_sync_upstream_stream_via_local_
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-antigravity-cli-finalize-local-1".to_string(),
|
||||
"provider-antigravity-cli-finalize-local-1".to_string(),
|
||||
"gemini:cli".to_string(),
|
||||
"gemini:generate_content".to_string(),
|
||||
Some("gemini".to_string()),
|
||||
Some("cli".to_string()),
|
||||
true,
|
||||
@@ -1653,12 +1653,12 @@ async fn gateway_executes_antigravity_gemini_cli_sync_upstream_stream_via_local_
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
encrypt_python_fernet_plaintext(DEVELOPMENT_ENCRYPTION_KEY, "__placeholder__")
|
||||
.expect("placeholder api key should encrypt"),
|
||||
Some(encrypted_auth_config),
|
||||
None,
|
||||
Some(serde_json::json!({"gemini:cli": 1})),
|
||||
Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
|
||||
@@ -505,7 +505,7 @@ async fn gateway_executes_openai_chat_stream_via_local_openai_responses_cross_fo
|
||||
endpoint_is_active: true,
|
||||
key_id: "key-openai-chat-cli-local-1".to_string(),
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "api_key".to_string(),
|
||||
key_auth_type: "oauth".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["openai:responses".to_string()]),
|
||||
key_allowed_models: None,
|
||||
@@ -578,7 +578,7 @@ async fn gateway_executes_openai_chat_stream_via_local_openai_responses_cross_fo
|
||||
"key-openai-chat-cli-local-1".to_string(),
|
||||
"provider-openai-chat-cli-local-1".to_string(),
|
||||
"prod".to_string(),
|
||||
"api_key".to_string(),
|
||||
"oauth".to_string(),
|
||||
None,
|
||||
true,
|
||||
)
|
||||
|
||||
@@ -101,7 +101,7 @@ async fn gateway_executes_kiro_claude_cli_stream_via_local_provider_catalog_cand
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["claude", "kiro"])),
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-sonnet-4"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -112,7 +112,7 @@ async fn gateway_executes_kiro_claude_cli_stream_via_local_provider_catalog_cand
|
||||
Some(5),
|
||||
Some(4_102_444_800),
|
||||
Some(serde_json::json!(["claude", "kiro"])),
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-sonnet-4"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -126,7 +126,7 @@ async fn gateway_executes_kiro_claude_cli_stream_via_local_provider_catalog_cand
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-kiro-cli-local-stream-1".to_string(),
|
||||
endpoint_api_format: "claude:cli".to_string(),
|
||||
endpoint_api_format: "claude:messages".to_string(),
|
||||
endpoint_api_family: Some("claude".to_string()),
|
||||
endpoint_kind: Some("cli".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -134,11 +134,11 @@ async fn gateway_executes_kiro_claude_cli_stream_via_local_provider_catalog_cand
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "bearer".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["claude:cli".to_string()]),
|
||||
key_api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:cli": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:messages": 1})),
|
||||
model_id: "model-kiro-cli-local-stream-1".to_string(),
|
||||
global_model_id: "global-model-kiro-cli-local-stream-1".to_string(),
|
||||
global_model_name: "claude-sonnet-4".to_string(),
|
||||
@@ -148,7 +148,7 @@ async fn gateway_executes_kiro_claude_cli_stream_via_local_provider_catalog_cand
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "claude-sonnet-4-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["claude:cli".to_string()]),
|
||||
api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -181,7 +181,7 @@ async fn gateway_executes_kiro_claude_cli_stream_via_local_provider_catalog_cand
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-kiro-cli-local-stream-1".to_string(),
|
||||
"provider-kiro-cli-local-stream-1".to_string(),
|
||||
"claude:cli".to_string(),
|
||||
"claude:messages".to_string(),
|
||||
Some("claude".to_string()),
|
||||
Some("cli".to_string()),
|
||||
true,
|
||||
@@ -228,7 +228,7 @@ async fn gateway_executes_kiro_claude_cli_stream_via_local_provider_catalog_cand
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
encrypt_python_fernet_plaintext(DEVELOPMENT_ENCRYPTION_KEY, "__placeholder__")
|
||||
.expect("api key should encrypt"),
|
||||
Some(
|
||||
@@ -239,7 +239,7 @@ async fn gateway_executes_kiro_claude_cli_stream_via_local_provider_catalog_cand
|
||||
.expect("auth config should encrypt"),
|
||||
),
|
||||
None,
|
||||
Some(serde_json::json!({"claude:cli": 1})),
|
||||
Some(serde_json::json!({"claude:messages": 1})),
|
||||
None,
|
||||
None,
|
||||
Some(
|
||||
@@ -270,7 +270,7 @@ async fn gateway_executes_kiro_claude_cli_stream_via_local_provider_catalog_cand
|
||||
"route_class": "ai_public",
|
||||
"route_family": "claude",
|
||||
"route_kind": "cli",
|
||||
"auth_endpoint_signature": "claude:cli",
|
||||
"auth_endpoint_signature": "claude:messages",
|
||||
"execution_runtime_candidate": true,
|
||||
"auth_context": {
|
||||
"user_id": "user-kiro-cli-local-stream-123",
|
||||
@@ -606,7 +606,7 @@ async fn gateway_executes_claude_cli_stream_via_local_decision_gate_without_wait
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["claude"])),
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-code"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -617,7 +617,7 @@ async fn gateway_executes_claude_cli_stream_via_local_decision_gate_without_wait
|
||||
Some(5),
|
||||
Some(4_102_444_800),
|
||||
Some(serde_json::json!(["claude"])),
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-code"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -631,7 +631,7 @@ async fn gateway_executes_claude_cli_stream_via_local_decision_gate_without_wait
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-claude-cli-local-1".to_string(),
|
||||
endpoint_api_format: "claude:cli".to_string(),
|
||||
endpoint_api_format: "claude:messages".to_string(),
|
||||
endpoint_api_family: Some("claude".to_string()),
|
||||
endpoint_kind: Some("cli".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -639,11 +639,11 @@ async fn gateway_executes_claude_cli_stream_via_local_decision_gate_without_wait
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "bearer".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["claude:cli".to_string()]),
|
||||
key_api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:cli": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:messages": 1})),
|
||||
model_id: "model-claude-cli-local-1".to_string(),
|
||||
global_model_id: "global-model-claude-cli-local-1".to_string(),
|
||||
global_model_name: "claude-code".to_string(),
|
||||
@@ -653,7 +653,7 @@ async fn gateway_executes_claude_cli_stream_via_local_decision_gate_without_wait
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "claude-code-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["claude:cli".to_string()]),
|
||||
api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -686,7 +686,7 @@ async fn gateway_executes_claude_cli_stream_via_local_decision_gate_without_wait
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-claude-cli-local-1".to_string(),
|
||||
"provider-claude-cli-local-1".to_string(),
|
||||
"claude:cli".to_string(),
|
||||
"claude:messages".to_string(),
|
||||
Some("claude".to_string()),
|
||||
Some("cli".to_string()),
|
||||
true,
|
||||
@@ -721,12 +721,12 @@ async fn gateway_executes_claude_cli_stream_via_local_decision_gate_without_wait
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
encrypt_python_fernet_plaintext(DEVELOPMENT_ENCRYPTION_KEY, "sk-upstream-claude-cli")
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"claude:cli": 1})),
|
||||
Some(serde_json::json!({"claude:messages": 1})),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"enabled": true, "node_id":"proxy-node-claude-cli-local"})),
|
||||
@@ -1055,7 +1055,7 @@ async fn gateway_executes_claude_code_cli_stream_via_local_decision_gate_with_lo
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["claude", "claude_code"])),
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-code"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -1066,7 +1066,7 @@ async fn gateway_executes_claude_code_cli_stream_via_local_decision_gate_with_lo
|
||||
Some(5),
|
||||
Some(4_102_444_800),
|
||||
Some(serde_json::json!(["claude", "claude_code"])),
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-code"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -1080,7 +1080,7 @@ async fn gateway_executes_claude_code_cli_stream_via_local_decision_gate_with_lo
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-claude-code-cli-local-1".to_string(),
|
||||
endpoint_api_format: "claude:cli".to_string(),
|
||||
endpoint_api_format: "claude:messages".to_string(),
|
||||
endpoint_api_family: Some("claude".to_string()),
|
||||
endpoint_kind: Some("cli".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -1088,11 +1088,11 @@ async fn gateway_executes_claude_code_cli_stream_via_local_decision_gate_with_lo
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "oauth".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["claude:cli".to_string()]),
|
||||
key_api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:cli": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:messages": 1})),
|
||||
model_id: "model-claude-code-cli-local-1".to_string(),
|
||||
global_model_id: "global-model-claude-code-cli-local-1".to_string(),
|
||||
global_model_name: "claude-code".to_string(),
|
||||
@@ -1102,7 +1102,7 @@ async fn gateway_executes_claude_code_cli_stream_via_local_decision_gate_with_lo
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "claude-code-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["claude:cli".to_string()]),
|
||||
api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -1139,7 +1139,7 @@ async fn gateway_executes_claude_code_cli_stream_via_local_decision_gate_with_lo
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-claude-code-cli-local-1".to_string(),
|
||||
"provider-claude-code-cli-local-1".to_string(),
|
||||
"claude:cli".to_string(),
|
||||
"claude:messages".to_string(),
|
||||
Some("claude".to_string()),
|
||||
Some("cli".to_string()),
|
||||
true,
|
||||
@@ -1174,7 +1174,7 @@ async fn gateway_executes_claude_code_cli_stream_via_local_decision_gate_with_lo
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
encrypt_python_fernet_plaintext(
|
||||
DEVELOPMENT_ENCRYPTION_KEY,
|
||||
"sk-upstream-claude-code-oauth",
|
||||
@@ -1182,7 +1182,7 @@ async fn gateway_executes_claude_code_cli_stream_via_local_decision_gate_with_lo
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"claude:cli": 1})),
|
||||
Some(serde_json::json!({"claude:messages": 1})),
|
||||
None,
|
||||
None,
|
||||
Some(
|
||||
@@ -1575,7 +1575,7 @@ async fn gateway_executes_claude_chat_stream_via_local_decision_gate_with_local_
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["claude"])),
|
||||
Some(serde_json::json!(["claude:chat"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-sonnet-4-5"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -1586,7 +1586,7 @@ async fn gateway_executes_claude_chat_stream_via_local_decision_gate_with_local_
|
||||
Some(5),
|
||||
Some(4_102_444_800),
|
||||
Some(serde_json::json!(["claude"])),
|
||||
Some(serde_json::json!(["claude:chat"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-sonnet-4-5"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -1600,7 +1600,7 @@ async fn gateway_executes_claude_chat_stream_via_local_decision_gate_with_local_
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-claude-chat-local-stream-1".to_string(),
|
||||
endpoint_api_format: "claude:chat".to_string(),
|
||||
endpoint_api_format: "claude:messages".to_string(),
|
||||
endpoint_api_family: Some("claude".to_string()),
|
||||
endpoint_kind: Some("chat".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -1608,11 +1608,11 @@ async fn gateway_executes_claude_chat_stream_via_local_decision_gate_with_local_
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "api_key".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["claude:chat".to_string()]),
|
||||
key_api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:chat": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:messages": 1})),
|
||||
model_id: "model-claude-chat-local-stream-1".to_string(),
|
||||
global_model_id: "global-model-claude-chat-local-stream-1".to_string(),
|
||||
global_model_name: "claude-sonnet-4-5".to_string(),
|
||||
@@ -1622,7 +1622,7 @@ async fn gateway_executes_claude_chat_stream_via_local_decision_gate_with_local_
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "claude-sonnet-4-5-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["claude:chat".to_string()]),
|
||||
api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -1655,7 +1655,7 @@ async fn gateway_executes_claude_chat_stream_via_local_decision_gate_with_local_
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-claude-chat-local-stream-1".to_string(),
|
||||
"provider-claude-chat-local-stream-1".to_string(),
|
||||
"claude:chat".to_string(),
|
||||
"claude:messages".to_string(),
|
||||
Some("claude".to_string()),
|
||||
Some("chat".to_string()),
|
||||
true,
|
||||
@@ -1690,7 +1690,7 @@ async fn gateway_executes_claude_chat_stream_via_local_decision_gate_with_local_
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["claude:chat"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
encrypt_python_fernet_plaintext(
|
||||
DEVELOPMENT_ENCRYPTION_KEY,
|
||||
"sk-upstream-claude-chat-stream",
|
||||
@@ -1698,7 +1698,7 @@ async fn gateway_executes_claude_chat_stream_via_local_decision_gate_with_local_
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"claude:chat": 1})),
|
||||
Some(serde_json::json!({"claude:messages": 1})),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"enabled": true, "node_id":"proxy-node-claude-chat-stream"})),
|
||||
|
||||
@@ -44,7 +44,7 @@ async fn gateway_executes_gemini_chat_stream_via_local_decision_gate_with_local_
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["gemini"])),
|
||||
Some(serde_json::json!(["gemini:chat"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
Some(serde_json::json!(["gemini-2.5-pro"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -55,7 +55,7 @@ async fn gateway_executes_gemini_chat_stream_via_local_decision_gate_with_local_
|
||||
Some(5),
|
||||
Some(4_102_444_800),
|
||||
Some(serde_json::json!(["gemini"])),
|
||||
Some(serde_json::json!(["gemini:chat"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
Some(serde_json::json!(["gemini-2.5-pro"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -69,7 +69,7 @@ async fn gateway_executes_gemini_chat_stream_via_local_decision_gate_with_local_
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-gemini-chat-local-stream-1".to_string(),
|
||||
endpoint_api_format: "gemini:chat".to_string(),
|
||||
endpoint_api_format: "gemini:generate_content".to_string(),
|
||||
endpoint_api_family: Some("gemini".to_string()),
|
||||
endpoint_kind: Some("chat".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -77,11 +77,11 @@ async fn gateway_executes_gemini_chat_stream_via_local_decision_gate_with_local_
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "api_key".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["gemini:chat".to_string()]),
|
||||
key_api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:chat": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
model_id: "model-gemini-chat-local-stream-1".to_string(),
|
||||
global_model_id: "global-model-gemini-chat-local-stream-1".to_string(),
|
||||
global_model_name: "gemini-2.5-pro".to_string(),
|
||||
@@ -91,7 +91,7 @@ async fn gateway_executes_gemini_chat_stream_via_local_decision_gate_with_local_
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "gemini-2.5-pro-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["gemini:chat".to_string()]),
|
||||
api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -124,7 +124,7 @@ async fn gateway_executes_gemini_chat_stream_via_local_decision_gate_with_local_
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-gemini-chat-local-stream-1".to_string(),
|
||||
"provider-gemini-chat-local-stream-1".to_string(),
|
||||
"gemini:chat".to_string(),
|
||||
"gemini:generate_content".to_string(),
|
||||
Some("gemini".to_string()),
|
||||
Some("chat".to_string()),
|
||||
true,
|
||||
@@ -160,7 +160,7 @@ async fn gateway_executes_gemini_chat_stream_via_local_decision_gate_with_local_
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["gemini:chat"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
encrypt_python_fernet_plaintext(
|
||||
DEVELOPMENT_ENCRYPTION_KEY,
|
||||
"sk-upstream-gemini-chat-stream",
|
||||
@@ -168,7 +168,7 @@ async fn gateway_executes_gemini_chat_stream_via_local_decision_gate_with_local_
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"gemini:chat": 1})),
|
||||
Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"enabled": true, "node_id":"proxy-node-gemini-chat-stream"})),
|
||||
@@ -198,7 +198,7 @@ async fn gateway_executes_gemini_chat_stream_via_local_decision_gate_with_local_
|
||||
"route_class": "ai_public",
|
||||
"route_family": "gemini",
|
||||
"route_kind": "chat",
|
||||
"auth_endpoint_signature": "gemini:chat",
|
||||
"auth_endpoint_signature": "gemini:generate_content",
|
||||
"execution_runtime_candidate": true,
|
||||
"auth_context": {
|
||||
"user_id": "user-gemini-chat-local-stream-1",
|
||||
|
||||
@@ -44,7 +44,7 @@ async fn gateway_executes_gemini_cli_stream_via_local_decision_gate_with_local_s
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["gemini"])),
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
Some(serde_json::json!(["gemini-cli"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -55,7 +55,7 @@ async fn gateway_executes_gemini_cli_stream_via_local_decision_gate_with_local_s
|
||||
Some(5),
|
||||
Some(4_102_444_800),
|
||||
Some(serde_json::json!(["gemini"])),
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
Some(serde_json::json!(["gemini-cli"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -69,7 +69,7 @@ async fn gateway_executes_gemini_cli_stream_via_local_decision_gate_with_local_s
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-gemini-cli-local-1".to_string(),
|
||||
endpoint_api_format: "gemini:cli".to_string(),
|
||||
endpoint_api_format: "gemini:generate_content".to_string(),
|
||||
endpoint_api_family: Some("gemini".to_string()),
|
||||
endpoint_kind: Some("cli".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -77,11 +77,11 @@ async fn gateway_executes_gemini_cli_stream_via_local_decision_gate_with_local_s
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "bearer".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["gemini:cli".to_string()]),
|
||||
key_api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:cli": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
model_id: "model-gemini-cli-local-1".to_string(),
|
||||
global_model_id: "global-model-gemini-cli-local-1".to_string(),
|
||||
global_model_name: "gemini-cli".to_string(),
|
||||
@@ -91,7 +91,7 @@ async fn gateway_executes_gemini_cli_stream_via_local_decision_gate_with_local_s
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "gemini-cli-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["gemini:cli".to_string()]),
|
||||
api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -124,7 +124,7 @@ async fn gateway_executes_gemini_cli_stream_via_local_decision_gate_with_local_s
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-gemini-cli-local-1".to_string(),
|
||||
"provider-gemini-cli-local-1".to_string(),
|
||||
"gemini:cli".to_string(),
|
||||
"gemini:generate_content".to_string(),
|
||||
Some("gemini".to_string()),
|
||||
Some("cli".to_string()),
|
||||
true,
|
||||
@@ -160,12 +160,12 @@ async fn gateway_executes_gemini_cli_stream_via_local_decision_gate_with_local_s
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
encrypt_python_fernet_plaintext(DEVELOPMENT_ENCRYPTION_KEY, "sk-upstream-gemini-cli")
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"gemini:cli": 1})),
|
||||
Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"enabled": true, "node_id":"proxy-node-gemini-cli-local"})),
|
||||
@@ -482,7 +482,7 @@ async fn gateway_executes_gemini_cli_stream_via_local_decision_gate_after_oauth_
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["gemini", "gemini_cli"])),
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
Some(serde_json::json!(["gemini-cli"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -493,7 +493,7 @@ async fn gateway_executes_gemini_cli_stream_via_local_decision_gate_after_oauth_
|
||||
Some(5),
|
||||
Some(4_102_444_800),
|
||||
Some(serde_json::json!(["gemini", "gemini_cli"])),
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
Some(serde_json::json!(["gemini-cli"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -507,7 +507,7 @@ async fn gateway_executes_gemini_cli_stream_via_local_decision_gate_after_oauth_
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-gemini-cli-oauth-stream-local-1".to_string(),
|
||||
endpoint_api_format: "gemini:cli".to_string(),
|
||||
endpoint_api_format: "gemini:generate_content".to_string(),
|
||||
endpoint_api_family: Some("gemini".to_string()),
|
||||
endpoint_kind: Some("cli".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -515,11 +515,11 @@ async fn gateway_executes_gemini_cli_stream_via_local_decision_gate_after_oauth_
|
||||
key_name: "oauth".to_string(),
|
||||
key_auth_type: "oauth".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["gemini:cli".to_string()]),
|
||||
key_api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:cli": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
model_id: "model-gemini-cli-oauth-stream-local-1".to_string(),
|
||||
global_model_id: "global-model-gemini-cli-oauth-stream-local-1".to_string(),
|
||||
global_model_name: "gemini-cli".to_string(),
|
||||
@@ -529,7 +529,7 @@ async fn gateway_executes_gemini_cli_stream_via_local_decision_gate_after_oauth_
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "gemini-cli-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["gemini:cli".to_string()]),
|
||||
api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -562,7 +562,7 @@ async fn gateway_executes_gemini_cli_stream_via_local_decision_gate_after_oauth_
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-gemini-cli-oauth-stream-local-1".to_string(),
|
||||
"provider-gemini-cli-oauth-stream-local-1".to_string(),
|
||||
"gemini:cli".to_string(),
|
||||
"gemini:generate_content".to_string(),
|
||||
Some("gemini".to_string()),
|
||||
Some("cli".to_string()),
|
||||
true,
|
||||
@@ -603,12 +603,12 @@ async fn gateway_executes_gemini_cli_stream_via_local_decision_gate_after_oauth_
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
encrypt_python_fernet_plaintext(DEVELOPMENT_ENCRYPTION_KEY, "__placeholder__")
|
||||
.expect("placeholder api key should encrypt"),
|
||||
Some(encrypted_auth_config),
|
||||
None,
|
||||
Some(serde_json::json!({"gemini:cli": 1})),
|
||||
Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
None,
|
||||
None,
|
||||
Some(
|
||||
@@ -987,7 +987,7 @@ async fn gateway_executes_vertex_ai_gemini_cli_stream_via_local_decision_gate_wi
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["gemini", "vertex"])),
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
Some(serde_json::json!(["gemini-cli"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -998,7 +998,7 @@ async fn gateway_executes_vertex_ai_gemini_cli_stream_via_local_decision_gate_wi
|
||||
Some(5),
|
||||
Some(4_102_444_800),
|
||||
Some(serde_json::json!(["gemini", "vertex"])),
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
Some(serde_json::json!(["gemini-cli"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -1012,7 +1012,7 @@ async fn gateway_executes_vertex_ai_gemini_cli_stream_via_local_decision_gate_wi
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-vertex-cli-stream-local-1".to_string(),
|
||||
endpoint_api_format: "gemini:cli".to_string(),
|
||||
endpoint_api_format: "gemini:generate_content".to_string(),
|
||||
endpoint_api_family: Some("gemini".to_string()),
|
||||
endpoint_kind: Some("cli".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -1020,11 +1020,11 @@ async fn gateway_executes_vertex_ai_gemini_cli_stream_via_local_decision_gate_wi
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "api_key".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["gemini:cli".to_string()]),
|
||||
key_api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:cli": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
model_id: "model-vertex-cli-stream-local-1".to_string(),
|
||||
global_model_id: "global-model-vertex-cli-stream-local-1".to_string(),
|
||||
global_model_name: "gemini-cli".to_string(),
|
||||
@@ -1034,7 +1034,7 @@ async fn gateway_executes_vertex_ai_gemini_cli_stream_via_local_decision_gate_wi
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "gemini-cli-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["gemini:cli".to_string()]),
|
||||
api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -1067,7 +1067,7 @@ async fn gateway_executes_vertex_ai_gemini_cli_stream_via_local_decision_gate_wi
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-vertex-cli-stream-local-1".to_string(),
|
||||
"provider-vertex-cli-stream-local-1".to_string(),
|
||||
"gemini:cli".to_string(),
|
||||
"gemini:generate_content".to_string(),
|
||||
Some("gemini".to_string()),
|
||||
Some("cli".to_string()),
|
||||
true,
|
||||
@@ -1103,12 +1103,12 @@ async fn gateway_executes_vertex_ai_gemini_cli_stream_via_local_decision_gate_wi
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
encrypt_python_fernet_plaintext(DEVELOPMENT_ENCRYPTION_KEY, "vertex-upstream-secret")
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"gemini:cli": 1})),
|
||||
Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
@@ -1428,7 +1428,7 @@ async fn gateway_executes_antigravity_gemini_cli_stream_via_local_decision_gate_
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["gemini", "antigravity"])),
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
Some(serde_json::json!(["gemini-cli"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -1439,7 +1439,7 @@ async fn gateway_executes_antigravity_gemini_cli_stream_via_local_decision_gate_
|
||||
Some(5),
|
||||
Some(4_102_444_800),
|
||||
Some(serde_json::json!(["gemini", "antigravity"])),
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
Some(serde_json::json!(["gemini-cli"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -1453,7 +1453,7 @@ async fn gateway_executes_antigravity_gemini_cli_stream_via_local_decision_gate_
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-antigravity-cli-oauth-stream-local-1".to_string(),
|
||||
endpoint_api_format: "gemini:cli".to_string(),
|
||||
endpoint_api_format: "gemini:generate_content".to_string(),
|
||||
endpoint_api_family: Some("gemini".to_string()),
|
||||
endpoint_kind: Some("cli".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -1461,11 +1461,11 @@ async fn gateway_executes_antigravity_gemini_cli_stream_via_local_decision_gate_
|
||||
key_name: "oauth".to_string(),
|
||||
key_auth_type: "oauth".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["gemini:cli".to_string()]),
|
||||
key_api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:cli": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
model_id: "model-antigravity-cli-oauth-stream-local-1".to_string(),
|
||||
global_model_id: "global-model-antigravity-cli-oauth-stream-local-1".to_string(),
|
||||
global_model_name: "gemini-cli".to_string(),
|
||||
@@ -1475,7 +1475,7 @@ async fn gateway_executes_antigravity_gemini_cli_stream_via_local_decision_gate_
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "claude-sonnet-4-5".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["gemini:cli".to_string()]),
|
||||
api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -1508,7 +1508,7 @@ async fn gateway_executes_antigravity_gemini_cli_stream_via_local_decision_gate_
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-antigravity-cli-oauth-stream-local-1".to_string(),
|
||||
"provider-antigravity-cli-oauth-stream-local-1".to_string(),
|
||||
"gemini:cli".to_string(),
|
||||
"gemini:generate_content".to_string(),
|
||||
Some("gemini".to_string()),
|
||||
Some("cli".to_string()),
|
||||
true,
|
||||
@@ -1543,12 +1543,12 @@ async fn gateway_executes_antigravity_gemini_cli_stream_via_local_decision_gate_
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
encrypt_python_fernet_plaintext(DEVELOPMENT_ENCRYPTION_KEY, "__placeholder__")
|
||||
.expect("placeholder api key should encrypt"),
|
||||
Some(encrypted_auth_config),
|
||||
None,
|
||||
Some(serde_json::json!({"gemini:cli": 1})),
|
||||
Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
|
||||
@@ -446,7 +446,7 @@ async fn gateway_executes_openai_chat_sync_via_local_cross_format_gemini_candida
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-openai-chat-gemini-local-1".to_string(),
|
||||
endpoint_api_format: "gemini:chat".to_string(),
|
||||
endpoint_api_format: "gemini:generate_content".to_string(),
|
||||
endpoint_api_family: Some("gemini".to_string()),
|
||||
endpoint_kind: Some("chat".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -454,11 +454,11 @@ async fn gateway_executes_openai_chat_sync_via_local_cross_format_gemini_candida
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "api_key".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["gemini:chat".to_string()]),
|
||||
key_api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:chat": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
model_id: "model-openai-chat-gemini-local-1".to_string(),
|
||||
global_model_id: "global-model-openai-chat-gemini-local-1".to_string(),
|
||||
global_model_name: "gpt-5".to_string(),
|
||||
@@ -468,7 +468,7 @@ async fn gateway_executes_openai_chat_sync_via_local_cross_format_gemini_candida
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "gemini-2.5-pro-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["gemini:chat".to_string()]),
|
||||
api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -488,7 +488,7 @@ async fn gateway_executes_openai_chat_sync_via_local_cross_format_gemini_candida
|
||||
row.model_provider_model_mappings = Some(vec![StoredProviderModelMapping {
|
||||
name: "gemini-2.5-flash-upstream".to_string(),
|
||||
priority: 2,
|
||||
api_formats: Some(vec!["gemini:chat".to_string()]),
|
||||
api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
}]);
|
||||
row
|
||||
}
|
||||
@@ -539,7 +539,7 @@ async fn gateway_executes_openai_chat_sync_via_local_cross_format_gemini_candida
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-openai-chat-gemini-local-1".to_string(),
|
||||
"provider-openai-chat-gemini-local-1".to_string(),
|
||||
"gemini:chat".to_string(),
|
||||
"gemini:generate_content".to_string(),
|
||||
Some("gemini".to_string()),
|
||||
Some("chat".to_string()),
|
||||
true,
|
||||
@@ -564,7 +564,7 @@ async fn gateway_executes_openai_chat_sync_via_local_cross_format_gemini_candida
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-openai-chat-gemini-local-disabled".to_string(),
|
||||
"provider-openai-chat-gemini-local-disabled".to_string(),
|
||||
"gemini:chat".to_string(),
|
||||
"gemini:generate_content".to_string(),
|
||||
Some("gemini".to_string()),
|
||||
Some("chat".to_string()),
|
||||
true,
|
||||
@@ -594,7 +594,7 @@ async fn gateway_executes_openai_chat_sync_via_local_cross_format_gemini_candida
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["gemini:chat"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
encrypt_python_fernet_plaintext(
|
||||
DEVELOPMENT_ENCRYPTION_KEY,
|
||||
"sk-upstream-openai-chat-gemini",
|
||||
@@ -602,7 +602,7 @@ async fn gateway_executes_openai_chat_sync_via_local_cross_format_gemini_candida
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"gemini:chat": 1})),
|
||||
Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
@@ -622,7 +622,7 @@ async fn gateway_executes_openai_chat_sync_via_local_cross_format_gemini_candida
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["gemini:chat"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
encrypt_python_fernet_plaintext(
|
||||
DEVELOPMENT_ENCRYPTION_KEY,
|
||||
"sk-upstream-openai-chat-gemini-disabled",
|
||||
@@ -630,7 +630,7 @@ async fn gateway_executes_openai_chat_sync_via_local_cross_format_gemini_candida
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"gemini:chat": 2})),
|
||||
Some(serde_json::json!({"gemini:generate_content": 2})),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
@@ -1026,7 +1026,7 @@ async fn gateway_returns_openai_chat_error_for_local_cross_format_claude_cli_syn
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-openai-chat-claude-cli-local-1".to_string(),
|
||||
endpoint_api_format: "claude:cli".to_string(),
|
||||
endpoint_api_format: "claude:messages".to_string(),
|
||||
endpoint_api_family: Some("claude".to_string()),
|
||||
endpoint_kind: Some("cli".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -1034,11 +1034,11 @@ async fn gateway_returns_openai_chat_error_for_local_cross_format_claude_cli_syn
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "bearer".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["claude:cli".to_string()]),
|
||||
key_api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:cli": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:messages": 1})),
|
||||
model_id: "model-openai-chat-claude-cli-local-1".to_string(),
|
||||
global_model_id: "global-model-openai-chat-claude-cli-local-1".to_string(),
|
||||
global_model_name: "gpt-5".to_string(),
|
||||
@@ -1048,7 +1048,7 @@ async fn gateway_returns_openai_chat_error_for_local_cross_format_claude_cli_syn
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "claude-code-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["claude:cli".to_string()]),
|
||||
api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -1081,7 +1081,7 @@ async fn gateway_returns_openai_chat_error_for_local_cross_format_claude_cli_syn
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-openai-chat-claude-cli-local-1".to_string(),
|
||||
"provider-openai-chat-claude-cli-local-1".to_string(),
|
||||
"claude:cli".to_string(),
|
||||
"claude:messages".to_string(),
|
||||
Some("claude".to_string()),
|
||||
Some("cli".to_string()),
|
||||
true,
|
||||
@@ -1113,7 +1113,7 @@ async fn gateway_returns_openai_chat_error_for_local_cross_format_claude_cli_syn
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
encrypt_python_fernet_plaintext(
|
||||
DEVELOPMENT_ENCRYPTION_KEY,
|
||||
"sk-upstream-openai-chat-claude-cli",
|
||||
@@ -1121,7 +1121,7 @@ async fn gateway_returns_openai_chat_error_for_local_cross_format_claude_cli_syn
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"claude:cli": 1})),
|
||||
Some(serde_json::json!({"claude:messages": 1})),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
@@ -1423,7 +1423,7 @@ async fn gateway_returns_openai_chat_error_for_local_cross_format_gemini_cli_syn
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-openai-chat-gemini-cli-local-1".to_string(),
|
||||
endpoint_api_format: "gemini:cli".to_string(),
|
||||
endpoint_api_format: "gemini:generate_content".to_string(),
|
||||
endpoint_api_family: Some("gemini".to_string()),
|
||||
endpoint_kind: Some("cli".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -1431,11 +1431,11 @@ async fn gateway_returns_openai_chat_error_for_local_cross_format_gemini_cli_syn
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "bearer".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["gemini:cli".to_string()]),
|
||||
key_api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:cli": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
model_id: "model-openai-chat-gemini-cli-local-1".to_string(),
|
||||
global_model_id: "global-model-openai-chat-gemini-cli-local-1".to_string(),
|
||||
global_model_name: "gpt-5".to_string(),
|
||||
@@ -1445,7 +1445,7 @@ async fn gateway_returns_openai_chat_error_for_local_cross_format_gemini_cli_syn
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "gemini-cli-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["gemini:cli".to_string()]),
|
||||
api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -1478,7 +1478,7 @@ async fn gateway_returns_openai_chat_error_for_local_cross_format_gemini_cli_syn
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-openai-chat-gemini-cli-local-1".to_string(),
|
||||
"provider-openai-chat-gemini-cli-local-1".to_string(),
|
||||
"gemini:cli".to_string(),
|
||||
"gemini:generate_content".to_string(),
|
||||
Some("gemini".to_string()),
|
||||
Some("cli".to_string()),
|
||||
true,
|
||||
@@ -1510,7 +1510,7 @@ async fn gateway_returns_openai_chat_error_for_local_cross_format_gemini_cli_syn
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
encrypt_python_fernet_plaintext(
|
||||
DEVELOPMENT_ENCRYPTION_KEY,
|
||||
"sk-upstream-openai-chat-gemini-cli",
|
||||
@@ -1518,7 +1518,7 @@ async fn gateway_returns_openai_chat_error_for_local_cross_format_gemini_cli_syn
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"gemini:cli": 1})),
|
||||
Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
@@ -1820,7 +1820,7 @@ async fn gateway_returns_openai_chat_error_for_local_cross_format_claude_sync_fa
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-openai-chat-claude-local-1".to_string(),
|
||||
endpoint_api_format: "claude:chat".to_string(),
|
||||
endpoint_api_format: "claude:messages".to_string(),
|
||||
endpoint_api_family: Some("claude".to_string()),
|
||||
endpoint_kind: Some("chat".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -1828,11 +1828,11 @@ async fn gateway_returns_openai_chat_error_for_local_cross_format_claude_sync_fa
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "api_key".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["claude:chat".to_string()]),
|
||||
key_api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:chat": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:messages": 1})),
|
||||
model_id: "model-openai-chat-claude-local-1".to_string(),
|
||||
global_model_id: "global-model-openai-chat-claude-local-1".to_string(),
|
||||
global_model_name: "gpt-5".to_string(),
|
||||
@@ -1842,7 +1842,7 @@ async fn gateway_returns_openai_chat_error_for_local_cross_format_claude_sync_fa
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "claude-sonnet-4-5-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["claude:chat".to_string()]),
|
||||
api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -1875,7 +1875,7 @@ async fn gateway_returns_openai_chat_error_for_local_cross_format_claude_sync_fa
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-openai-chat-claude-local-1".to_string(),
|
||||
"provider-openai-chat-claude-local-1".to_string(),
|
||||
"claude:chat".to_string(),
|
||||
"claude:messages".to_string(),
|
||||
Some("claude".to_string()),
|
||||
Some("chat".to_string()),
|
||||
true,
|
||||
@@ -1907,7 +1907,7 @@ async fn gateway_returns_openai_chat_error_for_local_cross_format_claude_sync_fa
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["claude:chat"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
encrypt_python_fernet_plaintext(
|
||||
DEVELOPMENT_ENCRYPTION_KEY,
|
||||
"sk-upstream-openai-chat-claude",
|
||||
@@ -1915,7 +1915,7 @@ async fn gateway_returns_openai_chat_error_for_local_cross_format_claude_sync_fa
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"claude:chat": 1})),
|
||||
Some(serde_json::json!({"claude:messages": 1})),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
@@ -2223,7 +2223,7 @@ async fn gateway_returns_openai_chat_error_for_local_cross_format_gemini_sync_fa
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-openai-chat-gemini-local-1".to_string(),
|
||||
endpoint_api_format: "gemini:chat".to_string(),
|
||||
endpoint_api_format: "gemini:generate_content".to_string(),
|
||||
endpoint_api_family: Some("gemini".to_string()),
|
||||
endpoint_kind: Some("chat".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -2231,11 +2231,11 @@ async fn gateway_returns_openai_chat_error_for_local_cross_format_gemini_sync_fa
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "api_key".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["gemini:chat".to_string()]),
|
||||
key_api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:chat": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
model_id: "model-openai-chat-gemini-local-1".to_string(),
|
||||
global_model_id: "global-model-openai-chat-gemini-local-1".to_string(),
|
||||
global_model_name: "gpt-5".to_string(),
|
||||
@@ -2245,7 +2245,7 @@ async fn gateway_returns_openai_chat_error_for_local_cross_format_gemini_sync_fa
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "gemini-2.5-pro-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["gemini:chat".to_string()]),
|
||||
api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -2278,7 +2278,7 @@ async fn gateway_returns_openai_chat_error_for_local_cross_format_gemini_sync_fa
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-openai-chat-gemini-local-1".to_string(),
|
||||
"provider-openai-chat-gemini-local-1".to_string(),
|
||||
"gemini:chat".to_string(),
|
||||
"gemini:generate_content".to_string(),
|
||||
Some("gemini".to_string()),
|
||||
Some("chat".to_string()),
|
||||
true,
|
||||
@@ -2310,7 +2310,7 @@ async fn gateway_returns_openai_chat_error_for_local_cross_format_gemini_sync_fa
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["gemini:chat"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
encrypt_python_fernet_plaintext(
|
||||
DEVELOPMENT_ENCRYPTION_KEY,
|
||||
"sk-upstream-openai-chat-gemini",
|
||||
@@ -2318,7 +2318,7 @@ async fn gateway_returns_openai_chat_error_for_local_cross_format_gemini_sync_fa
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"gemini:chat": 1})),
|
||||
Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
|
||||
@@ -48,7 +48,7 @@ async fn gateway_executes_claude_code_cli_sync_via_local_decision_gate_with_loca
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["claude", "claude_code"])),
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-code"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -59,7 +59,7 @@ async fn gateway_executes_claude_code_cli_sync_via_local_decision_gate_with_loca
|
||||
Some(5),
|
||||
Some(4_102_444_800),
|
||||
Some(serde_json::json!(["claude", "claude_code"])),
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-code"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -73,7 +73,7 @@ async fn gateway_executes_claude_code_cli_sync_via_local_decision_gate_with_loca
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-claude-code-cli-local-1".to_string(),
|
||||
endpoint_api_format: "claude:cli".to_string(),
|
||||
endpoint_api_format: "claude:messages".to_string(),
|
||||
endpoint_api_family: Some("claude".to_string()),
|
||||
endpoint_kind: Some("cli".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -81,11 +81,11 @@ async fn gateway_executes_claude_code_cli_sync_via_local_decision_gate_with_loca
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "oauth".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["claude:cli".to_string()]),
|
||||
key_api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:cli": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:messages": 1})),
|
||||
model_id: "model-claude-code-cli-local-1".to_string(),
|
||||
global_model_id: "global-model-claude-code-cli-local-1".to_string(),
|
||||
global_model_name: "claude-code".to_string(),
|
||||
@@ -95,7 +95,7 @@ async fn gateway_executes_claude_code_cli_sync_via_local_decision_gate_with_loca
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "claude-code-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["claude:cli".to_string()]),
|
||||
api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -132,7 +132,7 @@ async fn gateway_executes_claude_code_cli_sync_via_local_decision_gate_with_loca
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-claude-code-cli-local-1".to_string(),
|
||||
"provider-claude-code-cli-local-1".to_string(),
|
||||
"claude:cli".to_string(),
|
||||
"claude:messages".to_string(),
|
||||
Some("claude".to_string()),
|
||||
Some("cli".to_string()),
|
||||
true,
|
||||
@@ -167,7 +167,7 @@ async fn gateway_executes_claude_code_cli_sync_via_local_decision_gate_with_loca
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
encrypt_python_fernet_plaintext(
|
||||
DEVELOPMENT_ENCRYPTION_KEY,
|
||||
"sk-upstream-claude-code-oauth",
|
||||
@@ -175,7 +175,7 @@ async fn gateway_executes_claude_code_cli_sync_via_local_decision_gate_with_loca
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"claude:cli": 1})),
|
||||
Some(serde_json::json!({"claude:messages": 1})),
|
||||
None,
|
||||
None,
|
||||
Some(
|
||||
|
||||
@@ -121,7 +121,7 @@ async fn gateway_executes_kiro_claude_cli_sync_via_local_provider_catalog_candid
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["claude", "kiro"])),
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-sonnet-4"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -132,7 +132,7 @@ async fn gateway_executes_kiro_claude_cli_sync_via_local_provider_catalog_candid
|
||||
Some(5),
|
||||
Some(4_102_444_800),
|
||||
Some(serde_json::json!(["claude", "kiro"])),
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-sonnet-4"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -146,7 +146,7 @@ async fn gateway_executes_kiro_claude_cli_sync_via_local_provider_catalog_candid
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-kiro-cli-local-sync-1".to_string(),
|
||||
endpoint_api_format: "claude:cli".to_string(),
|
||||
endpoint_api_format: "claude:messages".to_string(),
|
||||
endpoint_api_family: Some("claude".to_string()),
|
||||
endpoint_kind: Some("cli".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -154,11 +154,11 @@ async fn gateway_executes_kiro_claude_cli_sync_via_local_provider_catalog_candid
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "bearer".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["claude:cli".to_string()]),
|
||||
key_api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:cli": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:messages": 1})),
|
||||
model_id: "model-kiro-cli-local-sync-1".to_string(),
|
||||
global_model_id: "global-model-kiro-cli-local-sync-1".to_string(),
|
||||
global_model_name: "claude-sonnet-4".to_string(),
|
||||
@@ -168,7 +168,7 @@ async fn gateway_executes_kiro_claude_cli_sync_via_local_provider_catalog_candid
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "claude-sonnet-4-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["claude:cli".to_string()]),
|
||||
api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -201,7 +201,7 @@ async fn gateway_executes_kiro_claude_cli_sync_via_local_provider_catalog_candid
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-kiro-cli-local-sync-1".to_string(),
|
||||
"provider-kiro-cli-local-sync-1".to_string(),
|
||||
"claude:cli".to_string(),
|
||||
"claude:messages".to_string(),
|
||||
Some("claude".to_string()),
|
||||
Some("cli".to_string()),
|
||||
true,
|
||||
@@ -249,7 +249,7 @@ async fn gateway_executes_kiro_claude_cli_sync_via_local_provider_catalog_candid
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
encrypt_python_fernet_plaintext(DEVELOPMENT_ENCRYPTION_KEY, "__placeholder__")
|
||||
.expect("api key should encrypt"),
|
||||
Some(
|
||||
@@ -260,7 +260,7 @@ async fn gateway_executes_kiro_claude_cli_sync_via_local_provider_catalog_candid
|
||||
.expect("auth config should encrypt"),
|
||||
),
|
||||
None,
|
||||
Some(serde_json::json!({"claude:cli": 1})),
|
||||
Some(serde_json::json!({"claude:messages": 1})),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"enabled": true, "node_id":"proxy-node-kiro-cli-local-sync"})),
|
||||
@@ -289,7 +289,7 @@ async fn gateway_executes_kiro_claude_cli_sync_via_local_provider_catalog_candid
|
||||
"route_class": "ai_public",
|
||||
"route_family": "claude",
|
||||
"route_kind": "cli",
|
||||
"auth_endpoint_signature": "claude:cli",
|
||||
"auth_endpoint_signature": "claude:messages",
|
||||
"execution_runtime_candidate": true,
|
||||
"auth_context": {
|
||||
"user_id": "user-kiro-cli-local-sync-123",
|
||||
@@ -683,7 +683,7 @@ async fn gateway_executes_kiro_claude_cli_sync_via_local_provider_catalog_candid
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["claude", "kiro"])),
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-sonnet-4"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -694,7 +694,7 @@ async fn gateway_executes_kiro_claude_cli_sync_via_local_provider_catalog_candid
|
||||
Some(5),
|
||||
Some(4_102_444_800),
|
||||
Some(serde_json::json!(["claude", "kiro"])),
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-sonnet-4"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -708,7 +708,7 @@ async fn gateway_executes_kiro_claude_cli_sync_via_local_provider_catalog_candid
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-kiro-cli-local-refresh-1".to_string(),
|
||||
endpoint_api_format: "claude:cli".to_string(),
|
||||
endpoint_api_format: "claude:messages".to_string(),
|
||||
endpoint_api_family: Some("claude".to_string()),
|
||||
endpoint_kind: Some("cli".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -716,11 +716,11 @@ async fn gateway_executes_kiro_claude_cli_sync_via_local_provider_catalog_candid
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "bearer".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["claude:cli".to_string()]),
|
||||
key_api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:cli": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:messages": 1})),
|
||||
model_id: "model-kiro-cli-local-refresh-1".to_string(),
|
||||
global_model_id: "global-model-kiro-cli-local-refresh-1".to_string(),
|
||||
global_model_name: "claude-sonnet-4".to_string(),
|
||||
@@ -730,7 +730,7 @@ async fn gateway_executes_kiro_claude_cli_sync_via_local_provider_catalog_candid
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "claude-sonnet-4-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["claude:cli".to_string()]),
|
||||
api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -763,7 +763,7 @@ async fn gateway_executes_kiro_claude_cli_sync_via_local_provider_catalog_candid
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-kiro-cli-local-refresh-1".to_string(),
|
||||
"provider-kiro-cli-local-refresh-1".to_string(),
|
||||
"claude:cli".to_string(),
|
||||
"claude:messages".to_string(),
|
||||
Some("claude".to_string()),
|
||||
Some("cli".to_string()),
|
||||
true,
|
||||
@@ -810,7 +810,7 @@ async fn gateway_executes_kiro_claude_cli_sync_via_local_provider_catalog_candid
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
encrypt_python_fernet_plaintext(DEVELOPMENT_ENCRYPTION_KEY, "__placeholder__")
|
||||
.expect("api key should encrypt"),
|
||||
Some(
|
||||
@@ -821,7 +821,7 @@ async fn gateway_executes_kiro_claude_cli_sync_via_local_provider_catalog_candid
|
||||
.expect("auth config should encrypt"),
|
||||
),
|
||||
None,
|
||||
Some(serde_json::json!({"claude:cli": 1})),
|
||||
Some(serde_json::json!({"claude:messages": 1})),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
@@ -873,7 +873,7 @@ async fn gateway_executes_kiro_claude_cli_sync_via_local_provider_catalog_candid
|
||||
"route_class": "ai_public",
|
||||
"route_family": "claude",
|
||||
"route_kind": "cli",
|
||||
"auth_endpoint_signature": "claude:cli",
|
||||
"auth_endpoint_signature": "claude:messages",
|
||||
"execution_runtime_candidate": true,
|
||||
"auth_context": {
|
||||
"user_id": "user-kiro-cli-local-refresh-123",
|
||||
|
||||
@@ -44,7 +44,7 @@ async fn gateway_executes_claude_chat_sync_via_local_decision_gate_with_local_sy
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["claude"])),
|
||||
Some(serde_json::json!(["claude:chat"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-sonnet-4-5"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -55,7 +55,7 @@ async fn gateway_executes_claude_chat_sync_via_local_decision_gate_with_local_sy
|
||||
Some(5),
|
||||
Some(4_102_444_800),
|
||||
Some(serde_json::json!(["claude"])),
|
||||
Some(serde_json::json!(["claude:chat"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-sonnet-4-5"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -69,7 +69,7 @@ async fn gateway_executes_claude_chat_sync_via_local_decision_gate_with_local_sy
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-claude-local-1".to_string(),
|
||||
endpoint_api_format: "claude:chat".to_string(),
|
||||
endpoint_api_format: "claude:messages".to_string(),
|
||||
endpoint_api_family: Some("claude".to_string()),
|
||||
endpoint_kind: Some("chat".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -77,11 +77,11 @@ async fn gateway_executes_claude_chat_sync_via_local_decision_gate_with_local_sy
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "api_key".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["claude:chat".to_string()]),
|
||||
key_api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:chat": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:messages": 1})),
|
||||
model_id: "model-claude-local-1".to_string(),
|
||||
global_model_id: "global-model-claude-local-1".to_string(),
|
||||
global_model_name: "claude-sonnet-4-5".to_string(),
|
||||
@@ -91,7 +91,7 @@ async fn gateway_executes_claude_chat_sync_via_local_decision_gate_with_local_sy
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "claude-sonnet-4-5-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["claude:chat".to_string()]),
|
||||
api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -124,7 +124,7 @@ async fn gateway_executes_claude_chat_sync_via_local_decision_gate_with_local_sy
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-claude-local-1".to_string(),
|
||||
"provider-claude-local-1".to_string(),
|
||||
"claude:chat".to_string(),
|
||||
"claude:messages".to_string(),
|
||||
Some("claude".to_string()),
|
||||
Some("chat".to_string()),
|
||||
true,
|
||||
@@ -159,12 +159,12 @@ async fn gateway_executes_claude_chat_sync_via_local_decision_gate_with_local_sy
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["claude:chat"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
encrypt_python_fernet_plaintext(DEVELOPMENT_ENCRYPTION_KEY, "sk-upstream-claude-chat")
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"claude:chat": 1})),
|
||||
Some(serde_json::json!({"claude:messages": 1})),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"enabled": true, "node_id":"proxy-node-claude-chat-local"})),
|
||||
@@ -470,7 +470,7 @@ async fn gateway_surfaces_candidate_list_empty_reason_for_claude_chat_runtime_mi
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["claude"])),
|
||||
Some(serde_json::json!(["claude:chat"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-sonnet-4-5"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -481,7 +481,7 @@ async fn gateway_surfaces_candidate_list_empty_reason_for_claude_chat_runtime_mi
|
||||
Some(5),
|
||||
Some(4_102_444_800),
|
||||
Some(serde_json::json!(["claude"])),
|
||||
Some(serde_json::json!(["claude:chat"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-sonnet-4-5"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -595,7 +595,7 @@ async fn gateway_returns_claude_chat_error_for_local_sync_failure() {
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["claude"])),
|
||||
Some(serde_json::json!(["claude:chat"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-sonnet-4-5"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -606,7 +606,7 @@ async fn gateway_returns_claude_chat_error_for_local_sync_failure() {
|
||||
Some(5),
|
||||
Some(4_102_444_800),
|
||||
Some(serde_json::json!(["claude"])),
|
||||
Some(serde_json::json!(["claude:chat"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-sonnet-4-5"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -620,7 +620,7 @@ async fn gateway_returns_claude_chat_error_for_local_sync_failure() {
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-claude-local-1".to_string(),
|
||||
endpoint_api_format: "claude:chat".to_string(),
|
||||
endpoint_api_format: "claude:messages".to_string(),
|
||||
endpoint_api_family: Some("claude".to_string()),
|
||||
endpoint_kind: Some("chat".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -628,11 +628,11 @@ async fn gateway_returns_claude_chat_error_for_local_sync_failure() {
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "api_key".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["claude:chat".to_string()]),
|
||||
key_api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:chat": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:messages": 1})),
|
||||
model_id: "model-claude-local-1".to_string(),
|
||||
global_model_id: "global-model-claude-local-1".to_string(),
|
||||
global_model_name: "claude-sonnet-4-5".to_string(),
|
||||
@@ -642,7 +642,7 @@ async fn gateway_returns_claude_chat_error_for_local_sync_failure() {
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "claude-sonnet-4-5-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["claude:chat".to_string()]),
|
||||
api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -675,7 +675,7 @@ async fn gateway_returns_claude_chat_error_for_local_sync_failure() {
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-claude-local-1".to_string(),
|
||||
"provider-claude-local-1".to_string(),
|
||||
"claude:chat".to_string(),
|
||||
"claude:messages".to_string(),
|
||||
Some("claude".to_string()),
|
||||
Some("chat".to_string()),
|
||||
true,
|
||||
@@ -710,12 +710,12 @@ async fn gateway_returns_claude_chat_error_for_local_sync_failure() {
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["claude:chat"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
encrypt_python_fernet_plaintext(DEVELOPMENT_ENCRYPTION_KEY, "sk-upstream-claude-chat")
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"claude:chat": 1})),
|
||||
Some(serde_json::json!({"claude:messages": 1})),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"enabled": true, "node_id":"proxy-node-claude-chat-local"})),
|
||||
|
||||
@@ -44,7 +44,7 @@ async fn gateway_executes_claude_cli_sync_via_local_decision_gate_with_local_syn
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["claude"])),
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-code"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -55,7 +55,7 @@ async fn gateway_executes_claude_cli_sync_via_local_decision_gate_with_local_syn
|
||||
Some(5),
|
||||
Some(4_102_444_800),
|
||||
Some(serde_json::json!(["claude"])),
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-code"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -69,7 +69,7 @@ async fn gateway_executes_claude_cli_sync_via_local_decision_gate_with_local_syn
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-claude-cli-local-1".to_string(),
|
||||
endpoint_api_format: "claude:cli".to_string(),
|
||||
endpoint_api_format: "claude:messages".to_string(),
|
||||
endpoint_api_family: Some("claude".to_string()),
|
||||
endpoint_kind: Some("cli".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -77,11 +77,11 @@ async fn gateway_executes_claude_cli_sync_via_local_decision_gate_with_local_syn
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "bearer".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["claude:cli".to_string()]),
|
||||
key_api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:cli": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:messages": 1})),
|
||||
model_id: "model-claude-cli-local-1".to_string(),
|
||||
global_model_id: "global-model-claude-cli-local-1".to_string(),
|
||||
global_model_name: "claude-code".to_string(),
|
||||
@@ -91,7 +91,7 @@ async fn gateway_executes_claude_cli_sync_via_local_decision_gate_with_local_syn
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "claude-code-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["claude:cli".to_string()]),
|
||||
api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -124,7 +124,7 @@ async fn gateway_executes_claude_cli_sync_via_local_decision_gate_with_local_syn
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-claude-cli-local-1".to_string(),
|
||||
"provider-claude-cli-local-1".to_string(),
|
||||
"claude:cli".to_string(),
|
||||
"claude:messages".to_string(),
|
||||
Some("claude".to_string()),
|
||||
Some("cli".to_string()),
|
||||
true,
|
||||
@@ -159,12 +159,12 @@ async fn gateway_executes_claude_cli_sync_via_local_decision_gate_with_local_syn
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
encrypt_python_fernet_plaintext(DEVELOPMENT_ENCRYPTION_KEY, "sk-upstream-claude-cli")
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"claude:cli": 1})),
|
||||
Some(serde_json::json!({"claude:messages": 1})),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"enabled": true, "node_id":"proxy-node-claude-cli-local"})),
|
||||
@@ -478,7 +478,7 @@ async fn gateway_returns_claude_cli_error_for_local_sync_failure() {
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["claude"])),
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-code"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -489,7 +489,7 @@ async fn gateway_returns_claude_cli_error_for_local_sync_failure() {
|
||||
Some(5),
|
||||
Some(4_102_444_800),
|
||||
Some(serde_json::json!(["claude"])),
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-code"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -503,7 +503,7 @@ async fn gateway_returns_claude_cli_error_for_local_sync_failure() {
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-claude-cli-local-1".to_string(),
|
||||
endpoint_api_format: "claude:cli".to_string(),
|
||||
endpoint_api_format: "claude:messages".to_string(),
|
||||
endpoint_api_family: Some("claude".to_string()),
|
||||
endpoint_kind: Some("cli".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -511,11 +511,11 @@ async fn gateway_returns_claude_cli_error_for_local_sync_failure() {
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "bearer".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["claude:cli".to_string()]),
|
||||
key_api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:cli": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:messages": 1})),
|
||||
model_id: "model-claude-cli-local-1".to_string(),
|
||||
global_model_id: "global-model-claude-cli-local-1".to_string(),
|
||||
global_model_name: "claude-code".to_string(),
|
||||
@@ -525,7 +525,7 @@ async fn gateway_returns_claude_cli_error_for_local_sync_failure() {
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "claude-code-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["claude:cli".to_string()]),
|
||||
api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -558,7 +558,7 @@ async fn gateway_returns_claude_cli_error_for_local_sync_failure() {
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-claude-cli-local-1".to_string(),
|
||||
"provider-claude-cli-local-1".to_string(),
|
||||
"claude:cli".to_string(),
|
||||
"claude:messages".to_string(),
|
||||
Some("claude".to_string()),
|
||||
Some("cli".to_string()),
|
||||
true,
|
||||
@@ -593,12 +593,12 @@ async fn gateway_returns_claude_cli_error_for_local_sync_failure() {
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
encrypt_python_fernet_plaintext(DEVELOPMENT_ENCRYPTION_KEY, "sk-upstream-claude-cli")
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"claude:cli": 1})),
|
||||
Some(serde_json::json!({"claude:messages": 1})),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"enabled": true, "node_id":"proxy-node-claude-cli-local"})),
|
||||
@@ -752,7 +752,7 @@ async fn gateway_marks_claude_cli_cross_format_runtime_miss_when_format_conversi
|
||||
true,
|
||||
false,
|
||||
None,
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["gpt-5.4"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -763,7 +763,7 @@ async fn gateway_marks_claude_cli_cross_format_runtime_miss_when_format_conversi
|
||||
Some(5),
|
||||
Some(4_102_444_800),
|
||||
None,
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["gpt-5.4"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
|
||||
@@ -1616,7 +1616,7 @@ async fn gateway_returns_openai_responses_error_for_local_cross_format_gemini_sy
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-openai-cli-gemini-local-1".to_string(),
|
||||
endpoint_api_format: "gemini:cli".to_string(),
|
||||
endpoint_api_format: "gemini:generate_content".to_string(),
|
||||
endpoint_api_family: Some("gemini".to_string()),
|
||||
endpoint_kind: Some("cli".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -1624,11 +1624,11 @@ async fn gateway_returns_openai_responses_error_for_local_cross_format_gemini_sy
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "bearer".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["gemini:cli".to_string()]),
|
||||
key_api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:cli": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
model_id: "model-openai-cli-gemini-local-1".to_string(),
|
||||
global_model_id: "global-model-openai-cli-gemini-local-1".to_string(),
|
||||
global_model_name: "gpt-5".to_string(),
|
||||
@@ -1638,7 +1638,7 @@ async fn gateway_returns_openai_responses_error_for_local_cross_format_gemini_sy
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "gemini-cli-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["gemini:cli".to_string()]),
|
||||
api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -1671,7 +1671,7 @@ async fn gateway_returns_openai_responses_error_for_local_cross_format_gemini_sy
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-openai-cli-gemini-local-1".to_string(),
|
||||
"provider-openai-cli-gemini-local-1".to_string(),
|
||||
"gemini:cli".to_string(),
|
||||
"gemini:generate_content".to_string(),
|
||||
Some("gemini".to_string()),
|
||||
Some("cli".to_string()),
|
||||
true,
|
||||
@@ -1703,7 +1703,7 @@ async fn gateway_returns_openai_responses_error_for_local_cross_format_gemini_sy
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
encrypt_python_fernet_plaintext(
|
||||
DEVELOPMENT_ENCRYPTION_KEY,
|
||||
"sk-upstream-openai-cli-gemini",
|
||||
@@ -1711,7 +1711,7 @@ async fn gateway_returns_openai_responses_error_for_local_cross_format_gemini_sy
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"gemini:cli": 1})),
|
||||
Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
@@ -1992,7 +1992,7 @@ async fn gateway_returns_openai_responses_error_for_local_cross_format_claude_sy
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-openai-cli-claude-local-1".to_string(),
|
||||
endpoint_api_format: "claude:cli".to_string(),
|
||||
endpoint_api_format: "claude:messages".to_string(),
|
||||
endpoint_api_family: Some("claude".to_string()),
|
||||
endpoint_kind: Some("cli".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -2000,11 +2000,11 @@ async fn gateway_returns_openai_responses_error_for_local_cross_format_claude_sy
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "bearer".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["claude:cli".to_string()]),
|
||||
key_api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:cli": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:messages": 1})),
|
||||
model_id: "model-openai-cli-claude-local-1".to_string(),
|
||||
global_model_id: "global-model-openai-cli-claude-local-1".to_string(),
|
||||
global_model_name: "gpt-5".to_string(),
|
||||
@@ -2014,7 +2014,7 @@ async fn gateway_returns_openai_responses_error_for_local_cross_format_claude_sy
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "claude-code-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["claude:cli".to_string()]),
|
||||
api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -2047,7 +2047,7 @@ async fn gateway_returns_openai_responses_error_for_local_cross_format_claude_sy
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-openai-cli-claude-local-1".to_string(),
|
||||
"provider-openai-cli-claude-local-1".to_string(),
|
||||
"claude:cli".to_string(),
|
||||
"claude:messages".to_string(),
|
||||
Some("claude".to_string()),
|
||||
Some("cli".to_string()),
|
||||
true,
|
||||
@@ -2079,7 +2079,7 @@ async fn gateway_returns_openai_responses_error_for_local_cross_format_claude_sy
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
encrypt_python_fernet_plaintext(
|
||||
DEVELOPMENT_ENCRYPTION_KEY,
|
||||
"sk-upstream-openai-cli-claude",
|
||||
@@ -2087,7 +2087,7 @@ async fn gateway_returns_openai_responses_error_for_local_cross_format_claude_sy
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"claude:cli": 1})),
|
||||
Some(serde_json::json!({"claude:messages": 1})),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
@@ -2368,7 +2368,7 @@ async fn gateway_returns_openai_responses_error_for_local_cross_format_claude_ch
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-openai-cli-claude-chat-local-1".to_string(),
|
||||
endpoint_api_format: "claude:chat".to_string(),
|
||||
endpoint_api_format: "claude:messages".to_string(),
|
||||
endpoint_api_family: Some("claude".to_string()),
|
||||
endpoint_kind: Some("chat".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -2376,11 +2376,11 @@ async fn gateway_returns_openai_responses_error_for_local_cross_format_claude_ch
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "api_key".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["claude:chat".to_string()]),
|
||||
key_api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:chat": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"claude:messages": 1})),
|
||||
model_id: "model-openai-cli-claude-chat-local-1".to_string(),
|
||||
global_model_id: "global-model-openai-cli-claude-chat-local-1".to_string(),
|
||||
global_model_name: "gpt-5".to_string(),
|
||||
@@ -2390,7 +2390,7 @@ async fn gateway_returns_openai_responses_error_for_local_cross_format_claude_ch
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "claude-sonnet-4-5-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["claude:chat".to_string()]),
|
||||
api_formats: Some(vec!["claude:messages".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -2423,7 +2423,7 @@ async fn gateway_returns_openai_responses_error_for_local_cross_format_claude_ch
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-openai-cli-claude-chat-local-1".to_string(),
|
||||
"provider-openai-cli-claude-chat-local-1".to_string(),
|
||||
"claude:chat".to_string(),
|
||||
"claude:messages".to_string(),
|
||||
Some("claude".to_string()),
|
||||
Some("chat".to_string()),
|
||||
true,
|
||||
@@ -2455,7 +2455,7 @@ async fn gateway_returns_openai_responses_error_for_local_cross_format_claude_ch
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["claude:chat"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
encrypt_python_fernet_plaintext(
|
||||
DEVELOPMENT_ENCRYPTION_KEY,
|
||||
"sk-upstream-openai-cli-claude-chat",
|
||||
@@ -2463,7 +2463,7 @@ async fn gateway_returns_openai_responses_error_for_local_cross_format_claude_ch
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"claude:chat": 1})),
|
||||
Some(serde_json::json!({"claude:messages": 1})),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
@@ -2747,7 +2747,7 @@ async fn gateway_returns_openai_responses_error_for_local_cross_format_gemini_ch
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-openai-cli-gemini-chat-local-1".to_string(),
|
||||
endpoint_api_format: "gemini:chat".to_string(),
|
||||
endpoint_api_format: "gemini:generate_content".to_string(),
|
||||
endpoint_api_family: Some("gemini".to_string()),
|
||||
endpoint_kind: Some("chat".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -2755,11 +2755,11 @@ async fn gateway_returns_openai_responses_error_for_local_cross_format_gemini_ch
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "api_key".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["gemini:chat".to_string()]),
|
||||
key_api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:chat": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
model_id: "model-openai-cli-gemini-chat-local-1".to_string(),
|
||||
global_model_id: "global-model-openai-cli-gemini-chat-local-1".to_string(),
|
||||
global_model_name: "gpt-5".to_string(),
|
||||
@@ -2769,7 +2769,7 @@ async fn gateway_returns_openai_responses_error_for_local_cross_format_gemini_ch
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "gemini-2.5-pro-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["gemini:chat".to_string()]),
|
||||
api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -2802,7 +2802,7 @@ async fn gateway_returns_openai_responses_error_for_local_cross_format_gemini_ch
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-openai-cli-gemini-chat-local-1".to_string(),
|
||||
"provider-openai-cli-gemini-chat-local-1".to_string(),
|
||||
"gemini:chat".to_string(),
|
||||
"gemini:generate_content".to_string(),
|
||||
Some("gemini".to_string()),
|
||||
Some("chat".to_string()),
|
||||
true,
|
||||
@@ -2834,7 +2834,7 @@ async fn gateway_returns_openai_responses_error_for_local_cross_format_gemini_ch
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["gemini:chat"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
encrypt_python_fernet_plaintext(
|
||||
DEVELOPMENT_ENCRYPTION_KEY,
|
||||
"sk-upstream-openai-cli-gemini-chat",
|
||||
@@ -2842,7 +2842,7 @@ async fn gateway_returns_openai_responses_error_for_local_cross_format_gemini_ch
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"gemini:chat": 1})),
|
||||
Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
|
||||
@@ -43,7 +43,7 @@ async fn gateway_executes_gemini_cli_sync_via_local_decision_gate_with_local_syn
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["gemini"])),
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
Some(serde_json::json!(["gemini-cli"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -54,7 +54,7 @@ async fn gateway_executes_gemini_cli_sync_via_local_decision_gate_with_local_syn
|
||||
Some(5),
|
||||
Some(4_102_444_800),
|
||||
Some(serde_json::json!(["gemini"])),
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
Some(serde_json::json!(["gemini-cli"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -68,7 +68,7 @@ async fn gateway_executes_gemini_cli_sync_via_local_decision_gate_with_local_syn
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-gemini-cli-local-1".to_string(),
|
||||
endpoint_api_format: "gemini:cli".to_string(),
|
||||
endpoint_api_format: "gemini:generate_content".to_string(),
|
||||
endpoint_api_family: Some("gemini".to_string()),
|
||||
endpoint_kind: Some("cli".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -76,11 +76,11 @@ async fn gateway_executes_gemini_cli_sync_via_local_decision_gate_with_local_syn
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "bearer".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["gemini:cli".to_string()]),
|
||||
key_api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:cli": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
model_id: "model-gemini-cli-local-1".to_string(),
|
||||
global_model_id: "global-model-gemini-cli-local-1".to_string(),
|
||||
global_model_name: "gemini-cli".to_string(),
|
||||
@@ -90,7 +90,7 @@ async fn gateway_executes_gemini_cli_sync_via_local_decision_gate_with_local_syn
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "gemini-cli-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["gemini:cli".to_string()]),
|
||||
api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -123,7 +123,7 @@ async fn gateway_executes_gemini_cli_sync_via_local_decision_gate_with_local_syn
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-gemini-cli-local-1".to_string(),
|
||||
"provider-gemini-cli-local-1".to_string(),
|
||||
"gemini:cli".to_string(),
|
||||
"gemini:generate_content".to_string(),
|
||||
Some("gemini".to_string()),
|
||||
Some("cli".to_string()),
|
||||
true,
|
||||
@@ -159,12 +159,12 @@ async fn gateway_executes_gemini_cli_sync_via_local_decision_gate_with_local_syn
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
encrypt_python_fernet_plaintext(DEVELOPMENT_ENCRYPTION_KEY, "sk-upstream-gemini-cli")
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"gemini:cli": 1})),
|
||||
Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"enabled": true, "node_id":"proxy-node-gemini-cli-local"})),
|
||||
@@ -463,7 +463,7 @@ async fn gateway_returns_gemini_cli_error_for_local_sync_failure() {
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["gemini"])),
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
Some(serde_json::json!(["gemini-cli"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -474,7 +474,7 @@ async fn gateway_returns_gemini_cli_error_for_local_sync_failure() {
|
||||
Some(5),
|
||||
Some(4_102_444_800),
|
||||
Some(serde_json::json!(["gemini"])),
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
Some(serde_json::json!(["gemini-cli"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -488,7 +488,7 @@ async fn gateway_returns_gemini_cli_error_for_local_sync_failure() {
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-gemini-cli-local-1".to_string(),
|
||||
endpoint_api_format: "gemini:cli".to_string(),
|
||||
endpoint_api_format: "gemini:generate_content".to_string(),
|
||||
endpoint_api_family: Some("gemini".to_string()),
|
||||
endpoint_kind: Some("cli".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -496,11 +496,11 @@ async fn gateway_returns_gemini_cli_error_for_local_sync_failure() {
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "bearer".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["gemini:cli".to_string()]),
|
||||
key_api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:cli": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
model_id: "model-gemini-cli-local-1".to_string(),
|
||||
global_model_id: "global-model-gemini-cli-local-1".to_string(),
|
||||
global_model_name: "gemini-cli".to_string(),
|
||||
@@ -510,7 +510,7 @@ async fn gateway_returns_gemini_cli_error_for_local_sync_failure() {
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "gemini-cli-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["gemini:cli".to_string()]),
|
||||
api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -543,7 +543,7 @@ async fn gateway_returns_gemini_cli_error_for_local_sync_failure() {
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-gemini-cli-local-1".to_string(),
|
||||
"provider-gemini-cli-local-1".to_string(),
|
||||
"gemini:cli".to_string(),
|
||||
"gemini:generate_content".to_string(),
|
||||
Some("gemini".to_string()),
|
||||
Some("cli".to_string()),
|
||||
true,
|
||||
@@ -579,12 +579,12 @@ async fn gateway_returns_gemini_cli_error_for_local_sync_failure() {
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
encrypt_python_fernet_plaintext(DEVELOPMENT_ENCRYPTION_KEY, "sk-upstream-gemini-cli")
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"gemini:cli": 1})),
|
||||
Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"enabled": true, "node_id":"proxy-node-gemini-cli-local"})),
|
||||
@@ -755,7 +755,7 @@ async fn gateway_executes_gemini_cli_sync_via_local_decision_gate_after_oauth_re
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["gemini", "gemini_cli"])),
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
Some(serde_json::json!(["gemini-cli"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -766,7 +766,7 @@ async fn gateway_executes_gemini_cli_sync_via_local_decision_gate_after_oauth_re
|
||||
Some(5),
|
||||
Some(4_102_444_800),
|
||||
Some(serde_json::json!(["gemini", "gemini_cli"])),
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
Some(serde_json::json!(["gemini-cli"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -780,7 +780,7 @@ async fn gateway_executes_gemini_cli_sync_via_local_decision_gate_after_oauth_re
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-gemini-cli-oauth-local-1".to_string(),
|
||||
endpoint_api_format: "gemini:cli".to_string(),
|
||||
endpoint_api_format: "gemini:generate_content".to_string(),
|
||||
endpoint_api_family: Some("gemini".to_string()),
|
||||
endpoint_kind: Some("cli".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -788,11 +788,11 @@ async fn gateway_executes_gemini_cli_sync_via_local_decision_gate_after_oauth_re
|
||||
key_name: "oauth".to_string(),
|
||||
key_auth_type: "oauth".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["gemini:cli".to_string()]),
|
||||
key_api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:cli": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
model_id: "model-gemini-cli-oauth-local-1".to_string(),
|
||||
global_model_id: "global-model-gemini-cli-oauth-local-1".to_string(),
|
||||
global_model_name: "gemini-cli".to_string(),
|
||||
@@ -802,7 +802,7 @@ async fn gateway_executes_gemini_cli_sync_via_local_decision_gate_after_oauth_re
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "gemini-cli-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["gemini:cli".to_string()]),
|
||||
api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -835,7 +835,7 @@ async fn gateway_executes_gemini_cli_sync_via_local_decision_gate_after_oauth_re
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-gemini-cli-oauth-local-1".to_string(),
|
||||
"provider-gemini-cli-oauth-local-1".to_string(),
|
||||
"gemini:cli".to_string(),
|
||||
"gemini:generate_content".to_string(),
|
||||
Some("gemini".to_string()),
|
||||
Some("cli".to_string()),
|
||||
true,
|
||||
@@ -876,12 +876,12 @@ async fn gateway_executes_gemini_cli_sync_via_local_decision_gate_after_oauth_re
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
encrypt_python_fernet_plaintext(DEVELOPMENT_ENCRYPTION_KEY, "__placeholder__")
|
||||
.expect("placeholder api key should encrypt"),
|
||||
Some(encrypted_auth_config),
|
||||
None,
|
||||
Some(serde_json::json!({"gemini:cli": 1})),
|
||||
Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
None,
|
||||
None,
|
||||
Some(
|
||||
@@ -1254,7 +1254,7 @@ async fn gateway_executes_vertex_ai_gemini_cli_sync_via_local_decision_gate_with
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["gemini", "vertex"])),
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
Some(serde_json::json!(["gemini-cli"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -1265,7 +1265,7 @@ async fn gateway_executes_vertex_ai_gemini_cli_sync_via_local_decision_gate_with
|
||||
Some(5),
|
||||
Some(4_102_444_800),
|
||||
Some(serde_json::json!(["gemini", "vertex"])),
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
Some(serde_json::json!(["gemini-cli"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -1279,7 +1279,7 @@ async fn gateway_executes_vertex_ai_gemini_cli_sync_via_local_decision_gate_with
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-vertex-cli-local-1".to_string(),
|
||||
endpoint_api_format: "gemini:cli".to_string(),
|
||||
endpoint_api_format: "gemini:generate_content".to_string(),
|
||||
endpoint_api_family: Some("gemini".to_string()),
|
||||
endpoint_kind: Some("cli".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -1287,11 +1287,11 @@ async fn gateway_executes_vertex_ai_gemini_cli_sync_via_local_decision_gate_with
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "api_key".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["gemini:cli".to_string()]),
|
||||
key_api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:cli": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
model_id: "model-vertex-cli-local-1".to_string(),
|
||||
global_model_id: "global-model-vertex-cli-local-1".to_string(),
|
||||
global_model_name: "gemini-cli".to_string(),
|
||||
@@ -1301,7 +1301,7 @@ async fn gateway_executes_vertex_ai_gemini_cli_sync_via_local_decision_gate_with
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "gemini-cli-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["gemini:cli".to_string()]),
|
||||
api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -1334,7 +1334,7 @@ async fn gateway_executes_vertex_ai_gemini_cli_sync_via_local_decision_gate_with
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-vertex-cli-local-1".to_string(),
|
||||
"provider-vertex-cli-local-1".to_string(),
|
||||
"gemini:cli".to_string(),
|
||||
"gemini:generate_content".to_string(),
|
||||
Some("gemini".to_string()),
|
||||
Some("cli".to_string()),
|
||||
true,
|
||||
@@ -1370,12 +1370,12 @@ async fn gateway_executes_vertex_ai_gemini_cli_sync_via_local_decision_gate_with
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
encrypt_python_fernet_plaintext(DEVELOPMENT_ENCRYPTION_KEY, "vertex-upstream-secret")
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"gemini:cli": 1})),
|
||||
Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
@@ -1689,7 +1689,7 @@ async fn gateway_executes_antigravity_gemini_cli_sync_via_local_decision_gate_af
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["gemini", "antigravity"])),
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
Some(serde_json::json!(["gemini-cli"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -1700,7 +1700,7 @@ async fn gateway_executes_antigravity_gemini_cli_sync_via_local_decision_gate_af
|
||||
Some(5),
|
||||
Some(4_102_444_800),
|
||||
Some(serde_json::json!(["gemini", "antigravity"])),
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
Some(serde_json::json!(["gemini-cli"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -1714,7 +1714,7 @@ async fn gateway_executes_antigravity_gemini_cli_sync_via_local_decision_gate_af
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-antigravity-cli-oauth-local-1".to_string(),
|
||||
endpoint_api_format: "gemini:cli".to_string(),
|
||||
endpoint_api_format: "gemini:generate_content".to_string(),
|
||||
endpoint_api_family: Some("gemini".to_string()),
|
||||
endpoint_kind: Some("cli".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -1722,11 +1722,11 @@ async fn gateway_executes_antigravity_gemini_cli_sync_via_local_decision_gate_af
|
||||
key_name: "oauth".to_string(),
|
||||
key_auth_type: "oauth".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["gemini:cli".to_string()]),
|
||||
key_api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:cli": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
model_id: "model-antigravity-cli-oauth-local-1".to_string(),
|
||||
global_model_id: "global-model-antigravity-cli-oauth-local-1".to_string(),
|
||||
global_model_name: "gemini-cli".to_string(),
|
||||
@@ -1736,7 +1736,7 @@ async fn gateway_executes_antigravity_gemini_cli_sync_via_local_decision_gate_af
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "claude-sonnet-4-5".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["gemini:cli".to_string()]),
|
||||
api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -1769,7 +1769,7 @@ async fn gateway_executes_antigravity_gemini_cli_sync_via_local_decision_gate_af
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-antigravity-cli-oauth-local-1".to_string(),
|
||||
"provider-antigravity-cli-oauth-local-1".to_string(),
|
||||
"gemini:cli".to_string(),
|
||||
"gemini:generate_content".to_string(),
|
||||
Some("gemini".to_string()),
|
||||
Some("cli".to_string()),
|
||||
true,
|
||||
@@ -1804,12 +1804,12 @@ async fn gateway_executes_antigravity_gemini_cli_sync_via_local_decision_gate_af
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["gemini:cli"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
encrypt_python_fernet_plaintext(DEVELOPMENT_ENCRYPTION_KEY, "__placeholder__")
|
||||
.expect("placeholder api key should encrypt"),
|
||||
Some(encrypted_auth_config),
|
||||
None,
|
||||
Some(serde_json::json!({"gemini:cli": 1})),
|
||||
Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
|
||||
@@ -43,7 +43,7 @@ async fn gateway_executes_gemini_chat_sync_via_local_decision_gate_with_local_sy
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["gemini"])),
|
||||
Some(serde_json::json!(["gemini:chat"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
Some(serde_json::json!(["gemini-2.5-pro"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -54,7 +54,7 @@ async fn gateway_executes_gemini_chat_sync_via_local_decision_gate_with_local_sy
|
||||
Some(5),
|
||||
Some(4_102_444_800),
|
||||
Some(serde_json::json!(["gemini"])),
|
||||
Some(serde_json::json!(["gemini:chat"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
Some(serde_json::json!(["gemini-2.5-pro"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -68,7 +68,7 @@ async fn gateway_executes_gemini_chat_sync_via_local_decision_gate_with_local_sy
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-gemini-local-1".to_string(),
|
||||
endpoint_api_format: "gemini:chat".to_string(),
|
||||
endpoint_api_format: "gemini:generate_content".to_string(),
|
||||
endpoint_api_family: Some("gemini".to_string()),
|
||||
endpoint_kind: Some("chat".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -76,11 +76,11 @@ async fn gateway_executes_gemini_chat_sync_via_local_decision_gate_with_local_sy
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "api_key".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["gemini:chat".to_string()]),
|
||||
key_api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:chat": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
model_id: "model-gemini-local-1".to_string(),
|
||||
global_model_id: "global-model-gemini-local-1".to_string(),
|
||||
global_model_name: "gemini-2.5-pro".to_string(),
|
||||
@@ -90,7 +90,7 @@ async fn gateway_executes_gemini_chat_sync_via_local_decision_gate_with_local_sy
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "gemini-2.5-pro-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["gemini:chat".to_string()]),
|
||||
api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -123,7 +123,7 @@ async fn gateway_executes_gemini_chat_sync_via_local_decision_gate_with_local_sy
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-gemini-local-1".to_string(),
|
||||
"provider-gemini-local-1".to_string(),
|
||||
"gemini:chat".to_string(),
|
||||
"gemini:generate_content".to_string(),
|
||||
Some("gemini".to_string()),
|
||||
Some("chat".to_string()),
|
||||
true,
|
||||
@@ -159,12 +159,12 @@ async fn gateway_executes_gemini_chat_sync_via_local_decision_gate_with_local_sy
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["gemini:chat"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
encrypt_python_fernet_plaintext(DEVELOPMENT_ENCRYPTION_KEY, "sk-upstream-gemini-chat")
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"gemini:chat": 1})),
|
||||
Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"enabled": true, "node_id":"proxy-node-gemini-chat-local"})),
|
||||
@@ -453,7 +453,7 @@ async fn gateway_returns_gemini_chat_error_for_local_sync_failure() {
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["gemini"])),
|
||||
Some(serde_json::json!(["gemini:chat"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
Some(serde_json::json!(["gemini-2.5-pro"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -464,7 +464,7 @@ async fn gateway_returns_gemini_chat_error_for_local_sync_failure() {
|
||||
Some(5),
|
||||
Some(4_102_444_800),
|
||||
Some(serde_json::json!(["gemini"])),
|
||||
Some(serde_json::json!(["gemini:chat"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
Some(serde_json::json!(["gemini-2.5-pro"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -478,7 +478,7 @@ async fn gateway_returns_gemini_chat_error_for_local_sync_failure() {
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-gemini-local-1".to_string(),
|
||||
endpoint_api_format: "gemini:chat".to_string(),
|
||||
endpoint_api_format: "gemini:generate_content".to_string(),
|
||||
endpoint_api_family: Some("gemini".to_string()),
|
||||
endpoint_kind: Some("chat".to_string()),
|
||||
endpoint_is_active: true,
|
||||
@@ -486,11 +486,11 @@ async fn gateway_returns_gemini_chat_error_for_local_sync_failure() {
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "api_key".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["gemini:chat".to_string()]),
|
||||
key_api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: None,
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:chat": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
model_id: "model-gemini-local-1".to_string(),
|
||||
global_model_id: "global-model-gemini-local-1".to_string(),
|
||||
global_model_name: "gemini-2.5-pro".to_string(),
|
||||
@@ -500,7 +500,7 @@ async fn gateway_returns_gemini_chat_error_for_local_sync_failure() {
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "gemini-2.5-pro-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["gemini:chat".to_string()]),
|
||||
api_formats: Some(vec!["gemini:generate_content".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -533,7 +533,7 @@ async fn gateway_returns_gemini_chat_error_for_local_sync_failure() {
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-gemini-local-1".to_string(),
|
||||
"provider-gemini-local-1".to_string(),
|
||||
"gemini:chat".to_string(),
|
||||
"gemini:generate_content".to_string(),
|
||||
Some("gemini".to_string()),
|
||||
Some("chat".to_string()),
|
||||
true,
|
||||
@@ -569,12 +569,12 @@ async fn gateway_returns_gemini_chat_error_for_local_sync_failure() {
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["gemini:chat"])),
|
||||
Some(serde_json::json!(["gemini:generate_content"])),
|
||||
encrypt_python_fernet_plaintext(DEVELOPMENT_ENCRYPTION_KEY, "sk-upstream-gemini-chat")
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"gemini:chat": 1})),
|
||||
Some(serde_json::json!({"gemini:generate_content": 1})),
|
||||
None,
|
||||
None,
|
||||
Some(serde_json::json!({"enabled": true, "node_id":"proxy-node-gemini-chat-local"})),
|
||||
|
||||
@@ -1075,7 +1075,8 @@ fn admin_provider_write_uses_specific_local_owners() {
|
||||
for pattern in [
|
||||
"pub(crate) async fn build_admin_create_provider_key_record(",
|
||||
"crate::handlers::admin::provider::write::normalize::{",
|
||||
"normalize_auth_type, validate_vertex_api_formats,",
|
||||
"normalize_auth_type,",
|
||||
"validate_vertex_api_formats,",
|
||||
"normalize_json_object, normalize_string_list,",
|
||||
] {
|
||||
assert!(
|
||||
@@ -1102,7 +1103,8 @@ fn admin_provider_write_uses_specific_local_owners() {
|
||||
for pattern in [
|
||||
"pub(crate) async fn build_admin_update_provider_key_record(",
|
||||
"crate::handlers::admin::provider::write::normalize::{",
|
||||
"normalize_auth_type, validate_vertex_api_formats,",
|
||||
"normalize_auth_type,",
|
||||
"validate_vertex_api_formats,",
|
||||
"encrypt_catalog_secret_with_fallbacks, json_string_list,",
|
||||
"normalize_json_object, normalize_string_list,",
|
||||
] {
|
||||
|
||||
@@ -2782,7 +2782,7 @@ fn ai_pipeline_openai_responses_specs_are_owned_by_pipeline_crate() {
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn ai_pipeline_openai_cli_legacy_names_stay_out_of_primary_paths() {
|
||||
fn ai_pipeline_legacy_api_format_names_stay_out_of_primary_paths() {
|
||||
for path in [
|
||||
"crates/aether-ai-pipeline/src/contracts/plan_kinds.rs",
|
||||
"crates/aether-ai-pipeline/src/planner/route.rs",
|
||||
@@ -2794,6 +2794,10 @@ fn ai_pipeline_openai_cli_legacy_names_stay_out_of_primary_paths() {
|
||||
for forbidden in [
|
||||
"openai:cli",
|
||||
"openai:compact",
|
||||
"claude:chat",
|
||||
"claude:cli",
|
||||
"gemini:chat",
|
||||
"gemini:cli",
|
||||
"openai_cli_",
|
||||
"openai_compact_",
|
||||
"OPENAI_CLI",
|
||||
@@ -2811,16 +2815,23 @@ fn ai_pipeline_openai_cli_legacy_names_stay_out_of_primary_paths() {
|
||||
.split("#[cfg(test)]")
|
||||
.next()
|
||||
.expect("registry source should have an implementation section");
|
||||
for forbidden in ["\"openai:cli\"", "\"openai:compact\""] {
|
||||
for forbidden in [
|
||||
"\"openai:cli\"",
|
||||
"\"openai:compact\"",
|
||||
"\"claude:chat\"",
|
||||
"\"claude:cli\"",
|
||||
"\"gemini:chat\"",
|
||||
"\"gemini:cli\"",
|
||||
] {
|
||||
assert!(
|
||||
!implementation.contains(forbidden),
|
||||
"conversion registry implementation should route legacy aliases through aether-ai-formats helpers: {forbidden}"
|
||||
"conversion registry implementation should not branch on retired API format aliases: {forbidden}"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn openai_cli_legacy_alias_occurrences_are_whitelisted() {
|
||||
fn retired_api_format_occurrences_are_whitelisted() {
|
||||
let workspace_root = std::path::Path::new(env!("CARGO_MANIFEST_DIR"))
|
||||
.join("../..")
|
||||
.canonicalize()
|
||||
@@ -2832,31 +2843,12 @@ fn openai_cli_legacy_alias_occurrences_are_whitelisted() {
|
||||
|
||||
let allowed_paths = [
|
||||
"apps/aether-gateway/src/ai_pipeline/conversion/mod.rs",
|
||||
"apps/aether-gateway/src/ai_pipeline/planner/common.rs",
|
||||
"apps/aether-gateway/src/ai_pipeline/planner/standard/openai/chat/plans/sync.rs",
|
||||
"apps/aether-gateway/src/execution_runtime/tests.rs",
|
||||
"apps/aether-gateway/src/handlers/public/support/models/shared.rs",
|
||||
"apps/aether-gateway/src/scheduler/affinity.rs",
|
||||
"crates/aether-admin/src/system.rs",
|
||||
"crates/aether-ai-formats/src/canonical.rs",
|
||||
"apps/aether-gateway/src/handlers/admin/provider/write/normalize.rs",
|
||||
"crates/aether-ai-formats/src/formats.rs",
|
||||
"crates/aether-ai-formats/src/matrix.rs",
|
||||
"crates/aether-ai-formats/src/registry.rs",
|
||||
"crates/aether-ai-pipeline/src/contracts/report_kinds.rs",
|
||||
"crates/aether-ai-pipeline/src/conversion/registry.rs",
|
||||
"crates/aether-ai-pipeline/src/finalize/sync_products.rs",
|
||||
"crates/aether-ai-pipeline/src/planner/common.rs",
|
||||
"crates/aether-model-fetch/src/logic.rs",
|
||||
"crates/aether-usage-runtime/src/report.rs",
|
||||
"frontend/src/api/endpoints/types/api-format.ts",
|
||||
"frontend/src/features/models/components/RoutingTab.vue",
|
||||
"frontend/src/features/providers/components/EndpointFormDialog.vue",
|
||||
"frontend/src/features/providers/components/PriorityManagementDialog.vue",
|
||||
"frontend/src/features/usage/conversation/__tests__/stream.spec.ts",
|
||||
"frontend/src/features/usage/utils/__tests__/status.spec.ts",
|
||||
"frontend/src/features/usage/utils/status.ts",
|
||||
"frontend/src/mocks/data.ts",
|
||||
"frontend/src/mocks/handler.ts",
|
||||
];
|
||||
let allowed = allowed_paths
|
||||
.into_iter()
|
||||
@@ -2864,12 +2856,10 @@ fn openai_cli_legacy_alias_occurrences_are_whitelisted() {
|
||||
let patterns = [
|
||||
"openai:cli",
|
||||
"openai:compact",
|
||||
"openai_cli",
|
||||
"openai_compact",
|
||||
"OPENAI_CLI",
|
||||
"OPENAI_COMPACT",
|
||||
"OpenAI CLI",
|
||||
"OpenAI Compact",
|
||||
"claude:chat",
|
||||
"claude:cli",
|
||||
"gemini:chat",
|
||||
"gemini:cli",
|
||||
];
|
||||
|
||||
let mut violations = Vec::new();
|
||||
@@ -2896,7 +2886,7 @@ fn openai_cli_legacy_alias_occurrences_are_whitelisted() {
|
||||
|
||||
assert!(
|
||||
violations.is_empty(),
|
||||
"legacy OpenAI Responses aliases should stay confined to explicit compatibility files:\n{}",
|
||||
"retired API format aliases should stay confined to migration or negative-test files:\n{}",
|
||||
violations.join("\n")
|
||||
);
|
||||
}
|
||||
|
||||
@@ -524,7 +524,7 @@ async fn gateway_handles_admin_api_keys_update_locally_with_trusted_admin_princi
|
||||
"rate_limit": null,
|
||||
"concurrent_limit": 12,
|
||||
"allowed_providers": ["gemini"],
|
||||
"allowed_api_formats": ["gemini:chat"],
|
||||
"allowed_api_formats": ["gemini:generate_content"],
|
||||
"allowed_models": ["gemini-2.5-pro"],
|
||||
"expires_at": "2030-03-04",
|
||||
"auto_delete_on_expiry": true,
|
||||
@@ -541,7 +541,10 @@ async fn gateway_handles_admin_api_keys_update_locally_with_trusted_admin_princi
|
||||
assert_eq!(payload["rate_limit"], serde_json::Value::Null);
|
||||
assert_eq!(payload["concurrent_limit"], json!(12));
|
||||
assert_eq!(payload["allowed_providers"], json!(["gemini"]));
|
||||
assert_eq!(payload["allowed_api_formats"], json!(["gemini:chat"]));
|
||||
assert_eq!(
|
||||
payload["allowed_api_formats"],
|
||||
json!(["gemini:generate_content"])
|
||||
);
|
||||
assert_eq!(payload["allowed_models"], json!(["gemini-2.5-pro"]));
|
||||
assert_eq!(payload["auto_delete_on_expiry"], json!(true));
|
||||
assert_eq!(payload["wallet"]["limit_mode"], json!("unlimited"));
|
||||
|
||||
@@ -469,7 +469,7 @@ async fn gateway_exports_admin_provider_key_locally_with_trusted_admin_principal
|
||||
let mut key = sample_key(
|
||||
"key-kiro-a",
|
||||
"provider-kiro",
|
||||
"claude:cli",
|
||||
"claude:messages",
|
||||
"oauth-access-token",
|
||||
);
|
||||
key.auth_type = "oauth".to_string();
|
||||
@@ -1569,7 +1569,12 @@ async fn gateway_handles_admin_keys_grouped_by_format_locally_with_trusted_admin
|
||||
key_a.health_by_format = Some(json!({"openai:chat": {"health_score": 0.8}}));
|
||||
key_a.circuit_breaker_by_format = Some(json!({"openai:chat": {"open": false}}));
|
||||
|
||||
let mut key_b = sample_key("key-claude-a", "provider-claude", "claude:chat", "sk-ant-a");
|
||||
let mut key_b = sample_key(
|
||||
"key-claude-a",
|
||||
"provider-claude",
|
||||
"claude:messages",
|
||||
"sk-ant-a",
|
||||
);
|
||||
key_b.internal_priority = 20;
|
||||
key_b.request_count = Some(2);
|
||||
key_b.success_count = Some(1);
|
||||
@@ -1592,7 +1597,7 @@ async fn gateway_handles_admin_keys_grouped_by_format_locally_with_trusted_admin
|
||||
sample_endpoint(
|
||||
"endpoint-claude-chat",
|
||||
"provider-claude",
|
||||
"claude:chat",
|
||||
"claude:messages",
|
||||
"https://api.claude.example",
|
||||
),
|
||||
],
|
||||
@@ -1633,7 +1638,7 @@ async fn gateway_handles_admin_keys_grouped_by_format_locally_with_trusted_admin
|
||||
"https://api.openai.example"
|
||||
);
|
||||
assert_eq!(payload["openai:chat"][0]["capabilities"], json!(["1h缓存"]));
|
||||
assert_eq!(payload["claude:chat"][0]["provider_active"], false);
|
||||
assert_eq!(payload["claude:messages"][0]["provider_active"], false);
|
||||
assert_eq!(*upstream_hits.lock().expect("mutex should lock"), 0);
|
||||
|
||||
gateway_handle.abort();
|
||||
|
||||
@@ -472,7 +472,7 @@ async fn gateway_refreshes_admin_provider_quota_locally_for_kiro_with_trusted_ad
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(json!(["claude:cli"])),
|
||||
Some(json!(["claude:messages"])),
|
||||
encrypted_api_key,
|
||||
Some(encrypted_auth_config),
|
||||
None,
|
||||
@@ -495,7 +495,7 @@ async fn gateway_refreshes_admin_provider_quota_locally_for_kiro_with_trusted_ad
|
||||
vec![sample_endpoint(
|
||||
"endpoint-kiro-cli",
|
||||
"provider-kiro",
|
||||
"claude:cli",
|
||||
"claude:messages",
|
||||
"https://q.us-west-2.amazonaws.com",
|
||||
)],
|
||||
vec![key],
|
||||
@@ -830,7 +830,7 @@ async fn gateway_refreshes_admin_provider_quota_locally_for_antigravity_with_tru
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(json!(["gemini:chat"])),
|
||||
Some(json!(["gemini:generate_content"])),
|
||||
encrypt_python_fernet_plaintext(DEVELOPMENT_ENCRYPTION_KEY, "ya29.ant-token")
|
||||
.expect("api key ciphertext should build"),
|
||||
Some(encrypted_auth_config),
|
||||
@@ -854,7 +854,7 @@ async fn gateway_refreshes_admin_provider_quota_locally_for_antigravity_with_tru
|
||||
vec![sample_endpoint(
|
||||
"endpoint-antigravity-chat",
|
||||
"provider-antigravity",
|
||||
"gemini:chat",
|
||||
"gemini:generate_content",
|
||||
"https://daily-cloudcode-pa.googleapis.com",
|
||||
)],
|
||||
vec![key],
|
||||
|
||||
@@ -53,7 +53,7 @@ fn sample_admin_gemini_endpoint() -> StoredProviderCatalogEndpoint {
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-gemini-admin-1".to_string(),
|
||||
"provider-gemini-admin-1".to_string(),
|
||||
"gemini:chat".to_string(),
|
||||
"gemini:generate_content".to_string(),
|
||||
Some("gemini".to_string()),
|
||||
Some("chat".to_string()),
|
||||
true,
|
||||
@@ -83,12 +83,12 @@ fn sample_admin_gemini_key(id: &str, name: &str, secret: &str) -> StoredProvider
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(json!(["gemini:chat"])),
|
||||
Some(json!(["gemini:generate_content"])),
|
||||
encrypt_python_fernet_plaintext(DEVELOPMENT_ENCRYPTION_KEY, secret)
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
None,
|
||||
Some(json!({"gemini:chat": 1})),
|
||||
Some(json!({"gemini:generate_content": 1})),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
|
||||
@@ -885,7 +885,7 @@ async fn gateway_handles_admin_pool_list_keys_with_quota_compatibility_fields()
|
||||
let mut key = sample_key(
|
||||
"key-antigravity-a",
|
||||
"provider-antigravity",
|
||||
"gemini:chat",
|
||||
"gemini:generate_content",
|
||||
"sk-antigravity",
|
||||
);
|
||||
key.name = "quota-key".to_string();
|
||||
@@ -1008,7 +1008,7 @@ async fn gateway_includes_pool_quota_and_compat_fields_in_list_keys_response() {
|
||||
let mut key = sample_key(
|
||||
"key-antigravity-oauth",
|
||||
"provider-antigravity",
|
||||
"gemini:chat",
|
||||
"gemini:generate_content",
|
||||
"oauth-placeholder",
|
||||
);
|
||||
key.name = "quota key".to_string();
|
||||
@@ -1133,7 +1133,7 @@ async fn gateway_prefers_status_snapshot_antigravity_quota_over_stale_metadata()
|
||||
let mut key = sample_key(
|
||||
"key-antigravity-snapshot-fresh",
|
||||
"provider-antigravity",
|
||||
"gemini:chat",
|
||||
"gemini:generate_content",
|
||||
"oauth-placeholder",
|
||||
);
|
||||
key.name = "antigravity snapshot fresh".to_string();
|
||||
@@ -1248,7 +1248,7 @@ async fn gateway_renders_gemini_cli_account_quota_from_status_snapshot() {
|
||||
let mut key = sample_key(
|
||||
"key-gemini-cli-snapshot",
|
||||
"provider-gemini-cli",
|
||||
"gemini:chat",
|
||||
"gemini:generate_content",
|
||||
"oauth-placeholder",
|
||||
);
|
||||
key.name = "gemini cli snapshot".to_string();
|
||||
@@ -1700,7 +1700,7 @@ async fn gateway_marks_exhausted_kiro_pool_key_as_blocked_when_flag_enabled() {
|
||||
let mut key = sample_key(
|
||||
"key-kiro-exhausted",
|
||||
"provider-kiro",
|
||||
"claude:cli",
|
||||
"claude:messages",
|
||||
"oauth-placeholder",
|
||||
);
|
||||
key.name = "kiro exhausted".to_string();
|
||||
@@ -1773,7 +1773,7 @@ async fn gateway_prefers_status_snapshot_kiro_quota_over_stale_metadata() {
|
||||
let mut key = sample_key(
|
||||
"key-kiro-snapshot-fresh",
|
||||
"provider-kiro",
|
||||
"claude:cli",
|
||||
"claude:messages",
|
||||
"oauth-placeholder",
|
||||
);
|
||||
key.name = "kiro snapshot fresh".to_string();
|
||||
|
||||
@@ -980,7 +980,7 @@ async fn gateway_handles_admin_provider_query_test_model_for_kiro_locally() {
|
||||
assert_eq!(plan.provider_id, "provider-kiro");
|
||||
assert_eq!(plan.endpoint_id, "endpoint-kiro-cli");
|
||||
assert_eq!(plan.key_id, "key-kiro-primary");
|
||||
assert_eq!(plan.provider_api_format, "claude:cli");
|
||||
assert_eq!(plan.provider_api_format, "claude:messages");
|
||||
assert_eq!(plan.model_name.as_deref(), Some("claude-sonnet-4-upstream"));
|
||||
Json(json!({
|
||||
"request_id": plan.request_id,
|
||||
@@ -1011,7 +1011,7 @@ async fn gateway_handles_admin_provider_query_test_model_for_kiro_locally() {
|
||||
let mut key = sample_key(
|
||||
"key-kiro-primary",
|
||||
"provider-kiro",
|
||||
"claude:cli",
|
||||
"claude:messages",
|
||||
"__placeholder__",
|
||||
);
|
||||
key.auth_type = "oauth".to_string();
|
||||
@@ -1038,9 +1038,9 @@ async fn gateway_handles_admin_provider_query_test_model_for_kiro_locally() {
|
||||
vec![StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-kiro-cli".to_string(),
|
||||
"provider-kiro".to_string(),
|
||||
"claude:cli".to_string(),
|
||||
"claude:messages".to_string(),
|
||||
Some("claude".to_string()),
|
||||
Some("cli".to_string()),
|
||||
Some("messages".to_string()),
|
||||
true,
|
||||
)
|
||||
.expect("endpoint should build")
|
||||
@@ -1076,7 +1076,7 @@ async fn gateway_handles_admin_provider_query_test_model_for_kiro_locally() {
|
||||
.json(&json!({
|
||||
"provider_id": "provider-kiro",
|
||||
"model_name": "claude-sonnet-4-upstream",
|
||||
"api_format": "claude:cli"
|
||||
"api_format": "claude:messages"
|
||||
}))
|
||||
.send()
|
||||
.await
|
||||
@@ -1148,7 +1148,7 @@ async fn gateway_handles_admin_provider_query_test_model_failover_for_kiro_local
|
||||
let mut provider = sample_provider("provider-kiro", "Kiro", 10);
|
||||
provider.provider_type = "kiro".to_string();
|
||||
let build_key = |id: &str| {
|
||||
let mut key = sample_key(id, "provider-kiro", "claude:cli", "__placeholder__");
|
||||
let mut key = sample_key(id, "provider-kiro", "claude:messages", "__placeholder__");
|
||||
key.auth_type = "oauth".to_string();
|
||||
key.encrypted_auth_config = Some(
|
||||
aether_crypto::encrypt_python_fernet_plaintext(
|
||||
@@ -1175,9 +1175,9 @@ async fn gateway_handles_admin_provider_query_test_model_failover_for_kiro_local
|
||||
vec![StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-kiro-cli".to_string(),
|
||||
"provider-kiro".to_string(),
|
||||
"claude:cli".to_string(),
|
||||
"claude:messages".to_string(),
|
||||
Some("claude".to_string()),
|
||||
Some("cli".to_string()),
|
||||
Some("messages".to_string()),
|
||||
true,
|
||||
)
|
||||
.expect("endpoint should build")
|
||||
@@ -1217,7 +1217,7 @@ async fn gateway_handles_admin_provider_query_test_model_failover_for_kiro_local
|
||||
"mode": "direct",
|
||||
"model_name": "claude-sonnet-4-upstream",
|
||||
"failover_models": ["claude-sonnet-4-upstream"],
|
||||
"api_format": "claude:cli",
|
||||
"api_format": "claude:messages",
|
||||
"request_id": "provider-test-kiro"
|
||||
}))
|
||||
.send()
|
||||
@@ -1295,7 +1295,7 @@ async fn gateway_retries_kiro_failover_after_http_error_without_message() {
|
||||
let mut provider = sample_provider("provider-kiro", "Kiro", 10);
|
||||
provider.provider_type = "kiro".to_string();
|
||||
let build_key = |id: &str| {
|
||||
let mut key = sample_key(id, "provider-kiro", "claude:cli", "__placeholder__");
|
||||
let mut key = sample_key(id, "provider-kiro", "claude:messages", "__placeholder__");
|
||||
key.auth_type = "oauth".to_string();
|
||||
key.encrypted_auth_config = Some(
|
||||
aether_crypto::encrypt_python_fernet_plaintext(
|
||||
@@ -1322,9 +1322,9 @@ async fn gateway_retries_kiro_failover_after_http_error_without_message() {
|
||||
vec![StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-kiro-cli".to_string(),
|
||||
"provider-kiro".to_string(),
|
||||
"claude:cli".to_string(),
|
||||
"claude:messages".to_string(),
|
||||
Some("claude".to_string()),
|
||||
Some("cli".to_string()),
|
||||
Some("messages".to_string()),
|
||||
true,
|
||||
)
|
||||
.expect("endpoint should build")
|
||||
@@ -1364,7 +1364,7 @@ async fn gateway_retries_kiro_failover_after_http_error_without_message() {
|
||||
"mode": "direct",
|
||||
"model_name": "claude-sonnet-4-upstream",
|
||||
"failover_models": ["claude-sonnet-4-upstream"],
|
||||
"api_format": "claude:cli",
|
||||
"api_format": "claude:messages",
|
||||
"request_id": "provider-test-kiro-empty-error"
|
||||
}))
|
||||
.send()
|
||||
@@ -1677,13 +1677,13 @@ async fn gateway_returns_stub_for_transport_unsupported_non_kiro_provider() {
|
||||
vec![sample_endpoint(
|
||||
"endpoint-antigravity-gemini",
|
||||
"provider-antigravity",
|
||||
"gemini:chat",
|
||||
"gemini:generate_content",
|
||||
"https://cloudcode-pa.googleapis.com",
|
||||
)],
|
||||
vec![sample_key(
|
||||
"key-antigravity-gemini",
|
||||
"provider-antigravity",
|
||||
"gemini:chat",
|
||||
"gemini:generate_content",
|
||||
"sk-test-antigravity",
|
||||
)],
|
||||
));
|
||||
@@ -1707,7 +1707,7 @@ async fn gateway_returns_stub_for_transport_unsupported_non_kiro_provider() {
|
||||
.json(&json!({
|
||||
"provider_id": "provider-antigravity",
|
||||
"model": "gemini-2.5-pro",
|
||||
"api_format": "gemini:chat"
|
||||
"api_format": "gemini:generate_content"
|
||||
}))
|
||||
.send()
|
||||
.await
|
||||
@@ -1969,7 +1969,7 @@ async fn gateway_prefers_supported_non_kiro_endpoint_with_compatible_key_when_ap
|
||||
sample_endpoint(
|
||||
"endpoint-gemini-chat",
|
||||
"provider-openai",
|
||||
"gemini:chat",
|
||||
"gemini:generate_content",
|
||||
"https://api.gemini.example",
|
||||
),
|
||||
sample_endpoint(
|
||||
@@ -2315,7 +2315,7 @@ async fn gateway_handles_claude_cli_test_model_locally() {
|
||||
assert_eq!(plan.provider_id, "provider-claude");
|
||||
assert_eq!(plan.endpoint_id, "endpoint-claude-cli");
|
||||
assert_eq!(plan.key_id, "key-claude-cli");
|
||||
assert_eq!(plan.provider_api_format, "claude:cli");
|
||||
assert_eq!(plan.provider_api_format, "claude:messages");
|
||||
assert_eq!(plan.url, "https://api.anthropic.example/v1/messages");
|
||||
assert_eq!(plan.model_name.as_deref(), Some("claude-sonnet-4-5"));
|
||||
Json(json!({
|
||||
@@ -2351,13 +2351,13 @@ async fn gateway_handles_claude_cli_test_model_locally() {
|
||||
vec![sample_endpoint(
|
||||
"endpoint-claude-cli",
|
||||
"provider-claude",
|
||||
"claude:cli",
|
||||
"claude:messages",
|
||||
"https://api.anthropic.example",
|
||||
)],
|
||||
vec![sample_key(
|
||||
"key-claude-cli",
|
||||
"provider-claude",
|
||||
"claude:cli",
|
||||
"claude:messages",
|
||||
"sk-test-claude-cli",
|
||||
)],
|
||||
));
|
||||
@@ -2380,7 +2380,7 @@ async fn gateway_handles_claude_cli_test_model_locally() {
|
||||
.json(&json!({
|
||||
"provider_id": "provider-claude",
|
||||
"model": "claude-sonnet-4-5",
|
||||
"api_format": "claude:cli"
|
||||
"api_format": "claude:messages"
|
||||
}))
|
||||
.send()
|
||||
.await
|
||||
@@ -2404,7 +2404,7 @@ async fn gateway_uses_compatible_claude_cli_endpoint_when_api_format_is_omitted(
|
||||
"/v1/execute/sync",
|
||||
any(move |Json(plan): Json<ExecutionPlan>| async move {
|
||||
assert_eq!(plan.endpoint_id, "endpoint-claude-cli");
|
||||
assert_eq!(plan.provider_api_format, "claude:cli");
|
||||
assert_eq!(plan.provider_api_format, "claude:messages");
|
||||
assert_eq!(plan.key_id, "key-claude-cli");
|
||||
Json(json!({
|
||||
"request_id": plan.request_id,
|
||||
@@ -2439,13 +2439,13 @@ async fn gateway_uses_compatible_claude_cli_endpoint_when_api_format_is_omitted(
|
||||
vec![sample_endpoint(
|
||||
"endpoint-claude-cli",
|
||||
"provider-claude",
|
||||
"claude:cli",
|
||||
"claude:messages",
|
||||
"https://api.anthropic.example",
|
||||
)],
|
||||
vec![sample_key(
|
||||
"key-claude-cli",
|
||||
"provider-claude",
|
||||
"claude:cli",
|
||||
"claude:messages",
|
||||
"sk-test-claude-cli",
|
||||
)],
|
||||
));
|
||||
@@ -2493,7 +2493,7 @@ async fn gateway_handles_claude_cli_test_model_failover_locally() {
|
||||
assert_eq!(plan.provider_id, "provider-claude");
|
||||
assert_eq!(plan.endpoint_id, "endpoint-claude-cli");
|
||||
assert_eq!(plan.key_id, "key-claude-cli");
|
||||
assert_eq!(plan.provider_api_format, "claude:cli");
|
||||
assert_eq!(plan.provider_api_format, "claude:messages");
|
||||
assert_eq!(plan.model_name.as_deref(), Some("claude-sonnet-4-5"));
|
||||
Json(json!({
|
||||
"request_id": plan.request_id,
|
||||
@@ -2528,13 +2528,13 @@ async fn gateway_handles_claude_cli_test_model_failover_locally() {
|
||||
vec![sample_endpoint(
|
||||
"endpoint-claude-cli",
|
||||
"provider-claude",
|
||||
"claude:cli",
|
||||
"claude:messages",
|
||||
"https://api.anthropic.example",
|
||||
)],
|
||||
vec![sample_key(
|
||||
"key-claude-cli",
|
||||
"provider-claude",
|
||||
"claude:cli",
|
||||
"claude:messages",
|
||||
"sk-test-claude-cli",
|
||||
)],
|
||||
));
|
||||
@@ -2559,7 +2559,7 @@ async fn gateway_handles_claude_cli_test_model_failover_locally() {
|
||||
.json(&json!({
|
||||
"provider_id": "provider-claude",
|
||||
"failover_models": ["claude-sonnet-4-5"],
|
||||
"api_format": "claude:cli"
|
||||
"api_format": "claude:messages"
|
||||
}))
|
||||
.send()
|
||||
.await
|
||||
@@ -2586,7 +2586,7 @@ async fn gateway_handles_gemini_cli_test_model_locally() {
|
||||
assert_eq!(plan.provider_id, "provider-gemini");
|
||||
assert_eq!(plan.endpoint_id, "endpoint-gemini-cli");
|
||||
assert_eq!(plan.key_id, "key-gemini-cli");
|
||||
assert_eq!(plan.provider_api_format, "gemini:cli");
|
||||
assert_eq!(plan.provider_api_format, "gemini:generate_content");
|
||||
assert_eq!(
|
||||
plan.url,
|
||||
"https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-pro:generateContent"
|
||||
@@ -2625,13 +2625,13 @@ async fn gateway_handles_gemini_cli_test_model_locally() {
|
||||
vec![sample_endpoint(
|
||||
"endpoint-gemini-cli",
|
||||
"provider-gemini",
|
||||
"gemini:cli",
|
||||
"gemini:generate_content",
|
||||
"https://generativelanguage.googleapis.com",
|
||||
)],
|
||||
vec![sample_key(
|
||||
"key-gemini-cli",
|
||||
"provider-gemini",
|
||||
"gemini:cli",
|
||||
"gemini:generate_content",
|
||||
"sk-test-gemini-cli",
|
||||
)],
|
||||
));
|
||||
@@ -2654,7 +2654,7 @@ async fn gateway_handles_gemini_cli_test_model_locally() {
|
||||
.json(&json!({
|
||||
"provider_id": "provider-gemini",
|
||||
"model": "gemini-2.5-pro",
|
||||
"api_format": "gemini:cli"
|
||||
"api_format": "gemini:generate_content"
|
||||
}))
|
||||
.send()
|
||||
.await
|
||||
@@ -2680,7 +2680,7 @@ async fn gateway_handles_gemini_cli_test_model_with_oauth_header_fallback() {
|
||||
assert_eq!(plan.provider_id, "provider-gemini");
|
||||
assert_eq!(plan.endpoint_id, "endpoint-gemini-cli");
|
||||
assert_eq!(plan.key_id, "key-gemini-cli");
|
||||
assert_eq!(plan.provider_api_format, "gemini:cli");
|
||||
assert_eq!(plan.provider_api_format, "gemini:generate_content");
|
||||
assert_eq!(
|
||||
plan.url,
|
||||
"https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-pro:generateContent"
|
||||
@@ -2721,7 +2721,7 @@ async fn gateway_handles_gemini_cli_test_model_with_oauth_header_fallback() {
|
||||
let mut key = sample_key(
|
||||
"key-gemini-cli",
|
||||
"provider-gemini",
|
||||
"gemini:cli",
|
||||
"gemini:generate_content",
|
||||
"cached-gemini-cli-token",
|
||||
);
|
||||
key.auth_type = "oauth".to_string();
|
||||
@@ -2737,7 +2737,7 @@ async fn gateway_handles_gemini_cli_test_model_with_oauth_header_fallback() {
|
||||
vec![sample_endpoint(
|
||||
"endpoint-gemini-cli",
|
||||
"provider-gemini",
|
||||
"gemini:cli",
|
||||
"gemini:generate_content",
|
||||
"https://generativelanguage.googleapis.com",
|
||||
)],
|
||||
vec![key],
|
||||
@@ -2761,7 +2761,7 @@ async fn gateway_handles_gemini_cli_test_model_with_oauth_header_fallback() {
|
||||
.json(&json!({
|
||||
"provider_id": "provider-gemini",
|
||||
"model": "gemini-2.5-pro",
|
||||
"api_format": "gemini:cli"
|
||||
"api_format": "gemini:generate_content"
|
||||
}))
|
||||
.send()
|
||||
.await
|
||||
@@ -2785,7 +2785,7 @@ async fn gateway_uses_compatible_gemini_cli_endpoint_when_api_format_is_omitted(
|
||||
"/v1/execute/sync",
|
||||
any(move |Json(plan): Json<ExecutionPlan>| async move {
|
||||
assert_eq!(plan.endpoint_id, "endpoint-gemini-cli");
|
||||
assert_eq!(plan.provider_api_format, "gemini:cli");
|
||||
assert_eq!(plan.provider_api_format, "gemini:generate_content");
|
||||
assert_eq!(plan.key_id, "key-gemini-cli");
|
||||
Json(json!({
|
||||
"request_id": plan.request_id,
|
||||
@@ -2820,13 +2820,13 @@ async fn gateway_uses_compatible_gemini_cli_endpoint_when_api_format_is_omitted(
|
||||
vec![sample_endpoint(
|
||||
"endpoint-gemini-cli",
|
||||
"provider-gemini",
|
||||
"gemini:cli",
|
||||
"gemini:generate_content",
|
||||
"https://generativelanguage.googleapis.com",
|
||||
)],
|
||||
vec![sample_key(
|
||||
"key-gemini-cli",
|
||||
"provider-gemini",
|
||||
"gemini:cli",
|
||||
"gemini:generate_content",
|
||||
"sk-test-gemini-cli",
|
||||
)],
|
||||
));
|
||||
@@ -2874,7 +2874,7 @@ async fn gateway_handles_gemini_cli_test_model_failover_locally() {
|
||||
assert_eq!(plan.provider_id, "provider-gemini");
|
||||
assert_eq!(plan.endpoint_id, "endpoint-gemini-cli");
|
||||
assert_eq!(plan.key_id, "key-gemini-cli");
|
||||
assert_eq!(plan.provider_api_format, "gemini:cli");
|
||||
assert_eq!(plan.provider_api_format, "gemini:generate_content");
|
||||
assert_eq!(plan.model_name.as_deref(), Some("gemini-2.5-pro"));
|
||||
Json(json!({
|
||||
"request_id": plan.request_id,
|
||||
@@ -2909,13 +2909,13 @@ async fn gateway_handles_gemini_cli_test_model_failover_locally() {
|
||||
vec![sample_endpoint(
|
||||
"endpoint-gemini-cli",
|
||||
"provider-gemini",
|
||||
"gemini:cli",
|
||||
"gemini:generate_content",
|
||||
"https://generativelanguage.googleapis.com",
|
||||
)],
|
||||
vec![sample_key(
|
||||
"key-gemini-cli",
|
||||
"provider-gemini",
|
||||
"gemini:cli",
|
||||
"gemini:generate_content",
|
||||
"sk-test-gemini-cli",
|
||||
)],
|
||||
));
|
||||
@@ -2940,7 +2940,7 @@ async fn gateway_handles_gemini_cli_test_model_failover_locally() {
|
||||
.json(&json!({
|
||||
"provider_id": "provider-gemini",
|
||||
"failover_models": ["gemini-2.5-pro"],
|
||||
"api_format": "gemini:cli"
|
||||
"api_format": "gemini:generate_content"
|
||||
}))
|
||||
.send()
|
||||
.await
|
||||
|
||||
@@ -585,7 +585,7 @@ async fn gateway_handles_admin_providers_summary_list_locally_with_trusted_admin
|
||||
sample_endpoint(
|
||||
"endpoint-anthropic-chat",
|
||||
"provider-anthropic",
|
||||
"claude:chat",
|
||||
"claude:messages",
|
||||
"https://api.anthropic.example",
|
||||
),
|
||||
],
|
||||
|
||||
@@ -482,9 +482,9 @@ async fn gateway_handles_admin_usage_aggregation_stats_locally_with_trusted_admi
|
||||
);
|
||||
usage_3.provider_id = Some("provider-anthropic".to_string());
|
||||
usage_3.total_tokens = usage_3.input_tokens;
|
||||
usage_3.api_format = Some("claude:cli".to_string());
|
||||
usage_3.api_format = Some("claude:messages".to_string());
|
||||
usage_3.api_family = Some("claude".to_string());
|
||||
usage_3.endpoint_api_format = Some("claude:cli".to_string());
|
||||
usage_3.endpoint_api_format = Some("claude:messages".to_string());
|
||||
usage_3.provider_api_family = Some("claude".to_string());
|
||||
|
||||
let usage_repository = Arc::new(InMemoryUsageReadRepository::seed(vec![
|
||||
@@ -558,7 +558,7 @@ async fn gateway_handles_admin_usage_aggregation_stats_locally_with_trusted_admi
|
||||
assert_eq!(api_format_items.len(), 2);
|
||||
assert_eq!(api_format_items[0]["api_format"], "openai:chat");
|
||||
assert_eq!(api_format_items[0]["output_tokens"], 40);
|
||||
assert_eq!(api_format_items[1]["api_format"], "claude:cli");
|
||||
assert_eq!(api_format_items[1]["api_format"], "claude:messages");
|
||||
assert_eq!(api_format_items[1]["output_tokens"], 20);
|
||||
assert_eq!(*upstream_hits.lock().expect("mutex should lock"), 0);
|
||||
|
||||
|
||||
@@ -462,7 +462,7 @@ async fn gateway_handles_admin_user_detail_routes_locally_with_trusted_admin_pri
|
||||
"username": "alice_updated",
|
||||
"role": "admin",
|
||||
"allowed_providers": ["openai", "anthropic"],
|
||||
"allowed_api_formats": ["openai:chat", "gemini:chat"],
|
||||
"allowed_api_formats": ["openai:chat", "gemini:generate_content"],
|
||||
"allowed_models": ["gpt-4.1", "gemini-2.5-pro"],
|
||||
"rate_limit": 120,
|
||||
"is_active": false,
|
||||
|
||||
@@ -501,7 +501,7 @@ async fn gateway_locally_denies_disallowed_claude_api_format_without_hitting_con
|
||||
assert_eq!(payload["error"]["type"], "http_error");
|
||||
assert_eq!(
|
||||
payload["error"]["message"],
|
||||
"当前密钥不允许访问 claude:chat 格式"
|
||||
"当前密钥不允许访问 claude:messages 格式"
|
||||
);
|
||||
assert_eq!(*auth_context_hits.lock().expect("mutex should lock"), 0);
|
||||
assert_eq!(*public_hits.lock().expect("mutex should lock"), 0);
|
||||
@@ -625,7 +625,7 @@ async fn gateway_locally_denies_disallowed_gemini_model_without_hitting_control_
|
||||
let mut snapshot = sample_currently_usable_auth_snapshot("key-gemini-123", "user-gemini-123");
|
||||
snapshot.api_key_allowed_providers = Some(vec!["gemini".to_string()]);
|
||||
snapshot.user_allowed_providers = Some(vec!["gemini".to_string()]);
|
||||
snapshot.api_key_allowed_api_formats = Some(vec!["gemini:chat".to_string()]);
|
||||
snapshot.api_key_allowed_api_formats = Some(vec!["gemini:generate_content".to_string()]);
|
||||
snapshot.api_key_allowed_models = Some(vec!["gemini-1.5-pro".to_string()]);
|
||||
let repository = Arc::new(InMemoryAuthApiKeySnapshotRepository::seed(vec![(
|
||||
Some(hash_api_key("gemini-client-key-123")),
|
||||
|
||||
@@ -42,7 +42,7 @@ fn sample_auth_snapshot(api_key_id: &str, user_id: &str) -> StoredAuthApiKeySnap
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["gemini"])),
|
||||
Some(serde_json::json!(["gemini:chat"])),
|
||||
Some(serde_json::json!(["gemini:files"])),
|
||||
Some(serde_json::json!(["gemini-2.5-pro"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -53,7 +53,7 @@ fn sample_auth_snapshot(api_key_id: &str, user_id: &str) -> StoredAuthApiKeySnap
|
||||
Some(5),
|
||||
Some(4_102_444_800_i64),
|
||||
Some(serde_json::json!(["gemini"])),
|
||||
Some(serde_json::json!(["gemini:chat"])),
|
||||
Some(serde_json::json!(["gemini:files"])),
|
||||
Some(serde_json::json!(["gemini-2.5-pro"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -67,19 +67,19 @@ fn sample_files_candidate_row() -> StoredMinimalCandidateSelectionRow {
|
||||
provider_priority: 10,
|
||||
provider_is_active: true,
|
||||
endpoint_id: "endpoint-gemini-files-local-1".to_string(),
|
||||
endpoint_api_format: "gemini:chat".to_string(),
|
||||
endpoint_api_format: "gemini:files".to_string(),
|
||||
endpoint_api_family: Some("gemini".to_string()),
|
||||
endpoint_kind: Some("chat".to_string()),
|
||||
endpoint_kind: Some("files".to_string()),
|
||||
endpoint_is_active: true,
|
||||
key_id: "key-gemini-files-local-1".to_string(),
|
||||
key_name: "prod".to_string(),
|
||||
key_auth_type: "api_key".to_string(),
|
||||
key_is_active: true,
|
||||
key_api_formats: Some(vec!["gemini:chat".to_string()]),
|
||||
key_api_formats: Some(vec!["gemini:files".to_string()]),
|
||||
key_allowed_models: None,
|
||||
key_capabilities: Some(serde_json::json!({"gemini_files": true})),
|
||||
key_internal_priority: 5,
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:chat": 1})),
|
||||
key_global_priority_by_format: Some(serde_json::json!({"gemini:files": 1})),
|
||||
model_id: "model-gemini-files-local-1".to_string(),
|
||||
global_model_id: "global-model-gemini-files-local-1".to_string(),
|
||||
global_model_name: "gemini-2.5-pro".to_string(),
|
||||
@@ -89,7 +89,7 @@ fn sample_files_candidate_row() -> StoredMinimalCandidateSelectionRow {
|
||||
model_provider_model_mappings: Some(vec![StoredProviderModelMapping {
|
||||
name: "gemini-2.5-pro-upstream".to_string(),
|
||||
priority: 1,
|
||||
api_formats: Some(vec!["gemini:chat".to_string()]),
|
||||
api_formats: Some(vec!["gemini:files".to_string()]),
|
||||
}]),
|
||||
model_supports_streaming: Some(true),
|
||||
model_is_active: true,
|
||||
@@ -122,9 +122,9 @@ fn sample_files_provider_catalog_endpoint() -> StoredProviderCatalogEndpoint {
|
||||
StoredProviderCatalogEndpoint::new(
|
||||
"endpoint-gemini-files-local-1".to_string(),
|
||||
"provider-gemini-files-local-1".to_string(),
|
||||
"gemini:chat".to_string(),
|
||||
"gemini:files".to_string(),
|
||||
Some("gemini".to_string()),
|
||||
Some("chat".to_string()),
|
||||
Some("files".to_string()),
|
||||
true,
|
||||
)
|
||||
.expect("endpoint should build")
|
||||
@@ -152,12 +152,12 @@ fn sample_files_provider_catalog_key() -> StoredProviderCatalogKey {
|
||||
)
|
||||
.expect("key should build")
|
||||
.with_transport_fields(
|
||||
Some(serde_json::json!(["gemini:chat"])),
|
||||
Some(serde_json::json!(["gemini:files"])),
|
||||
encrypt_python_fernet_plaintext(DEVELOPMENT_ENCRYPTION_KEY, "sk-upstream-gemini-files")
|
||||
.expect("api key should encrypt"),
|
||||
None,
|
||||
Some(serde_json::json!({"gemini_files": true})),
|
||||
Some(serde_json::json!({"gemini:chat": 1})),
|
||||
Some(serde_json::json!({"gemini:files": 1})),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
@@ -416,7 +416,7 @@ async fn gateway_executes_gemini_files_get_via_local_decision_gate_with_local_pl
|
||||
"route_class": "ai_public",
|
||||
"route_family": "gemini",
|
||||
"route_kind": "files",
|
||||
"auth_endpoint_signature": "gemini:chat",
|
||||
"auth_endpoint_signature": "gemini:generate_content",
|
||||
"execution_runtime_candidate": true,
|
||||
"auth_context": {
|
||||
"user_id": "user-files-local-123",
|
||||
|
||||
@@ -44,7 +44,7 @@ async fn gateway_executes_gemini_files_download_via_local_decision_gate_with_loc
|
||||
"route_class": "ai_public",
|
||||
"route_family": "gemini",
|
||||
"route_kind": "files",
|
||||
"auth_endpoint_signature": "gemini:chat",
|
||||
"auth_endpoint_signature": "gemini:generate_content",
|
||||
"execution_runtime_candidate": true,
|
||||
"auth_context": {
|
||||
"user_id": "user-files-download-local-123",
|
||||
|
||||
@@ -44,7 +44,7 @@ async fn gateway_executes_gemini_files_upload_via_local_decision_gate_with_local
|
||||
"route_class": "ai_public",
|
||||
"route_family": "gemini",
|
||||
"route_kind": "files",
|
||||
"auth_endpoint_signature": "gemini:chat",
|
||||
"auth_endpoint_signature": "gemini:generate_content",
|
||||
"execution_runtime_candidate": true,
|
||||
"auth_context": {
|
||||
"user_id": "user-files-upload-local-123",
|
||||
@@ -325,7 +325,7 @@ async fn gateway_executes_gemini_files_list_via_local_decision_gate_with_local_p
|
||||
"route_class": "ai_public",
|
||||
"route_family": "gemini",
|
||||
"route_kind": "files",
|
||||
"auth_endpoint_signature": "gemini:chat",
|
||||
"auth_endpoint_signature": "gemini:generate_content",
|
||||
"execution_runtime_candidate": true,
|
||||
"auth_context": {
|
||||
"user_id": "user-files-list-local-123",
|
||||
@@ -533,7 +533,7 @@ async fn gateway_executes_gemini_files_delete_via_local_decision_gate_with_local
|
||||
"route_class": "ai_public",
|
||||
"route_family": "gemini",
|
||||
"route_kind": "files",
|
||||
"auth_endpoint_signature": "gemini:chat",
|
||||
"auth_endpoint_signature": "gemini:generate_content",
|
||||
"execution_runtime_candidate": true,
|
||||
"auth_context": {
|
||||
"user_id": "user-files-delete-local-123",
|
||||
|
||||
@@ -199,7 +199,7 @@ async fn gateway_handles_public_openai_models_with_cross_format_candidates_witho
|
||||
sample_models_candidate_row(
|
||||
"provider-claude",
|
||||
"claude",
|
||||
"claude:chat",
|
||||
"claude:messages",
|
||||
"claude-3-7-sonnet",
|
||||
10,
|
||||
),
|
||||
@@ -277,14 +277,14 @@ async fn gateway_handles_public_claude_models_without_hitting_fallback_probe() {
|
||||
sample_models_candidate_row(
|
||||
"provider-claude",
|
||||
"claude",
|
||||
"claude:chat",
|
||||
"claude:messages",
|
||||
"claude-3-7-sonnet",
|
||||
10,
|
||||
),
|
||||
sample_models_candidate_row(
|
||||
"provider-claude",
|
||||
"claude",
|
||||
"claude:chat",
|
||||
"claude:messages",
|
||||
"claude-3-5-haiku",
|
||||
10,
|
||||
),
|
||||
@@ -347,14 +347,14 @@ async fn gateway_handles_public_gemini_models_without_hitting_fallback_probe() {
|
||||
sample_models_candidate_row(
|
||||
"provider-gemini",
|
||||
"gemini",
|
||||
"gemini:chat",
|
||||
"gemini:generate_content",
|
||||
"gemini-2.5-flash",
|
||||
10,
|
||||
),
|
||||
sample_models_candidate_row(
|
||||
"provider-gemini",
|
||||
"gemini",
|
||||
"gemini:chat",
|
||||
"gemini:generate_content",
|
||||
"gemini-2.5-pro",
|
||||
10,
|
||||
),
|
||||
|
||||
@@ -720,13 +720,13 @@ async fn gateway_handles_public_catalog_providers_without_proxying_upstream() {
|
||||
sample_endpoint(
|
||||
"endpoint-claude",
|
||||
"provider-claude",
|
||||
"claude:chat",
|
||||
"claude:messages",
|
||||
"https://api.anthropic.example",
|
||||
),
|
||||
sample_endpoint(
|
||||
"endpoint-claude-cli",
|
||||
"provider-claude",
|
||||
"claude:cli",
|
||||
"claude:messages",
|
||||
"https://api.anthropic.example",
|
||||
),
|
||||
],
|
||||
@@ -943,7 +943,7 @@ async fn gateway_handles_public_catalog_stats_without_proxying_upstream() {
|
||||
sample_endpoint(
|
||||
"endpoint-claude",
|
||||
"provider-claude",
|
||||
"claude:chat",
|
||||
"claude:messages",
|
||||
"https://api.anthropic.example",
|
||||
),
|
||||
],
|
||||
@@ -956,7 +956,7 @@ async fn gateway_handles_public_catalog_stats_without_proxying_upstream() {
|
||||
sample_models_candidate_row(
|
||||
"provider-claude",
|
||||
"claude",
|
||||
"claude:chat",
|
||||
"claude:messages",
|
||||
"claude-3-7-sonnet",
|
||||
20,
|
||||
),
|
||||
@@ -989,7 +989,7 @@ async fn gateway_handles_public_catalog_stats_without_proxying_upstream() {
|
||||
assert_eq!(payload["active_models"], 3);
|
||||
assert_eq!(
|
||||
payload["supported_formats"],
|
||||
json!(["claude:chat", "openai:chat"])
|
||||
json!(["claude:messages", "openai:chat"])
|
||||
);
|
||||
assert_eq!(*upstream_hits.lock().expect("mutex should lock"), 0);
|
||||
|
||||
@@ -1078,7 +1078,7 @@ async fn gateway_handles_public_health_api_formats_without_proxying_upstream() {
|
||||
sample_endpoint(
|
||||
"endpoint-claude",
|
||||
"provider-claude",
|
||||
"claude:chat",
|
||||
"claude:messages",
|
||||
"https://api.anthropic.example",
|
||||
),
|
||||
],
|
||||
@@ -1158,7 +1158,7 @@ async fn gateway_handles_public_health_api_formats_without_proxying_upstream() {
|
||||
.as_array()
|
||||
.expect("formats should be an array");
|
||||
assert_eq!(formats.len(), 2);
|
||||
assert_eq!(formats[0]["api_format"], "claude:chat");
|
||||
assert_eq!(formats[0]["api_format"], "claude:messages");
|
||||
assert_eq!(formats[0]["api_path"], "/v1/messages");
|
||||
assert_eq!(formats[0]["total_attempts"], 1);
|
||||
assert_eq!(formats[0]["success_rate"], 1.0);
|
||||
@@ -4442,7 +4442,7 @@ async fn gateway_handles_users_me_endpoint_status_locally_without_proxying_upstr
|
||||
sample_endpoint(
|
||||
"endpoint-claude",
|
||||
"provider-claude",
|
||||
"claude:chat",
|
||||
"claude:messages",
|
||||
"https://api.anthropic.example",
|
||||
),
|
||||
],
|
||||
@@ -4456,7 +4456,7 @@ async fn gateway_handles_users_me_endpoint_status_locally_without_proxying_upstr
|
||||
sample_key(
|
||||
"key-claude",
|
||||
"provider-claude",
|
||||
"claude:chat",
|
||||
"claude:messages",
|
||||
"sk-claude-endpoint-status",
|
||||
),
|
||||
],
|
||||
@@ -4540,8 +4540,8 @@ async fn gateway_handles_users_me_endpoint_status_locally_without_proxying_upstr
|
||||
let payload: serde_json::Value = response.json().await.expect("json body should parse");
|
||||
let items = payload.as_array().expect("payload should be an array");
|
||||
assert_eq!(items.len(), 2);
|
||||
assert_eq!(items[0]["api_format"], "claude:chat");
|
||||
assert_eq!(items[0]["display_name"], "Claude Chat");
|
||||
assert_eq!(items[0]["api_format"], "claude:messages");
|
||||
assert_eq!(items[0]["display_name"], "Claude Messages");
|
||||
assert_eq!(items[0]["health_score"], 1.0);
|
||||
assert_eq!(items[0]["timeline"].as_array().map(Vec::len), Some(100));
|
||||
assert!(items[0].get("total_endpoints").is_none());
|
||||
|
||||
@@ -245,8 +245,8 @@ async fn gateway_handles_admin_dashboard_stats_locally_without_proxying_upstream
|
||||
claude_usage.input_tokens = 900;
|
||||
claude_usage.output_tokens = 100;
|
||||
claude_usage.total_tokens = 1_000;
|
||||
claude_usage.api_format = Some("claude:chat".to_string());
|
||||
claude_usage.endpoint_api_format = Some("claude:chat".to_string());
|
||||
claude_usage.api_format = Some("claude:messages".to_string());
|
||||
claude_usage.endpoint_api_format = Some("claude:messages".to_string());
|
||||
claude_usage.cache_creation_input_tokens = 50;
|
||||
claude_usage.cache_creation_ephemeral_5m_input_tokens = 20;
|
||||
claude_usage.cache_creation_ephemeral_1h_input_tokens = 30;
|
||||
|
||||
@@ -824,7 +824,7 @@ async fn gateway_records_failed_usage_for_claude_runtime_miss_without_execution_
|
||||
true,
|
||||
false,
|
||||
Some(serde_json::json!(["claude"])),
|
||||
Some(serde_json::json!(["claude:chat"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-sonnet-4-5"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -835,7 +835,7 @@ async fn gateway_records_failed_usage_for_claude_runtime_miss_without_execution_
|
||||
Some(5),
|
||||
Some(4_102_444_800),
|
||||
Some(serde_json::json!(["claude"])),
|
||||
Some(serde_json::json!(["claude:chat"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["claude-sonnet-4-5"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -974,7 +974,7 @@ async fn gateway_records_failed_usage_for_claude_runtime_miss_without_execution_
|
||||
);
|
||||
assert_eq!(stored_usage.provider_name, "unknown");
|
||||
assert_eq!(stored_usage.model, "claude-sonnet-4-5");
|
||||
assert_eq!(stored_usage.api_format.as_deref(), Some("claude:chat"));
|
||||
assert_eq!(stored_usage.api_format.as_deref(), Some("claude:messages"));
|
||||
assert_eq!(
|
||||
stored_usage.routing_execution_path(),
|
||||
Some("local_execution_runtime_miss")
|
||||
@@ -984,7 +984,7 @@ async fn gateway_records_failed_usage_for_claude_runtime_miss_without_execution_
|
||||
Some("candidate_list_empty")
|
||||
);
|
||||
assert_eq!(stored_usage.routing_route_family(), Some("claude"));
|
||||
assert_eq!(stored_usage.routing_route_kind(), Some("chat"));
|
||||
assert_eq!(stored_usage.routing_route_kind(), Some("messages"));
|
||||
assert_eq!(
|
||||
stored_usage
|
||||
.request_metadata
|
||||
@@ -1369,7 +1369,7 @@ async fn gateway_records_failed_usage_when_all_local_claude_cli_candidates_are_s
|
||||
true,
|
||||
false,
|
||||
None,
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["gpt-5.4"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -1380,7 +1380,7 @@ async fn gateway_records_failed_usage_when_all_local_claude_cli_candidates_are_s
|
||||
Some(5),
|
||||
Some(4_102_444_800),
|
||||
None,
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["gpt-5.4"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
@@ -1595,10 +1595,10 @@ async fn gateway_records_failed_usage_when_all_local_claude_cli_candidates_are_s
|
||||
);
|
||||
assert_eq!(stored_usage.provider_name, "unknown");
|
||||
assert_eq!(stored_usage.model, "gpt-5.4");
|
||||
assert_eq!(stored_usage.api_format.as_deref(), Some("claude:cli"));
|
||||
assert_eq!(stored_usage.api_format.as_deref(), Some("claude:messages"));
|
||||
assert_eq!(
|
||||
stored_usage.endpoint_api_format.as_deref(),
|
||||
Some("claude:cli")
|
||||
Some("claude:messages")
|
||||
);
|
||||
assert_eq!(stored_usage.routing_key_name(), None);
|
||||
assert_eq!(stored_usage.routing_planner_kind(), Some("claude_cli_sync"));
|
||||
@@ -1683,7 +1683,7 @@ async fn gateway_keeps_failed_usage_request_capture_lightweight_for_large_local_
|
||||
true,
|
||||
false,
|
||||
None,
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["gpt-5.4"])),
|
||||
api_key_id.to_string(),
|
||||
Some("default".to_string()),
|
||||
@@ -1694,7 +1694,7 @@ async fn gateway_keeps_failed_usage_request_capture_lightweight_for_large_local_
|
||||
Some(5),
|
||||
Some(4_102_444_800),
|
||||
None,
|
||||
Some(serde_json::json!(["claude:cli"])),
|
||||
Some(serde_json::json!(["claude:messages"])),
|
||||
Some(serde_json::json!(["gpt-5.4"])),
|
||||
)
|
||||
.expect("auth snapshot should build")
|
||||
|
||||
@@ -53,7 +53,7 @@ const OPENAI_SPEC: ProviderSpec = ProviderSpec {
|
||||
const CLAUDE_SPEC: ProviderSpec = ProviderSpec {
|
||||
provider_id: "provider-claude-usage-pricing-1",
|
||||
provider_name: "claude",
|
||||
api_format: "claude:chat",
|
||||
api_format: "claude:messages",
|
||||
endpoint_id: "endpoint-claude-usage-pricing-1",
|
||||
key_id: "key-claude-usage-pricing-1",
|
||||
model_id: "model-claude-usage-pricing-1",
|
||||
@@ -67,7 +67,7 @@ const CLAUDE_SPEC: ProviderSpec = ProviderSpec {
|
||||
const GEMINI_SPEC: ProviderSpec = ProviderSpec {
|
||||
provider_id: "provider-gemini-usage-pricing-1",
|
||||
provider_name: "gemini",
|
||||
api_format: "gemini:chat",
|
||||
api_format: "gemini:generate_content",
|
||||
endpoint_id: "endpoint-gemini-usage-pricing-1",
|
||||
key_id: "key-gemini-usage-pricing-1",
|
||||
model_id: "model-gemini-usage-pricing-1",
|
||||
|
||||
Reference in New Issue
Block a user