Skip to content
RU

Reasoning effort

Reasoning models write an internal chain of thought before answering. It costs money and latency, but on multi-step problems — code, maths, untangling requirements — it noticeably raises quality. The reasoning_effort parameter on POST /v1/chat/completions controls how much a model spends on it.

Value Meaning
"off" Do not reason — a plain, fast answer
"low" Short chain
"medium" Medium (the default on most models)
"high" Long
"xhigh" Extended — not accepted everywhere
"max" Maximum — accepted by very few

Every model has its own set, and you do not have to guess it: GET /v1/models returns capabilities.reasoning_efforts — the values that model really accepts — and capabilities.can_disable_reasoning — whether it accepts "off".

curl -s https://api.mixen.ai/v1/models \
-H "Authorization: Bearer $MIXEN_API_KEY" \
| python -c "import json,sys; [print(m['id'], m['capabilities']['reasoning_efforts'], m['capabilities']['can_disable_reasoning']) for m in json.load(sys.stdin)['data'] if m['capabilities'].get('reasoning_efforts')]"

An unsupported level does not break the request

Section titled “An unsupported level does not break the request”

If a model does not accept the level you sent, we clamp it to the nearest level that is no deeper, instead of returning an error. So "max" on a model capped at high becomes "high", and "medium" on a model that only offers max becomes "max" (nothing closer exists).

The reason is practical: the level usually lives in client settings, separately from the model, and outlives a model switch — a hard error would mean a broken conversation right after switching models, with the user having changed nothing.

"off" is a separate case. On some models reasoning is innate and cannot be turned off (Claude Fable, Gemini 3.1 Pro, Grok 4.5/4.6, GPT-5 mini and others): those report can_disable_reasoning: false and "off" does not apply to them. Models that do not reason at all have an empty reasoning_efforts — passing the parameter to them is pointless.

There is a third case: a model that always reasons at its own depth — then reasoning_efforts is empty and can_disable_reasoning is false at the same time, and there is nothing to control. Trust both catalog fields rather than a model’s reputation.

Reasoning tokens are output tokens: they are billed at the model’s output price and counted in usage.completion_tokens together with the visible answer. That is why high on a long task can cost several times more than low for an answer that looks the same.

max_tokens caps the sum of reasoning and answer. Hence the most common failure: at a deep level the model spends the whole budget thinking, never reaches the text, and returns an empty content with finish_reason: "length". If the answer must be structured (JSON against a schema) and the effort is high, leave headroom — 8000 tokens and up.

from openai import OpenAI
client = OpenAI(base_url="https://api.mixen.ai/v1", api_key=MIXEN_API_KEY)
resp = client.chat.completions.create(
model="gpt-5.6-sol",
messages=[{"role": "user", "content": "17 people, 3 lifts holding 5 each. Fewest trips?"}],
reasoning_effort="high",
max_tokens=8000,
)
print(resp.choices[0].message.content)
print(resp.usage.completion_tokens, "output tokens, reasoning included")
  • Deeper is not always better. On simple questions, translation and rewriting, reasoning only adds cost and latency.
  • We do not hand out the chain of thought. You get the result; on the Anthropic protocol (POST /v1/messages) you also get thinking blocks, exactly as the original API returns them.
  • The default level belongs to the model. Omit reasoning_effort and a reasoning model still reasons, at its own default.