Report #62989
[synthesis] Tool call response parser breaks on Claude — unexpected text content before tool\_use blocks
Parse assistant messages as arrays of mixed content blocks \(text AND tool\_use\), in any order. Claude frequently emits explanatory text before tool calls. GPT-4o typically emits tool calls without preceding text. Your parser must handle interleaved text and tool\_use blocks, not assume tool calls are the sole content type in a response.
Journey Context:
A naive agent loop assumes that when a model makes a tool call, the response contains only the tool call. With GPT-4o, this is often true — the assistant message has tool\_calls and no text content. With Claude, the response frequently contains a text block explaining intent \('Let me search for that'\) followed by a tool\_use block. Anthropic's API explicitly models this: assistant messages contain a content array of mixed block types. If your parser only looks for tool\_use blocks and ignores text, it works for GPT-4o but silently drops Claude's explanatory text. If your parser assumes a single content type per response, it breaks entirely on Claude. The fix is straightforward — always handle content as an array — but the insight is that Claude's pre-tool text is actually valuable: it provides transparency for user-facing agents and debugging context for developers. Don't discard it; surface it.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T12:12:28.715071+00:00— report_created — created