From 96a4a78faa72f901c2eb379e40f591d856b73d88 Mon Sep 17 00:00:00 2001 From: Jeffrey Sperling Date: Tue, 12 May 2026 10:50:35 -0700 Subject: [PATCH] chore: migrate to gemini-3.1-flash-lite GA model The Gemini 3.1 Flash Lite preview model is being discontinued on May 25, 2026. Per Google's GA announcement, the underlying model architecture is identical and only the model identifier needs to be updated from `gemini-3.1-flash-lite-preview` to `gemini-3.1-flash-lite`. Also relaxes the `_require_gemini_31_preview` guard to accept any `gemini-3.1-*` identifier (renamed to `_require_gemini_31`), so the GA name and the still-preview `gemini-3.1-pro-preview` both pass. --- skills/last30days/scripts/evaluate_search_quality.py | 2 +- skills/last30days/scripts/lib/providers.py | 12 ++++++------ tests/test_cli_v3.py | 4 ++-- tests/test_evaluator_v3.py | 4 ++-- tests/test_render_v3.py | 12 ++++++------ tests/test_rerank_v3.py | 4 ++-- tests/test_schema_v3.py | 4 ++-- 7 files changed, 21 insertions(+), 21 deletions(-) diff --git a/skills/last30days/scripts/evaluate_search_quality.py b/skills/last30days/scripts/evaluate_search_quality.py index 55d62f6..1505d02 100644 --- a/skills/last30days/scripts/evaluate_search_quality.py +++ b/skills/last30days/scripts/evaluate_search_quality.py @@ -43,7 +43,7 @@ def _load_default_topics() -> list[tuple[str, str]]: DEFAULT_TOPICS = _load_default_topics() DEFAULT_SEARCH = "" -DEFAULT_JUDGE_MODEL = "gemini-3.1-flash-lite-preview" +DEFAULT_JUDGE_MODEL = "gemini-3.1-flash-lite" GEMINI_API_URL = "https://generativelanguage.googleapis.com/v1beta/models/{model}:generateContent?key={api_key}" diff --git a/skills/last30days/scripts/lib/providers.py b/skills/last30days/scripts/lib/providers.py index 0a5e88c..09040f2 100644 --- a/skills/last30days/scripts/lib/providers.py +++ b/skills/last30days/scripts/lib/providers.py @@ -9,7 +9,7 @@ from typing import Any from . import env, http, schema -GEMINI_FLASH_LITE = "gemini-3.1-flash-lite-preview" +GEMINI_FLASH_LITE = "gemini-3.1-flash-lite" GEMINI_PRO = "gemini-3.1-pro-preview" OPENAI_DEFAULT = "gpt-5.4-nano" XAI_DEFAULT = "grok-4-1-fast" @@ -232,8 +232,8 @@ def _resolve_model_pins(config: dict[str, Any], depth: str, provider_name: str) rerank_model = config.get("LAST30DAYS_RERANK_MODEL") or default_rerank if provider_name == "gemini": - _require_gemini_31_preview(planner_model, role="planner") - _require_gemini_31_preview(rerank_model, role="rerank") + _require_gemini_31(planner_model, role="planner") + _require_gemini_31(rerank_model, role="rerank") return planner_model, rerank_model @@ -344,11 +344,11 @@ def _resolve_x_backend(config: dict[str, Any]) -> str | None: return env.get_x_source(config) -def _require_gemini_31_preview(model: str, *, role: str) -> None: - if model.startswith("gemini-3.1-") and model.endswith("-preview"): +def _require_gemini_31(model: str, *, role: str) -> None: + if model.startswith("gemini-3.1-"): return raise RuntimeError( - f"{role} must use a Gemini 3.1 preview model. Got: {model}" + f"{role} must use a Gemini 3.1 model. Got: {model}" ) diff --git a/tests/test_cli_v3.py b/tests/test_cli_v3.py index f7120d5..f5b5319 100644 --- a/tests/test_cli_v3.py +++ b/tests/test_cli_v3.py @@ -27,8 +27,8 @@ class CliV3Tests(unittest.TestCase): generated_at="2026-03-16T00:00:00+00:00", provider_runtime=schema.ProviderRuntime( reasoning_provider="gemini", - planner_model="gemini-3.1-flash-lite-preview", - rerank_model="gemini-3.1-flash-lite-preview", + planner_model="gemini-3.1-flash-lite", + rerank_model="gemini-3.1-flash-lite", ), query_plan=schema.QueryPlan( intent="comparison", diff --git a/tests/test_evaluator_v3.py b/tests/test_evaluator_v3.py index 5e8eb62..32fabed 100644 --- a/tests/test_evaluator_v3.py +++ b/tests/test_evaluator_v3.py @@ -125,7 +125,7 @@ class EvaluatorV3Tests(unittest.TestCase): topic="test topic", query_type="general", items=[{"key": "a"}], - judge_model="gemini-3.1-flash-lite-preview", + judge_model="gemini-3.1-flash-lite", gemini_api_key="key", ) self.assertEqual({"a": 3}, cached) @@ -136,7 +136,7 @@ class EvaluatorV3Tests(unittest.TestCase): topic="test topic", query_type="general", items=[], - judge_model="gemini-3.1-flash-lite-preview", + judge_model="gemini-3.1-flash-lite", gemini_api_key=None, ) self.assertEqual({}, skipped) diff --git a/tests/test_render_v3.py b/tests/test_render_v3.py index 0184812..753c22e 100644 --- a/tests/test_render_v3.py +++ b/tests/test_render_v3.py @@ -70,8 +70,8 @@ def sample_report() -> schema.Report: generated_at="2026-03-16T00:00:00+00:00", provider_runtime=schema.ProviderRuntime( reasoning_provider="gemini", - planner_model="gemini-3.1-flash-lite-preview", - rerank_model="gemini-3.1-flash-lite-preview", + planner_model="gemini-3.1-flash-lite", + rerank_model="gemini-3.1-flash-lite", ), query_plan=schema.QueryPlan( intent="breaking_news", @@ -239,8 +239,8 @@ class RenderTopCommentsTests(unittest.TestCase): generated_at="2026-03-16T00:00:00+00:00", provider_runtime=schema.ProviderRuntime( reasoning_provider="gemini", - planner_model="gemini-3.1-flash-lite-preview", - rerank_model="gemini-3.1-flash-lite-preview", + planner_model="gemini-3.1-flash-lite", + rerank_model="gemini-3.1-flash-lite", ), query_plan=schema.QueryPlan( intent="breaking_news", @@ -424,8 +424,8 @@ class RenderBestTakesCompactTests(unittest.TestCase): generated_at="2026-03-16T00:00:00+00:00", provider_runtime=schema.ProviderRuntime( reasoning_provider="gemini", - planner_model="gemini-3.1-flash-lite-preview", - rerank_model="gemini-3.1-flash-lite-preview", + planner_model="gemini-3.1-flash-lite", + rerank_model="gemini-3.1-flash-lite", ), query_plan=schema.QueryPlan( intent="breaking_news", diff --git a/tests/test_rerank_v3.py b/tests/test_rerank_v3.py index a3ccb96..320d003 100644 --- a/tests/test_rerank_v3.py +++ b/tests/test_rerank_v3.py @@ -172,10 +172,10 @@ class RerankV3Tests(unittest.TestCase): plan=make_plan(), candidates=[first, second], provider=provider, - model="gemini-3.1-flash-lite-preview", + model="gemini-3.1-flash-lite", shortlist_size=1, ) - self.assertEqual("gemini-3.1-flash-lite-preview", provider.model) + self.assertEqual("gemini-3.1-flash-lite", provider.model) self.assertEqual(95.0, first.rerank_score) self.assertEqual("high fit", first.explanation) # Tail is scored via the fallback (may or may not carry the entity-miss diff --git a/tests/test_schema_v3.py b/tests/test_schema_v3.py index 9997905..d3c963e 100644 --- a/tests/test_schema_v3.py +++ b/tests/test_schema_v3.py @@ -16,8 +16,8 @@ class SchemaV3Tests(unittest.TestCase): generated_at="2026-03-16T00:00:00+00:00", provider_runtime=schema.ProviderRuntime( reasoning_provider="gemini", - planner_model="gemini-3.1-flash-lite-preview", - rerank_model="gemini-3.1-flash-lite-preview", + planner_model="gemini-3.1-flash-lite", + rerank_model="gemini-3.1-flash-lite", ), query_plan=schema.QueryPlan( intent="breaking_news",