From 0e7925309dfe133942275bfc520c87b91fa779b7 Mon Sep 17 00:00:00 2001 From: MSiva <113901375+Siva010@users.noreply.github.com> Date: Fri, 18 Sep 2026 19:59:15 +0530 Subject: [PATCH] fix(translator): map Claude stop_sequences and stop to Gemini stopSequences (#12785) --- .../translator/request/claude-to-gemini.ts | 9 +++--- .../unit/translator-claude-to-gemini.test.ts | 31 +++++++++++++++++++ 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/open-sse/translator/request/claude-to-gemini.ts b/open-sse/translator/request/claude-to-gemini.ts index 8be6ee8fc5..c17472173a 100644 --- a/open-sse/translator/request/claude-to-gemini.ts +++ b/open-sse/translator/request/claude-to-gemini.ts @@ -1,9 +1,6 @@ import { register } from "../registry.ts"; import { FORMATS } from "../formats.ts"; -import { - DEFAULT_SAFETY_SETTINGS, - cleanJSONSchemaForAntigravity, -} from "../helpers/geminiHelper.ts"; +import { DEFAULT_SAFETY_SETTINGS, cleanJSONSchemaForAntigravity } from "../helpers/geminiHelper.ts"; import { buildGeminiTools, sanitizeGeminiToolName } from "../helpers/geminiToolsSanitizer.ts"; import { buildGeminiThoughtSignatureKey, @@ -83,6 +80,10 @@ export function claudeToGeminiRequest(model, body, stream, credentials = null) { result.generationConfig.maxOutputTokens = maxOutputTokens; } } + if (body.stop_sequences !== undefined || body.stop !== undefined) { + const rawStop = body.stop_sequences ?? body.stop; + result.generationConfig.stopSequences = Array.isArray(rawStop) ? rawStop : [rawStop]; + } // ── System instruction ───────────────────────────────────────── if (body.system) { diff --git a/tests/unit/translator-claude-to-gemini.test.ts b/tests/unit/translator-claude-to-gemini.test.ts index 0b82ef1a1f..dce1ca3836 100644 --- a/tests/unit/translator-claude-to-gemini.test.ts +++ b/tests/unit/translator-claude-to-gemini.test.ts @@ -486,3 +486,34 @@ test("Claude -> Gemini non-numeric budget_tokens falls through to effort path", includeThoughts: true, }); }); + +test("Claude -> Gemini maps stop_sequences and stop to generationConfig.stopSequences", () => { + const result1 = claudeToGeminiRequest( + "gemini-2.5-pro", + { + messages: [{ role: "user", content: [{ type: "text", text: "hi" }] }], + stop_sequences: ["STOP", "\nHuman:"], + }, + false + ); + assert.deepEqual(result1.generationConfig.stopSequences, ["STOP", "\nHuman:"]); + + const result2 = claudeToGeminiRequest( + "gemini-2.5-pro", + { + messages: [{ role: "user", content: [{ type: "text", text: "hi" }] }], + stop: "SINGLE_STOP", + }, + false + ); + assert.deepEqual(result2.generationConfig.stopSequences, ["SINGLE_STOP"]); + + const result3 = claudeToGeminiRequest( + "gemini-2.5-pro", + { + messages: [{ role: "user", content: [{ type: "text", text: "hi" }] }], + }, + false + ); + assert.strictEqual(result3.generationConfig.stopSequences, undefined); +});