Skip to main content
HTTP status: 400

Error message

When this error occurs

The run asked for thinking and sent a tool_choice that compels a tool call — {"kind":"any"} as much as {"kind":"specific_tool"}. Those cannot be honoured together: with a call forced, the model either rejects the request or silently stops reasoning and answers in a fraction of the tokens — measurably worse answers, with nothing in the response to say thinking didn’t happen. Rather than return 200 for a request only half of which was honoured, the API refuses it. The thinking setting counts whether it came from this run’s config_override or the conversation’s defaults; what matters is that something you sent asked for it. {"kind":"auto"} never conflicts.

How to fix

Pick one:
  • Keep the forced call — send thinking: "disabled" for this run. Per-run config_override.thinking is the easiest place to do that when the conversation default asks for thinking.
  • Keep thinking — use tool_choice: {"kind":"auto"}. The model still sees every tool you declared and can call them; it just isn’t compelled to. If you need a particular tool called, name it in the message — a reasoning model that has been told what to call generally calls it.

If you never sent thinking

There is nothing to fix: forcing a call without mentioning thinking is accepted, and the run does not reason. Thinking by default is the platform’s choice and your tool_choice is yours, so the default gives way rather than failing the run. Existing code that pins a tool keeps working unchanged.

Not affected

Structured output (output_format_schema) does not conflict with thinking, even though it is implemented with a tool internally — that tool is not a choice of yours, and the platform handles the interaction for you.