Thinking Levels: Syntax and Options for /think Directives
Learn the syntax for setting thinking levels in requests using /think, /fast, /verbose, and /trace. This page is for developers configuring reasoning depth across supported models.
Read this when
- Adjusting thinking, fast-mode, or verbose directive parsing or defaults
What it does
- You can set the thinking level inline in any incoming request body using
/t <level>,/think:<level>, or/thinking <level>. - The available levels, with their aliases, are
off | minimal | low | medium | high | xhigh | adaptive | max | ultra, which closely follow Anthropic's classic magic-word scale of "think" < "think hard" < "think harder" < "ultrathink":- minimal corresponds to "think"
- low corresponds to "think hard"
- medium corresponds to "think harder"
- high corresponds to "ultrathink" (the maximum budget)
- xhigh corresponds to "ultrathink+" (available on GPT-5.2+ and Codex models, plus Anthropic Claude Opus 4.7+ with effort)
- adaptive relies on provider-managed adaptive thinking (supported on Claude 4.6 via Anthropic/Bedrock, Anthropic Claude Opus 4.7+, and Google Gemini dynamic thinking)
- max uses the provider's maximum reasoning (Anthropic Claude Opus 4.7+; Ollama translates this to its highest native
thinkeffort) - ultra applies the provider's maximum reasoning and, when the chosen model or runtime allows it, adds proactive sub-agent orchestration
x-high,x_high,extra-high,extra high, andextra_highall resolve toxhigh.highestresolves tohigh.
- Notes on provider behavior:
- The thinking menus and pickers are driven by provider profiles. Each provider plugin declares the exact set of levels for the selected model, including labels like binary
on. adaptive,xhigh,max, andultraappear only for provider/model/runtime profiles that actually support them. If you type a directive for an unsupported level, it gets rejected along with the valid options for that model.- When stored levels aren't supported, they get remapped based on provider profile rank. On non-adaptive models,
adaptivedrops back tomedium, whilexhighandmaxfall back to the highest supported non-off level for the model in question. - For Anthropic Claude 4.6 models,
adaptiveis the default when no explicit thinking level is provided. - Anthropic Claude Opus 4.8 and Opus 4.7 leave thinking off unless you explicitly set a level. Once adaptive thinking is enabled, Opus 4.8's provider-owned effort default is
high. - On Anthropic Claude Opus 4.7+,
/think xhightriggers adaptive thinking plusoutput_config.effort: "xhigh", since/thinkacts as a thinking directive andxhighcontrols the Opus effort setting. - Anthropic Claude Opus 4.7+ also offers
/think max, which routes to the same provider-owned max effort path. - Direct DeepSeek V4 models expose
/think xhigh|max; both of these map to DeepSeekreasoning_effort: "max", while lower non-off levels map tohigh. - For DeepSeek V4 models routed through OpenRouter,
/think xhighis exposed, and OpenRouter-supportedreasoning.effortvalues are sent instead of DeepSeek-native top-levelreasoning_effort. Lower non-off levels map tohigh, and storedmaxoverrides fall back toxhigh. - Ollama models with thinking capability expose
/think low|medium|high|max;maxmaps to nativethink: "high"because Ollama's native API acceptslow,medium, andhighas effort strings. - OpenAI GPT models map
/thinkthrough model-specific Responses API effort support./think offsendsreasoning.effort: "none"only when the target model supports it; otherwise, OpenClaw leaves out the disabled reasoning payload rather than sending an unsupported value. - GPT-5.6 Sol and Terra expose native
/think ultravia the Codex runtime. GPT-5.6 Luna exposes levels throughmaxbecause its Codex catalog doesn't advertise Ultra. - The embedded OpenClaw runtime exposes logical
/think ultrafor GPT-5.6 Sol, Terra, and Luna. It sends the provider's max effort and adds run-scoped proactive sub-agent orchestration guidance. - Custom OpenAI-compatible catalog entries can opt into
/think xhighby settingmodels.providers.<provider>.models[].compat.supportedReasoningEffortsto include"xhigh". This relies on the same compat metadata that maps outbound OpenAI reasoning effort payloads, so menus, session validation, agent CLI, andllm-taskstay consistent with transport behavior. - Stale configured OpenRouter Hunter Alpha refs skip proxy reasoning injection because that retired route could return final answer text through reasoning fields.
- Google Gemini maps
/think adaptiveto Gemini's provider-owned dynamic thinking. Gemini 3 requests omit a fixedthinkingLevel, while Gemini 2.5 requests sendthinkingBudget: -1; fixed levels still map to the closest GeminithinkingLevelor budget for that model family.
- The thinking menus and pickers are driven by provider profiles. Each provider plugin declares the exact set of levels for the selected model, including labels like binary
- MiniMax M2.x (
minimax/MiniMax-M2*) on the Anthropic-compatible streaming path defaults tothinking: { type: "disabled" }unless you explicitly set thinking in model params or request params. This avoids leakedreasoning_contentdeltas from M2.x's non-native Anthropic stream format. MiniMax-M3 (and M3.x) is exempt: M3 emits proper Anthropic thinking blocks and returns empty content when thinking is disabled, so OpenClaw keeps M3 on the provider's omitted/adaptive thinking path. - Z.AI (
zai/*) is binary (on/off) for most GLM models. GLM-5.2 is the exception: it exposes/think off|low|high|max, mapslowandhighto Z.AIreasoning_effort: "high", and mapsmaxtoreasoning_effort: "max". - Moonshot API Kimi K3 (
moonshot/kimi-k3) always thinks atmax, sendsreasoning_effort: "max", omits the K2thinkingfield and fixed sampling overrides, and preserves K3-supported tool choices. Kimi Code K3 (kimi/k3andkimi/k3-256k) exposes the full/thinkladder with ahighdefault:offsendsthinking.type: "disabled",minimal/lowmap to low effort,medium/high/adaptiveto high effort, andxhigh/maxto max effort. Current Kimi Code refs also includekimi/kimi-for-codingandkimi/kimi-for-coding-highspeed. Kimi K2.7 Code (moonshot/kimi-k2.7-codeandmoonshot/kimi-k2.7-code-highspeed) always thinks, exposes onlyon, and omits both outboundthinkingandreasoning_effort. Othermoonshot/*models map/think offtothinking: { type: "disabled" }and any non-offlevel tothinking: { type: "enabled" }. When K2 thinking is enabled, Moonshot only acceptstool_choiceauto|none; OpenClaw normalizes incompatible values toauto.
Resolution order
- Inline directive on the message (applies only to that message).
- Session override (set by sending a directive-only message).
- Per-agent default (
agents.entries.*.thinkingDefaultin config). - Global default (
agents.defaults.thinkingDefaultin config). - Fallback: provider-declared default when available; otherwise reasoning-capable models resolve to
mediumor the nearest supported non-offlevel for that model, and non-reasoning models stayoff.
Setting a session default
- Transmit a message containing nothing but the directive (extra whitespace is fine), for instance
/think:mediumor/t high. - This persists for the ongoing session (per-sender by default). To drop the session override and fall back to the configured or provider default, use
/think default; acceptable synonyms areinherit,clear,reset, andunpin. - An explicit off override is stored via
/think off. This disables thinking until you modify or remove the session override. - A confirmation reply is dispatched (
Thinking level set to high./Thinking disabled.). Should the level be invalid (e.g./thinking big), the command is refused with a suggestion, and the session state remains untouched. - To view the current thinking level, send
/think(or/think:) without any argument.
Application by agent
- Embedded OpenClaw: the resolved level is handed to the in-process OpenClaw agent runtime.
- Claude CLI backend: concrete non-off levels are forwarded to Claude Code as
--effortwhenclaude-cliis in use;adaptivestrips configured effort flags and lets Claude Code's environment, settings, and model defaults determine effective effort. Refer to CLI backends.
Fast mode (/fast)
- Levels:
auto|on|off|default. - A directive-only message toggles a session fast-mode override and responds with
Fast mode set to auto.,Fast mode enabled., orFast mode disabled.. To clear the session override and revert to the configured default, use/fast default; aliases includeinherit,clear,reset, andunpin. - Send
/fast(or/fast status) with no mode to check the current effective fast-mode state. - OpenClaw determines fast mode in this sequence:
- Inline/directive-only
/fast auto|on|offoverride (/fast defaultclears this layer) - Session override
- Per-agent default (
agents.entries.*.fastModeDefault) - Per-model config:
agents.defaults.models["<provider>/<model>"].params.fastMode - Fallback:
off
- Inline/directive-only
- With
auto, the session/config mode stays auto, but each new model call is resolved independently. Calls initiated before the auto cutoff have fast mode enabled; later retry, fallback, tool-result, or continuation calls start with fast mode disabled. The cutoff defaults to 60 seconds; adjustagents.defaults.models["<provider>/<model>"].params.fastAutoOnSecondson the active model to change it. - For
openai/*, fast mode corresponds to OpenAI priority processing by transmittingservice_tier=priorityon supported Responses requests. - For Codex-backed
openai/*/openai-codex/*models, fast mode sends the identicalservice_tier=priorityflag on Codex Responses. Native Codex app-server turns receive the tier only onturn/startor thread start/resume, soautocannot retier an already-running app-server turn; it applies to the next model turn OpenClaw starts. - For direct public
anthropic/*requests, including OAuth-authenticated traffic sent toapi.anthropic.com, fast mode corresponds to Anthropic service tiers:/fast onsetsservice_tier=auto,/fast offsetsservice_tier=standard_only. - For
minimax/*on the Anthropic-compatible path,/fast on(orparams.fastMode: true) rewritesMiniMax-M2.7toMiniMax-M2.7-highspeed. - Explicit Anthropic
serviceTier/service_tiermodel params override the fast-mode default when both are set. OpenClaw still skips Anthropic service-tier injection for non-Anthropic proxy base URLs. /statusdisplaysFastwhen fast mode is enabled andFast:autowhen the configured mode is auto.
Verbose directives (/verbose or /v)
- Levels:
on(minimal) |full|off(default). - A directive-only message flips the session verbose setting and answers with
Verbose logging enabled./Verbose logging disabled.; bad levels trigger a hint and leave the state untouched. /verbose offsaves an explicit session override; remove it through the Sessions UI by pickinginherit.- Authorized external channel senders can keep the session verbose override. Internal gateway/webchat clients require
operator.adminto do the same. - An inline directive only touches that single message; otherwise session/global defaults apply.
- Running
/verbose(or/verbose:) without arguments displays the current verbose level. - With verbose on, agents emitting structured tool results relay each tool call as its own metadata-only message, tagged with
<emoji> <tool-name>: <arg>when present. These summaries appear the moment each tool starts (separate bubbles), not as streaming deltas. - Tool failure summaries show up in normal mode, but raw error detail suffixes stay hidden unless verbose is
full. - When verbose is
full, tool outputs also get forwarded after finishing (separate bubble, clipped to a safe size). Flipping/verbose on|full|offmid-run makes subsequent tool bubbles respect the new value. agents.defaults.toolProgressDetaildictates the format of/verbosetool summaries and progress-draft tool lines. Pick"explain"(default) for short human labels like🛠️ Exec: checking JS syntax; choose"raw"when you want the raw command/detail appended for debugging. Per-agentagents.entries.*.toolProgressDetailoverrides the default.explain:🛠️ Exec: check JS syntax for /tmp/app.jsraw:🛠️ Exec: check JS syntax for /tmp/app.js, node --check /tmp/app.js
Plugin trace directives (/trace)
- Levels:
on|off(default). - A directive-only message toggles session plugin trace output and responds with
Plugin trace enabled./Plugin trace disabled.. - An inline directive only affects that message; session/global defaults apply otherwise.
- Sending
/trace(or/trace:) with no argument reveals the current trace level. /traceis more limited than/verbose: it only surfaces plugin-owned trace/debug lines, such as Active Memory debug summaries.- Trace lines can appear in
/statusand as a follow-up diagnostic message after the normal assistant reply.
Reasoning visibility (/reasoning)
- Levels:
on|off|stream. - A directive-only message toggles whether thinking blocks appear in replies.
- When on, reasoning is delivered as a separate message prefixed with
Thinking. stream: streams reasoning while the reply is generating when the active channel supports reasoning previews, then sends the final answer without reasoning.- Alias:
/reason. - Running
/reasoning(or/reasoning:) without arguments shows the current reasoning level. - Resolution order: inline directive, then session override, then per-agent default (
agents.entries.*.reasoningDefault), then global default (agents.defaults.reasoningDefault), then fallback (off).
Malformed local-model reasoning tags get handled conservatively. Closed <think>...</think> blocks stay hidden on normal replies, and unclosed reasoning after already visible text is also hidden. If a reply is fully wrapped in a single unclosed opening tag and would otherwise deliver as empty text, OpenClaw removes the malformed opening tag and delivers the remaining text.
Related
- Elevated mode docs live in Elevated mode.
Heartbeats
- Heartbeat probe body is the configured heartbeat prompt (default:
Follow the heartbeat monitor scratch context when provided. Recurring tasks are automations; create or change their schedules with the automations tool, not heartbeat scratch. Do not infer or repeat old tasks from prior chats. If nothing needs attention, reply HEARTBEAT_OK.). Inline directives in a heartbeat message apply as usual (but avoid changing session defaults from heartbeats). - Heartbeat delivery uses the last outbound-capable non-reasoning payload. Separate reasoning or
Thinkingpayloads remain internal, and a reasoning-only heartbeat result produces no alert.
Web chat UI
- When the page loads, the web chat thinking selector reflects the level already stored for the session, pulled from the inbound session store or configuration.
- Choosing a different level immediately writes the session override through
sessions.patch; this happens without waiting for the next message send, and it is not a one-timethinkingOnceoverride. - If a send occurs while model, reasoning, or speed picker adjustments are still pending, it waits for all outstanding picker patches; should any patch fail, the message is held back for manual review.
- The first entry always represents the clear-override action. It displays
Inherited: <resolved level>, andInherited: Offappears when inherited thinking is turned off. - Explicit picker selections show their direct level labels, but provider labels are preserved where they exist (for instance,
Maximumfor a provider-labeledmaxoption). - The picker relies on
thinkingLevelsfrom the gateway session row or defaults, withthinkingOptionsretained as a legacy label list. The browser UI does not maintain its own provider regex list; model-specific level sets belong to plugins. /think:<level>continues to function and modifies the same stored session level, keeping chat directives and the picker consistent with each other.
Provider profiles
- Provider plugins can offer
resolveThinkingProfile(ctx)to specify the model's supported levels and its default. - Provider plugins that proxy Claude models should reuse
resolveClaudeThinkingProfile(modelId)fromopenclaw/plugin-sdk/provider-model-sharedso direct Anthropic and proxy catalogs remain consistent. - Each profile level stores a canonical
id(off,minimal,low,medium,high,xhigh,adaptive,max, orultra) and may include a displaylabel. Binary providers use{ id: "low", label: "on" }. - Profile hooks receive merged catalog facts when those are available, including
reasoning,compat.thinkingFormat, andcompat.supportedReasoningEfforts. Only expose binary or custom profiles with those facts when the configured request contract supports the corresponding payload. - Tool plugins validating an explicit thinking override should use
api.runtime.agent.resolveThinkingPolicy({ provider, model, agentRuntime })plusapi.runtime.agent.normalizeThinkingLevel(...); they must avoid maintaining their own provider or model level lists. PassagentRuntimewhen the tool controls the execution path, such as in an always-embedded run. - Tool plugins with access to configured custom model metadata can pass
catalogintoresolveThinkingPolicysocompat.supportedReasoningEffortsopt-ins are reflected in plugin-side validation. - Published legacy hooks (
supportsXHighThinking,isBinaryThinking, andresolveDefaultThinkingLevel) remain as compatibility adapters, but new custom level sets should useresolveThinkingProfile. - Gateway rows and defaults expose
thinkingLevels,thinkingOptions, andthinkingDefaultso ACP and chat clients render the same profile ids and labels that runtime validation uses.