From 737fbb3fda155d7f9843cac4a36ee870b612eaaf Mon Sep 17 00:00:00 2001 From: daniel-lxs Date: Fri, 16 Jan 2026 17:07:50 -0500 Subject: [PATCH] fix(litellm): detect Gemini models with space-separated names for thought signature injection The isGeminiModel() function only matched hyphenated model names (e.g., gemini-3-pro) but LiteLLM model groups can use space-separated names like 'Gemini 3 Pro'. When the model isn't detected as Gemini, thought signatures aren't injected into the request, causing 'Corrupted thought signature' errors from the Vertex AI API. Changes: - Added lowerModelId.includes('gemini 3') and lowerModelId.includes('gemini 2.5') for space-separated model names - Updated provider-prefixed regex to match both hyphens and spaces - Added tests for space-separated model name detection Closes COM-508 --- src/api/providers/__tests__/lite-llm.spec.ts | 15 +++++++++++++++ src/api/providers/lite-llm.ts | 8 +++++++- 2 files changed, 22 insertions(+), 1 deletion(-) 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) ) }