Skip to content
API referenceThinking / effort

Thinking / effort

Reasoning controls, output budgets, and behavior of the selected API.

Model protocol

Native thinking without a server prompt

Without an applied server prompt, Claude /v1/messages preserves Claude's native thinking blocks. Sonnet 5.5 uses adaptive thinking by default at high effort, Haiku 5.5 at medium; Opus 5 also thinks by default. Control depth with output_config.effort. On Opus 4.8 you must enable it explicitly — "thinking": {"type": "adaptive"}.

json
{
  "model": "claude-opus-5",
  "max_tokens": 4096,
  "thinking": {"type": "adaptive"},
  "output_config": {"effort": "medium"},
  "messages": [{
    "role": "user",
    "content": "Compare two algorithms and justify the choice"
  }]
}
effortUse case
lowsimple or latency-sensitive tasks
mediuma balance of quality and token spend
highcomplex tasks; the default
xhigh / maxthe hardest coding and agentic work on models that support them

Thinking is returned as a separate content block with a signature, followed by normal text. Streaming uses thinking_delta and signature_delta.

GPT-6.1 Sol, GPT-6 Sol, and Luna

For gpt-6.1-sol, Guard uses default effort low and supports low, medium, high, xhigh, max. Direct none, minimal, and ultra are rejected with 400. The raw native catalog advertises ultra, so a Codex client can show that level and map it to max itself; it is not a supported direct API value. GPT-6 Sol and GPT-6 Luna still default to medium and support none, low, medium, high, xhigh, max; none is confirmed with reasoning_tokens: 0, although the native dropdown does not show it.

Kimi, Composer and Grok

ModelsDepth in Chat Completions
k3, k3-256kthe reasoning_effort field with any non-empty value; Kimi itself documents the levels low, high and max. These models do not take the thinking field, it is rejected locally
kimi-for-coding, kimi-for-coding-highspeedthe thinking field exactly as {"type": "enabled", "keep": "all"}; they take reasoning_effort as well, and so do both K3 models
Composer 2.5no levels
Grok 4.7 and 4.6the level is part of the id: -low, -medium, -high, -xhigh. There is no separate field for it; all eight 4.7 ids use a 256K window

Kimi: depth in Chat Completions

On /v1/chat/completions, there are two fields and they are not equivalent. All four models understand reasoning_effort, and the value reaches the wire as sent. The thinking field belongs to kimi-for-coding and kimi-for-coding-highspeed only: on k3 and k3-256k it is rejected locally, before the reserve and any charge. On Messages, all four models accept thinking under the Messages contract; Responses uses reasoning.effort.

ModelFieldAccepted in Chat Completions
k3reasoning_effortany non-empty value; Kimi documents low, high and max
k3-256kreasoning_effortany non-empty value; Kimi documents low, high and max
kimi-for-codingreasoning_effort or thinkingthinking exactly {"type": "enabled", "keep": "all"}
kimi-for-coding-highspeedreasoning_effort or thinkingthinking exactly {"type": "enabled", "keep": "all"}

The field is optional. Send nothing and Kimi picks the level itself: its schema says max.

json
{
  "model": "k3",
  "max_tokens": 2048,
  "reasoning_effort": "high",
  "messages": [{"role": "user", "content": "Compare two algorithms and justify the choice"}]
}
json
{
  "model": "kimi-for-coding",
  "max_tokens": 2048,
  "thinking": {"type": "enabled", "keep": "all"},
  "messages": [{"role": "user", "content": "Find the bug in this function"}]
}
Sent to Chat CompletionsWhat comes back
reasoning_effort as an empty string or a non-string400 invalid_reasoning_effort
tool_choice: "required" on kimi-for-coding and kimi-for-coding-highspeed400 invalid_tool_choice
thinking in any other shape400 invalid_thinking
thinking on a K3 model400 invalid_thinking

For Chat Completions: all four models understand reasoning_effort. The thinking field belongs to kimi-for-coding and kimi-for-coding-highspeed only, and on the K3 models it is rejected locally, before the reserve and any charge.

Thinking in GLM

The three APIs do not share one universal switch. Guard preserves native thinking/reasoning fields and events for the selected protocol without translation.

APIConfirmed behavior
Chatthinking: {"type":"disabled"} disables thinking; usage exposes completion_tokens_details.reasoning_tokens.
MessagesIf the model returns native thinking/tool blocks, preserve them in full for the next tool turn.
ResponsesReasoning arrives as separate items/events; output_tokens_details.reasoning_tokens is part of total output.
json
{
  "model": "glm-5.3",
  "messages": [{"role": "user", "content": "Reply briefly"}],
  "max_tokens": 4096,
  "thinking": {"type": "disabled"}
}

Reasoning consumes the output budget and is billed as output. In Responses SSE, initial frames can contain only reasoning while visible text arrives later.

Gemini reasoning

Gemini reasoning cannot be turned off completely. The level is set by a field of the selected API.

APILevel fieldAlso
Chat Completionsreasoning_effortno other fields
Responsesreasoning.effortwith reasoning.summary: "auto" the model returns a short summary of its reasoning
Messagesoutput_config.effortthe thinking field accepts {"type": "adaptive"} with an optional display, or {"type": "enabled"} with no other fields, budget_tokens included; display: "omitted" together with adaptive hides the reasoning text
ModelLevel valuesDefault
gemini-4-argonlow, medium, highhigh
gemini-3.8-flashlow, medium, highmedium

Any other level value gets a 400 error with the code invalid_request (in Chat Completions and Responses with param: "reasoning_effort"); Guard does not replace it with another one. Other settings the model does not have (for example, turning reasoning off) also get a clear error, not a substitution.

Muse reasoning

The reasoning level is set by a field of the selected API. Muse does not return the full reasoning text; in Responses with reasoning.summary: "auto" Meta may return a short summary of it (a reasoning item with a summary field).

APILevel field
Chat Completionsreasoning_effort
Responsesreasoning.effort
Messagesoutput_config.effort

Level values: minimal, low, medium, high, xhigh, and max. The value none is not accepted and gets a refusal.

Sections

On this page