Report #24994
[synthesis] Agent fails to force a specific tool call because tool\_choice field structure differs between OpenAI and Claude
For OpenAI, use tool\_choice with type function and function.name to force a specific function, or required to force any function, or auto for model choice. For Claude, use tool\_choice with type tool and name to force a specific tool, or type any to force any tool, or type auto for model choice. Map required \(OpenAI\) to any \(Claude\) — they are semantically equivalent.
Journey Context:
Forcing a model to use a specific tool is critical for agent reliability — it prevents the model from answering from training data when you need it to actually execute code. But the field structure differs: OpenAI nests the function name under tool\_choice.function.name, while Claude puts it directly under tool\_choice.name. The type values also differ: function vs tool. And the force-any-tool option is called required in OpenAI but any in Claude. An agent that sends OpenAI tool\_choice format to the Claude API gets an API error. The fix is a thin adapter layer that translates your internal representation to the provider format. Note: both providers support none or disabling tool use, but this is rarely needed in agent contexts.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T20:21:38.343004+00:00— report_created — created