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

@@ -103,16 +103,16 @@ pub fn infer_internal_finalize_signature(payload: &GatewaySyncReportRequest) ->
return Some("openai:video".to_string());
}
if report_kind.starts_with("claude_chat_") {
return Some("claude:chat".to_string());
return Some("claude:messages".to_string());
}
if report_kind.starts_with("claude_cli_") {
return Some("claude:cli".to_string());
return Some("claude:messages".to_string());
}
if report_kind.starts_with("gemini_chat_") {
return Some("gemini:chat".to_string());
return Some("gemini:generate_content".to_string());
}
if report_kind.starts_with("gemini_cli_") {
return Some("gemini:cli".to_string());
return Some("gemini:generate_content".to_string());
}
if report_kind.starts_with("gemini_video_") {
return Some("gemini:video".to_string());
@@ -121,7 +121,7 @@ pub fn infer_internal_finalize_signature(payload: &GatewaySyncReportRequest) ->
}
pub fn resolve_internal_finalize_route(signature: &str) -> Option<InternalFinalizeRoute> {
match aether_ai_formats::normalize_legacy_openai_format_alias(signature).as_str() {
match aether_ai_formats::normalize_api_format_alias(signature).as_str() {
"openai:chat" => Some(InternalFinalizeRoute {
public_path: "/v1/chat/completions",
route_family: "openai",
@@ -147,25 +147,15 @@ pub fn resolve_internal_finalize_route(signature: &str) -> Option<InternalFinali
route_family: "openai",
route_kind: "video",
}),
"claude:chat" => Some(InternalFinalizeRoute {
"claude:messages" => Some(InternalFinalizeRoute {
public_path: "/v1/messages",
route_family: "claude",
route_kind: "chat",
route_kind: "messages",
}),
"claude:cli" => Some(InternalFinalizeRoute {
public_path: "/v1/messages",
route_family: "claude",
route_kind: "cli",
}),
"gemini:chat" => Some(InternalFinalizeRoute {
"gemini:generate_content" => Some(InternalFinalizeRoute {
public_path: "/v1beta/models",
route_family: "gemini",
route_kind: "chat",
}),
"gemini:cli" => Some(InternalFinalizeRoute {
public_path: "/v1beta/models",
route_family: "gemini",
route_kind: "cli",
route_kind: "generate_content",
}),
"gemini:video" => Some(InternalFinalizeRoute {
public_path: "/v1beta/models",
@@ -525,10 +515,7 @@ mod tests {
route_kind: "responses:compact",
})
);
assert_eq!(
resolve_internal_finalize_route("openai:compact"),
resolve_internal_finalize_route("openai:responses:compact")
);
assert_eq!(resolve_internal_finalize_route("openai:compact"), None);
assert_eq!(
resolve_internal_finalize_route("gemini:video"),
Some(InternalFinalizeRoute {

View File

@@ -331,7 +331,7 @@ mod tests {
"cache_read_input_tokens": 10
}
}),
"claude:chat",
"claude:messages",
);
assert_eq!(usage.input_tokens, 0);
@@ -411,7 +411,7 @@ mod tests {
"cache_creation_input_tokens": 4,
"cache_read_input_tokens": 1
}),
"claude:chat",
"claude:messages",
);
assert_eq!(usage.input_tokens, 10);
@@ -447,7 +447,7 @@ mod tests {
}
]
}),
"claude:chat",
"claude:messages",
);
assert_eq!(usage.input_tokens, 5);
@@ -474,7 +474,7 @@ mod tests {
}
]
}),
"claude:chat",
"claude:messages",
);
assert_eq!(usage.input_tokens, 5);
@@ -492,7 +492,7 @@ mod tests {
"cache_read_input_tokens": 52873,
"output_tokens": 973
}),
"claude:chat",
"claude:messages",
);
assert_eq!(usage.input_tokens, 4941);
@@ -520,7 +520,7 @@ mod tests {
},
"service_tier": "standard"
}),
"claude:chat",
"claude:messages",
);
assert_eq!(usage.input_tokens, 2095);
@@ -544,7 +544,7 @@ mod tests {
"cache_creation_input_tokens": 5191,
"cache_read_input_tokens": 97634
}),
"claude:chat",
"claude:messages",
);
assert_eq!(usage.input_tokens, 1);
@@ -565,7 +565,7 @@ mod tests {
"cachedContentTokenCount": 2
}
}),
"gemini:chat",
"gemini:generate_content",
);
assert_eq!(usage.input_tokens, 14);
@@ -596,7 +596,7 @@ mod tests {
}
]
}),
"gemini:chat",
"gemini:generate_content",
);
assert_eq!(usage.input_tokens, 14);

View File

@@ -2453,7 +2453,7 @@ mod tests {
"messages": [{"role": "user", "content": "hello"}]
})),
stream: false,
client_api_format: "claude:cli".to_string(),
client_api_format: "claude:messages".to_string(),
provider_api_format: "openai:responses".to_string(),
model_name: Some("gpt-5.4".to_string()),
proxy: None,
@@ -2561,7 +2561,7 @@ mod tests {
content_encoding: None,
body: RequestBody::from_json(json!({"model": "gpt-5.4"})),
stream: true,
client_api_format: "claude:cli".to_string(),
client_api_format: "claude:messages".to_string(),
provider_api_format: "openai:responses".to_string(),
model_name: Some("gpt-5.4".to_string()),
proxy: None,
@@ -2618,7 +2618,7 @@ mod tests {
content_encoding: None,
body: RequestBody::from_json(json!({"model": "gpt-5.4"})),
stream: false,
client_api_format: "claude:cli".to_string(),
client_api_format: "claude:messages".to_string(),
provider_api_format: "openai:responses".to_string(),
model_name: Some("gpt-5.4".to_string()),
proxy: None,
@@ -2629,7 +2629,7 @@ mod tests {
trace_id: "trace-sync-usage-deep-1".to_string(),
report_kind: "claude_cli_sync_success".to_string(),
report_context: Some(json!({
"client_api_format": "claude:cli",
"client_api_format": "claude:messages",
"provider_api_format": "openai:responses",
"needs_conversion": true,
"original_request_body": nested,
@@ -3078,7 +3078,7 @@ mod tests {
},
stream: false,
client_api_format: "openai:chat".to_string(),
provider_api_format: "gemini:chat".to_string(),
provider_api_format: "gemini:generate_content".to_string(),
model_name: Some("gpt-5".to_string()),
proxy: None,
tls_profile: None,
@@ -3089,7 +3089,7 @@ mod tests {
report_kind: "openai_chat_sync_success".to_string(),
report_context: Some(json!({
"client_api_format": "openai:chat",
"provider_api_format": "gemini:chat",
"provider_api_format": "gemini:generate_content",
"needs_conversion": true
})),
status_code: 200,
@@ -3293,7 +3293,7 @@ mod tests {
},
stream: false,
client_api_format: "openai:chat".to_string(),
provider_api_format: "gemini:chat".to_string(),
provider_api_format: "gemini:generate_content".to_string(),
model_name: Some("gpt-5".to_string()),
proxy: None,
tls_profile: None,
@@ -3304,7 +3304,7 @@ mod tests {
report_kind: "openai_chat_sync_success".to_string(),
report_context: Some(json!({
"client_api_format": "openai:chat",
"provider_api_format": "gemini:chat",
"provider_api_format": "gemini:generate_content",
"needs_conversion": true
})),
status_code: 200,
@@ -3579,7 +3579,7 @@ mod tests {
"input": [{"role": "user", "content": "provider-side compiled body"}],
})),
stream: false,
client_api_format: "claude:cli".to_string(),
client_api_format: "claude:messages".to_string(),
provider_api_format: "openai:responses".to_string(),
model_name: Some("gpt-5.4".to_string()),
proxy: None,
@@ -3590,7 +3590,7 @@ mod tests {
trace_id: "trace-sync-no-client-echo-1".to_string(),
report_kind: "claude_cli_sync_success".to_string(),
report_context: Some(json!({
"client_api_format": "claude:cli",
"client_api_format": "claude:messages",
"provider_api_format": "openai:responses",
"needs_conversion": true,
"original_request_body": null,
@@ -3633,7 +3633,7 @@ mod tests {
content_encoding: None,
body: RequestBody::from_json(json!({"model": "gpt-5.4"})),
stream: false,
client_api_format: "claude:cli".to_string(),
client_api_format: "claude:messages".to_string(),
provider_api_format: "openai:responses".to_string(),
model_name: Some("gpt-5.4".to_string()),
proxy: None,
@@ -3644,7 +3644,7 @@ mod tests {
trace_id: "trace-sync-null-error-1".to_string(),
report_kind: "claude_cli_sync_success".to_string(),
report_context: Some(json!({
"client_api_format": "claude:cli",
"client_api_format": "claude:messages",
"provider_api_format": "openai:responses",
"needs_conversion": true,
})),