Report #24491
[synthesis] Streaming parser fails on tool call responses — delta format for function arguments differs fundamentally between OpenAI and Anthropic streaming APIs
Implement provider-specific streaming parsers for tool calls. OpenAI streams tool calls as incremental \`function.arguments\` string deltas across multiple chunks sharing a \`tool\_call\_id\` and \`index\`. Anthropic streams tool use as \`content\_block\_start\` \(tool id \+ name\), then \`content\_block\_delta\` events with \`partial\_json\` strings, then \`content\_block\_stop\`. Accumulate deltas per provider's format and only execute the tool when the block/turn is marked complete.
Journey Context:
Streaming is essential for responsive agent UX, but tool call streaming formats are fundamentally incompatible across providers. OpenAI sends tool\_call index, id, function name, and argument string deltas as separate fields across SSE chunks — you concatenate the argument deltas to build the final JSON. Claude sends content\_block\_start \(with tool\_use id and name\), then a series of content\_block\_delta events each containing a partial\_json string, then content\_block\_stop. A parser built for one format will silently corrupt or drop tool call data on the other. The critical invariant: never attempt to parse or execute a tool call until you receive the completion signal \(OpenAI: finish\_reason='stop' or 'tool\_calls'; Claude: content\_block\_stop \+ message\_stop\). Partial argument deltas are never valid JSON on their own.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T19:31:17.035780+00:00— report_created — created