diff --git a/src/api/providers/__tests__/lite-llm.spec.ts b/src/api/providers/__tests__/lite-llm.spec.ts index 64cbd6e865..311d7680c6 100644 --- a/src/api/providers/__tests__/lite-llm.spec.ts +++ b/src/api/providers/__tests__/lite-llm.spec.ts @@ -414,6 +414,18 @@ describe("LiteLLMHandler", () => { expect(isGeminiModel("gemini-2.5-flash")).toBe(true) }) + it("should detect Gemini models with spaces (LiteLLM model groups)", () => { + const handler = new LiteLLMHandler(mockOptions) + const isGeminiModel = (handler as any).isGeminiModel.bind(handler) + + // LiteLLM model groups often use space-separated names with title case + expect(isGeminiModel("Gemini 3 Pro")).toBe(true) + expect(isGeminiModel("Gemini 3 Flash")).toBe(true) + expect(isGeminiModel("gemini 3 pro")).toBe(true) + expect(isGeminiModel("Gemini 2.5 Pro")).toBe(true) + expect(isGeminiModel("gemini 2.5 flash")).toBe(true) + }) + it("should detect provider-prefixed Gemini models", () => { const handler = new LiteLLMHandler(mockOptions) const isGeminiModel = (handler as any).isGeminiModel.bind(handler) @@ -421,6 +433,9 @@ describe("LiteLLMHandler", () => { expect(isGeminiModel("google/gemini-3-pro")).toBe(true) expect(isGeminiModel("vertex_ai/gemini-3-pro")).toBe(true) expect(isGeminiModel("vertex/gemini-2.5-pro")).toBe(true) + // Space-separated variants with provider prefix + expect(isGeminiModel("google/gemini 3 pro")).toBe(true) + expect(isGeminiModel("vertex_ai/gemini 2.5 pro")).toBe(true) }) it("should not detect non-Gemini models", () => { diff --git a/src/api/providers/lite-llm.ts b/src/api/providers/lite-llm.ts index fbafc9410f..45dc58da70 100644 --- a/src/api/providers/lite-llm.ts +++ b/src/api/providers/lite-llm.ts @@ -46,15 +46,21 @@ export class LiteLLMHandler extends RouterProvider implements SingleCompletionHa private isGeminiModel(modelId: string): boolean { // Match various Gemini model patterns: // - gemini-3-pro, gemini-3-flash, gemini-3-* + // - gemini 3 pro, Gemini 3 Pro (space-separated, case-insensitive) // - gemini/gemini-3-*, google/gemini-3-* // - vertex_ai/gemini-3-*, vertex/gemini-3-* // Also match Gemini 2.5+ models which use similar validation const lowerModelId = modelId.toLowerCase() return ( + // Match hyphenated versions: gemini-3, gemini-2.5 lowerModelId.includes("gemini-3") || lowerModelId.includes("gemini-2.5") || + // Match space-separated versions: "gemini 3", "gemini 2.5" + // This handles model names like "Gemini 3 Pro" from LiteLLM model groups + lowerModelId.includes("gemini 3") || + lowerModelId.includes("gemini 2.5") || // Also match provider-prefixed versions - /\b(gemini|google|vertex_ai|vertex)\/gemini-(3|2\.5)/i.test(modelId) + /\b(gemini|google|vertex_ai|vertex)\/gemini[-\s](3|2\.5)/i.test(modelId) ) }