Skip to main content
Some models think before they answer. You set how much with a reasoning effort, and most of them can return their reasoning alongside the answer. What you get back depends on the model. Claude, Gemini and OpenAI models return the provider’s summary of their reasoning, not the full chain of thought. Open-weight models such as DeepSeek, GLM and gpt-oss return their raw reasoning text. Reasoning is opt-in: set an effort to get it back.

Quick reference

Effort levels

Every endpoint accepts the same levels, from least to most thinking: none, minimal, low, medium, high, xhigh, max
  • Which levels a model takes is listed in its reasoning.effort_levels in the model catalog. Levels differ by model: Claude 5 models take low to max, for example, and GPT-5.4 takes none, low, medium, high and xhigh.
  • A level the model doesn’t take normally runs at the nearest level it does. For example, none and minimal run as low on Claude 5 models, and an effort sent to a model that doesn’t reason is not sent at all. On Gemini 2.5 models, xhigh and max can be refused with a 400, so send high.
  • Gemini models take levels up to high. Send high rather than xhigh or max.
  • none asks for no reasoning. Models that can’t stop thinking (can_disable: false) still think, but return no reasoning.
  • Stay within effort_levels to be sure of the level you get. A few models can still receive a level they don’t list, for example low on GPT-5.2 Pro and GPT-5.4 Pro.

Pick an effort from the model catalog

GET /platform/v2/models returns a reasoning object on every model that reasons, and null on every model that doesn’t:
To pick an effort, take the level you want if the model lists it, otherwise the nearest level it does list:

What comes back

Chat Completions

A non-streamed answer carries the reasoning in message.reasoning_content:
On Direct Completions, a stream sends the reasoning as delta.reasoning_content chunks before the first answer chunk (chunks trimmed):
The guarded and grounded chat streams carry no reasoning: a streamed answer there, Claude’s included, has no summary. To read reasoning from those endpoints, send a non-streamed request.

Responses

On the Responses endpoints, set reasoning.summary (auto, concise or detailed) to get the reasoning back. Without it, OpenAI and Claude models normally return no summary. The summary comes back as a reasoning item in output[], before the message item:
Claude models on the guarded and grounded endpoints return reasoning item ids that start with reasoning_; OpenAI models return rs_ ids. Only Direct Responses streams the summary, and only for OpenAI models served over OpenAI’s Responses API, which pass on OpenAI’s own reasoning events. They arrive before the message item opens (payloads trimmed):
Read the reasoning from response.reasoning_summary_text.delta (or the final text from .done) and the answer from response.output_text.delta, as with OpenAI.

Examples by endpoint

Each example sets an effort and reads the reasoning and the answer. Streamed examples are shown for the endpoints that stream reasoning. The OpenAI SDKs send reasoning_effort and reasoning natively. They don’t type reasoning_content, so read it with getattr in Python and a wider type in TypeScript. Parameters the SDKs don’t know, such as the grounding parameters, go in extra_body in Python and top-level with a cast in TypeScript. If your SDK version doesn’t type a level you send (such as max), pass it in extra_body as well.

Completions

POST /ai/v2/guarded/chat/completions. The answer is moderated; the reasoning is not (see below).

Grounded Completions

POST /ai/v2/grounded/chat/completions. Point the SDK at https://platform.ai.gloo.com/ai/v2/grounded and send the grounding parameters as extra fields. The answer is moderated; the reasoning is not.

Direct Completions

POST /ai/v2/direct/chat/completions. Nothing is moderated on direct endpoints.
Streamed:

Responses

POST /ai/v2/guarded/responses. The answer is moderated; the reasoning summary is not.

Grounded Responses

POST /ai/v1/grounded/responses. Point the SDK at https://platform.ai.gloo.com/ai/v1/grounded and send the grounding parameters as extra fields.

Direct Responses

POST /ai/v2/direct/responses. A non-streamed response carries the summary for every model that returns one. A stream carries it only for OpenAI models served over OpenAI’s Responses API, such as GPT-5.4.
Streamed, with an OpenAI model:

How the endpoints differ

By model family

Check the live model catalog for current model IDs and each model’s reasoning object.

Reasoning is not moderated

On the guarded endpoints (Completions, Grounded Completions and Responses), output moderation checks the answer, not the reasoning. When moderation replaces an answer, the reasoning from the original answer is still returned.
If you show reasoning to your end users and rely on Gloo’s output moderation, check reasoning_content (or the Responses reasoning item) yourself first, or don’t show it.

Thinking uses your output limit

Thinking tokens count toward max_tokens (max_output_tokens on Responses) and are billed as output tokens, whether or not any reasoning comes back. For Claude 5 models and Gemini 2.5 Flash and Flash-Lite, Gloo sends your limit to the provider as you set it. A high effort can use up a small limit before the answer starts, and the response then ends with finish_reason: "length" and little or no answer text. Leave room for the thinking as well as the answer, or lower the effort. See Reasoning models and the output limit.

When a provider fails mid-reasoning

For the Claude models that always think, if the provider fails after a Direct Completions stream has sent reasoning but no answer text, Gloo can send the request to another provider instead of ending the stream with an error. The new provider’s reasoning then arrives in the same stream, starting from the beginning. No chunk marks the switch. If you show reasoning as it arrives, be ready for it to start over, or show only the answer in delta.content. Once answer text has been sent, the stream is not switched this way.

Reasoning across turns

Reasoning items never include encrypted_content, and include: ["reasoning.encrypted_content"] returns none. Reasoning items you send back in input are not used as reasoning state: any encrypted reasoning in them is removed before a model is called, and the request still succeeds. The removal is reported:
  • Responses and Grounded Responses add a reasoning_carryover field, for example {"received": 2, "carried": 0, "dropped": [{"id": "rs_1", "reason": "not_gloo_state"}], "not_sealed": null}. On a stream, the counts are in the X-Gloo-Reasoning-Carryover header and the final field is in response.completed.
  • Direct Responses reports it as input.reasoning=<n> in ignored_params.
Other items tied to removed reasoning, such as a hosted tool call from the same turn, can be removed with it (paired_removed in reasoning_carryover, input.reasoning_paired=<n> in ignored_params). Send the full conversation in input each turn; the model reasons afresh.

supports_reasoning and reasoning_level

On GET /platform/v2/models, supports_reasoning is true exactly when reasoning is not null. It does not promise that reasoning text comes back; reasoning.returns_summary says that. reasoning_level is an overall quality rating from 0 to 5, not a measure of reasoning: a model that does not reason can score 4.