DEV Community

Cover image for LLM Thinking Controls: What 13 Models Accept, Ignore, or Enforce
synthorai
synthorai

Posted on • Originally published at synthorai.io

LLM Thinking Controls: What 13 Models Accept, Ignore, or Enforce

The same thinking-control parameter means three different things depending on which model you send it to: thinking_budget: 16 burns exactly 16 reasoning tokens on Qwen 3.8 Max, GLM 5.2, and both DeepSeek V4 builds, is silently ignored on Kimi K3 and MiniMax M3, and is rejected with a 400 by GPT-5.6. We probed 13 models from nine vendors with every control spelling the OpenAI-compatible surface accepts, then measured what each dial position costs in reasoning tokens and what it breaks in accuracy, on the same four salted tasks, three runs per cell.

TL;DR

  • thinking: {"type": "disabled"} zeroes reasoning on 11 of 13 models; the two exceptions (Gemini pro, GPT-5.6) reject it.
  • Qwen, GLM, and DeepSeek burn thinking_budget: 16 as exactly 16; Kimi and MiniMax accept the field and change nothing: Kimi burned 8-97 against that cap, never 16.
  • Thinking off dropped 5-step arithmetic from 3/3 to 0-1/3 on eight models; DeepSeek V4 Pro and Claude kept 3/3 by writing steps into the visible answer.
  • JSON extraction scored 3/3 with thinking off on all 12 models that support off.

Which thinking controls does each API accept?

Three control families circulate on OpenAI-compatible surfaces, and no model honors all of them. reasoning_effort takes an enum (none through max), thinking_budget takes a token count, and thinking: {"type": "disabled"} (with its cousin enable_thinking: false) asks for a hard off. Here is the acceptance map we measured, one trivial salted question per cell:

Model reasoning_effort thinking_budget thinking: disabled
kimi-k3 all 7 values accepted, ignored works (rt=0)
qwen3.8-max all 7 values exact (16 → 16; 0 rejected) works
deepseek-v4-flash-0731 5 values, no off position exact (16 → 16) works
deepseek-v4-pro 5 values, no off position exact works
gpt-5.6-luna 5 of 7 values (minimal/max rejected upstream) rejected (400) rejected (400)
glm-5.2 all 7 values exact (16 → 16) works
gemini-3.6-flash all values; none/minimal truly off translated, coarse: 0-64 = off, 1,024 caps works (ct=2)
gemini-3.1-pro-preview none/minimal rejected (pro cannot disable) lowers burn, floors high (64 → 204) rejected (400)
minimax-m3 accepted; none ignored accepted, ignored works (ct=2)
Dola-Seed-2.0-pro 4 values; minimal truly off 0 = off; nonzero ignored (16 → 36-64) works (rt=0)
claude-sonnet-5 output_config.effort budget_tokens rejected (400) works
claude-opus-5 output_config.effort budget_tokens rejected (400) works
claude-fable-5 output_config.effort accepted accepted

Two rows deserve a flag. Google splits its own line: the flash tier turns off cleanly while the pro tier rejects every off-spelling with a 400, matching Google's position that pro-class thinking cannot be disabled. And the two claude-fable-5 cells marked "accepted" differ from Anthropic's published contract for that model, which specifies thinking cannot be disabled; treat those cells as in flux.

Does "accepted" mean "enforced"?

No, and the gap between the two is billed. A 200 response tells you the parameter parsed, not that it reached the model. The test that separates the two is trivial: send a budget of 16 and read the meter.

Qwen, GLM, and both DeepSeek builds burned exactly 16. Kimi burned 8, 19, 79, and 97 against the same cap across four runs, never 16, and MiniMax behaved the same at 18-44, billed as usual, with nothing in the response hinting the cap had been dropped. Gemini translates budgets into its native control at coarse granularity: on flash, caps of 0 through 64 behaved as a full off while 1,024 allowed thinking (median 141 on our 5-step task); the pro tier cut its burn under a cap but floored around 200 against a requested 64 and cannot reach zero. GPT-5.6 and Claude sit at the honest end of the spectrum: numeric budgets are rejected with a 400 and you know where you stand immediately.

The practical rule: after setting any thinking control, read completion_tokens_details.reasoning_tokens on the next response and confirm the dial moved. A control that fails loud costs you one retry; a control that fails silent costs you the reasoning bill you thought you had capped, on every call.

Is there a universal off-switch?

