Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions packages/types/src/providers/vertex.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,17 @@ export const vertexModels = {
},
],
},
"gemini-3.1-flash-lite-preview": {
maxTokens: 65_536,
contextWindow: 1_048_576,
supportsImages: true,
supportsPromptCache: true,

supportsTemperature: true,
defaultTemperature: 1,
inputPrice: 0.0,
outputPrice: 0.0,
},
"gemini-3.1-pro-preview-customtools": {
maxTokens: 65_536,
contextWindow: 1_048_576,
Expand Down
28 changes: 28 additions & 0 deletions src/api/providers/__tests__/anthropic-vertex.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -869,6 +869,34 @@ describe("VertexHandler", () => {
expect(result.temperature).toBe(0)
})

it("should pass through custom/unknown model IDs with sensible defaults", () => {
const handler = new AnthropicVertexHandler({
apiModelId: "claude-5-opus@20260101",
vertexProjectId: "test-project",
vertexRegion: "us-central1",
})

const modelInfo = handler.getModel()
expect(modelInfo.id).toBe("claude-5-opus@20260101")
expect(modelInfo.info).toBeDefined()
expect(modelInfo.info.maxTokens).toBe(8192)
expect(modelInfo.info.contextWindow).toBe(200_000)
expect(modelInfo.info.supportsImages).toBe(true)
expect(modelInfo.info.supportsPromptCache).toBe(false)
})

it("should fall back to default model when no model ID is provided", () => {
const handler = new AnthropicVertexHandler({
vertexProjectId: "test-project",
vertexRegion: "us-central1",
})

const modelInfo = handler.getModel()
expect(modelInfo.id).toBeDefined()
expect(modelInfo.info).toBeDefined()
expect(modelInfo.info.maxTokens).toBeGreaterThan(0)
})

it("should enable 1M context for Claude Sonnet 4 when beta flag is set", () => {
const handler = new AnthropicVertexHandler({
apiModelId: VERTEX_1M_CONTEXT_MODEL_IDS[0],
Expand Down
30 changes: 30 additions & 0 deletions src/api/providers/__tests__/vertex.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -163,5 +163,35 @@ describe("VertexHandler", () => {
expect(excludedCount).toBe(1)
expect(includedCount).toBe(1)
})

it("should pass through custom/unknown model IDs with sensible defaults", () => {
const testHandler = new VertexHandler({
apiModelId: "gemini-4.0-ultra-preview",
vertexProjectId: "test-project",
vertexRegion: "us-central1",
})

const modelInfo = testHandler.getModel()
expect(modelInfo.id).toBe("gemini-4.0-ultra-preview")
expect(modelInfo.info).toBeDefined()
expect(modelInfo.info.maxTokens).toBe(8192)
expect(modelInfo.info.contextWindow).toBe(1_048_576)
expect(modelInfo.info.supportsImages).toBe(true)
expect(modelInfo.info.supportsPromptCache).toBe(false)
expect(modelInfo.info.excludedTools).toContain("apply_diff")
expect(modelInfo.info.includedTools).toContain("edit")
})

it("should fall back to default model when no model ID is provided", () => {
const testHandler = new VertexHandler({
vertexProjectId: "test-project",
vertexRegion: "us-central1",
})

const modelInfo = testHandler.getModel()
expect(modelInfo.id).toBeDefined()
expect(modelInfo.info).toBeDefined()
expect(modelInfo.info.maxTokens).toBeGreaterThan(0)
})
})
})
23 changes: 21 additions & 2 deletions src/api/providers/anthropic-vertex.ts
Original file line number Diff line number Diff line change
Expand Up @@ -207,8 +207,27 @@ export class AnthropicVertexHandler extends BaseProvider implements SingleComple

getModel() {
const modelId = this.options.apiModelId
let id = modelId && modelId in vertexModels ? (modelId as VertexModelId) : vertexDefaultModelId
let info: ModelInfo = vertexModels[id]
let id: string
let info: ModelInfo

if (modelId && modelId in vertexModels) {
id = modelId as VertexModelId
info = vertexModels[id as VertexModelId]
} else if (modelId) {
// Pass through custom/unknown model IDs with sensible defaults
id = modelId
info = {
maxTokens: 8192,
contextWindow: 200_000,
supportsImages: true,
supportsPromptCache: false,
inputPrice: 0,
outputPrice: 0,
}
} else {
id = vertexDefaultModelId
info = vertexModels[vertexDefaultModelId]
}

// Check if 1M context beta should be enabled for supported models
const supports1MContext = VERTEX_1M_CONTEXT_MODEL_IDS.includes(
Expand Down
23 changes: 21 additions & 2 deletions src/api/providers/vertex.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,27 @@ export class VertexHandler extends GeminiHandler implements SingleCompletionHand

override getModel() {
const modelId = this.options.apiModelId
let id = modelId && modelId in vertexModels ? (modelId as VertexModelId) : vertexDefaultModelId
let info: ModelInfo = vertexModels[id]
let id: string
let info: ModelInfo

if (modelId && modelId in vertexModels) {
id = modelId as VertexModelId
info = vertexModels[id as VertexModelId]
} else if (modelId) {
// Pass through custom/unknown model IDs with sensible defaults
id = modelId
info = {
maxTokens: 8192,
contextWindow: 1_048_576,
supportsImages: true,
supportsPromptCache: false,
inputPrice: 0,
outputPrice: 0,
}
} else {
id = vertexDefaultModelId
info = vertexModels[vertexDefaultModelId]
}
const params = getModelParams({
format: "gemini",
modelId: id,
Expand Down
Loading