[eric] models: drop gemini-3-flash entirely (preview id aged out; key-only users hung; AG probe retargeted to flash-lite)

This commit is contained in:
ciregenz
2026-07-03 14:42:42 -07:00
parent f202599198
commit 5dbfb69c6d
2 changed files with 6 additions and 10 deletions
+2 -6
View File
@@ -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":
+4 -4
View File
@@ -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():