thinking: {"type": "disabled"} is as close as it gets: it zeroed reasoning on 11 of the 13 models, spanning Kimi, Qwen, both DeepSeeks, GLM, Gemini flash, MiniMax, ByteDance's Seed line, and all three Claude models. Its lookalike enable_thinking: false matches it almost everywhere, with one silent exception: MiniMax accepts it and keeps thinking (31 reasoning tokens on our probe).

The two exceptions fail loud rather than silent: Gemini pro returns a 400 for every off-spelling (the tier cannot disable thinking), and GPT-5.6 rejects the field too. GPT-5.6 needs no off-switch in the same sense: gpt-5.6-luna burns zero reasoning tokens on simple lookups and extractions by default (the two-lever pattern of that family), and reasoning_effort: "none" pins that behavior for math-shaped inputs too.

What does turning thinking off cost in accuracy?

On a 5-step arithmetic chain, everything: eight models fell from 3/3 to 0/3 or 1/3 the moment thinking went off. On a 2-hop word problem, much less: most models held 3/3 with thinking off, and only Kimi and MiniMax dropped to 0/3 there, the same fragile off state the K3 study found on its launch build. The cliff sits where the step count exceeds what the model can carry in a single visible pass.

Model 5-step multi, thinking on 5-step multi, thinking off
kimi-k3 3/3 (52 rt) 1/3
qwen3.8-max 3/3 (96 rt) 0/3
deepseek-v4-flash-0731 3/3 (70 rt) 1/3
deepseek-v4-pro 3/3 (112 rt) 3/3 (answer grew to 142 tokens)
gpt-5.6-luna 3/3 (33 rt) 0/3
glm-5.2 3/3 (237 rt) 0/3
gemini-3.6-flash 3/3 (338 rt) 0/3
minimax-m3 3/3 (66 rt) 1/3
Dola-Seed-2.0-pro 3/3 (128 rt) 0/3
claude-sonnet-5 3/3 (70 out) 3/3 (output grew to 139 tokens)
claude-opus-5 3/3 (60 out) 3/3

The three survivors share one trick: with thinking disabled they write the intermediate steps into the visible answer. DeepSeek V4 Pro's median reply grew from 115 to 142 tokens, Sonnet 5's from 70 to 139. You stop paying for hidden reasoning and start paying for visible reasoning, which on most price cards is the same output rate; the "off" switch relabels the spend more than it removes it. The models that obediently answer in 1-4 tokens when off are the ones that fall off the cliff.

Where the cliff bites, a small budget buys the accuracy back: thinking_budget: 256 restored 3/3 on Qwen and both DeepSeek builds at 77-128 median reasoning tokens, the same floor-rescue pattern we measured on the DeepSeek retrain and on Qwen 3.8's hidden caps.

One cell in our matrix produced no numbers at all: claude-fable-5 returned stop_reason: "refusal" (category cyber) for our exact arithmetic phrasing in 12 of 12 runs, at every effort setting, while a semantically identical rephrase passed 12 of 12. Anthropic documents refusal as a first-class stop reason with an opt-in fallback mechanism; if fable-class models are in your rotation, handle that stop reason before you need it.

What do the effort levels actually buy?

A different curve at every vendor, and only Google's slopes upward. We ran each model's full accepted enum on the same 5-step task, three runs per position, and plotted the medians on one scale:

One line chart, ten models: both Gemini lines and ByteDance Seed climb toward 360-390 reasoning tokens, GLM zigzags up to 345 with high dipping below low, while six lines from Kimi, Qwen, DeepSeek, MiniMax, GPT-5.6-luna, and Claude Opus 5 stay flat below 100; red x marks dial positions where accuracy fell

The lines sort into four shapes. Real throttles: both Geminis climb monotonically, 137 to 390 reasoning tokens on flash and 180 to 387 on pro (saturating at high), and low held 3/3 accuracy at a third to a half of the top positions' burn, which makes it the default worth pinning on Gemini pipelines. Flat lines: DeepSeek (78 at low, 54 at max, drifting down), Kimi (94 at minimal, 67 at max), and MiniMax (61-93 in no particular order) expose a multi-position dial where no position changes anything; DeepSeek's own model card quotes benchmarks at "max reasoning effort", a setting we already found indistinguishable from default. Caps that do not bind: Qwen's levels are budget ceilings, invisible on a task this size (85-156 with no trend) and real only on deep work, as measured in isolation. Non-monotonic: GLM's high burned 116 against low's 184 and max's 345; until that mapping settles, treat its middle positions as unordered. The two adaptive models barely need the dial at all: gpt-5.6-luna spans 32 to 41 tokens across its whole enum, and Opus 5's output_config.effort moved visible output only within noise (54-63 tokens, Sonnet 5 the same at 71-92), adaptive thinking making the real decision.

