From fdaeccf1e52ed36361331aa55260506b4719efef Mon Sep 17 00:00:00 2001 From: AveryanAlex Date: Sun, 29 Mar 2026 00:26:24 +0300 Subject: [PATCH] fix: use replaceAll for think tags to handle multiple occurrences --- open-sse/transformer/responsesTransformer.ts | 2 +- .../translator/response/openai-responses.ts | 2 +- tests/unit/responses-translation-fixes.test.mjs | 17 +++++++++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/open-sse/transformer/responsesTransformer.ts b/open-sse/transformer/responsesTransformer.ts index 602adcdd1c..6a6f8540ca 100644 --- a/open-sse/transformer/responsesTransformer.ts +++ b/open-sse/transformer/responsesTransformer.ts @@ -377,7 +377,7 @@ export function createResponsesApiTransformStream(logger = null) { if (content.includes("")) { state.inThinking = true; - content = content.replace("", ""); + content = content.replaceAll("", ""); startReasoning(controller, idx); } diff --git a/open-sse/translator/response/openai-responses.ts b/open-sse/translator/response/openai-responses.ts index 745b643de8..40ec923bd4 100644 --- a/open-sse/translator/response/openai-responses.ts +++ b/open-sse/translator/response/openai-responses.ts @@ -75,7 +75,7 @@ export function openaiToOpenAIResponsesResponse(chunk, state) { if (content.includes("")) { state.inThinking = true; - content = content.replace("", ""); + content = content.replaceAll("", ""); startReasoning(state, emit, idx); } diff --git a/tests/unit/responses-translation-fixes.test.mjs b/tests/unit/responses-translation-fixes.test.mjs index 8ecf34f4bd..6d66f7ed73 100644 --- a/tests/unit/responses-translation-fixes.test.mjs +++ b/tests/unit/responses-translation-fixes.test.mjs @@ -403,3 +403,20 @@ test("Responses→Chat streaming: reasoning delta emits reasoning_content in Cha assert.ok(result, "should return a chunk"); assert.equal(result.choices[0].delta.reasoning_content, "thinking step..."); }); + +test("Chat→Responses streaming: multiple tags in one chunk handled", () => { + const state = initState(FORMATS.OPENAI_RESPONSES); + + // Chunk with multiple think tags + const chunk = { + choices: [{ index: 0, delta: { content: "firstmiddlesecondend" }, finish_reason: null }], + id: "c1", + }; + const events = openaiToOpenAIResponsesResponse(chunk, state); + // Should not have literal in any text delta + const textDeltas = events + .filter((e) => e.event === "response.output_text.delta") + .map((e) => e.data.delta); + const combined = textDeltas.join(""); + assert.ok(!combined.includes(""), `text should not contain tag, got: ${combined}`); +});