2025-12-09 17:51:05 +00:00
---
2026-01-04 05:21:12 +00:00
summary: "Directive syntax for /think + /verbose and how they affect model reasoning"
2025-12-09 17:51:05 +00:00
read_when:
2026-01-04 05:21:12 +00:00
- Adjusting thinking or verbose directive parsing or defaults
2026-01-31 16:04:03 -05:00
title: "Thinking Levels"
2025-12-09 17:51:05 +00:00
---
2026-01-31 21:13:13 +09:00
2025-12-03 08:45:30 +00:00
# Thinking Levels (/think directives)
## What it does
2026-01-31 21:13:13 +09:00
2025-12-03 08:45:30 +00:00
- Inline directive in any inbound body: `/t <level>` , `/think:<level>` , or `/thinking <level>` .
2026-01-07 17:17:38 -08:00
- Levels (aliases): `off | minimal | low | medium | high | xhigh` (GPT-5.2 + Codex models only)
2025-12-03 08:45:30 +00:00
- minimal → “think”
- low → “think hard”
- medium → “think harder”
- high → “ultrathink” (max budget)
2026-01-07 17:17:38 -08:00
- xhigh → “ultrathink+” (GPT-5.2 + Codex models only)
2026-02-05 15:56:26 -08:00
- `x-high` , `x_high` , `extra-high` , `extra high` , and `extra_high` map to `xhigh` .
2025-12-03 08:45:30 +00:00
- `highest` , `max` map to `high` .
2026-01-16 22:25:51 +00:00
- Provider notes:
- Z.AI (`zai/*` ) only supports binary thinking (`on` /`off` ). Any non-`off` level is treated as `on` (mapped to `low` ).
2025-12-03 08:45:30 +00:00
## Resolution order
2026-01-31 21:13:13 +09:00
2025-12-03 08:45:30 +00:00
1. Inline directive on the message (applies only to that message).
2. Session override (set by sending a directive-only message).
2026-01-09 12:44:23 +00:00
3. Global default (`agents.defaults.thinkingDefault` in config).
2026-01-03 12:18:50 +00:00
4. Fallback: low for reasoning-capable models; off otherwise.
2025-12-03 08:45:30 +00:00
## Setting a session default
2026-01-31 21:13:13 +09:00
2025-12-03 08:45:30 +00:00
- Send a message that is **only** the directive (whitespace allowed), e.g. `/think:medium` or `/t high` .
- That sticks for the current session (per-sender by default); cleared by `/think:off` or session idle reset.
2025-12-03 08:54:38 +00:00
- Confirmation reply is sent (`Thinking level set to high.` / `Thinking disabled.` ). If the level is invalid (e.g. `/thinking big` ), the command is rejected with a hint and the session state is left unchanged.
2026-01-08 03:22:14 +01:00
- Send `/think` (or `/think:` ) with no argument to see the current thinking level.
2025-12-03 08:45:30 +00:00
## Application by agent
2026-01-31 21:13:13 +09:00
2025-12-17 11:29:12 +01:00
- **Embedded Pi**: the resolved level is passed to the in-process Pi agent runtime.
2025-12-03 08:45:30 +00:00
2025-12-03 09:04:37 +00:00
## Verbose directives (/verbose or /v)
2026-01-31 21:13:13 +09:00
2026-01-17 05:33:27 +00:00
- Levels: `on` (minimal) | `full` | `off` (default).
2025-12-03 09:04:37 +00:00
- Directive-only message toggles session verbose and replies `Verbose logging enabled.` / `Verbose logging disabled.` ; invalid levels return a hint without changing state.
2026-01-10 00:52:11 +01:00
- `/verbose off` stores an explicit session override; clear it via the Sessions UI by choosing `inherit` .
2025-12-03 09:04:37 +00:00
- Inline directive affects only that message; session/global defaults apply otherwise.
2026-01-08 03:22:14 +01:00
- Send `/verbose` (or `/verbose:` ) with no argument to see the current verbose level.
2026-01-17 05:33:27 +00:00
- When verbose is on, agents that emit structured tool results (Pi, other JSON agents) send each tool call back as its own metadata-only message, prefixed with `<emoji> <tool-name>: <arg>` when available (path/command). These tool summaries are sent as soon as each tool starts (separate bubbles), not as streaming deltas.
2026-02-22 15:25:44 +01:00
- Tool failure summaries remain visible in normal mode, but raw error detail suffixes are hidden unless verbose is `on` or `full` .
2026-01-17 05:40:21 +00:00
- When verbose is `full` , tool outputs are also forwarded after completion (separate bubble, truncated to a safe length). If you toggle `/verbose on|full|off` while a run is in-flight, subsequent tool bubbles honor the new setting.
2025-12-03 09:04:37 +00:00
2026-02-21 11:18:29 -05:00
## Reasoning visibility (/reasoning)
2026-01-31 21:13:13 +09:00
2026-01-07 11:08:11 +01:00
- Levels: `on|off|stream` .
2026-01-10 00:02:13 +01:00
- Directive-only message toggles whether thinking blocks are shown in replies.
- When enabled, reasoning is sent as a **separate message** prefixed with `Reasoning:` .
2026-01-07 11:08:11 +01:00
- `stream` (Telegram only): streams reasoning into the Telegram draft bubble while the reply is generating, then sends the final answer without reasoning.
2026-01-07 06:16:38 +01:00
- Alias: `/reason` .
2026-01-08 03:22:14 +01:00
- Send `/reasoning` (or `/reasoning:` ) with no argument to see the current reasoning level.
2026-01-07 06:16:38 +01:00
2026-01-04 05:21:12 +00:00
## Related
2026-01-31 21:13:13 +09:00
2026-01-10 14:51:21 -06:00
- Elevated mode docs live in [Elevated mode ](/tools/elevated ).
2026-01-04 05:15:42 +00:00
2025-12-03 08:45:30 +00:00
## Heartbeats
2026-01-31 21:13:13 +09:00
2026-01-16 00:46:07 +00:00
- Heartbeat probe body is the configured heartbeat prompt (default: `Read HEARTBEAT.md if it exists (workspace context). Follow it strictly. 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 defaults to the final payload only. To also send the separate `Reasoning:` message (when available), set `agents.defaults.heartbeat.includeReasoning: true` or per-agent `agents.list[].heartbeat.includeReasoning: true` .
2025-12-08 16:09:04 +00:00
## Web chat UI
2026-01-31 21:13:13 +09:00
2025-12-08 16:09:04 +00:00
- The web chat thinking selector mirrors the session's stored level from the inbound session store/config when the page loads.
- Picking another level applies only to the next message (`thinkingOnce` ); after sending, the selector snaps back to the stored session level.
- To change the session default, send a `/think:<level>` directive (as before); the selector will reflect it after the next reload.