Capabilities

Reasoning

Some models can spend extra tokens working through a problem before they answer. What you may ask for depends on the model — there is no single set of levels that works everywhere.

Read this before you hardcode a level

Reasoning is not a uniform parameter. Roughly half the chat models on xKiro ignore it completely, and the ones that support it accept different sets of values — max is valid on some and meaningless on others. Sending a level a model does not have is safe (xKiro adjusts it, see below), but assuming it took effect is not.

How to ask#

Both dialects reach the same control. What you send is an intent; xKiro translates it into whatever the model that ends up serving your request actually understands.

Chat Completions
{ "reasoning_effort": "high" }
Messages — three accepted shapes
{ "thinking": { "type": "adaptive" } }                          // model decides the depth
{ "thinking": { "type": "enabled", "budget_tokens": 16000 } }  // a token budget
{ "thinking": { "type": "disabled" } }                         // off

Budgets become levels

When a request carrying budget_tokens is served by a model that expresses reasoning as a level rather than a budget, the budget is converted:

budget_tokens → intent
FieldTypeDescription
0→ noneA zero budget means no reasoning.
≤ 6,000→ lowA short pass.
≤ 13,000→ mediumBalanced.
≤ 24,000→ highDeep.
> 24,000→ xhighVery deep.

Support is per model#

Every model declares which control it has and which values it accepts. The shapes currently in the catalog:

Reasoning shapes in the catalog (measured 2026-08-24)
FieldTypeDescription
No control at all51 of 87 chat modelsReasoning parameters are ignored entirely. Covers the Qwen family, the DeepSeek family, most MiniMax models, the Kimi K2.x models, Xiaomi, several Mistral models, Tencent Hy3, Muse Spark, OX Alpha, and every Gemini except 3.6 and 3.7 Flash. Sending reasoning_effort to these changes nothing and costs nothing.
low · medium · high · xhigh · maxgradedThe full scale. GPT-5.6 (sol / terra / luna), Claude Fable 5, Opus 4.7, Opus 4.8, Opus 5, Sonnet 5.
low · medium · high · xhighgradedNo max. GPT-5.4, GPT-5.4-mini, GPT-5.5, Grok 4.6.
low · medium · high · maxgradedNo xhigh. Claude Sonnet 4.6, Claude Opus 4.6.
low · medium · highgradedClaude Haiku 4.5 — expressed internally as a token budget. Grok 4.5, Gemini 3.7 Flash.
low · high · maxgraded, non-adjacentThree steps with gaps. Kimi K3, GLM-5.3. Asking for medium or xhigh steps down to the nearest level the model has (low and high respectively).
minimal · low · medium · highgraded, minimal is offGemini 3.6 Flash. This model has no un-graded form, so a request that sets "reasoning_effort": "none" — or sends nothing at all — is served at minimal, the cheapest step. See below for how minimal differs from the GLM-5.2 scale.
none · minimal · low · medium · high · xhigh · maxgraded, with offThe widest scale. GLM-5.2. It shares minimal with Gemini 3.6 Flash, but the two mean different things — see below.
none · hightwo positionsMistral Medium 3.5, Mistral Small. Off, or on — nothing in between.
off · ontwo positionsGLM 4.5 through 5.1, GLM 5 Turbo, and the NVIDIA Nemotron family. A switch, not a dial.
adaptive · disabledtwo positionsMiniMax M3 on the free tier (minimax/minimax-m3:free). Either the model decides, or reasoning is off.

Send nothing and the two families behave in opposite ways

The listed defaults across the catalog include none, off, disabled, low, medium, high and xhigh — but what happens when you send no reasoning parameter depends on the family, and they differ:

Claude models do not reason. Their listed default is catalogue metadata for display; xKiro sends no thinking block unless you ask for one, so you pay nothing extra — and if you expected deep reasoning without asking, you will get a shallower answer than you planned for.

openai/gpt-5.6-*, gpt-5.5 and gpt-5.4* always reason: an effort value is always sent, so reasoning tokens are always billed.

Two meanings of minimal

