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

Commit df31ccd

Browse files
committed
fix: add Gemma 4 models to geminiModels map and stop silent model ID fallback
- Add gemma-4-31b-it, gemma-4-12b-it, gemma-4-6b-it, gemma-4-4b-it, and gemma-4-1b-it to the geminiModels map with correct context windows and capabilities - Fix silent fallback in GeminiHandler.getModel() that replaced unknown model IDs with geminiDefaultModelId (gemini-3.1-pro-preview) - Apply the same fix to VertexHandler.getModel() - Now preserves user-provided model ID and only falls back on model info - Update tests to verify unknown models are passed through and Gemma 4 models are natively recognized Closes #12166
1 parent c4547d2 commit df31ccd

4 files changed

Lines changed: 68 additions & 6 deletions

File tree

packages/types/src/providers/gemini.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,4 +283,46 @@ export const geminiModels = {
283283
supportsReasoningBudget: true,
284284
maxThinkingTokens: 24_576,
285285
},
286+
// Gemma 4 models
287+
// https://ai.google.dev/gemma/docs/core
288+
"gemma-4-31b-it": {
289+
maxTokens: 8_192,
290+
contextWindow: 131_072,
291+
supportsImages: true,
292+
supportsPromptCache: false,
293+
inputPrice: 0,
294+
outputPrice: 0,
295+
},
296+
"gemma-4-12b-it": {
297+
maxTokens: 8_192,
298+
contextWindow: 131_072,
299+
supportsImages: true,
300+
supportsPromptCache: false,
301+
inputPrice: 0,
302+
outputPrice: 0,
303+
},
304+
"gemma-4-6b-it": {
305+
maxTokens: 8_192,
306+
contextWindow: 32_768,
307+
supportsImages: true,
308+
supportsPromptCache: false,
309+
inputPrice: 0,
310+
outputPrice: 0,
311+
},
312+
"gemma-4-4b-it": {
313+
maxTokens: 8_192,
314+
contextWindow: 32_768,
315+
supportsImages: true,
316+
supportsPromptCache: false,
317+
inputPrice: 0,
318+
outputPrice: 0,
319+
},
320+
"gemma-4-1b-it": {
321+
maxTokens: 8_192,
322+
contextWindow: 32_768,
323+
supportsImages: false,
324+
supportsPromptCache: false,
325+
inputPrice: 0,
326+
outputPrice: 0,
327+
},
286328
} as const satisfies Record<string, ModelInfo>

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

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,13 +165,33 @@ describe("GeminiHandler", () => {
165165
expect(modelInfo.info).toBeDefined()
166166
})
167167

168-
it("should return default model if invalid model specified", () => {
168+
it("should preserve unknown model ID instead of silently falling back to default", () => {
169169
const invalidHandler = new GeminiHandler({
170170
apiModelId: "invalid-model",
171171
geminiApiKey: "test-key",
172172
})
173173
const modelInfo = invalidHandler.getModel()
174-
expect(modelInfo.id).toBe(geminiDefaultModelId) // Default model
174+
expect(modelInfo.id).toBe("invalid-model") // Preserves user-provided ID
175+
expect(modelInfo.info).toBeDefined() // Falls back to default model info
176+
})
177+
178+
it("should use default model when no model ID is provided", () => {
179+
const noModelHandler = new GeminiHandler({
180+
geminiApiKey: "test-key",
181+
})
182+
const modelInfo = noModelHandler.getModel()
183+
expect(modelInfo.id).toBe(geminiDefaultModelId)
184+
})
185+
186+
it("should recognize Gemma 4 models natively", () => {
187+
const gemmaHandler = new GeminiHandler({
188+
apiModelId: "gemma-4-31b-it",
189+
geminiApiKey: "test-key",
190+
})
191+
const modelInfo = gemmaHandler.getModel()
192+
expect(modelInfo.id).toBe("gemma-4-31b-it")
193+
expect(modelInfo.info.contextWindow).toBe(131_072)
194+
expect(modelInfo.info.supportsImages).toBe(true)
175195
})
176196

177197
it("should exclude apply_diff and include edit in tool preferences", () => {

src/api/providers/gemini.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -348,8 +348,8 @@ export class GeminiHandler extends BaseProvider implements SingleCompletionHandl
348348

349349
override getModel() {
350350
const modelId = this.options.apiModelId
351-
let id = modelId && modelId in geminiModels ? (modelId as GeminiModelId) : geminiDefaultModelId
352-
let info: ModelInfo = geminiModels[id]
351+
const id: string = modelId ?? geminiDefaultModelId
352+
let info: ModelInfo = geminiModels[id as GeminiModelId] ?? geminiModels[geminiDefaultModelId]
353353

354354
const params = getModelParams({
355355
format: "gemini",

src/api/providers/vertex.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ 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+
const id: string = modelId ?? vertexDefaultModelId
18+
let info: ModelInfo = vertexModels[id as VertexModelId] ?? vertexModels[vertexDefaultModelId]
1919
const params = getModelParams({
2020
format: "gemini",
2121
modelId: id,

0 commit comments

Comments
 (0)