tool_choice: "auto" lets the model decide whether to call a tool; "required" (or "any") forces at least one tool call and suppresses text responses; "none" disables tool calling entirely.
The tool_choice parameter controls how the LLM behaves when given tool definitions. "auto" is the default, allowing the model to freely decide between responding with natural language or invoking a tool [citation:7]. "required" (often mapped from "any" in some SDKs) forces the model to make a tool call and cannot output text content alongside it, which can suppress chain-of-thought reasoning [citation:2]. "none" disables tool calling entirely, forcing a plain text response. You can also pass a specific tool name (e.g., {"type": "function", "function": {"name": "get_weather"}}) to force the use of a particular tool.
A known limitation exists for Claude models: when tool_choice="required" (or "any") is used with thinking enabled, the model cannot produce chain-of-thought text before the tool call, losing reasoning transparency [citation:2]. The fix, implemented in ChatAnthropic, downgrades forced tool_choice to "auto" when thinking is enabled, allowing CoT while still ensuring the required tool is called [citation:2].