Claude rejects forced tool_choice: steer generate_video by description

Claude Sonnet 5.5 and Opus 5.5 return a 400 for tool_choice any or tool, and thinking cannot be disabled. Steer Sume tool calls with descriptions and a dry run.

4 min readSume
All posts

You cannot make Claude Sonnet 5.5 or Opus 5.5 call a tool by forcing it. The Claude API release notes say tool_choice set to any or tool returns a 400 on both (Sonnet 5.5 from Sep 28, Opus 5.5 from Sep 22), and that thinking cannot be disabled. To get generate_video called, guide the model with the tool description and your prompt.

Opus 5.5 is listed at $4 and $20 per million tokens for input and output.

What changed

Claude API release notes, Sep 2026 (read 2026-10-03)
ModelDateTool choice any or toolThinking
Opus 5.5Sep 22Returns 400Cannot be disabled
Sonnet 5.5Sep 28Returns 400Cannot be disabled

Why a forced call was tempting

A forced call guarantees a tool result, which is convenient for a pipeline that wants exactly one render. With a paid tool, forcing was also risky: the model had no chance to pause, check the cost or ask a question.

The replacement is to make the right call the obvious one, and to put the safety in the arguments.

Steering with the tool contract

Sume's hosted MCP lets the agent read a tool's contract before using it. tools_schema with a name returns one tool contract, and the docs give an example instruction: call tools_schema for generate_image and explain idempotency_key and dry_run before submitting any paid generation.

  • Say in the system prompt when to use the tool: for example, when the user asks for a clip.
  • State which fields are mandatory: idempotency_key on every paid call.
  • Tell it to omit payload.model unless the user named a family; the router then uses sume/auto.
  • Ask for dry_run=true first on anything expensive, then a real call.

Checking that it called

Without forcing, your code has to verify the outcome. In a Messages API loop, look for a tool use block, and treat a text-only reply as a case to handle: re-prompt, or fall back to a plain REST submit.

If three or more independent calls of the same shape are needed, the docs point to script_run, which runs a short script on Sume's side that calls the tools in a loop or in parallel and returns one value. It is bounded by timeout_seconds, max_calls and max_paid_calls.

After the call

A paid call returns a job, not a finished video. Wait with jobs_wait in slices of at most 55 seconds, then read jobs_result. If a slice expires, call jobs_wait again with the same ids. Resubmitting would create and bill a second job.

Sources

Related posts

More in Developers

All Developers posts

Written by Sume