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.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.
Asking a non-reasoning model to think is not an error. The opt-in is honored where it can
be; where the model has no reasoning mode, you get an ordinary answer and no reasoning
field.
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 draws from your plan’s included usage 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.