命令系统
命令系统 让用户通过 /command 语法快速触发特定功能。输入 / 开头的文本,前端自动识别命令名和参数,分发到对应的处理逻辑——就像终端命令行一样高效。
命令处理方式
Section titled “命令处理方式”命令根据实现方式分为以下几种处理模式:
| 处理方式 | 说明 | 示例 |
|---|---|---|
| 前端直接处理 | 前端 switch case 匹配命令名,执行本地逻辑或发送 RPC 到后端 | /compact:前端发送 RPC 调用后端压缩接口 |
| 特殊前缀处理 | 前端识别命令前缀,生成特殊消息(isMeta: true)传递给 AI | /goal:生成目标设定消息,AI 据此理解任务目标 |
| 自定义命令 | 宿主应用通过 API 注册自定义命令,前端匹配后调用注册的处理函数 | 宿主注册的任意自定义命令 |
命令解析流程
Section titled “命令解析流程”解析规则:
/后第一个单词为命令名- 剩余部分为参数(原始字符串传递)
- 命令名匹配优先级:精确匹配 > 别名匹配
命令来自两个渠道:系统内置命令(/compact、/export、/goal、/persona)和宿主应用通过 API 注册的自定义命令。
/compact — 手动压缩
Section titled “/compact — 手动压缩”暴露已有的自动压缩功能,允许用户主动触发上下文压缩,释放 token 空间。
| 参数 | 必填 | 说明 |
|---|---|---|
| 自定义指令 | 否 | 覆盖默认压缩 prompt 的自定义摘要指令 |
| 关键规则 | 说明 |
|---|---|
| 异步执行 | 压缩走队列,不阻塞当前对话 |
| 完成通知 | 压缩完成后通过 Live 频道推送通知 |
| 防重复 | 压缩中禁止重复触发 |
| 结果反馈 | 压缩完成后返回 {Success: true},通过 Live 频道推送通知 |
/export — 导出会话
Section titled “/export — 导出会话”将当前会话的对话记录导出为独立的 HTML 文件,用于离线阅读、归档或分享。纯前端实现,无需服务端参与。
弹出对话框提供以下配置项:
| 选项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| 消息数量上限 | 滑块 | 200 | 导出最近 N 条消息。步进 100,最大值 2000。设为超过当前消息数则导出全部 |
| 包含工具调用 | 是 / 否 | 否 | 是否包含 toolcall_input 和 toolcall_output 类型的消息 |
| 包含推理过程 | 是 / 否 | 否 | 是否包含 thinking 类型的消息 |
生成的 HTML 文件包含:
| 内容 | 说明 |
|---|---|
| 会话元信息 | 标题、创建时间、消息数、Token 统计(输入/输出/缓存读取/缓存写入/总花费) |
| 用户消息 | 展开显示,Markdown 渲染 + 代码高亮 |
| 助手回复 | 展开显示,Markdown 渲染 + 代码高亮 |
| 工具调用 | 折叠显示(可选),展开后可查看参数和结果 |
| 推理过程 | 折叠显示(可选),展开后可查看 AI 思考过程 |
文件名格式:rtc-{会话标题}-{YYYY-MM-DD}.html
- 非法文件名字符自动替换为连字符
- 标题截断至 50 个字符
- 空格替换为连字符
消息过滤规则
Section titled “消息过滤规则”| 规则 | 说明 |
|---|---|
| 排除流式消息 | 自动过滤 streaming: true 的不完整消息 |
| 空会话检查 | 当前会话没有消息时提示错误 |
| 按内容过滤 | 根据用户选项过滤工具调用和推理消息 |
| 按数量截断 | 超出上限时保留最近 N 条消息 |
💡 设计原则:导出是完全离线的纯前端操作——HTML 文件内嵌所有样式,无需联网即可查看。Markdown 渲染使用
marked+highlight.js+DOMPurify,与组件内部的消息渲染管线保持一致。
/persona — 角色切换
Section titled “/persona — 角色切换”切换 AI 在当前会话中扮演的角色/人设。输入角色名称后,AI 会采用该角色的词汇、优先级和典型推理模式,直到会话结束或被新命令覆盖。
/persona <角色名称>| 参数 | 必填 | 说明 |
|---|---|---|
| 角色名称 | 是 | 角色描述,如 senior-backend-engineer、产品经理、security-expert。输入 default 恢复默认行为 |
/persona 是一个 会话级 命令——触发后在整个会话期间持续生效。后端通过两个阶段实现角色保持:
| 阶段 | 说明 |
|---|---|
| 触发提示 | 首次执行时,注入系统消息激活角色 |
| 保持提示 | 后续轮次注入提醒,确保 AI 保持角色 |
| 关键规则 | 说明 |
|---|---|
| 会话级生效 | 角色仅在当前会话有效,关闭会话后失效 |
| 可覆盖 | 输入新的 /persona 命令即可切换角色 |
| 可恢复 | 使用 /persona default 恢复默认行为 |
/loop — 循环执行
Section titled “/loop — 循环执行”用户用自然语言描述需要循环执行的任务,Agent 理解意图后创建定时循环任务,按固定间隔自动执行。
/loop <任务描述>| 参数 | 必填 | 说明 |
|---|---|---|
| 任务描述 | 是 | 自然语言描述的循环任务,如 每 5 分钟检查一次部署状态 |
/loop 通过 LLM 内置工具 createLoop 创建定时循环任务。任务创建后,系统按固定间隔自动触发新的 Turn 执行任务描述中的操作,直到用户取消。
| 相关工具 | 说明 |
|---|---|
createLoop | 创建定时循环任务 |
cancelLoop | 取消循环任务 |
completeLoop | 将循环任务标记为已完成 |
listLoops | 列出当前会话的所有循环任务 |
pauseLoop | 暂停循环任务 |
resumeLoop | 恢复暂停的循环任务 |
/goal — 目标驱动
Section titled “/goal — 目标驱动”用户设定一个完成条件,AI 持续工作直到条件满足。AI 在执行过程中自行判断目标是否达成,通过 completeGoal 工具声明目标已达成,或通过 cancelGoal 取消目标。
命令交互方式
Section titled “命令交互方式”/goal 采用特殊前缀处理模式:用户输入 /goal <条件> 后,前端将其作为普通消息发送,后端通过命令注册表(GoalWorkflow)检测前缀并注入系统提示,引导 AI 进入目标设定流程。
与 /compact 等前端直接处理的命令不同,/goal 不会立即执行操作——它触发的是一个多轮对话工作流:
| 对比 | /compact | /goal |
|---|---|---|
| 处理方式 | 前端直接发送 RPC | 特殊前缀 → 系统提示注入 |
| 执行时机 | 即时执行 | AI 理解后引导多轮交互 |
| 用户确认 | 不需要 | 需要用户确认目标条件 |
AI 在执行过程中持续评估目标完成度。当 AI 认为目标已达成时,调用 completeGoal 工具声明完成;当 AI 认为目标无法完成或需要取消时,调用 cancelGoal 工具。
| 组件 | 职责 |
|---|---|
| AI | 执行工作并自行判断目标是否达成,通过 completeGoal/cancelGoal 工具声明状态变化 |
目标作为独立实体
Section titled “目标作为独立实体”Goal 是独立于 Session 的实体,有自己的生命周期:
| 状态 | 说明 |
|---|---|
Active | 目标激活中,AI 持续工作 |
Completed | AI 调用 completeGoal 声明条件达成 |
Cancelled | 用户手动取消 |
Exhausted | 超过最大轮次上限(默认 50 轮) |
| 元素 | 说明 |
|---|---|
| 状态栏 | 显示当前目标条件摘要 |
| Overlay 面板 | 显示已执行轮次、累计 token、运行时长 |
| 完成通知 | 目标达成时弹出通知 |
| 命令 | 说明 |
|---|---|
/goal | 显示当前目标 |
/goal <condition> | 设定目标 |
/goal clear | 清除目标 |
| 关键规则 | 说明 |
|---|---|
| 单一目标 | 单次会话只能有一个活跃目标 |
| 会话内有效 | 目标仅在当前会话有效 |
| 安全上限 | 最大轮次上限(默认 50 轮),防止失控 |
命令执行后通过 Toast 向用户提供反馈。
命令反馈:
| 场景 | 反馈方式 |
|---|---|
| 命令执行成功 | Toast 通知 ✅ |
| 命令执行失败 | Toast 错误提示 ❌ |