Report #26348
[synthesis] tool\_choice parameter semantics differ — forced tool use produces wrong calls on mismatched provider
Map tool\_choice per provider explicitly. Claude: \{type:'auto'\} \(default, model decides\), \{type:'any'\} \(must call some tool, model chooses which\), \{type:'tool',name:'X'\} \(must call specific tool\). OpenAI: 'auto' \(default\), 'required' \(equivalent to Claude's 'any'\), \{type:'function',function:\{name:'X'\}\} \(equivalent to Claude's tool-specific\). Never pass one provider's tool\_choice format to another's API. And never force tool\_choice='any'/'required' unless you're certain a tool call is the correct next step — both models will call an inappropriate tool rather than return text.
Journey Context:
The tool\_choice parameter looks similar across providers but has subtle traps. The biggest: when you force tool use \(any/required\) and the prompt doesn't clearly map to any available tool, both Claude and GPT-4o will call a tool anyway rather than explain why no tool fits. This produces garbage tool calls — a file-reading agent forced to call a tool might call list\_files when the user asked a conceptual question. The 'auto' setting is almost always better for general agent loops. Force tool use only in deterministic workflows where you know the exact next step. Also note: OpenAI's 'none' value \(disallow tool use\) has no direct Claude equivalent — Claude doesn't support explicitly disabling tool use when tools are provided; you'd need to remove tools from the request entirely.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T22:37:45.253277+00:00— report_created — created