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"}.
{
"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"
}]
}| effort | Use case |
|---|---|
low | simple or latency-sensitive tasks |
medium | a balance of quality and token spend |
high | complex tasks; the default |
xhigh / max | the 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.
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.
| Models | Depth in Chat Completions |
|---|---|
k3, k3-256k | the 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-highspeed | the thinking field exactly as {"type": "enabled", "keep": "all"}; they take reasoning_effort as well, and so do both K3 models |
| Composer 2.5 | no levels |
| Grok 4.7 and 4.6 | the 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 |
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.
| Model | Field | Accepted in Chat Completions |
|---|---|---|
k3 | reasoning_effort | any non-empty value; Kimi documents low, high and max |
k3-256k | reasoning_effort | any non-empty value; Kimi documents low, high and max |
kimi-for-coding | reasoning_effort or thinking | thinking exactly {"type": "enabled", "keep": "all"} |
kimi-for-coding-highspeed | reasoning_effort or thinking | thinking exactly {"type": "enabled", "keep": "all"} |
The field is optional. Send nothing and Kimi picks the level itself: its schema says max.
{
"model": "k3",
"max_tokens": 2048,
"reasoning_effort": "high",
"messages": [{"role": "user", "content": "Compare two algorithms and justify the choice"}]
}{
"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 Completions | What comes back |
|---|---|
reasoning_effort as an empty string or a non-string | 400 invalid_reasoning_effort |
tool_choice: "required" on kimi-for-coding and kimi-for-coding-highspeed | 400 invalid_tool_choice |
thinking in any other shape | 400 invalid_thinking |
thinking on a K3 model | 400 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.
The three APIs do not share one universal switch. Guard preserves native thinking/reasoning fields and events for the selected protocol without translation.
| API | Confirmed behavior |
|---|---|
| Chat | thinking: {"type":"disabled"} disables thinking; usage exposes completion_tokens_details.reasoning_tokens. |
| Messages | If the model returns native thinking/tool blocks, preserve them in full for the next tool turn. |
| Responses | Reasoning arrives as separate items/events; output_tokens_details.reasoning_tokens is part of total output. |
{
"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 cannot be turned off completely. The level is set by a field of the selected API.
| API | Level field | Also |
|---|---|---|
| Chat Completions | reasoning_effort | no other fields |
| Responses | reasoning.effort | with reasoning.summary: "auto" the model returns a short summary of its reasoning |
| Messages | output_config.effort | the 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 |
| Model | Level values | Default |
|---|---|---|
gemini-4-argon | low, medium, high | high |
gemini-3.8-flash | low, medium, high | medium |
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.
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).
| API | Level field |
|---|---|
| Chat Completions | reasoning_effort |
| Responses | reasoning.effort |
| Messages | output_config.effort |
Level values: minimal, low, medium, high, xhigh, and max. The value none is not accepted and gets a refusal.