The operational rule falls out of the shapes: on Gemini, pick a level deliberately, because each step is real money. On Qwen, GLM, and DeepSeek, steer with thinking_budget (exact) and the off-switch, not the enum. Everywhere else the enum is decoration between off and default, and the only way to know which kind you have is the ladder test above: same task, every position, read the meter.

The task-shape lesson generalizes: on our single-step JSON extraction, thinking-on burned the highest counts in the whole matrix (377 reasoning tokens on GLM, 332 on Gemini flash) and bought nothing, because every one of the 12 models that can turn thinking off scored 3/3 on that task with it off. Structured extraction pays the largest pointless reasoning tax, and it is precisely the workload where the off-switch is safe.

Can you see what you paid for?

The billing meter is universal; the thinking itself is not. Six of the open-weight-family models return reasoning text in reasoning_content: GLM 5.2 and DeepSeek V4 Pro sent back what reads as the full chain (508 and 312 characters for 167 and 100 reasoning tokens), while Kimi, Qwen, DeepSeek Flash, MiniMax, and Seed returned shorter traces roughly in line with their small burns. GPT-5.6 and both Geminis return nothing: the reasoning tokens are billed and invisible. Claude returns thinking blocks whose content is omitted by default on the surface we measured, so you see that thinking happened, but not what it was.

That visibility split matters for debugging budget behavior: on the models that return nothing, reasoning_tokens in the usage details is your only instrument, which loops back to the rule above. Trust the meter, not the 200.

FAQ

How do I turn off thinking on an OpenAI-compatible API?

Send thinking: {"type": "disabled"}; in our 13-model matrix it zeroed reasoning on 11 (Kimi, Qwen, DeepSeek x2, GLM, Gemini flash, MiniMax, Seed, and the Claude family). Gemini pro cannot be turned off and returns a 400; GPT-5.6 rejects the field but barely thinks on simple tasks by default. Verify by reading reasoning_tokens on the next response.

Does thinking_budget: 0 disable thinking?

It depends on the model. On Gemini flash and ByteDance Seed, 0 behaves as a clean off; Qwen and DeepSeek reject 0 with a 400; Kimi and MiniMax accept any budget and ignore it. Where budgets are enforced to the token (Qwen, GLM, DeepSeek), the minimum useful value is a small positive number: 256 held 3/3 on Qwen and both DeepSeek builds on our 5-step task, while GLM wobbled to 2/3 at the same setting.

Is it safe to disable thinking for JSON extraction?

In our runs, yes: single-step extraction scored 3/3 with thinking off on every model that supports off, while thinking-on burned up to 377 reasoning tokens for the same output. The boundary is step count, not output format: multi-step tasks collapsed without thinking on 8 of 11 models. One caveat from our DeepSeek study: on the 0731 retrain, thinking-on actively corrupted strict-JSON values, so there the off-switch is a correctness fix too.

Which models enforce thinking budgets exactly?

Qwen 3.8 Max, GLM 5.2, and both DeepSeek V4 builds: request 16, the meter reads 16. Kimi K3 and MiniMax accept the same field and ignore it; Gemini translates it coarsely (small caps act as off on flash, pro floors high); GPT-5.6 and the Claude 5-generation models reject numeric budgets outright (Claude's budget_tokens returns a 400 pointing at adaptive thinking).

Measured 2026-08-11/12 through the Synthorai gateway: acceptance probes for reasoning_effort (7 values), thinking_budget (0/16/1024), enable_thinking, and thinking:{"type":"disabled"} across 13 models, re-verified hours before publication; then a 552-call tax matrix (four salted task shapes x 3 runs per arm, arms limited to each model's verified-working controls), a 183-call full-enum ladder on the 5-step task (the chart's data), top-up cells, and a per-model reasoning-visibility probe. Accuracy graded from raw answers; token medians of n=3; reasoning tokens read from completion_tokens_details.reasoning_tokens (Claude models report output tokens only). Prompts salted per call. Dial semantics and enums are the surface we measured on this date and may change; re-probe before relying on any single cell.

Top comments (0)