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.
Levels
Section titled “Levels”| 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.
What it costs
Section titled “What it costs”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.
Examples
Section titled “Examples”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")curl https://api.mixen.ai/v1/chat/completions \ -H "Authorization: Bearer $MIXEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-5.6-sol", "reasoning_effort": "high", "max_tokens": 8000, "messages": [{"role": "user", "content": "17 people, 3 lifts holding 5 each. Fewest trips?"}] }'Things to keep in mind
Section titled “Things to keep in mind”- 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 getthinkingblocks, exactly as the original API returns them. - The default level belongs to the model. Omit
reasoning_effortand a reasoning model still reasons, at its own default.