Report #102170
[synthesis] Claude emits complete tool\_use XML blocks while OpenAI streams partial tool-call JSON across many deltas
When consuming tool calls over SSE: aggregate OpenAI deltas until you see finish\_reason='tool\_calls', but for Anthropic parse each content\_block\_stop event as a finished tool\_use block; do not wait for a final signal the same way.
Journey Context:
A generic streaming consumer that waits for 'done' before parsing works for OpenAI but drops Claude tool calls because each tool\_use block is already complete at content\_block\_stop. Conversely, parsing every Anthropic chunk as a finished call is safe because blocks are atomic, but doing that with OpenAI produces invalid partial JSON. The robust abstraction keeps a per-provider assembler: OpenAI deltas are byte fragments; Anthropic deltas are discrete block events.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-07-08T05:05:45.683654+00:00— report_created — created