From 9147a532745a492489c668d45966881aaced4da2 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Wed, 13 May 2026 01:05:25 +0100 Subject: [PATCH] fix: normalize nested gemini preview config ids --- CHANGELOG.md | 1 + src/agents/model-ref-shared.test.ts | 13 ++++++++++++- src/agents/model-ref-shared.ts | 12 +++++++++++- src/config/model-alias-defaults.test.ts | 13 +++++++++++++ 4 files changed, 37 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 995d917a48e..d571f0e5653 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,6 +49,7 @@ Docs: https://docs.openclaw.ai - Google/Gemini: normalize retired Gemini 3 Pro Preview ids returned by direct `openclaw models auth login --set-default` provider auth flows before writing config, so Gemini testing targets `google/gemini-3.1-pro-preview`. - Google/Gemini: normalize retired Gemini 3 Pro Preview ids in provider catalog rows when API-key onboarding only reapplies the agent default, so emitted config keeps testing `google/gemini-3.1-pro-preview`. - Google/Gemini: canonicalize provider-qualified retired Gemini 3 Pro Preview refs during Google forward-compatible model resolution, so emitted config uses `google/gemini-3.1-pro-preview` for Gemini 3.1 testing. +- Google/Gemini: normalize proxy-prefixed retired Gemini 3 Pro Preview catalog rows, so emitted configs use `google/gemini-3.1-pro-preview` for Gemini 3.1 testing. - Docs/subagents: document `agents.defaults.subagents.announceTimeoutMs` in the sub-agent and configuration references. (#75509) Thanks @akrimm702. - Cron: add direct `cron.get`, `openclaw cron get `, and agent-tool `get` support for inspecting one stored cron job by id. (#75117) Thanks @samzong. - Agents/tools: add per-sender tool policies with canonical channel-scoped sender keys, so operators can restrict dangerous tools by requester identity across global, agent, group, core, bundled, and plugin tool surfaces. (#66933) Thanks @JerranC. diff --git a/src/agents/model-ref-shared.test.ts b/src/agents/model-ref-shared.test.ts index d54efae8818..5af2d944961 100644 --- a/src/agents/model-ref-shared.test.ts +++ b/src/agents/model-ref-shared.test.ts @@ -1,5 +1,8 @@ import { describe, expect, it } from "vitest"; -import { normalizeStaticProviderModelId } from "./model-ref-shared.js"; +import { + normalizeConfiguredProviderCatalogModelId, + normalizeStaticProviderModelId, +} from "./model-ref-shared.js"; describe("normalizeStaticProviderModelId", () => { it("re-adds the nvidia prefix for bare model ids", () => { @@ -14,3 +17,11 @@ describe("normalizeStaticProviderModelId", () => { ); }); }); + +describe("normalizeConfiguredProviderCatalogModelId", () => { + it("normalizes nested retired Google Gemini ids in proxy-prefixed rows", () => { + expect( + normalizeConfiguredProviderCatalogModelId("kilocode", "kilocode/google/gemini-3-pro-preview"), + ).toBe("kilocode/google/gemini-3.1-pro-preview"); + }); +}); diff --git a/src/agents/model-ref-shared.ts b/src/agents/model-ref-shared.ts index 54c6754dfc2..e5f5c3b927b 100644 --- a/src/agents/model-ref-shared.ts +++ b/src/agents/model-ref-shared.ts @@ -60,7 +60,17 @@ export function normalizeConfiguredProviderCatalogModelId(provider: string, mode const providerModel = normalizeStaticProviderModelId(provider, model); const googlePrefix = "google/"; if (!providerModel.startsWith(googlePrefix)) { - return providerModel; + const slash = providerModel.indexOf("/"); + if (slash <= 0 || slash >= providerModel.length - 1) { + return providerModel; + } + const prefix = providerModel.slice(0, slash + 1); + const suffix = providerModel.slice(slash + 1); + if (!suffix.startsWith(googlePrefix)) { + return providerModel; + } + const normalizedSuffix = normalizeGooglePreviewModelId(suffix); + return normalizedSuffix === suffix ? providerModel : `${prefix}${normalizedSuffix}`; } const modelId = providerModel.slice(googlePrefix.length); const normalizedModelId = normalizeGooglePreviewModelId(modelId); diff --git a/src/config/model-alias-defaults.test.ts b/src/config/model-alias-defaults.test.ts index dc4545dd632..66819d9e4cb 100644 --- a/src/config/model-alias-defaults.test.ts +++ b/src/config/model-alias-defaults.test.ts @@ -235,6 +235,19 @@ describe("applyModelDefaults", () => { expect(next.models?.providers?.myproxy?.models?.[0]?.id).toBe("google/gemini-3.1-pro-preview"); }); + it("normalizes provider-prefixed nested retired Gemini ids in proxy provider rows", () => { + const cfg = buildProxyProviderConfig(); + const model = cfg.models.providers.myproxy.models[0]; + model.id = "myproxy/google/gemini-3-pro-preview"; + model.name = "Gemini via proxy"; + + const next = applyModelDefaults(cfg); + + expect(next.models?.providers?.myproxy?.models?.[0]?.id).toBe( + "myproxy/google/gemini-3.1-pro-preview", + ); + }); + it("fills missing model provider defaults", () => { const cfg = buildProxyProviderConfig();