Certopolis

Claude Certified Architect – Foundations

tool_choice: auto, any, tool and none

tool_choice has four values. auto lets Claude decide whether to call a tool, any forces a call to one of your tools, tool forces a call to the one tool you name, and none stops Claude from calling tools at all.

The four values

auto is the default when you send tools. Claude calls a tool when the request maps to one, or answers in text. none is the default when you send no tools. any means Claude must call one of the provided tools but picks which. tool forces one named tool, for example {"type": "tool", "name": "get_weather"}.

With any or tool, the API prefills the assistant turn so the response starts with the tool call. Claude writes no explanation before the tool_use block, even if your prompt asks for one, and it skips thinking: there is no thinking block. If you want a sentence of context or some reasoning first, use auto and say in the user message which tool to use.

Where forced tool use is rejected

Manual extended thinking (thinking: {"type": "enabled"}) does not support any or tool; only auto and none work. Claude Opus 5.5, Claude Sonnet 5.5, Claude Fable 5.1 and Claude Mythos 5.1 return a 400 for any and tool whatever the thinking settings. On those models, use auto with strict: true on your tools to guarantee schema-valid inputs, or structured outputs when you need a fixed JSON reply.

Cost and caching

Declaring tools adds a tool-use system prompt, and its size depends on tool_choice. On Claude Opus 5 it is 286 tokens for auto or none and 406 tokens for any or tool. With no tools at all and none, it is 0. A request path that never needs tools should leave the tools array out rather than send it with none.

Changing tool_choice between requests invalidates cached message blocks. Tool definitions and the system prompt stay cached, but message content is reprocessed.

To limit Claude to a single call per response, set disable_parallel_tool_use: true inside the tool_choice object. It is not a top-level request parameter.

Where the exam catches people

  • Believing a system prompt can make Claude explain itself before a forced call: with any or tool the turn is prefilled and no text comes first.
  • Believing tool_choice: none removes all tool overhead: the tool-use system prompt is still added while the tools array is present.
  • Believing a tool_choice change invalidates the whole cache: tools and system stay cached, only message blocks are reprocessed.
  • Believing every model accepts any: Opus 5.5, Sonnet 5.5, Fable 5.1 and Mythos 5.1 return a 400 for any and tool.

Written from Anthropic's documentation

Try 3 questions on this

Pick an answer to see why each option is right or wrong.

  1. Your support service on Claude Sonnet 5 (claude-sonnet-5) sets tool_choice to {"type": "any"} and instructs the model in its system prompt to explain its reasoning in one sentence before calling a tool. The tool calls are correct, but the explanatory sentence never appears. What is the most likely cause?

    Right. In the game that’s Renown for your Tool Design, MCP and Server Tools building.

    Not that one: D is right. In the game your Tool Design, MCP and Server Tools building would lose a little Renown, and this question would come back later.

  2. Your service on Claude Opus 5 (claude-opus-5) caches a large system prompt and tool catalogue. For a small subset of requests it switches tool_choice from {"type": "auto"} to {"type": "any"} on an otherwise identical conversation, and monitoring shows those requests reading only part of the prefix from cache. What is the most likely root cause?

    Right. In the game that’s Renown for your Tool Design, MCP and Server Tools building.

    Not that one: C is right. In the game your Tool Design, MCP and Server Tools building would lose a little Renown, and this question would come back later.

  3. Your service shares one Claude Opus 5 (claude-opus-5) request builder across an agentic path and a high-volume classification path. The classification path never needs tools but still ships the full tool array with tool_choice: {"type": "none"}, and its prompts are short. You want the classification path to carry no automatic tool overhead and to stop paying repeatedly for tool definitions. What's the most effective way to meet these requirements at the lowest cost?

    Right. In the game that’s Renown for your Tool Design, MCP and Server Tools building.

    Not that one: A is right. In the game your Tool Design, MCP and Server Tools building would lose a little Renown, and this question would come back later.

    Show the full explanation and doc quotes

    Overhead is zero only when no tools are declared and tool_choice is none. For a path that never calls a tool, omitting the array is both the cheapest and the simplest fix.

    Written from platform.claude.com/docs/en/agents-and-tools/tool-use/overview