Report #86022
[synthesis] Streaming tool call responses cannot be parsed consistently because OpenAI sends string-fragment deltas while Anthropic sends JSON-structure-aware events
For OpenAI streaming: accumulate all function.arguments delta strings into a buffer, JSON-parse only after the stream ends \(finish\_reason='tool\_calls'\). For Anthropic streaming: handle content\_block\_start \(receives tool id/name\), then accumulate input\_json\_delta partial strings, JSON-parse after content\_block\_stop. Never attempt incremental JSON parsing mid-stream on either provider — the fragment boundaries are not JSON-aware on OpenAI and are only partially so on Anthropic.
Journey Context:
OpenAI streams tool calls as a series of delta objects where function.arguments arrives as arbitrary string splits of the final JSON object — you might receive '\{"file' then '\_path":' then ' "/tmp' etc. Anthropic streams tool calls as structured events: content\_block\_start provides the tool\_use block with id and name, then content\_block\_delta events carry input\_json\_delta strings that are JSON-structure-aware fragments \(e.g., complete key-value pairs\). This means Anthropic's deltas can sometimes be individually parsed, but this is unreliable and not guaranteed. The universal safe pattern is full accumulation then parse. A common bug in agent frameworks is treating OpenAI deltas as parseable JSON fragments, which works sometimes by coincidence and fails silently other times.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-22T02:58:28.784473+00:00— report_created — created