From dbaf4df4931e4e27185029afbbd63cddb03f84d8 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Wed, 8 Apr 2026 02:18:44 +0100 Subject: [PATCH] test: drop pre-Gemini 3 from live model matrix --- src/agents/live-model-filter.ts | 15 ++++++++++++++- src/agents/model-compat.test.ts | 18 ++++++++++++++++-- .../gateway-models.profiles.live.test.ts | 11 ++--------- 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/src/agents/live-model-filter.ts b/src/agents/live-model-filter.ts index 68cfe74b758..2ae2f363cd1 100644 --- a/src/agents/live-model-filter.ts +++ b/src/agents/live-model-filter.ts @@ -10,7 +10,7 @@ export type ModelRef = { const HIGH_SIGNAL_LIVE_MODEL_PRIORITY = [ "anthropic/claude-opus-4-6", "google/gemini-3.1-pro-preview", - "google/gemini-2.5-flash", + "google/gemini-3-flash-preview", "minimax/minimax-m2.7", "openai/gpt-5.2", "openai-codex/gpt-5.2", @@ -52,6 +52,16 @@ function isHighSignalClaudeModelId(id: string): boolean { return minor >= 6; } +function isPreGemini3ModelId(id: string): boolean { + const normalized = normalizeLowercaseStringOrEmpty(id); + const match = normalized.match(/(?:^|\/)gemini-(\d+)(?:[.-]|$)/); + if (!match) { + return false; + } + const major = Number.parseInt(match[1] ?? "0", 10); + return Number.isFinite(major) && major < 3; +} + export function isModernModelRef(ref: ModelRef): boolean { const provider = normalizeProviderId(ref.provider ?? ""); const id = normalizeLowercaseStringOrEmpty(ref.id); @@ -77,6 +87,9 @@ export function isHighSignalLiveModelRef(ref: ModelRef): boolean { if (!isModernModelRef(ref) || !id) { return false; } + if (isPreGemini3ModelId(id)) { + return false; + } return isHighSignalClaudeModelId(id); } diff --git a/src/agents/model-compat.test.ts b/src/agents/model-compat.test.ts index 154d68dee2d..c5b36054b82 100644 --- a/src/agents/model-compat.test.ts +++ b/src/agents/model-compat.test.ts @@ -462,6 +462,20 @@ describe("isHighSignalLiveModelRef", () => { isHighSignalLiveModelRef({ provider: "opencode", id: "claude-3-5-haiku-20241022" }), ).toBe(false); }); + + it("drops Gemini families older than major version 3 from the default live matrix", () => { + providerRuntimeMocks.resolveProviderModernModelRef.mockReturnValue(true); + + expect(isHighSignalLiveModelRef({ provider: "google", id: "gemini-2.5-flash-lite" })).toBe( + false, + ); + expect(isHighSignalLiveModelRef({ provider: "openrouter", id: "google/gemini-2.5-pro" })).toBe( + false, + ); + expect(isHighSignalLiveModelRef({ provider: "google", id: "gemini-3-flash-preview" })).toBe( + true, + ); + }); }); describe("selectHighSignalLiveItems", () => { @@ -469,7 +483,7 @@ describe("selectHighSignalLiveItems", () => { const items = [ { provider: "anthropic", id: "claude-opus-4-6" }, { provider: "google", id: "gemini-3.1-pro-preview" }, - { provider: "google", id: "gemini-2.5-flash" }, + { provider: "google", id: "gemini-3-flash-preview" }, { provider: "openai", id: "gpt-5.2" }, { provider: "opencode", id: "big-pickle" }, ]; @@ -484,7 +498,7 @@ describe("selectHighSignalLiveItems", () => { ).toEqual([ { provider: "anthropic", id: "claude-opus-4-6" }, { provider: "google", id: "gemini-3.1-pro-preview" }, - { provider: "google", id: "gemini-2.5-flash" }, + { provider: "google", id: "gemini-3-flash-preview" }, { provider: "openai", id: "gpt-5.2" }, ]); }); diff --git a/src/gateway/gateway-models.profiles.live.test.ts b/src/gateway/gateway-models.profiles.live.test.ts index 0650200e336..664cc4b38ac 100644 --- a/src/gateway/gateway-models.profiles.live.test.ts +++ b/src/gateway/gateway-models.profiles.live.test.ts @@ -73,7 +73,6 @@ const GATEWAY_LIVE_HEARTBEAT_MS = Math.max( toInt(process.env.OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS, 30_000), ); const GATEWAY_LIVE_STRIP_SCAFFOLDING_MODEL_KEYS = new Set([ - "google/gemini-2.5-flash", "google/gemini-3-flash-preview", "google/gemini-3-pro-preview", "google/gemini-3.1-flash-lite-preview", @@ -387,7 +386,7 @@ describe("maybeStripAssistantScaffoldingForLiveModel", () => { expect( maybeStripAssistantScaffoldingForLiveModel( "Visible", - "google/gemini-2.5-flash", + "google/gemini-3-flash-preview", ), ).toBe("Visible"); expect( @@ -414,12 +413,6 @@ describe("maybeStripAssistantScaffoldingForLiveModel", () => { "google/gemini-3.1-pro-preview-customtools", ), ).toBe("Visible"); - expect( - maybeStripAssistantScaffoldingForLiveModel( - "hiddenVisible", - "google/gemini-2.5-flash", - ), - ).toBe("Visible"); }); it("strips scaffolding for known OpenAI transcript wrappers", () => { @@ -631,7 +624,7 @@ describe("getHighSignalLiveModelPriorityIndex", () => { getHighSignalLiveModelPriorityIndex({ provider: "google", id: "gemini-3.1-pro-preview" }), ).toBe(1); expect( - getHighSignalLiveModelPriorityIndex({ provider: "google", id: "gemini-2.5-flash" }), + getHighSignalLiveModelPriorityIndex({ provider: "google", id: "gemini-3-flash-preview" }), ).toBe(2); expect(getHighSignalLiveModelPriorityIndex({ provider: "opencode", id: "big-pickle" })).toBe( null,