From d3a24446b84da59aeb55987ed3fb874b61c32b03 Mon Sep 17 00:00:00 2001 From: Mikhail Salnikov <14850941+mikhailsal@users.noreply.github.com> Date: Sun, 29 Mar 2026 21:44:13 +0300 Subject: [PATCH] fix: trim leading whitespace from assembled content in log summaries NVIDIA and other providers emit token deltas with leading spaces (e.g. ' The', ' user'). When joined, these produce a leading space in the provider_response and parsed non-streaming response logs. Trim the joined content and reasoning_content in both buildOpenAISummary and parseSSEToOpenAIResponse for consistent log output. --- open-sse/handlers/sseParser.ts | 8 +++++--- open-sse/utils/streamPayloadCollector.ts | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/open-sse/handlers/sseParser.ts b/open-sse/handlers/sseParser.ts index 4a9626ac7b..aa579010bc 100644 --- a/open-sse/handlers/sseParser.ts +++ b/open-sse/handlers/sseParser.ts @@ -98,12 +98,14 @@ export function parseSSEToOpenAIResponse(rawSSE, fallbackModel) { } } + const joinedContent = contentParts.length > 0 ? contentParts.join("").trim() : null; + const joinedReasoning = reasoningParts.length > 0 ? reasoningParts.join("").trim() : null; const message: Record = { role: "assistant", - content: contentParts.length > 0 ? contentParts.join("") : null, + content: joinedContent || null, }; - if (reasoningParts.length > 0) { - message.reasoning_content = reasoningParts.join(""); + if (joinedReasoning) { + message.reasoning_content = joinedReasoning; } const finalToolCalls = [...accumulatedToolCalls.values()].filter(Boolean).sort((a, b) => { diff --git a/open-sse/utils/streamPayloadCollector.ts b/open-sse/utils/streamPayloadCollector.ts index 427770fa08..58a20cbb5e 100644 --- a/open-sse/utils/streamPayloadCollector.ts +++ b/open-sse/utils/streamPayloadCollector.ts @@ -207,12 +207,14 @@ function buildOpenAISummary(events: StructuredSSEEvent[], fallbackModel?: string } } + const joinedContent = contentParts.length > 0 ? contentParts.join("").trim() : null; + const joinedReasoning = reasoningParts.length > 0 ? reasoningParts.join("").trim() : null; const message: JsonRecord = { role: "assistant", - content: contentParts.length > 0 ? contentParts.join("") : null, + content: joinedContent || null, }; - if (reasoningParts.length > 0) { - message.reasoning_content = reasoningParts.join(""); + if (joinedReasoning) { + message.reasoning_content = joinedReasoning; } const finalToolCalls = [...toolCalls.values()].sort((a, b) => a.index - b.index);