fix(ai-serving): route provider-aware normalization through root seams

Move Antigravity schema-preservation policy into the format crate and expose provider-aware Chat and Responses builders through the existing gateway root seam. Preserve legacy conversion and scoped Responses history behavior without weakening architecture tests.

Validated: 61 standalone architecture tests, 947 format tests, 527 transport tests, 2 actual-source planner tests, and gateway cargo check.
This commit is contained in:
wangpengxiang
2026-09-17 15:38:27 +08:00
parent 5a55116b62
commit 4124749a7d
6 changed files with 248 additions and 41 deletions
@@ -4,7 +4,7 @@ use crate::ai_serving::transport::apply_standard_provider_request_body_rules_wit
use crate::ai_serving::{
apply_codex_openai_responses_chat_body_edits,
apply_openai_responses_compact_special_body_edits,
build_cross_format_openai_chat_request_body_with_model_directives as surface_build_cross_format_openai_chat_request_body,
build_cross_format_openai_chat_request_body_with_provider_context as surface_build_cross_format_openai_chat_request_body,
build_local_openai_chat_request_body_with_model_directives as surface_build_local_openai_chat_request_body,
GatewayProviderTransportSnapshot,
};
@@ -70,23 +70,15 @@ pub(crate) fn build_cross_format_openai_chat_request_body(
request_headers: &http::HeaderMap,
enable_model_directives: bool,
) -> Option<Value> {
let provider_request_body = if provider_type.trim().eq_ignore_ascii_case("antigravity")
&& aether_ai_formats::normalize_api_format_alias(provider_api_format)
== "gemini:generate_content"
{
aether_ai_formats::formats::shared::standard_matrix::build_standard_request_body_with_model_directives(
body_json, "openai:chat", mapped_model, provider_type, provider_api_format,
"", upstream_is_stream, None, user_api_key_id, enable_model_directives,
)?
} else {
surface_build_cross_format_openai_chat_request_body(
body_json,
mapped_model,
provider_api_format,
upstream_is_stream,
enable_model_directives,
)?
};
let provider_request_body = surface_build_cross_format_openai_chat_request_body(
body_json,
mapped_model,
provider_type,
provider_api_format,
upstream_is_stream,
enable_model_directives,
user_api_key_id,
)?;
let mut provider_request_body =
apply_standard_provider_request_body_rules_with_request_headers(
provider_request_body,
@@ -3,7 +3,7 @@ use serde_json::Value;
use crate::ai_serving::transport::apply_standard_provider_request_body_rules_with_request_headers;
use crate::ai_serving::{
apply_openai_responses_compact_special_body_edits,
build_cross_format_openai_responses_request_body_with_model_directives_and_history_scope as surface_build_cross_format_openai_responses_request_body,
build_cross_format_openai_responses_request_body_with_provider_context as surface_build_cross_format_openai_responses_request_body,
build_local_openai_responses_request_body_with_model_directives as surface_build_local_openai_responses_request_body,
GatewayProviderTransportSnapshot,
};
@@ -214,25 +214,16 @@ pub(crate) fn build_cross_format_openai_responses_request_body_with_codex_model_
model_capabilities: Option<&crate::ai_serving::CodexResponsesModelCapabilities>,
enable_model_directives: bool,
) -> Option<Value> {
let provider_request_body = if provider_type.trim().eq_ignore_ascii_case("antigravity")
&& aether_ai_formats::normalize_api_format_alias(provider_api_format)
== "gemini:generate_content"
{
aether_ai_formats::formats::shared::standard_matrix::build_standard_request_body_with_model_directives(
body_json, client_api_format, mapped_model, provider_type, provider_api_format,
"", upstream_is_stream, None, history_scope, enable_model_directives,
)?
} else {
surface_build_cross_format_openai_responses_request_body(
body_json,
mapped_model,
client_api_format,
provider_api_format,
upstream_is_stream,
enable_model_directives,
history_scope,
)?
};
let provider_request_body = surface_build_cross_format_openai_responses_request_body(
body_json,
mapped_model,
client_api_format,
provider_type,
provider_api_format,
upstream_is_stream,
enable_model_directives,
history_scope,
)?;
let mut provider_request_body =
apply_standard_provider_request_body_rules_with_request_headers(
provider_request_body,
@@ -17,9 +17,11 @@ pub(crate) use aether_ai_formats::api::{
build_codex_model_catalog_metadata, build_codex_openai_image_api_provider_request_body,
build_core_error_body_for_client_format, build_cross_format_openai_chat_request_body,
build_cross_format_openai_chat_request_body_with_model_directives,
build_cross_format_openai_chat_request_body_with_provider_context,
build_cross_format_openai_responses_request_body,
build_cross_format_openai_responses_request_body_with_model_directives,
build_cross_format_openai_responses_request_body_with_model_directives_and_history_scope,
build_cross_format_openai_responses_request_body_with_provider_context,
build_gemini_image_request_body_from_openai_image_request,
build_gemini_image_response_from_openai_image_response,
build_gemini_image_response_from_openai_responses_image_response, build_generated_tool_call_id,