fix(provider): use gateway-specific model IDs for vercel transform
The gateway uses google/gemini-3-flash (no -preview suffix) unlike the direct Google API. Give the vercel provider its own transform instead of delegating to sub-provider transforms blindly.
This commit is contained in:
@@ -4275,7 +4275,7 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin
|
|||||||
"model": "vercel/anthropic/claude-haiku-4.5",
|
"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",
|
"model": "vercel/openai/gpt-5.4-mini",
|
||||||
@@ -4301,7 +4301,7 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin
|
|||||||
"variant": "medium",
|
"variant": "medium",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"model": "vercel/google/gemini-3-flash-preview",
|
"model": "vercel/google/gemini-3-flash",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
"model": "vercel/anthropic/claude-sonnet-4.6",
|
"model": "vercel/anthropic/claude-sonnet-4.6",
|
||||||
@@ -4313,7 +4313,7 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin
|
|||||||
"variant": "medium",
|
"variant": "medium",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"model": "vercel/google/gemini-3-flash-preview",
|
"model": "vercel/google/gemini-3-flash",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
"model": "vercel/anthropic/claude-sonnet-4.6",
|
"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/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/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",
|
"model": "vercel/openai/gpt-5.4-mini",
|
||||||
@@ -4513,7 +4513,7 @@ exports[`generateModelConfig Vercel AI Gateway provider uses vercel/ model strin
|
|||||||
"variant": "medium",
|
"variant": "medium",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"model": "vercel/google/gemini-3-flash-preview",
|
"model": "vercel/google/gemini-3-flash",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
"model": "vercel/anthropic/claude-sonnet-4.6",
|
"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/anthropic/claude-sonnet-4.6",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
"model": "vercel/google/gemini-3-flash-preview",
|
"model": "vercel/google/gemini-3-flash",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -247,13 +247,13 @@ describe("transformModelForProvider", () => {
|
|||||||
expect(result).toBe("google/gemini-3.1-pro-preview")
|
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
|
// #given vercel provider and gemini-3-flash model
|
||||||
// #when transformModelForProvider is called
|
// #when transformModelForProvider is called
|
||||||
const result = transformModelForProvider("vercel", "gemini-3-flash")
|
const result = transformModelForProvider("vercel", "gemini-3-flash")
|
||||||
|
|
||||||
// #then should produce 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-preview")
|
expect(result).toBe("google/gemini-3-flash")
|
||||||
})
|
})
|
||||||
|
|
||||||
test("prepends xai/ for grok models", () => {
|
test("prepends xai/ for grok models", () => {
|
||||||
|
|||||||
@@ -6,17 +6,26 @@ function inferSubProvider(model: string): string | undefined {
|
|||||||
return 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 {
|
export function transformModelForProvider(provider: string, model: string): string {
|
||||||
if (provider === "vercel") {
|
if (provider === "vercel") {
|
||||||
const slashIndex = model.indexOf("/")
|
const slashIndex = model.indexOf("/")
|
||||||
if (slashIndex !== -1) {
|
if (slashIndex !== -1) {
|
||||||
const subProvider = model.substring(0, slashIndex)
|
const subProvider = model.substring(0, slashIndex)
|
||||||
const subModel = model.substring(slashIndex + 1)
|
const subModel = model.substring(slashIndex + 1)
|
||||||
return `${subProvider}/${transformModelForProvider(subProvider, subModel)}`
|
return `${subProvider}/${transformModelForGateway(subModel)}`
|
||||||
}
|
}
|
||||||
const subProvider = inferSubProvider(model)
|
const subProvider = inferSubProvider(model)
|
||||||
if (subProvider) {
|
if (subProvider) {
|
||||||
return `${subProvider}/${transformModelForProvider(subProvider, model)}`
|
return `${subProvider}/${transformModelForGateway(model)}`
|
||||||
}
|
}
|
||||||
return model
|
return model
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user