Report #55786
[synthesis] Streaming tool call reconstruction produces malformed JSON or interleaved arguments across models
Use provider-specific delta accumulation: for GPT, accumulate argument string deltas indexed by tool\_call index \(multiple tool calls can interleave in the stream\); for Claude, accumulate input\_json\_delta partial\_json strings indexed by content\_block\_index \(blocks stream sequentially\); never assume a single global argument buffer
Journey Context:
When streaming, tool call arguments arrive in chunks and must be reconstructed. GPT streams tool\_calls as an array where each element has an index and a function.arguments delta \(a string fragment\). Multiple parallel tool calls can interleave in the stream—index 0 gets a chunk, then index 1, then index 0 again. Claude streams content\_block\_delta events where delta.type='input\_json\_delta' carries a partial\_json string, indexed by content\_block\_index. Claude's content blocks stream sequentially \(block 0 completes before block 1 starts\). A streaming parser that uses a single argument buffer will mix chunks from different tool calls on GPT, producing invalid JSON. A parser that assumes sequential blocks will work on Claude but must still handle the interleaving on GPT. The synthesis: streaming tool call parsing requires fundamentally different accumulation strategies per provider, and any cross-model streaming abstraction must maintain per-index buffers with provider-aware ordering assumptions.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T00:07:41.630256+00:00— report_created — created