mirror of
https://github.com/fawney19/Aether.git
synced 2026-10-10 19:29:50 +08:00
fix(antigravity): wrap cross-format requests in the v1internal envelope
The gemini:generate_content URL hook rewrites any Antigravity endpoint to /v1internal:generateContent, but only the same-format passthrough and the two OpenAI decision paths ever built the matching envelope. A Claude Messages or Gemini client therefore reached the standard family planner, picked up the rewritten URL, and posted a bare Gemini body that upstream rejects with "Invalid JSON payload received. Unknown name \"contents\"" -- four retries across every account, then a 503 that names none of this. Route the standard family through the shared v1internal builder the same way gemini_cli already is, so the URL and the body come from one decision. The OpenAI-image-to-Gemini path cannot carry an envelope at all, so it now skips Antigravity candidates instead of sending a request upstream can only reject. Also stop treating a configured proxy as locally unsupported. The execution plan carries the proxy itself, and the generic and Vertex gates moved to transport_proxy_is_locally_supported long ago; Antigravity kept rejecting on proxy.is_some(), which no longer matches how the local runtime executes. A proxy that resolves to no route still disqualifies the request, and transport profiles stay unsupported because the v1internal payload never carries one. Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -9,6 +9,7 @@ use crate::ai_serving::planner::candidate_preparation::{
|
||||
};
|
||||
use crate::ai_serving::planner::spec_metadata::local_openai_image_spec_metadata;
|
||||
use crate::ai_serving::pure::normalize_openai_image_request_with_options;
|
||||
use crate::ai_serving::transport::antigravity::is_antigravity_provider_transport;
|
||||
use crate::ai_serving::transport::{
|
||||
build_grok_browser_headers, build_grok_upstream_url, build_openai_image_headers,
|
||||
build_openai_image_upstream_url, build_standard_provider_request_headers,
|
||||
@@ -338,6 +339,25 @@ async fn resolve_local_openai_image_to_gemini_candidate_payload_parts(
|
||||
let candidate = &attempt.eligible.candidate;
|
||||
let transport = &attempt.eligible.transport;
|
||||
let provider_api_format = "gemini:generate_content";
|
||||
|
||||
// The gemini:generate_content URL hook rewrites an Antigravity endpoint to
|
||||
// /v1internal:, and this image path has no v1internal envelope to match it.
|
||||
// Skip the candidate instead of posting a bare Gemini body that upstream
|
||||
// would only reject.
|
||||
if is_antigravity_provider_transport(transport) {
|
||||
mark_skipped_local_openai_image_candidate(
|
||||
state,
|
||||
input,
|
||||
trace_id,
|
||||
candidate,
|
||||
attempt.candidate_index,
|
||||
&attempt.candidate_id,
|
||||
"transport_unsupported",
|
||||
)
|
||||
.await;
|
||||
return None;
|
||||
}
|
||||
|
||||
let effective_headers = input.effective_headers(&parts.headers);
|
||||
|
||||
let prepared_candidate = match prepare_header_authenticated_candidate(
|
||||
|
||||
Reference in New Issue
Block a user