> ## Documentation Index
> Fetch the complete documentation index at: https://docs.narrative.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Thinking With Forced Tool Choice

> A run cannot both think and force a tool call.

**HTTP status:** 400

## Error message

```
thinking cannot be combined with tool_choice.specific_tool ('{tool}'): model '{model}' stops reasoning when a tool is forced
```

```
thinking cannot be combined with tool_choice.any: model '{model}' stops reasoning when a tool is forced
```

## 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.