Two models in the catalog accept minimal, and they do not mean the same thing. On GLM-5.2 it is a step on a graded scale that also has a separate none for switching reasoning off. On Gemini 3.6 Flash there is no none: minimal is the off position, and it is also what you get when you send no reasoning parameter at all.

The practical consequence is only on Gemini 3.6 Flash: asking for something below low lands on minimal rather than being refused, and a request that says nothing is served at the cheapest step rather than a middle one. If you want more than that on this model, ask for it explicitly.

Finding out for your model

Read it from the API instead of this page: GET /v1/models returns a reasoning_efforts object per model — the exact levels it accepts and its default, straight from the live catalog (see List models). The catalog in the dashboard shows the same data. Treat those as the source of truth: the table above is a snapshot, and models are added and revised without a documentation deploy.

Which levels does this model take?
curl -s https://api.xkiro.com/v1/models \
  | jq '.data[] | select(.id == "z-ai/glm-5.3") | .reasoning_efforts'
# { "levels": ["low", "high", "max"], "default": "high" }

Four intents, and why they differ#

This is the part that trips people up most, so it is worth stating precisely.

FieldTypeDescription
field omittedno opinionThe model applies its own default — which, per the warning above, is frequently ON. Nothing is sent upstream on your behalf.
none / disabledexplicitly offReasoning is turned off wherever the model can express that. Models declaring none, off or disabledreceive exactly that value; others get their adapter's own way of switching thinking off.
adaptivemodel decidesYou want reasoning but not a fixed depth. Resolves to the model's declared default level.
low … maxexplicit depthUsed as-is when the model declares that level; otherwise adjusted downward.

Omitting is not disabling

These are different requests with different bills. To turn reasoning off, say so: "reasoning_effort": "none" or thinking: { "type": "disabled" }. Leaving the field out lets each model do whatever it defaults to.

Levels a model does not have#

Nothing is rejected for this reason, and nothing is ever quietly upgraded. The rules, in order:

  • Above the model's range → step down to the nearest level it has. Asking for max on GPT-5.4, which stops at xhigh, gives xhigh — not the model default, which would be lower than you asked for.
  • Below the model's lowest level → nothing is sent. Rounding up would cost more than you asked for. On most models that means the model runs on its own default. ⚠️ On openai/gpt-5.6-*, gpt-5.5 and gpt-5.4* it does not mean "off": none lands on the model's lowest level and still bills reasoning tokens. There is currently no way to fully disable reasoning on those models.
  • Two-position models get the obvious answer. Any positive level turns the switch on; noneturns it off. There is no way to ask for "a bit" of thinking on those models.
  • Unrecognised values are never forwarded upstream. A typo does not silently disable reasoning — some providers return 400 for an unknown level, so xKiro drops it. On most models the model default then applies; on the models named above the lowest level applies instead.
  • Models with no control ignore the field. No error, no cost, no effect.

Reading the reasoning#

Where a model exposes its thinking, it arrives alongside the answer: thinking content blocks on Messages, and reasoning_content on the delta in Chat Completions. Not every model returns it, and some return only a summary.

Streaming both
for await (const chunk of stream) {
  const delta = chunk.choices[0]?.delta as
    | { content?: string; reasoning_content?: string }
    | undefined;

  if (delta?.reasoning_content) showThinking(delta.reasoning_content);
  if (delta?.content) showAnswer(delta.content);
}

Absent reasoning output does not mean absent reasoning

Some models reason without exposing it. Judge whether reasoning is active by the output token count and the latency, not by whether you can read the thinking.

Cost and latency#

  • Reasoning tokens are billed as output tokens. On the same prompt, a high level can cost several times what a low one does.
  • Time to first visible token grows with depth, because the model reasons before it writes. Use streaming so the wait is visible rather than blank.
  • Sampling parameters are dropped while reasoning is active — reasoning models reject temperature and top_p, so xKiro removes them rather than letting the provider fail the request.
  • If a model defaults to reasoning and you do not need it, turning it off explicitly is one of the largest single savings available.

Was this page helpful?