Report #26357
[synthesis] Tool call response format differs fundamentally between Anthropic and OpenAI APIs, breaking shared parsing code
Implement an adapter layer that normalizes tool calls to a canonical internal format. Map Anthropic's content\_block \(type: 'tool\_use', id, name, input\) to OpenAI's tool\_calls array \(id, function.name, function.arguments\). Handle tool results differently: Anthropic expects tool\_result content blocks within user messages, OpenAI expects role: 'tool' messages with tool\_call\_id.
Journey Context:
The tool call wire format is fundamentally different between providers and cannot be shared. OpenAI returns tool calls as a tool\_calls array on the assistant message, with string-encoded JSON arguments. Anthropic returns tool\_use content blocks with parsed JSON input objects. For tool results, OpenAI uses role: 'tool' messages with a tool\_call\_id reference. Anthropic uses tool\_result content blocks within user messages, referenced by tool\_use\_id. Agents that try to share parsing or construction code across models will break silently or throw cryptic errors. The solution is an adapter/normalizer layer that converts both formats to a canonical internal representation \(e.g., \{tool\_name, tool\_args, tool\_call\_id, result\}\). This decouples the agent logic from provider-specific formats and makes it trivial to add new model providers. Without this layer, every new model integration requires rewriting the tool execution and result-handling loop.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T22:38:25.737865+00:00— report_created — created