fix(models): apply Gemini model-id normalization to google-vertex provider (#42435)

* fix(models): apply Gemini model-id normalization to google-vertex provider

The existing normalizeGoogleModelId() (which maps e.g. gemini-3.1-flash-lite
to gemini-3.1-flash-lite-preview) was only applied when the provider was
"google". Users configuring google-vertex/gemini-3.1-flash-lite would get
a "missing" model because the -preview suffix was never appended.

Extend the normalization to google-vertex in both model-selection
(parseModelRef path) and normalizeProviders (config normalization path).

Ref: https://github.com/openclaw/openclaw/issues/36838
Ref: https://github.com/openclaw/openclaw/pull/36918#issuecomment-4032732959


* fix(models): normalize google-vertex flash-lite

* fix(models): place unreleased changelog entry last

* fix(models): place unreleased changelog entry before releases
This commit is contained in:
scoootscooob
2026-03-13 20:45:34 -07:00
committed by GitHub
parent f4a2bbe0c9
commit b857a8d8bc
5 changed files with 40 additions and 3 deletions

View File

@@ -241,6 +241,12 @@ describe("model-selection", () => {
defaultProvider: "anthropic",
expected: { provider: "openai", model: "gpt-5.3-codex-codex" },
},
{
name: "normalizes gemini 3.1 flash-lite ids for google-vertex",
variants: ["google-vertex/gemini-3.1-flash-lite", "gemini-3.1-flash-lite"],
defaultProvider: "google-vertex",
expected: { provider: "google-vertex", model: "gemini-3.1-flash-lite-preview" },
},
])("$name", ({ variants, defaultProvider, expected }) => {
expectParsedModelVariants(variants, defaultProvider, expected);
});
@@ -252,7 +258,6 @@ describe("model-selection", () => {
"anthropic/claude-opus-4-6",
);
});
it.each(["", " ", "/", "anthropic/", "/model"])("returns null for invalid ref %j", (raw) => {
expect(parseModelRef(raw, "anthropic")).toBeNull();
});

View File

@@ -171,7 +171,7 @@ function normalizeProviderModelId(provider: string, model: string): string {
return `anthropic/${normalizedAnthropicModel}`;
}
}
if (provider === "google") {
if (provider === "google" || provider === "google-vertex") {
return normalizeGoogleModelId(model);
}
// OpenRouter-native models (e.g. "openrouter/aurora-alpha") need the full

View File

@@ -97,3 +97,33 @@ describe("google-antigravity provider normalization", () => {
expect(normalized).toBe(providers);
});
});
describe("google-vertex provider normalization", () => {
it("normalizes gemini flash-lite IDs for google-vertex providers", () => {
const agentDir = mkdtempSync(join(tmpdir(), "openclaw-test-"));
const providers = {
"google-vertex": buildProvider(["gemini-3.1-flash-lite", "gemini-3-flash-preview"]),
openai: buildProvider(["gpt-5"]),
};
const normalized = normalizeProviders({ providers, agentDir });
expect(normalized).not.toBe(providers);
expect(normalized?.["google-vertex"]?.models.map((model) => model.id)).toEqual([
"gemini-3.1-flash-lite-preview",
"gemini-3-flash-preview",
]);
expect(normalized?.openai).toBe(providers.openai);
});
it("returns original providers object when no google-vertex IDs need normalization", () => {
const agentDir = mkdtempSync(join(tmpdir(), "openclaw-test-"));
const providers = {
"google-vertex": buildProvider(["gemini-3.1-flash-lite-preview", "gemini-3-flash-preview"]),
};
const normalized = normalizeProviders({ providers, agentDir });
expect(normalized).toBe(providers);
});
});

View File

@@ -545,7 +545,7 @@ export function normalizeProviders(params: {
}
}
if (normalizedKey === "google") {
if (normalizedKey === "google" || normalizedKey === "google-vertex") {
const googleNormalized = normalizeGoogleProvider(normalizedProvider);
if (googleNormalized !== normalizedProvider) {
mutated = true;