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.
{ "reasoning_effort": "high" }{ "thinking": { "type": "adaptive" } } // model decides the depth
{ "thinking": { "type": "enabled", "budget_tokens": 16000 } } // a token budget
{ "thinking": { "type": "disabled" } } // offBudgets 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:
| Field | Type | Description |
|---|---|---|
0 | → none | A zero budget means no reasoning. |
≤ 6,000 | → low | A short pass. |
≤ 13,000 | → medium | Balanced. |
≤ 24,000 | → high | Deep. |
> 24,000 | → xhigh | Very deep. |
Support is per model#
Every model declares which control it has and which values it accepts. The shapes currently in the catalog:
| Field | Type | Description |
|---|---|---|
No control at all | 51 of 87 chat models | Reasoning 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 · max | graded | The full scale. GPT-5.6 (sol / terra / luna), Claude Fable 5, Opus 4.7, Opus 4.8, Opus 5, Sonnet 5. |
low · medium · high · xhigh | graded | No max. GPT-5.4, GPT-5.4-mini, GPT-5.5, Grok 4.6. |
low · medium · high · max | graded | No xhigh. Claude Sonnet 4.6, Claude Opus 4.6. |
low · medium · high | graded | Claude Haiku 4.5 — expressed internally as a token budget. Grok 4.5, Gemini 3.7 Flash. |
low · high · max | graded, non-adjacent | Three 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 · high | graded, minimal is off | Gemini 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 · max | graded, with off | The widest scale. GLM-5.2. It shares minimal with Gemini 3.6 Flash, but the two mean different things — see below. |
none · high | two positions | Mistral Medium 3.5, Mistral Small. Off, or on — nothing in between. |
off · on | two positions | GLM 4.5 through 5.1, GLM 5 Turbo, and the NVIDIA Nemotron family. A switch, not a dial. |
adaptive · disabled | two positions | MiniMax 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.
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.
| Field | Type | Description |
|---|---|---|
field omitted | no opinion | The model applies its own default — which, per the warning above, is frequently ON. Nothing is sent upstream on your behalf. |
none / disabled | explicitly off | Reasoning 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. |
adaptive | model decides | You want reasoning but not a fixed depth. Resolves to the model's declared default level. |
low … max | explicit depth | Used 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
maxon GPT-5.4, which stops atxhigh, givesxhigh— 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.5andgpt-5.4*it does not mean "off":nonelands 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
400for 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.
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
temperatureandtop_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.
