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.