Report #79169
[synthesis] Tool results silently ignored or rejected after a tool call — model hallucinates as if tool never ran
Use provider-specific message formats for tool results: GPT-4o requires role='tool' with tool\_call\_id; Claude requires role='user' with a tool\_result content block referencing tool\_use\_id; Gemini requires a functionResponse part. Never reuse one provider's format for another.
Journey Context:
This is the single most common silent failure in cross-model agent code. If you send GPT-4o's role='tool' message to Claude, Claude either throws an API error \(rejecting the unknown role\) or ignores it, then responds as if it never received the tool output—often hallucinating an answer. The inverse \(sending Claude's tool\_result-in-user format to GPT-4o\) causes GPT-4o to treat it as a regular user message and get confused. The fix seems obvious in hindsight but is insidious because the error doesn't always surface as an API rejection—sometimes the model just quietly proceeds without the data, producing plausible but wrong results. Always map the result format per provider at the transport layer.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T15:29:04.439092+00:00— report_created — created