From ed0cfcbda2a71a21ddf51f20776d93c4df9a470c Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Thu, 12 Feb 2026 21:09:33 +0100 Subject: [PATCH] fix(ai): tolerate malformed trailing tool-call JSON in OpenAI streams closes #1424 --- packages/ai/src/providers/openai-completions.ts | 2 +- packages/ai/src/providers/openai-responses-shared.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/ai/src/providers/openai-completions.ts b/packages/ai/src/providers/openai-completions.ts index 7150af2b..f724401b 100644 --- a/packages/ai/src/providers/openai-completions.ts +++ b/packages/ai/src/providers/openai-completions.ts @@ -129,7 +129,7 @@ export const streamOpenAICompletions: StreamFunction<"openai-completions", OpenA partial: output, }); } else if (block.type === "toolCall") { - block.arguments = JSON.parse(block.partialArgs || "{}"); + block.arguments = parseStreamingJson(block.partialArgs); delete block.partialArgs; stream.push({ type: "toolcall_end", diff --git a/packages/ai/src/providers/openai-responses-shared.ts b/packages/ai/src/providers/openai-responses-shared.ts index 4642e4e8..552bc606 100644 --- a/packages/ai/src/providers/openai-responses-shared.ts +++ b/packages/ai/src/providers/openai-responses-shared.ts @@ -414,8 +414,8 @@ export async function processResponsesStream( } else if (item.type === "function_call") { const args = currentBlock?.type === "toolCall" && currentBlock.partialJson - ? JSON.parse(currentBlock.partialJson) - : JSON.parse(item.arguments); + ? parseStreamingJson(currentBlock.partialJson) + : parseStreamingJson(item.arguments || "{}"); const toolCall: ToolCall = { type: "toolCall", id: `${item.call_id}|${item.id}`,