Slash commands
Commands are handled by the Gateway. Most commands must be sent as a standalone message that starts with/.
The host-only bash chat command uses ! <cmd> (with /bash <cmd> as an alias).
There are two related systems:
- Commands: standalone
/...messages. - Directives:
/think,/fast,/verbose,/reasoning,/elevated,/exec,/model,/queue.- Directives are stripped from the message before the model sees it.
- In normal chat messages (not directive-only), they are treated as “inline hints” and do not persist session settings.
- In directive-only messages (the message contains only directives), they persist to the session and reply with an acknowledgement.
- Directives are only applied for authorized senders. If
commands.allowFromis set, it is the only allowlist used; otherwise authorization comes from channel allowlists/pairing pluscommands.useAccessGroups. Unauthorized senders see directives treated as plain text.
/help, /commands, /status, /whoami (/id).
They run immediately, are stripped before the model sees the message, and the remaining text continues through the normal flow.
Config
commands.text(defaulttrue) enables parsing/...in chat messages.- On surfaces without native commands (WhatsApp/WebChat/Signal/iMessage/Google Chat/Microsoft Teams), text commands still work even if you set this to
false.
- On surfaces without native commands (WhatsApp/WebChat/Signal/iMessage/Google Chat/Microsoft Teams), text commands still work even if you set this to
commands.native(default"auto") registers native commands.- Auto: on for Discord/Telegram; off for Slack (until you add slash commands); ignored for providers without native support.
- Set
channels.discord.commands.native,channels.telegram.commands.native, orchannels.slack.commands.nativeto override per provider (bool or"auto"). falseclears previously registered commands on Discord/Telegram at startup. Slack commands are managed in the Slack app and are not removed automatically.
commands.nativeSkills(default"auto") registers skill commands natively when supported.- Auto: on for Discord/Telegram; off for Slack (Slack requires creating a slash command per skill).
- Set
channels.discord.commands.nativeSkills,channels.telegram.commands.nativeSkills, orchannels.slack.commands.nativeSkillsto override per provider (bool or"auto").
commands.bash(defaultfalse) enables! <cmd>to run host shell commands (/bash <cmd>is an alias; requirestools.elevatedallowlists).commands.bashForegroundMs(default2000) controls how long bash waits before switching to background mode (0backgrounds immediately).commands.config(defaultfalse) enables/config(reads/writesopenclaw.json).commands.mcp(defaultfalse) enables/mcp(reads/writes OpenClaw-managed MCP config undermcp.servers).commands.plugins(defaultfalse) enables/plugins(plugin discovery/status plus install + enable/disable controls).commands.debug(defaultfalse) enables/debug(runtime-only overrides).commands.allowFrom(optional) sets a per-provider allowlist for command authorization. When configured, it is the only authorization source for commands and directives (channel allowlists/pairing andcommands.useAccessGroupsare ignored). Use"*"for a global default; provider-specific keys override it.commands.useAccessGroups(defaulttrue) enforces allowlists/policies for commands whencommands.allowFromis not set.
Command list
Text + native (when enabled):/help/commands/tools [compact|verbose](show what the current agent can use right now;verboseadds descriptions)/skill <name> [input](run a skill by name)/status(show current status; includes provider usage/quota for the current model provider when available)/tasks(list background tasks for the current session; shows active and recent task details with agent-local fallback counts)/allowlist(list/add/remove allowlist entries)/approve <id> <decision>(resolve exec approval prompts; use the pending approval message for the available decisions)/context [list|detail|json](explain “context”;detailshows per-file + per-tool + per-skill + system prompt size)/btw <question>(ask an ephemeral side question about the current session without changing future session context; see /tools/btw)/export-session [path](alias:/export) (export current session to HTML with full system prompt)/whoami(show your sender id; alias:/id)/session idle <duration|off>(manage inactivity auto-unfocus for focused thread bindings)/session max-age <duration|off>(manage hard max-age auto-unfocus for focused thread bindings)/subagents list|kill|log|info|send|steer|spawn(inspect, control, or spawn sub-agent runs for the current session)/acp spawn|cancel|steer|close|status|set-mode|set|cwd|permissions|timeout|model|reset-options|doctor|install|sessions(inspect and control ACP runtime sessions)/agents(list thread-bound agents for this session)/focus <target>(Discord: bind this thread, or a new thread, to a session/subagent target)/unfocus(Discord: remove the current thread binding)/kill <id|#|all>(immediately abort one or all running sub-agents for this session; no confirmation message)/steer <id|#> <message>(steer a running sub-agent immediately: in-run when possible, otherwise abort current work and restart on the steer message)/tell <id|#> <message>(alias for/steer)/config show|get|set|unset(persist config to disk, owner-only; requirescommands.config: true)/mcp show|get|set|unset(manage OpenClaw MCP server config, owner-only; requirescommands.mcp: true)/plugins list|show|get|install|enable|disable(inspect discovered plugins, install new ones, and toggle enablement; owner-only for writes; requirescommands.plugins: true)/pluginis an alias for/plugins./plugin install <spec>accepts the same plugin specs asopenclaw plugins install: local path/archive, npm package, orclawhub:<pkg>.- Enable/disable writes still reply with a restart hint. On a watched foreground gateway, OpenClaw may perform that restart automatically right after the write.
/debug show|set|unset|reset(runtime overrides, owner-only; requirescommands.debug: true)/usage off|tokens|full|cost(per-response usage footer or local cost summary)/tts off|always|inbound|tagged|status|provider|limit|summary|audio(control TTS; see /tts)- Discord: native command is
/voice(Discord reserves/tts); text/ttsstill works.
- Discord: native command is
/stop/restart/dock-telegram(alias:/dock_telegram) (switch replies to Telegram)/dock-discord(alias:/dock_discord) (switch replies to Discord)/dock-slack(alias:/dock_slack) (switch replies to Slack)/activation mention|always(groups only)/send on|off|inherit(owner-only)/resetor/new [model](optional model hint; remainder is passed through)/think <off|minimal|low|medium|high|xhigh>(dynamic choices by model/provider; aliases:/thinking,/t)/fast status|on|off(omitting the arg shows the current effective fast-mode state)/verbose on|full|off(alias:/v)/reasoning on|off|stream(alias:/reason; when on, sends a separate message prefixedReasoning:;stream= Telegram draft only)/elevated on|off|ask|full(alias:/elev;fullskips exec approvals)/exec host=<auto|sandbox|gateway|node> security=<deny|allowlist|full> ask=<off|on-miss|always> node=<id>(send/execto show current)/model <name>(alias:/models; or/<alias>fromagents.defaults.models.*.alias)/queue <mode>(plus options likedebounce:2s cap:25 drop:summarize; send/queueto see current settings)/bash <command>(host-only; alias for! <command>; requirescommands.bash: true+tools.elevatedallowlists)
/compact [instructions](see /concepts/compaction)! <command>(host-only; one at a time; use!poll+!stopfor long-running jobs)!poll(check output / status; accepts optionalsessionId;/bash pollalso works)!stop(stop the running bash job; accepts optionalsessionId;/bash stopalso works)
- Commands accept an optional
:between the command and args (e.g./think: high,/send: on,/help:). /new <model>accepts a model alias,provider/model, or a provider name (fuzzy match); if no match, the text is treated as the message body.- For full provider usage breakdown, use
openclaw status --usage. /allowlist add|removerequirescommands.config=trueand honors channelconfigWrites.- In multi-account channels, config-targeted
/allowlist --account <id>and/config set channels.<provider>.accounts.<id>...also honor the target account’sconfigWrites. /usagecontrols the per-response usage footer;/usage costprints a local cost summary from OpenClaw session logs./restartis enabled by default; setcommands.restart: falseto disable it.- Discord-only native command:
/vc join|leave|statuscontrols voice channels (requireschannels.discord.voiceand native commands; not available as text). - Discord thread-binding commands (
/focus,/unfocus,/agents,/session idle,/session max-age) require effective thread bindings to be enabled (session.threadBindings.enabledand/orchannels.discord.threadBindings.enabled). - ACP command reference and runtime behavior: ACP Agents.
/verboseis meant for debugging and extra visibility; keep it off in normal use./fast on|offpersists a session override. Use the Sessions UIinheritoption to clear it and fall back to config defaults./fastis provider-specific: OpenAI/OpenAI Codex map it toservice_tier=priorityon native Responses endpoints, while direct public Anthropic requests, including OAuth-authenticated traffic sent toapi.anthropic.com, map it toservice_tier=autoorstandard_only. See OpenAI and Anthropic.- Tool failure summaries are still shown when relevant, but detailed failure text is only included when
/verboseisonorfull. /reasoning(and/verbose) are risky in group settings: they may reveal internal reasoning or tool output you did not intend to expose. Prefer leaving them off, especially in group chats./modelpersists the new session model immediately.- If the agent is idle, the next run uses it right away.
- If a run is already active, OpenClaw marks a live switch as pending and only restarts into the new model at a clean retry point.
- If tool activity or reply output has already started, the pending switch can stay queued until a later retry opportunity or the next user turn.
- Fast path: command-only messages from allowlisted senders are handled immediately (bypass queue + model).
- Group mention gating: command-only messages from allowlisted senders bypass mention requirements.
- Inline shortcuts (allowlisted senders only): certain commands also work when embedded in a normal message and are stripped before the model sees the remaining text.
- Example:
hey /statustriggers a status reply, and the remaining text continues through the normal flow.
- Example:
- Currently:
/help,/commands,/status,/whoami(/id). - Unauthorized command-only messages are silently ignored, and inline
/...tokens are treated as plain text. - Skill commands:
user-invocableskills are exposed as slash commands. Names are sanitized toa-z0-9_(max 32 chars); collisions get numeric suffixes (e.g._2)./skill <name> [input]runs a skill by name (useful when native command limits prevent per-skill commands).- By default, skill commands are forwarded to the model as a normal request.
- Skills may optionally declare
command-dispatch: toolto route the command directly to a tool (deterministic, no model). - Example:
/prose(OpenProse plugin) — see OpenProse.
- Native command arguments: Discord uses autocomplete for dynamic options (and button menus when you omit required args). Telegram and Slack show a button menu when a command supports choices and you omit the arg.
/tools
/tools answers a runtime question, not a config question: what this agent can use right now in
this conversation.
- Default
/toolsis compact and optimized for quick scanning. /tools verboseadds short descriptions.- Native-command surfaces that support arguments expose the same mode switch as
compact|verbose. - Results are session-scoped, so changing agent, channel, thread, sender authorization, or model can change the output.
/toolsincludes tools that are actually reachable at runtime, including core tools, connected plugin tools, and channel-owned tools.
/tools as a static catalog.
Usage surfaces (what shows where)
- Provider usage/quota (example: “Claude 80% left”) shows up in
/statusfor the current model provider when usage tracking is enabled. OpenClaw normalizes provider windows to% left; for MiniMax, remaining-only percent fields are inverted before display, andmodel_remainsresponses prefer the chat-model entry plus a model-tagged plan label. - Token/cache lines in
/statuscan fall back to the latest transcript usage entry when the live session snapshot is sparse. Existing nonzero live values still win, and transcript fallback can also recover the active runtime model label plus a larger prompt-oriented total when stored totals are missing or smaller. - Per-response tokens/cost is controlled by
/usage off|tokens|full(appended to normal replies). /model statusis about models/auth/endpoints, not usage.
Model selection (/model)
/model is implemented as a directive.
Examples:
/modeland/model listshow a compact, numbered picker (model family + available providers).- On Discord,
/modeland/modelsopen an interactive picker with provider and model dropdowns plus a Submit step. /model <#>selects from that picker (and prefers the current provider when possible)./model statusshows the detailed view, including configured provider endpoint (baseUrl) and API mode (api) when available.
Debug overrides
/debug lets you set runtime-only config overrides (memory, not disk). Owner-only. Disabled by default; enable with commands.debug: true.
Examples:
- Overrides apply immediately to new config reads, but do not write to
openclaw.json. - Use
/debug resetto clear all overrides and return to the on-disk config.
Config updates
/config writes to your on-disk config (openclaw.json). Owner-only. Disabled by default; enable with commands.config: true.
Examples:
- Config is validated before write; invalid changes are rejected.
/configupdates persist across restarts.
MCP updates
/mcp writes OpenClaw-managed MCP server definitions under mcp.servers. Owner-only. Disabled by default; enable with commands.mcp: true.
Examples:
/mcpstores config in OpenClaw config, not Pi-owned project settings.- Runtime adapters decide which transports are actually executable.
Plugin updates
/plugins lets operators inspect discovered plugins and toggle enablement in config. Read-only flows can use /plugin as an alias. Disabled by default; enable with commands.plugins: true.
Examples:
/plugins listand/plugins showuse real plugin discovery against the current workspace plus on-disk config./plugins enable|disableupdates plugin config only; it does not install or uninstall plugins.- After enable/disable changes, restart the gateway to apply them.
Surface notes
- Text commands run in the normal chat session (DMs share
main, groups have their own session). - Native commands use isolated sessions:
- Discord:
agent:<agentId>:discord:slash:<userId> - Slack:
agent:<agentId>:slack:slash:<userId>(prefix configurable viachannels.slack.slashCommand.sessionPrefix) - Telegram:
telegram:slash:<userId>(targets the chat session viaCommandTargetSessionKey)
- Discord:
/stoptargets the active chat session so it can abort the current run.- Slack:
channels.slack.slashCommandis still supported for a single/openclaw-style command. If you enablecommands.native, you must create one Slack slash command per built-in command (same names as/help). Command argument menus for Slack are delivered as ephemeral Block Kit buttons.- Slack native exception: register
/agentstatus(not/status) because Slack reserves/status. Text/statusstill works in Slack messages.
- Slack native exception: register
BTW side questions
/btw is a quick side question about the current session.
Unlike normal chat:
- it uses the current session as background context,
- it runs as a separate tool-less one-shot call,
- it does not change future session context,
- it is not written to transcript history,
- it is delivered as a live side result instead of a normal assistant message.
/btw useful when you want a temporary clarification while the main
task keeps going.
Example: