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

@@ -713,13 +713,17 @@ fn detect_kiro_web_search_request(
{
return None;
}
if !plan.stream || !plan.provider_api_format.eq_ignore_ascii_case("claude:cli") {
if !plan.stream
|| !plan
.provider_api_format
.eq_ignore_ascii_case("claude:messages")
{
return None;
}
if report_context
.and_then(|context| context.get("client_api_format"))
.and_then(Value::as_str)
.is_some_and(|value| !value.eq_ignore_ascii_case("claude:cli"))
.is_some_and(|value| !value.eq_ignore_ascii_case("claude:messages"))
{
return None;
}
@@ -1200,8 +1204,8 @@ mod tests {
content_encoding: None,
body: RequestBody::from_json(body),
stream: true,
client_api_format: "claude:cli".to_string(),
provider_api_format: "claude:cli".to_string(),
client_api_format: "claude:messages".to_string(),
provider_api_format: "claude:messages".to_string(),
model_name: Some("claude-sonnet-4.6".to_string()),
proxy: None,
tls_profile: None,
@@ -1227,7 +1231,7 @@ mod tests {
let plan = sample_plan(json!({"conversationState": {}}));
let report_context = json!({
"envelope_name": "kiro:generateAssistantResponse",
"client_api_format": "claude:cli",
"client_api_format": "claude:messages",
"original_request_body": {
"model": "claude-haiku-4-5-20251001",
"messages": [{
@@ -1274,7 +1278,7 @@ mod tests {
}));
let report_context = json!({
"envelope_name": "kiro:generateAssistantResponse",
"client_api_format": "claude:cli"
"client_api_format": "claude:messages"
});
let detected = detect_kiro_web_search_request(&plan, Some(&report_context))

View File

@@ -272,17 +272,17 @@ mod tests {
#[test]
fn execution_contract_helper_appends_unified_fields() {
let value = append_execution_contract_fields_to_value(
json!({"provider_api_format": "gemini:chat"}),
json!({"provider_api_format": "gemini:generate_content"}),
ExecutionStrategy::LocalCrossFormat,
ConversionMode::Bidirectional,
"openai:chat",
"gemini:chat",
"gemini:generate_content",
);
assert_eq!(value["execution_strategy"], "local_cross_format");
assert_eq!(value["conversion_mode"], "bidirectional");
assert_eq!(value["client_contract"], "openai:chat");
assert_eq!(value["provider_contract"], "gemini:chat");
assert_eq!(value["provider_api_format"], "gemini:chat");
assert_eq!(value["provider_contract"], "gemini:generate_content");
assert_eq!(value["provider_api_format"], "gemini:generate_content");
}
}

View File

@@ -2354,8 +2354,8 @@ mod tests {
assert!(should_skip_direct_finalize_prefetch(
Some("claude_cli_sync_finalize"),
Some("text/event-stream"),
"claude:cli",
"claude:cli",
"claude:messages",
"claude:messages",
false,
false,
));
@@ -2366,8 +2366,8 @@ mod tests {
assert!(should_skip_direct_finalize_prefetch(
Some("claude_cli_sync_finalize"),
None,
"claude:cli",
"claude:cli",
"claude:messages",
"claude:messages",
false,
false,
));
@@ -2378,8 +2378,8 @@ mod tests {
assert!(!should_skip_direct_finalize_prefetch(
Some("claude_cli_sync_finalize"),
Some("application/json"),
"claude:cli",
"claude:cli",
"claude:messages",
"claude:messages",
false,
false,
));
@@ -2391,7 +2391,7 @@ mod tests {
Some("claude_cli_sync_finalize"),
Some("text/event-stream"),
"openai:chat",
"claude:cli",
"claude:messages",
false,
true,
));

View File

@@ -607,7 +607,7 @@ mod tests {
let payload = core_finalize_payload(
"openai_chat_sync_finalize",
"openai:chat",
"claude:chat",
"claude:messages",
200,
json!({
"type": "error",
@@ -647,8 +647,8 @@ mod tests {
async fn maybe_build_local_core_error_response_infers_status_from_gemini_status_text() {
let payload = core_finalize_payload(
"gemini_chat_sync_finalize",
"gemini:chat",
"gemini:chat",
"gemini:generate_content",
"gemini:generate_content",
200,
json!({
"error": {

View File

@@ -187,7 +187,7 @@ fn build_best_effort_local_core_error_body_converts_gemini_chat_error_to_openai_
let payload = core_finalize_payload(
"openai_chat_sync_finalize",
"openai:chat",
"gemini:chat",
"gemini:generate_content",
429,
json!({
"error": {
@@ -222,7 +222,7 @@ fn build_best_effort_local_core_error_body_converts_claude_cli_error_to_openai_r
let payload = core_finalize_payload(
"openai_responses_sync_finalize",
"openai:responses",
"claude:cli",
"claude:messages",
401,
json!({
"type": "error",
@@ -259,7 +259,7 @@ fn build_best_effort_local_core_error_body_converts_sync_errors_across_standard_
core_finalize_payload(
"openai_chat_sync_finalize",
"openai:chat",
"claude:chat",
"claude:messages",
429,
json!({
"type": "error",
@@ -280,7 +280,7 @@ fn build_best_effort_local_core_error_body_converts_sync_errors_across_standard_
"openai chat -> claude chat",
core_finalize_payload(
"claude_chat_sync_finalize",
"claude:chat",
"claude:messages",
"openai:chat",
404,
json!({
@@ -304,7 +304,7 @@ fn build_best_effort_local_core_error_body_converts_sync_errors_across_standard_
"openai chat -> gemini chat",
core_finalize_payload(
"gemini_chat_sync_finalize",
"gemini:chat",
"gemini:generate_content",
"openai:chat",
401,
json!({
@@ -327,7 +327,7 @@ fn build_best_effort_local_core_error_body_converts_sync_errors_across_standard_
core_finalize_payload(
"openai_responses_sync_finalize",
"openai:responses",
"gemini:cli",
"gemini:generate_content",
429,
json!({
"error": {
@@ -349,8 +349,8 @@ fn build_best_effort_local_core_error_body_converts_sync_errors_across_standard_
"gemini cli -> claude cli",
core_finalize_payload(
"claude_cli_sync_finalize",
"claude:cli",
"gemini:cli",
"claude:messages",
"gemini:generate_content",
503,
json!({
"error": {
@@ -372,8 +372,8 @@ fn build_best_effort_local_core_error_body_converts_sync_errors_across_standard_
"claude cli -> gemini cli",
core_finalize_payload(
"gemini_cli_sync_finalize",
"gemini:cli",
"claude:cli",
"gemini:generate_content",
"claude:messages",
404,
json!({
"type": "error",
@@ -410,7 +410,7 @@ fn resolve_local_core_error_response_body_json_parses_body_base64_json_for_cross
{
let mut payload = core_finalize_payload(
"claude_cli_sync_finalize",
"claude:cli",
"claude:messages",
"openai:responses",
401,
json!({}),
@@ -441,7 +441,7 @@ fn resolve_local_core_error_response_body_json_parses_body_base64_json_for_cross
fn resolve_local_core_error_response_body_json_builds_client_error_from_plain_text_body() {
let mut payload = core_finalize_payload(
"claude_cli_sync_finalize",
"claude:cli",
"claude:messages",
"openai:responses",
400,
json!({}),

View File

@@ -1730,8 +1730,8 @@ mod tests {
content_encoding: None,
body: RequestBody::from_json(json!({"model": "claude-3.7-sonnet"})),
stream: false,
client_api_format: "claude:chat".into(),
provider_api_format: "claude:chat".into(),
client_api_format: "claude:messages".into(),
provider_api_format: "claude:messages".into(),
model_name: Some("claude-3.7-sonnet".into()),
proxy: None,
tls_profile: Some("claude_code_nodejs".into()),