ClaudeHowSupport Us

tool_choice type "tool" and "any" are not supported for this model

The error

A request that forces a tool call — tool_choice: {"type": "any"} or {"type": "tool", "name": "..."} — returns a 400 invalid_request_error:

tool_choice: type "tool" and "any" are not supported for this model.

It appears on Fable 5.1, Mythos 5.1, Opus 5.5 and Sonnet 5.5, and not only on the Messages API: the Message Batches API and the token-counting endpoint reject the same request, so a cost estimate built with count_tokens fails before any real traffic does. {"type": "auto"} and {"type": "none"} are unaffected.

Why it isn't about thinking

It is tempting to blame always-on thinking, but the documentation is explicit that this is a model-specific restriction: Fable 5 and Opus 5 also think by default and still accept forced tool choice. Treat it as a request-shape change on these four models, not as a consequence of reasoning being enabled.

The fix depends on why you were forcing the call

You wanted a specific tool used. Send auto, name the tool in the prompt ("use the get_weather tool to answer"), and check the response for a tool_use block — auto doesn't guarantee a call, so retry or fall back when there isn't one. Where the application requires the call on a given turn of a longer conversation, append a system message after the latest user turn that names the tool, says the call is required on this turn and asks Claude to open its response with it — then keep that message in the history afterwards.

You wanted schema-valid arguments. Put strict: true on the tool definition, with additionalProperties: false in its schema. That restores the guarantee any used to give, under auto.

You only wanted JSON back. Drop the tool and use structured outputs (output_config.format), which validates the response itself.

response = client.messages.create(
    model="claude-opus-5-5",
    max_tokens=1024,
    tools=[{**weather_tool, "strict": True}],
    tool_choice={"type": "auto"},
    messages=[{"role": "user", "content": "What's the weather in Paris? Use the get_weather tool."}],
)
if not any(block.type == "tool_use" for block in response.content):
    ...  # retry, or accept a text answer

disable_parallel_tool_use: true still works with auto, but now means at most one call rather than exactly one.

Two cases the usual fix doesn't cover

Customer-managed encryption keys. In an organisation using customer-managed keys, structured outputs — strict: true included — aren't available on the Fable models, so the schema guarantee can't be restored there. Rely on the prompt instruction and validate the arguments yourself.

The advisor tool. An executor that rejects forced tool choice rejects forcing the advisor tool too. Nudge the consult from the prompt instead.

Verified 2026-09-30 against ClaudeHow facts module (src/data/facts/) — see /about/#accuracy.