From 5dbfb69c6db1fb1558f6008f17a52cf72f9ceaae Mon Sep 17 00:00:00 2001 From: ciregenz Date: Fri, 3 Jul 2026 14:42:42 -0700 Subject: [PATCH] [eric] models: drop gemini-3-flash entirely (preview id aged out; key-only users hung; AG probe retargeted to flash-lite) --- backend/apps/agents/providers/registry.py | 8 ++------ backend/tests/test_v2_invariants.py | 8 ++++---- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/backend/apps/agents/providers/registry.py b/backend/apps/agents/providers/registry.py index a378e06f..2f41cb33 100644 --- a/backend/apps/agents/providers/registry.py +++ b/backend/apps/agents/providers/registry.py @@ -112,10 +112,7 @@ BUILTIN_MODELS: dict[str, list[dict[str, Any]]] = { {"value": "gemini-3.1-flash-lite", "label": "Gemini 3.1 Flash Lite", "context_window": 1_000_000, "router_model_id": "gc/gemini-3.1-flash-lite-preview", "api": "gemini-cli", "subscription_only": True, "reasoning": True}, - # gemini-3-pro removed: gemini-3-pro-preview was shut down 2026-03-09 (dead on both the direct API and the Gemini CLI backend). gemini-3-flash kept: it's superseded on the direct API but still serves on the CLI subscription route. - {"value": "gemini-3-flash", "label": "Gemini 3 Flash", - "context_window": 1_000_000, "router_model_id": "gc/gemini-3-flash-preview", - "api": "gemini-cli", "subscription_only": True, "reasoning": True}, + # gemini-3-pro removed 2026-03-09 and gemini-3-flash removed 2026-07-03: gemini-3-flash-preview aged out upstream (API-key route hangs with no fail-fast; only an Antigravity sub still masked it). 3.5-flash / 3.1-flash-lite cover the slots. # API-key entries: bypass 9Router, call generativelanguage.googleapis.com. {"value": "gemini-3.5-flash-api", "label": "Gemini 3.5 Flash (API key)", "context_window": 1_000_000, "router_model_id": "gemini-3.5-flash", "model_id": "gemini-3.5-flash", @@ -248,8 +245,7 @@ def resolve_model_id_for_sdk(short_name: str, settings: AppSettings) -> str: return entry.get("model_id", short_name) # Gemini lane order: Antigravity OAuth (for the models it serves), then AI Studio apikey, then Gemini CLI. AG bypasses the thoughtSignature validator that breaks multi-step Gemini turns AND supports real reasoning, so a connected AG sub is preferred over the AI Studio key, which otherwise silently shadowed it. The map is AG's allowlist; pro variants 404/400 on AG and are deliberately absent, so they fall through to the key. P_ANTIGRAVITY_MAP = { - # gemini-3-pro-preview disabled: AG returns 404 even with active conn. gemini-3.1-pro-preview disabled: AG's `gemini-3.1-pro-high` variant 400s every request with "invalid argument" (the `-high` thinking- budget alias on AG requires a thinking_config the CLI doesn't emit). Falls through to the AI Studio key / gc/ instead. - "gemini-3-flash-preview": "gemini-3-flash", + # gemini-3-pro-preview disabled: AG returns 404 even with active conn. gemini-3.1-pro-preview disabled: AG's `gemini-3.1-pro-high` variant 400s every request with "invalid argument" (the `-high` thinking- budget alias on AG requires a thinking_config the CLI doesn't emit). Falls through to the AI Studio key / gc/ instead. gemini-3-flash-preview key dropped with its registry entry (aged out upstream). "gemini-3.1-flash-lite-preview": "gemini-3-flash", } if entry.get("api") == "gemini-cli": diff --git a/backend/tests/test_v2_invariants.py b/backend/tests/test_v2_invariants.py index 2c4abd9b..f31b3439 100644 --- a/backend/tests/test_v2_invariants.py +++ b/backend/tests/test_v2_invariants.py @@ -555,15 +555,15 @@ def test_resolve_sdk_gemini_prefers_antigravity_over_api_key(): s = AppSettings() s.google_api_key = "ai-studio-key" with patch.object(registry, "p_antigravity_connected", return_value=True): - # flash IS AG-serveable -> AG wins over the key - assert registry.resolve_model_id_for_sdk("gemini-3-flash", s) == "ag/gemini-3-flash" + # flash-lite IS AG-serveable -> AG wins over the key (probe retargeted after gemini-3-flash was removed) + assert registry.resolve_model_id_for_sdk("gemini-3.1-flash-lite", s) == "ag/gemini-3-flash" with patch.object(registry, "p_antigravity_connected", return_value=False): # AG not connected -> key - assert registry.resolve_model_id_for_sdk("gemini-3-flash", s) == "gemini/gemini-3-flash-preview" + assert registry.resolve_model_id_for_sdk("gemini-3.1-flash-lite", s) == "gemini/gemini-3.1-flash-lite-preview" # No key, no AG -> gc/ subscription lane untouched s2 = AppSettings() with patch.object(registry, "p_antigravity_connected", return_value=False): - assert registry.resolve_model_id_for_sdk("gemini-3-flash", s2) == "gc/gemini-3-flash-preview" + assert registry.resolve_model_id_for_sdk("gemini-3.1-flash-lite", s2) == "gc/gemini-3.1-flash-lite-preview" def test_error_classify_schema_translation_400_is_not_auth():