Skip to content
This repository was archived by the owner on May 15, 2026. It is now read-only.

Commit edbd112

Browse files
committed
feat: allow custom model ID passthrough for Vertex AI providers
- Add gemini-3.1-flash-lite-preview to vertex models list - Update VertexHandler.getModel() to pass through unknown model IDs with sensible default ModelInfo instead of falling back to default model - Update AnthropicVertexHandler.getModel() with same custom model ID passthrough behavior - Add tests for custom model ID passthrough in both handlers Closes #12232
1 parent ad25634 commit edbd112

5 files changed

Lines changed: 111 additions & 4 deletions

File tree

packages/types/src/providers/vertex.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,17 @@ export const vertexModels = {
3535
},
3636
],
3737
},
38+
"gemini-3.1-flash-lite-preview": {
39+
maxTokens: 65_536,
40+
contextWindow: 1_048_576,
41+
supportsImages: true,
42+
supportsPromptCache: true,
43+
44+
supportsTemperature: true,
45+
defaultTemperature: 1,
46+
inputPrice: 0.0,
47+
outputPrice: 0.0,
48+
},
3849
"gemini-3.1-pro-preview-customtools": {
3950
maxTokens: 65_536,
4051
contextWindow: 1_048_576,

src/api/providers/__tests__/anthropic-vertex.spec.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -869,6 +869,34 @@ describe("VertexHandler", () => {
869869
expect(result.temperature).toBe(0)
870870
})
871871

872+
it("should pass through custom/unknown model IDs with sensible defaults", () => {
873+
const handler = new AnthropicVertexHandler({
874+
apiModelId: "claude-5-opus@20260101",
875+
vertexProjectId: "test-project",
876+
vertexRegion: "us-central1",
877+
})
878+
879+
const modelInfo = handler.getModel()
880+
expect(modelInfo.id).toBe("claude-5-opus@20260101")
881+
expect(modelInfo.info).toBeDefined()
882+
expect(modelInfo.info.maxTokens).toBe(8192)
883+
expect(modelInfo.info.contextWindow).toBe(200_000)
884+
expect(modelInfo.info.supportsImages).toBe(true)
885+
expect(modelInfo.info.supportsPromptCache).toBe(false)
886+
})
887+
888+
it("should fall back to default model when no model ID is provided", () => {
889+
const handler = new AnthropicVertexHandler({
890+
vertexProjectId: "test-project",
891+
vertexRegion: "us-central1",
892+
})
893+
894+
const modelInfo = handler.getModel()
895+
expect(modelInfo.id).toBeDefined()
896+
expect(modelInfo.info).toBeDefined()
897+
expect(modelInfo.info.maxTokens).toBeGreaterThan(0)
898+
})
899+
872900
it("should enable 1M context for Claude Sonnet 4 when beta flag is set", () => {
873901
const handler = new AnthropicVertexHandler({
874902
apiModelId: VERTEX_1M_CONTEXT_MODEL_IDS[0],

src/api/providers/__tests__/vertex.spec.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,5 +163,35 @@ describe("VertexHandler", () => {
163163
expect(excludedCount).toBe(1)
164164
expect(includedCount).toBe(1)
165165
})
166+
167+
it("should pass through custom/unknown model IDs with sensible defaults", () => {
168+
const testHandler = new VertexHandler({
169+
apiModelId: "gemini-4.0-ultra-preview",
170+
vertexProjectId: "test-project",
171+
vertexRegion: "us-central1",
172+
})
173+
174+
const modelInfo = testHandler.getModel()
175+
expect(modelInfo.id).toBe("gemini-4.0-ultra-preview")
176+
expect(modelInfo.info).toBeDefined()
177+
expect(modelInfo.info.maxTokens).toBe(8192)
178+
expect(modelInfo.info.contextWindow).toBe(1_048_576)
179+
expect(modelInfo.info.supportsImages).toBe(true)
180+
expect(modelInfo.info.supportsPromptCache).toBe(false)
181+
expect(modelInfo.info.excludedTools).toContain("apply_diff")
182+
expect(modelInfo.info.includedTools).toContain("edit")
183+
})
184+
185+
it("should fall back to default model when no model ID is provided", () => {
186+
const testHandler = new VertexHandler({
187+
vertexProjectId: "test-project",
188+
vertexRegion: "us-central1",
189+
})
190+
191+
const modelInfo = testHandler.getModel()
192+
expect(modelInfo.id).toBeDefined()
193+
expect(modelInfo.info).toBeDefined()
194+
expect(modelInfo.info.maxTokens).toBeGreaterThan(0)
195+
})
166196
})
167197
})

src/api/providers/anthropic-vertex.ts

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,8 +207,27 @@ export class AnthropicVertexHandler extends BaseProvider implements SingleComple
207207

208208
getModel() {
209209
const modelId = this.options.apiModelId
210-
let id = modelId && modelId in vertexModels ? (modelId as VertexModelId) : vertexDefaultModelId
211-
let info: ModelInfo = vertexModels[id]
210+
let id: string
211+
let info: ModelInfo
212+
213+
if (modelId && modelId in vertexModels) {
214+
id = modelId as VertexModelId
215+
info = vertexModels[id as VertexModelId]
216+
} else if (modelId) {
217+
// Pass through custom/unknown model IDs with sensible defaults
218+
id = modelId
219+
info = {
220+
maxTokens: 8192,
221+
contextWindow: 200_000,
222+
supportsImages: true,
223+
supportsPromptCache: false,
224+
inputPrice: 0,
225+
outputPrice: 0,
226+
}
227+
} else {
228+
id = vertexDefaultModelId
229+
info = vertexModels[vertexDefaultModelId]
230+
}
212231

213232
// Check if 1M context beta should be enabled for supported models
214233
const supports1MContext = VERTEX_1M_CONTEXT_MODEL_IDS.includes(

src/api/providers/vertex.ts

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,27 @@ export class VertexHandler extends GeminiHandler implements SingleCompletionHand
1414

1515
override getModel() {
1616
const modelId = this.options.apiModelId
17-
let id = modelId && modelId in vertexModels ? (modelId as VertexModelId) : vertexDefaultModelId
18-
let info: ModelInfo = vertexModels[id]
17+
let id: string
18+
let info: ModelInfo
19+
20+
if (modelId && modelId in vertexModels) {
21+
id = modelId as VertexModelId
22+
info = vertexModels[id as VertexModelId]
23+
} else if (modelId) {
24+
// Pass through custom/unknown model IDs with sensible defaults
25+
id = modelId
26+
info = {
27+
maxTokens: 8192,
28+
contextWindow: 1_048_576,
29+
supportsImages: true,
30+
supportsPromptCache: false,
31+
inputPrice: 0,
32+
outputPrice: 0,
33+
}
34+
} else {
35+
id = vertexDefaultModelId
36+
info = vertexModels[vertexDefaultModelId]
37+
}
1938
const params = getModelParams({
2039
format: "gemini",
2140
modelId: id,

0 commit comments

Comments
 (0)