centralize openai responses alias handling

This commit is contained in:
fawney19
2026-04-26 23:59:53 +08:00
parent ea3dc3257e
commit 4ec591fbf2
52 changed files with 364 additions and 396 deletions
@@ -110,11 +110,7 @@ fn maybe_bridge_openai_image_sync_json_to_stream(
}
fn normalize_api_format(value: &str) -> String {
match value.trim().to_ascii_lowercase().as_str() {
"openai:cli" => "openai:responses".to_string(),
"openai:compact" => "openai:responses:compact".to_string(),
other => other.to_string(),
}
crate::ai_pipeline::normalize_legacy_openai_format_alias(value)
}
fn is_standard_api_format(value: &str) -> bool {
@@ -176,11 +176,7 @@ pub(crate) async fn rank_eligible_local_execution_candidates(
}
fn normalize_api_format_alias(value: &str) -> String {
match value.trim().to_ascii_lowercase().as_str() {
"openai:cli" => "openai:responses".to_string(),
"openai:compact" => "openai:responses:compact".to_string(),
other => other.to_string(),
}
crate::ai_pipeline::normalize_legacy_openai_format_alias(value)
}
fn api_format_matches(left: &str, right: &str) -> bool {
@@ -322,11 +322,7 @@ fn transport_key_supports_api_format(
}
fn normalize_api_format_alias(value: &str) -> String {
match value.trim().to_ascii_lowercase().as_str() {
"openai:cli" => "openai:responses".to_string(),
"openai:compact" => "openai:responses:compact".to_string(),
other => other.to_string(),
}
crate::ai_pipeline::normalize_legacy_openai_format_alias(value)
}
fn api_format_matches(left: &str, right: &str) -> bool {
@@ -36,10 +36,14 @@ pub(crate) fn resolve_same_format_provider_transport_unsupported_reason_for_trac
transport: &GatewayProviderTransportSnapshot,
provider_api_format: &str,
) -> Option<&'static str> {
let provider_api_format = match provider_api_format.trim().to_ascii_lowercase().as_str() {
let provider_api_format = match crate::ai_pipeline::normalize_legacy_openai_format_alias(
provider_api_format,
)
.as_str()
{
"openai:chat" => "openai:chat",
"openai:responses" | "openai:cli" => "openai:responses",
"openai:responses:compact" | "openai:compact" => "openai:responses:compact",
"openai:responses" => "openai:responses",
"openai:responses:compact" => "openai:responses:compact",
"claude:chat" => "claude:chat",
"claude:cli" => "claude:cli",
"gemini:chat" => "gemini:chat",
@@ -162,10 +162,11 @@ pub(crate) async fn resolve_local_openai_responses_candidate_payload_parts(
let direct_auth = if kiro_auth.is_some() {
None
} else if same_format {
match provider_api_format {
match crate::ai_pipeline::normalize_legacy_openai_format_alias(provider_api_format).as_str()
{
"gemini:cli" => resolve_local_gemini_auth(transport),
"claude:cli" => resolve_local_standard_auth(transport),
"openai:responses" | "openai:responses:compact" | "openai:cli" | "openai:compact" => {
"openai:responses" | "openai:responses:compact" => {
resolve_local_openai_bearer_auth(transport)
}
_ => None,
@@ -535,15 +536,7 @@ pub(crate) async fn resolve_local_openai_responses_candidate_payload_parts(
}
fn api_format_alias_matches(left: &str, right: &str) -> bool {
normalize_api_format_alias(left) == normalize_api_format_alias(right)
}
fn normalize_api_format_alias(value: &str) -> String {
match value.trim().to_ascii_lowercase().as_str() {
"openai:cli" => "openai:responses".to_string(),
"openai:compact" => "openai:responses:compact".to_string(),
other => other.to_string(),
}
crate::ai_pipeline::legacy_openai_format_alias_matches(left, right)
}
#[allow(clippy::too_many_arguments)]
@@ -340,15 +340,7 @@ pub(crate) async fn materialize_local_openai_responses_candidate_attempts(
}
fn api_format_alias_matches(left: &str, right: &str) -> bool {
normalize_api_format_alias(left) == normalize_api_format_alias(right)
}
fn normalize_api_format_alias(value: &str) -> String {
match value.trim().to_ascii_lowercase().as_str() {
"openai:cli" => "openai:responses".to_string(),
"openai:compact" => "openai:responses:compact".to_string(),
other => other.to_string(),
}
crate::ai_pipeline::legacy_openai_format_alias_matches(left, right)
}
pub(crate) async fn mark_skipped_local_openai_responses_candidate(
state: &AppState,
@@ -71,11 +71,7 @@ fn diagnose_request_body_build_failure(
}
fn is_openai_responses_client_format(client_api_format: &str) -> bool {
let normalized = client_api_format.trim().to_ascii_lowercase();
matches!(
normalized.as_str(),
"openai:responses" | "openai:responses:compact" | "openai:cli" | "openai:compact"
)
crate::ai_pipeline::is_openai_responses_family_format(client_api_format)
}
fn diagnose_same_format_provider_request_body_failure(
@@ -26,8 +26,9 @@ pub(crate) use aether_ai_pipeline::api::{
find_kiro_real_thinking_end_tag_at_buffer_end, find_kiro_real_thinking_start_tag,
force_upstream_streaming_for_provider, generic_decision_missing_exact_provider_request,
implicit_sync_finalize_report_kind, is_core_error_finalize_kind, is_matching_stream_request,
kiro_crc32, map_claude_stop_reason, map_openai_reasoning_effort_to_claude_output,
map_openai_reasoning_effort_to_gemini_budget,
is_openai_responses_family_format, is_openai_responses_format, kiro_crc32,
legacy_openai_format_alias_matches, map_claude_stop_reason,
map_openai_reasoning_effort_to_claude_output, map_openai_reasoning_effort_to_gemini_budget,
maybe_build_openai_chat_cross_format_sync_product_from_normalized_payload,
maybe_build_openai_responses_cross_format_sync_product_from_normalized_payload,
maybe_build_openai_responses_same_family_sync_body_from_normalized_payload,
@@ -36,7 +37,7 @@ pub(crate) use aether_ai_pipeline::api::{
maybe_build_standard_same_format_sync_body_from_normalized_payload,
maybe_build_standard_sync_finalize_product_from_normalized_payload,
normalize_claude_request_to_openai_chat_request,
normalize_gemini_request_to_openai_chat_request,
normalize_gemini_request_to_openai_chat_request, normalize_legacy_openai_format_alias,
normalize_openai_responses_request_to_openai_chat_request,
normalize_provider_private_report_context, normalize_provider_private_response_value,
normalize_standard_request_to_openai_chat_request, parse_direct_request_body,