OpenClaw Thinking Levels Guide: /think vs /fast vs /reasoning vs /verbose, and Why Your /think high Didn't Stick
Use /think to change how hard the model reasons, /fast to request a faster provider tier, and /reasoning or /verbose only to see what the agent did. Each directive persists for the session when you send it as a message on its own, and lasts one message when it sits inside other text. Set lasting defaults per agent with thinkingDefault rather than leaving a chat pinned at high.
You typed /think high why does the deploy script hang on step 4 into Telegram. That answer was careful. The next one was shallow again, and you assumed the setting broke. It did exactly what the docs say: a directive inside a sentence is a one-message hint.
The opposite mistake costs more. Someone sends /think high alone, gets back an acknowledgement, and three weeks later every "thanks" in that chat still runs at the top budget.
I worked from the official Thinking levels and Slash commands pages as published on November 6, 2026. Level names, config keys and the resolution order below come from those two pages. Neither page mentions price, so where I talk about cost it is my own experience running agents, and I label it.
Five directives, one table
| Directive | Values | Default | Per-agent config key | Best for | Key trade-off |
|---|---|---|---|---|---|
/think (/t, /thinking) | off, minimal, low, medium, high, xhigh, adaptive, max, ultra | Provider default, else medium for reasoning models, else off | thinkingDefault | Hard debugging, planning, anything with a wrong answer that costs you | Slower turns and more reasoning tokens on every message while pinned |
/fast | auto, on, off, ultrafast, default | off | fastModeDefault | Chat where you are waiting on the reply | On OpenAI it requests service_tier=priority, which the docs say does not guarantee faster service |
/reasoning (/reason) | on, off, stream | off | reasoningDefault | Checking why the agent chose something | Shows reasoning to everyone in the chat |
/verbose (/v) | on, full, off | off | verboseDefault | Watching tool calls while you debug a skill | full forwards raw tool output into the chat |
/trace | on, off | off | None listed | Plugin debugging, such as Active Memory summaries | Plugin-owned lines only, so it won't explain a model decision |
Only the first two change what the model does. The other three change what you see.
Alone it sticks, inside a sentence it doesn't
All five are parsed before the model sees the message, and stripped out of the task text. What happens next depends on whether anything else was in the message:
/think high # persists for this session, replies with an ack
/t medium # same, short alias
/think high why does step 4 hang? # this one message only
/think # shows the current level
/think default # clears the override (also: inherit, clear, reset, unpin)A persisted level is scoped to the current session and, by default, to the sender. Your teammate in the same Slack thread keeps their own level. A typo like /think hihg is rejected and nothing changes. A level the current model doesn't support is rejected too, and the error lists the levels that model does accept.
Note the difference between /think off and /think default. The first stores an explicit off that beats every config default. The second removes your override so config takes over again. I have watched people send /think off to "reset" and then wonder why a new thinkingDefault on the agent did nothing in that chat.
Directives only work for authorized senders. Everyone else's /think high reaches the model as plain text. If commands.allowFrom is set, it is the only allowlist consulted; otherwise channel allowlists and pairing decide.
Where the level actually comes from
Seven places can set a thinking level, checked in this order, first match wins:
- An inline directive on the message.
- The session override from a directive-only message.
agents.entries.<id>.thinkingDefaultagents.entries.<id>.models["<provider>/<model>"].params.thinkingagents.defaults.models["<provider>/<model>"].params.thinkingagents.defaults.thinkingDefault- The provider default, else
medium(or the nearest non-off level) for reasoning models, elseoff.
Steps 4 and 5 are the ones I reach for. Thinking is a property of the model more than of the agent, and pinning it per model means a failover to a cheaper model doesn't inherit a level it can't use:
agents: {
defaults: {
thinkingDefault: "low",
models: {
"anthropic/claude-opus-4-8": { params: { thinking: "high" } },
},
},
}Clamping makes this safer than it looks. If a model switch leaves a level the new model doesn't support, each run clamps to the nearest supported level and your saved preference survives, so switching back restores it.
The Opus 4.8 surprise
Anthropic Claude Opus 4.8 and 4.7 keep thinking off unless you set a level. Claude 4.6 models default to adaptive.
So moving an agent from a 4.6 model up to Opus 4.8, with no thinking config anywhere, can leave answers to multi-step questions feeling shallower, even though you paid for the bigger model. Nothing in the logs says why. If you upgraded recently and the agent got worse at planning, check this before anything else, and set params.thinking on the Opus entry.
What each level means per provider
The docs map the ladder onto the familiar prompt phrases: minimal is roughly "think", low "think hard", medium "think harder", high "ultrathink" at max budget. Past that it depends on the provider.
| Provider | Default with no config | What off really does | Top levels |
|---|---|---|---|
| Anthropic | adaptive on Claude 4.6; off on Opus 4.7 and 4.8 | No caveat documented | xhigh and max map to provider effort on Opus 4.7+ |
| OpenAI | Depends on model and auth route | Sends reasoning.effort: "none" on API-key routes; subscription routes may keep reasoning | xhigh on GPT-5.2+ and Codex; native ultra on GPT-6 Astra and GPT-5.6 Sol and Terra via Codex |
| Google Gemini | Provider default | No caveat documented | adaptive uses dynamic thinking (Gemini 2.5 sends thinkingBudget: -1) |
| DeepSeek V4 | Provider default | No caveat documented | xhigh and max both send max; every lower non-off level sends high |
| Moonshot Kimi | K3 thinks at max on the API route; Kimi Code K3 defaults to high | K2.7 Code always thinks and exposes only on | Full ladder on Kimi Code K3 |
| MiniMax M2.x | Thinking disabled on the Anthropic-compatible path (M3 exempt) | Does not guarantee upstream reasoning tokens are suppressed | Provider-dependent |
Two rows deserve a warning. On DeepSeek V4, low and high send the same value, so tuning between them does nothing. On an OpenAI subscription route, /think off may still leave reasoning running, so don't benchmark latency there and assume you measured a no-thinking turn.
For a custom OpenAI-compatible endpoint, reasoning: true sends reasoning_effort. Set compat.supportsReasoningEffort: false if the server chokes on it, or list compat.supportedReasoningEfforts (and a reasoningEffortMap such as { off: "none" }) to unlock levels above high.
ultra is a harness mode
ultra sits on the same ladder and behaves like nothing else on it. The docs describe it as harness-level planning, execution, verification and proactive sub-agent orchestration, available for every model on the OpenClaw and Claude Code runtimes and on supported native reasoning models through Codex. It does not grant tools or bypass tool policy. An agent with a tight allowlist stays inside it.
Because it can spawn sub-agents on its own, I only use ultra inline, for one message, and never as a session or config default. That is my own cost judgment; the docs are silent on it. /btw side questions run at off regardless.
/fast auto, and why it switches off mid-turn
/fast auto decides per model call. Calls that start before the cutoff (60 seconds by default) get fast mode; later retries, fallbacks, tool-result and continuation calls start without it. Change the cutoff with fastAutoOnSeconds on the active model's params.
That is the right shape for chat. You want the first reply quickly; a long tool loop that has already run for two minutes gains little from the priority tier. /status shows the fast-mode policy you asked for. It can't show which tier the provider actually applied.
Keep /reasoning and /verbose out of group chats
/reasoning on sends the model's reasoning as a separate message prefixed "Thinking." stream previews it while the model works and then sends only the answer. /verbose on posts each tool call as a metadata-only message, and full adds the tool output.
In a DM with yourself, all of that is useful debugging. In a team channel, /verbose full pastes whatever a tool returned into a room full of people: a file listing, or forty lines of somebody's inbox. The Slash commands page calls /reasoning, /verbose and /trace risky in groups. I would go further and leave reasoningDefault and verboseDefault unset on any agent bound to a shared channel.
One side effect for heartbeats: delivery uses the last non-reasoning payload, so a heartbeat run that produced only reasoning sends no alert. Don't change session defaults from inside a heartbeat.
The web chat picker writes the same setting
Moving the effort slider in the web chat writes a session override immediately through sessions.patch, the same stored level /think:<level> sets. It needs operator.write; admin isn't required. A change made mid-reply applies to the next turn; the running one keeps its level. Queued messages that haven't started pick up the new value. To go back to inheriting, send /think default, because the slider has no "unset" position.
Where each directive fits (and where it does not)
/think inline fits the one hard question in an otherwise routine chat. It is the wrong tool for an agent that is always doing hard work; give that agent a thinkingDefault instead.
/think alone fits a focused debugging session you will end with /think default. It goes wrong when nobody ends it.
/fast auto wins for interactive chat. For cron jobs that nobody watches, leave it off.
/reasoning and /verbose belong in DMs while you debug. Nowhere else.
/trace is for plugin authors.
Final verdict
Put thinking in config, per model, at low or medium, and set it explicitly on any Opus 4.7 or 4.8 entry because those default to off. Use /think high inline for the hard message and /fast auto for chats you sit and wait on. Then send /think with no argument in your busiest chat, because if it answers high and you don't remember setting it, that chat has been running at the top budget for a while.
Ready to build?
Get the OpenClaw Starter Kit — config templates, 5 production-ready skills, deployment checklist. Go from zero to running in under an hour.
$14 $6.99
Get the Starter Kit →Also in the OpenClaw store
Get the free OpenClaw quickstart guide
Step-by-step setup. Plain English. No jargon.