diff --git a/src/cli/__snapshots__/model-fallback.test.ts.snap b/src/cli/__snapshots__/model-fallback.test.ts.snap index 83ae744e6..73c5bfdb8 100644 --- a/src/cli/__snapshots__/model-fallback.test.ts.snap +++ b/src/cli/__snapshots__/model-fallback.test.ts.snap @@ -4275,7 +4275,7 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin "model": "vercel/anthropic/claude-haiku-4.5", }, { - "model": "vercel/google/gemini-3-flash-preview", + "model": "vercel/google/gemini-3-flash", }, ], "model": "vercel/openai/gpt-5.4-mini", @@ -4301,7 +4301,7 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin "variant": "medium", }, { - "model": "vercel/google/gemini-3-flash-preview", + "model": "vercel/google/gemini-3-flash", }, ], "model": "vercel/anthropic/claude-sonnet-4.6", @@ -4313,7 +4313,7 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin "variant": "medium", }, { - "model": "vercel/google/gemini-3-flash-preview", + "model": "vercel/google/gemini-3-flash", }, ], "model": "vercel/anthropic/claude-sonnet-4.6", @@ -4334,7 +4334,7 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin "model": "vercel/anthropic/claude-sonnet-4.6", }, ], - "model": "vercel/google/gemini-3-flash-preview", + "model": "vercel/google/gemini-3-flash", }, }, } @@ -4477,7 +4477,7 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin "model": "vercel/anthropic/claude-haiku-4.5", }, { - "model": "vercel/google/gemini-3-flash-preview", + "model": "vercel/google/gemini-3-flash", }, ], "model": "vercel/openai/gpt-5.4-mini", @@ -4513,7 +4513,7 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin "variant": "medium", }, { - "model": "vercel/google/gemini-3-flash-preview", + "model": "vercel/google/gemini-3-flash", }, ], "model": "vercel/anthropic/claude-sonnet-4.6", @@ -4534,7 +4534,7 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin "model": "vercel/anthropic/claude-sonnet-4.6", }, ], - "model": "vercel/google/gemini-3-flash-preview", + "model": "vercel/google/gemini-3-flash", }, }, } diff --git a/src/cli/provider-model-id-transform.test.ts b/src/cli/provider-model-id-transform.test.ts index be01735d0..a898b7c2b 100644 --- a/src/cli/provider-model-id-transform.test.ts +++ b/src/cli/provider-model-id-transform.test.ts @@ -247,13 +247,13 @@ describe("transformModelForProvider", () => { expect(result).toBe("google/gemini-3.1-pro-preview") }) - test("prepends google/ and applies google transform for gemini-3-flash", () => { + test("prepends google/ without -preview for gemini-3-flash", () => { // #given vercel provider and gemini-3-flash model // #when transformModelForProvider is called const result = transformModelForProvider("vercel", "gemini-3-flash") - // #then should produce google/gemini-3-flash-preview - expect(result).toBe("google/gemini-3-flash-preview") + // #then should produce google/gemini-3-flash (gateway does not use -preview for this model) + expect(result).toBe("google/gemini-3-flash") }) test("prepends xai/ for grok models", () => { diff --git a/src/shared/provider-model-id-transform.ts b/src/shared/provider-model-id-transform.ts index 60676e962..9e304c9d8 100644 --- a/src/shared/provider-model-id-transform.ts +++ b/src/shared/provider-model-id-transform.ts @@ -6,17 +6,26 @@ function inferSubProvider(model: string): string | undefined { return undefined } +function transformModelForGateway(model: string): string { + return model + .replace("claude-opus-4-6", "claude-opus-4.6") + .replace("claude-sonnet-4-6", "claude-sonnet-4.6") + .replace("claude-sonnet-4-5", "claude-sonnet-4.5") + .replace("claude-haiku-4-5", "claude-haiku-4.5") + .replace(/gemini-3\.1-pro(?!-)/g, "gemini-3.1-pro-preview") +} + export function transformModelForProvider(provider: string, model: string): string { if (provider === "vercel") { const slashIndex = model.indexOf("/") if (slashIndex !== -1) { const subProvider = model.substring(0, slashIndex) const subModel = model.substring(slashIndex + 1) - return `${subProvider}/${transformModelForProvider(subProvider, subModel)}` + return `${subProvider}/${transformModelForGateway(subModel)}` } const subProvider = inferSubProvider(model) if (subProvider) { - return `${subProvider}/${transformModelForProvider(subProvider, model)}` + return `${subProvider}/${transformModelForGateway(model)}` } return model }