Without an applied server prompt, Claude /v1/messages preserves Claude's native thinking blocks. Opus 5 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.
| 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.6 | the level is part of the id: -low, -medium, -high, -xhigh. There is no field for it |
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 a K2.7 Code model | 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.