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-03)
FieldTypeDescription
No control at all31 of 65 chat modelsReasoning parameters are ignored entirely. Covers the Qwen family, most MiniMax models, Xiaomi, and several Mistral models. 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.
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.
none · minimal · low · medium · high · xhigh · maxgraded, with offThe widest scale, and the only one with minimal. GLM-5.2.
none · hightwo positionsMistral Medium 3.5, Mistral Small. Off, or on — nothing in between.
off · ontwo positionsGLM 4.5 through 5.1, the DeepSeek family, the NVIDIA Nemotron family. A switch, not a dial.
adaptive · disabledtwo positionsMiniMax M3. Either the model decides, or reasoning is off.

Defaults differ too — and several default to ON

Defaults across the catalog include none, off, disabled, low, medium, high and xhigh. GPT-5.5 and Claude Opus 4.7 default to xhigh; Opus 5, Opus 4.8, Sonnet 5 and Fable 5 default to high. If you send no reasoning parameter at all, those models still reason — and you still pay for it.

Finding out for your model

The catalog in the dashboard lists the control and accepted values per model. Treat it as the source of truth: the table above is a snapshot, and models are added and revised without a documentation deploy.

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, so the model runs on its own default instead.
  • 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 fall back to the model default. A typo does not silently disable reasoning, and is never forwarded upstream — some providers return 400 for an unknown level.
  • Models with no control ignore the field. No error, no cost, no effect.

What this means when routing substitutes a model

If your request is served by a different model (see Overview), your reasoning intent is re-resolved against the model that actually runs. A request that asked for max may therefore run at xhigh, or on a two-position model simply run with thinking on. The intent is preserved as closely as the substitute allows; it is never escalated.

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.