生成模型:Claude Opus 4.6 (anthropic/claude-opus-4-6) Token 消耗:输入 ~55k tokens,输出 ~5k tokens(本节)
除了 CLI 终端命令(如 openclaw gateway、openclaw models),OpenClaw 还拥有一套完整的聊天命令系统——用户在聊天窗口中输入 /status、/new、/compact 等斜杠命令(Slash Commands),即可控制 Agent 的行为。本节剖析这套命令系统的注册、解析和执行机制。
25.3.1 命令注册中心(src/auto-reply/commands-registry.data.ts)
每个聊天命令通过 ChatCommandDefinition 类型描述:
// src/auto-reply/commands-registry.types.ts
export type ChatCommandDefinition = {
key: string; // 唯一标识符,如 "status"、"new"
nativeName?: string; // 原生命令名称(用于 Telegram/Discord/Slack 的原生斜杠命令注册)
description: string; // 命令描述
textAliases: string[]; // 文本别名列表,如 ["/status"]、["/new", "/reset"]
acceptsArgs?: boolean; // 是否接受参数
args?: CommandArgDefinition[]; // 参数定义
argsParsing?: "none" | "positional"; // 参数解析模式
formatArgs?: (values: CommandArgValues) => string | undefined;
argsMenu?: CommandArgMenuSpec | "auto"; // 原生平台的参数选择菜单
scope: CommandScope; // "text" | "native" | "both"
category?: CommandCategory; // 分类
};
export type CommandScope = "text" | "native" | "both";
export type CommandCategory =
| "session" // 会话管理
| "options" // 运行时选项
| "status" // 状态查询
| "management" // 系统管理
| "media" // 媒体控制
| "tools" // 工具
| "docks"; // 通道切换
仅在文本消息中识别(如 WhatsApp 消息 "/compact")
/compact、/bash、/allowlist
仅在原生斜杠命令平台上注册(Telegram/Discord/Slack)
/status、/new、/think 等大多数命令
衍生解释 — 原生斜杠命令(Native Slash Commands)
Telegram、Discord 和 Slack 都支持"原生斜杠命令"——Bot 在注册时向平台声明自己支持哪些 /command,用户在聊天框输入 / 时会看到自动补全菜单。这与在普通消息文本中包含 /status 不同——原生命令由平台解析并以特殊格式传递给 Bot,而文本命令需要 OpenClaw 自行从消息文本中匹配。
defineChatCommand 是命令定义的工厂函数,自动推导默认值:
buildChatCommands() 函数构建完整的命令列表。以下是所有内置聊天命令的分类汇总:
会话管理(session)
运行时选项(options)
off / minimal / low / medium / high / xhigh
off / tokens / full / cost
steer / interrupt / followup / ...
host=... security=... ask=...
状态查询(status)
管理(management)
查看/设置配置(show / get / set / unset)
管理子代理(list / stop / log / info / send)
设置群组激活模式(mention / always)
设置发送策略(on / off / inherit)
工具(tools)
媒体(media)
控制文本转语音(on/off/status/provider/limit/summary/audio/help)
通道切换(docks)
通道 Dock 命令是动态生成的——根据已注册的通道插件中支持原生命令的 Dock,自动创建 /dock-<id> 命令:
部分命令还有快捷别名:
registerAlias 使用 Set 去重,确保不会注册重复的别名。
assertCommandRegistry 在命令构建完成后进行严格的完整性校验:
唯一性:key 不能重复,nativeName 不能重复,textAlias 不能重复
一致性:text 作用域的命令不能有 nativeName,但必须有 textAlias;native 作用域的命令不能有 textAlias
命令列表使用单例缓存,通过插件注册表版本控制失效:
当插件注册表发生变化时(如加载新插件),缓存自动失效并重建命令列表。
OpenClaw 的命令检测分为两种模式:
精确匹配(Exact Match)— 消息整体是一个命令(如 "/status")
内联检测(Inline Detection)— 消息中包含命令标记(如 "hey /status")
内联 /status 的检测使用正则表达式:
对于允许列表内的发送者,内联 /status 会被立即执行并从消息文本中剥离(让模型看不到命令文本)。对于未授权发送者,内联命令被保留为普通文本。
/status 是最常用的聊天命令,它生成一份详细的状态报告,包括:
Agent 配置(思考级别、详细模式、推理模式等)
状态报告按分类组织,对于授权用户和未授权用户显示不同的信息量。
/new 与 /reset — 会话重置
/new 和 /reset 在功能上等价——重置当前会话并开始新的对话。重置过程会:
触发内部钩子(triggerInternalHook),允许注册的钩子(如 session-memory)在重置前保存上下文
保留会话级覆盖选项(per-session overrides)
如果是"裸重置"(不带参数),触发问候语 Prompt
默认的重置触发词配置在 config/sessions/types.ts:
/compact — 上下文压缩
/compact 触发会话上下文压缩流水线,可以附带压缩指令(如 /compact focus on decisions)。这是一个受限命令——只允许所有者或授权发送者执行,未授权用户的请求会被静默忽略并记录日志。
/bash — Shell 命令执行
/bash 命令允许直接在宿主机上执行 Shell 命令:
/bash 被有意限制为 text 作用域——它不会在 Telegram、Discord、Slack 的原生命令菜单中出现,减少意外执行的风险。执行前需要在配置中启用 commands.bash=true。
聊天命令支持两种参数解析模式:
/think medium → { level: "medium" }
/config set agents.defaults.model gpt-4
参数定义支持丰富的类型和约束:
choices 字段可以是静态数组,也可以是一个函数——例如 /think 的选项列表根据当前模型提供商动态计算(不同模型支持不同的思考级别):
argsMenu 字段控制在原生平台上是否为参数提供选择菜单。设为 "auto" 时,框架根据 args 中的 choices 自动生成菜单。也可以手动指定菜单标题和目标参数:
TUI(终端用户界面)也集成了聊天命令系统。src/tui/commands.ts 通过 getSlashCommands() 将聊天命令转换为 TUI 支持的格式:
TUI 在用户输入 / 时展示命令补全列表,与原生斜杠命令的体验一致。
统一命令注册表:所有聊天命令通过 ChatCommandDefinition 统一定义,包括唯一 key、原生名称、文本别名、参数定义和作用域,assertCommandRegistry 确保注册表完整一致
三种作用域:text(仅文本消息)、native(仅原生平台)、both(两者兼容),安全敏感命令如 /bash 被限制为 text 作用域
七个命令分类:session(会话管理)、options(运行时选项)、status(状态查询)、management(系统管理)、media(媒体)、tools(工具)、docks(通道切换),共计 25+ 内置命令
动态命令生成:通道 Dock 命令根据已注册的插件动态生成;/think 的选项列表根据当前模型动态计算
缓存 + 插件感知:命令列表使用单例缓存,当插件注册表变化时自动失效重建
权限控制:大多数命令仅允许所有者和允许列表成员执行;内联命令(如消息中的 /status)对未授权用户保留为普通文本
多平台适配:同一套命令定义适配 WhatsApp 文本消息、Telegram/Discord/Slack 原生斜杠命令和 TUI 终端界面