Reasoning is off-surface by default
Every chat endpoint hides the model’s chain-of-thought unless the request explicitly opted in. That default is deliberate: an unsolicited thinking block breaks strict clients — Claude Code with thinking disabled, for one — and a client that never asked for reasoning should never have to parse it. Nothing changes about the model’s behavior. Reasoning models still reason. The flag controls whether those tokens are surfaced to you, not whether they are produced.Asking for it
Each dialect has its own opt-in, and each returns the reasoning in that dialect’s native shape.reasoning_content is the DeepSeek/GLM/OSS convention rather than anything OpenAI
publishes, because OpenAI’s own API does not return chain-of-thought at all. Read it
defensively — treat a missing field as “no reasoning”, never as an error.Effort levels
Reasoning models that expose effort levels accept them on every dialect, and an effort level a model doesn’t offer is translated to the nearest one it does — you get an answer at a supported level rather than an error. That matters for agents whose config bakes inxhigh for a model that tops out at high: the request runs at high.
The same translation applies to the other knobs an egress needs (an output ceiling a
model can’t express is clamped to its maximum, for example). If a request declares a hard
requirement no placement of the model can honour at all — a forced tool_choice, a strict
response_format — you get a 422 before anything is sent, not a silently weaker
request. See Errors.
Which models reason
Check the catalog rather than assuming:capabilities.reasoning on each
GET /v1/models entry, and the Reasoning capability tag on the
Models page. It is a large slice of the catalog and it is not confined to one
tier — several workhorse models reason, and some frontier models do not surface it.
Check before you set an effort level: a model without a reasoning mode can’t honour one
exactly, so it is handled like any other effort mismatch — see
Effort levels.
Budget for it
This is the part that surprises people:- Hidden reasoning still costs output tokens. It is generated, so it is billed and it burns your credits at the model’s output rate exactly like visible output.
- It counts against
max_tokens. On a reasoning model, a tight output ceiling can be consumed entirely by thinking, leaving a truncated or empty answer withfinish_reason: "length". Budget generously — a ceiling that is comfortable on a non-reasoning model is often too small here. reasoning_effortis a dial, not a switch. Higher effort means more reasoning tokens and a slower, more expensive turn. Start at the low end and raise it only where the answers justify it.
A ceiling that leaves room to think
Streaming
Reasoning streams like any other content. On the Messages dialect it arrives as athinking content block that opens, deltas, and closes before the text block starts — so a
UI can show “thinking…” and then swap to the answer. See Streaming.