Normalize canonical API formats

This commit is contained in:
fawney19
2026-04-29 09:25:19 +08:00
parent 02ad67fe33
commit 07a319259b
171 changed files with 2460 additions and 1962 deletions

View File

@@ -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 请求无法在本地执行:没有匹配到可用的执行路径",
)

View File

@@ -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,

View File

@@ -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,

View File

@@ -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"})),

View File

@@ -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,

View File

@@ -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,

View File

@@ -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,
)

View File

@@ -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"})),

View File

@@ -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",

View File

@@ -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,

View File

@@ -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,

View File

@@ -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(

View File

@@ -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",

View File

@@ -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"})),

View File

@@ -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")

View File

@@ -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,

View File

@@ -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,

View File

@@ -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"})),

View File

@@ -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,",
] {

View File

@@ -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")
);
}

View File

@@ -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"));

View File

@@ -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();

View File

@@ -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],

View File

@@ -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,

View File

@@ -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();

View File

@@ -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

View File

@@ -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",
),
],

View File

@@ -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);

View File

@@ -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,

View File

@@ -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")),

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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,
),

View File

@@ -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());

View File

@@ -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;

View File

@@ -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")

View File

@@ -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",