From 9bca5cc32243115b46b867d1eaf477215926d4d1 Mon Sep 17 00:00:00 2001 From: Roo Code Date: Thu, 16 Apr 2026 18:40:51 +0000 Subject: [PATCH] fix: pass through custom model names in Gemini provider instead of falling back to default --- src/api/providers/__tests__/gemini.spec.ts | 22 ++++++++++++++----- src/api/providers/gemini.ts | 25 ++++++++++++++++++++-- 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/src/api/providers/__tests__/gemini.spec.ts b/src/api/providers/__tests__/gemini.spec.ts index 47ee79dd0d6..e35050f2bff 100644 --- a/src/api/providers/__tests__/gemini.spec.ts +++ b/src/api/providers/__tests__/gemini.spec.ts @@ -165,13 +165,25 @@ describe("GeminiHandler", () => { expect(modelInfo.info).toBeDefined() }) - it("should return default model if invalid model specified", () => { - const invalidHandler = new GeminiHandler({ - apiModelId: "invalid-model", + it("should pass through custom model names not in the predefined list", () => { + const customHandler = new GeminiHandler({ + apiModelId: "gemini-3.1-flash-lite-preview", geminiApiKey: "test-key", }) - const modelInfo = invalidHandler.getModel() - expect(modelInfo.id).toBe(geminiDefaultModelId) // Default model + const modelInfo = customHandler.getModel() + expect(modelInfo.id).toBe("gemini-3.1-flash-lite-preview") + expect(modelInfo.info).toBeDefined() + expect(modelInfo.info.maxTokens).toBe(8192) + expect(modelInfo.info.supportsImages).toBe(true) + }) + + it("should return default model when no model ID is specified", () => { + const noModelHandler = new GeminiHandler({ + apiModelId: undefined as any, + geminiApiKey: "test-key", + }) + const modelInfo = noModelHandler.getModel() + expect(modelInfo.id).toBe(geminiDefaultModelId) }) it("should exclude apply_diff and include edit in tool preferences", () => { diff --git a/src/api/providers/gemini.ts b/src/api/providers/gemini.ts index a49073ea334..243310e6281 100644 --- a/src/api/providers/gemini.ts +++ b/src/api/providers/gemini.ts @@ -348,8 +348,29 @@ export class GeminiHandler extends BaseProvider implements SingleCompletionHandl override getModel() { const modelId = this.options.apiModelId - let id = modelId && modelId in geminiModels ? (modelId as GeminiModelId) : geminiDefaultModelId - let info: ModelInfo = geminiModels[id] + + let id: string + let info: ModelInfo + + if (modelId && modelId in geminiModels) { + // Known Gemini model -- use its curated ModelInfo. + id = modelId as GeminiModelId + info = geminiModels[id as GeminiModelId] + } else if (modelId) { + // Custom model name not in the predefined list. + // Pass it through as-is so the user's chosen model is respected. + id = modelId + info = { + maxTokens: 8192, + contextWindow: 1_048_576, + supportsImages: true, + supportsPromptCache: false, + } + } else { + // No model specified -- fall back to the default. + id = geminiDefaultModelId + info = geminiModels[geminiDefaultModelId] + } const params = getModelParams({ format: "gemini",