Skip to content
API referenceThinking / effort

Thinking / effort

Claude and Kimi reasoning: parameters depend on the model and API.

Model protocol

Native thinking without a server prompt

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"}.

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.

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.6the level is part of the id: -low, -medium, -high, -xhigh. There is no field for it

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 a K2.7 Code model400 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.

Documentation sections

On this page