Report #68245
[gotcha] Streaming tool call arguments arrive as partial JSON fragments that crash JSON.parse
Buffer all argument delta chunks across the stream until finish\_reason is received, then parse the complete accumulated string. For real-time incremental parsing, use a streaming JSON parser \(e.g., partial-json, json-stream\). Never call JSON.parse on individual streamed argument deltas.
Journey Context:
When streaming is enabled and the model invokes a tool or function, the API returns arguments as delta string fragments: chunk 1 carries \`\{"na\`, chunk 2 carries \`me":\`, chunk 3 carries \`"get\_we\`, chunk 4 carries \`ather"\}\`. Each fragment is syntactically invalid JSON on its own. The two common mistakes are: \(a\) disabling streaming entirely for tool-calling endpoints, sacrificing the perceived-speed UX benefit, or \(b\) attempting JSON.parse on each delta and crashing on every intermediate chunk. The correct approach is to accumulate the arguments string across all delta chunks and parse only after the stream signals completion via finish\_reason. This preserves streaming UX for content display while handling structured data correctly. Some SDKs handle this accumulation internally, but raw HTTP streaming clients do not — and this is exactly where most custom integrations break.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T21:02:05.127923+00:00— report_created — created