这个助手的能力不是写死的。你可以用斜杠命令快速触发功能、用钩子在关键时刻插一脚、用插件装别人写的扩展、还能让它派"分身"并行干活。本篇讲这四种扩展方式。
9.1 / 开头的命令是怎么实现的:四十多个命令的统一做法
在输入框敲 /,会弹出一串命令:/clear(清空对话)、/compact(压缩)、/model(换模型)、/cost(看花了多少钱)......有四十多个。它们是怎么组织的?
每个命令是一个独立小包
每个命令是一个独立的小模块,住自己的文件夹,里面有:命令叫什么、干什么、怎么执行。这种"一个功能一个文件夹"的组织方式,好处是互不干扰------加新命令就是加个新文件夹,不用碰老代码。
统一的"命令"约定
每个命令按统一规矩描述自己:
- 名字和说明(
/help列表里显示的); - 要不要参数(比如
/model sonnet带模型名); - 什么时候可用(有的命令在特定模式下才出现);
- 是"一次性动作"还是"打开一个界面"。
命令分两种长相:
- 一次性命令 :敲下去执行一个动作就完事,比如
/clear清空对话、/compact触发压缩; - 带界面的命令 :敲下去打开一个全屏交互界面,比如
/model弹出模型选择列表、/config打开配置编辑器、装第三方应用的命令甚至是一个多步骤向导(一步步引导你点选)。
懒加载:不敲就不加载
四十多个命令的代码,不是启动时全部读进来的。如果全加载,光命令代码就拖慢启动。实际做法是:启动时只登记"有哪些命令、各叫什么"(很轻),你真的敲了某个命令,才去加载那个命令的代码并执行。
这和第 4 篇"工具按需加载"、第 2 篇"快速通道"是同一种思想:轻装启动,用到才加载。
命令怎么被识别和分发
你输入内容后,有个"命令中心"先判断:这是不是 / 开头?是的话解析出命令名和参数,找到对应模块,加载并执行;不是的话就当作普通对话交给核心循环。斜杠命令在对话里有特殊地位------它不是发给模型的话,而是给程序的指令。
排队执行
命令也会进第 3 篇讲的消息队列:模型正在干活时你敲了个命令,命令会排队,等当前这圈转完再执行,避免打断。
给"已搬走"的命令留个路标
有些老命令后来被改成插件形式提供了。为了不让老用户敲老命令时一脸懵,项目会留一个"路标牌":你敲老命令,它提示"这个功能现在在某某插件里",而不是冷冰冰地报"未知命令"。这是个很贴心的兼容性设计。
9.2 关键时刻插一脚:怎么让它每次改完文件都自动跑测试
斜杠命令是"人主动触发"的。但有些事你希望在特定时机自动发生------每次改完文件自动跑测试、每次提交前自动检查、AI 每次开口前先记录日志。这靠**钩子(hooks)**机制。
钩子是什么
钩子就是"在程序生命周期的固定节点上,允许你插入自己要执行的动作"。程序在这些节点上会停下来问一句:"这里有没有人挂了动作?有就执行。"
打个比方:钩子像流水线旁边的"工位"。流水线在固定位置留了接口,你可以在"零件组装完"这个工位挂一个质检动作,零件每次流到这里就自动质检。你不用改造流水线本身,只要把动作挂到对应工位上。
有哪些挂载点
程序在这些关键节点留了钩子:
- 工具调用之前(PreToolUse):能审查甚至拦下这次调用;
- 工具调用之后(PostToolUse):拿到结果后做点什么(比如改完文件自动跑测试);
- 用户提交消息时(UserPromptSubmit):消息发给模型前做点什么;
- 会话开始 / 结束;
- 模型回复之后(PostModelQuery);
- 停止时(Stop / 子助手停止):模型说"我干完了"时触发;
- 压缩之前(PreCompact)。
钩子怎么配
钩子在配置文件里声明,通常指定:挂在哪个节点、匹配什么条件(比如"只在改文件工具之后")、执行什么动作(通常是跑一条命令,比如 npm test)。
钩子的动作可以是任意命令行命令,所以能力很灵活:跑测试、发通知、记日志、触发 CI、调用公司内部脚本......想干什么都行。
钩子能影响流程,不只是旁观
钩子不只是"看一眼",它可以实质影响流程:
- 拦截:工具调用前的钩子可以说"这个不允许",于是工具不执行(相当于自定义了一条权限规则);
- 补充:钩子可以往上下文里加内容(比如每次对话前自动把最新的接口文档塞进去);
- 叫停:停止钩子可以说"先别停,还有个测试没过,继续修"------于是模型会接着干。
钩子和权限、插件的关系
- 钩子 vs 权限关卡(第 4 篇):权限关卡管"这个操作允不允许",钩子更通用,能在任何节点挂任何动作;"工具调用前拦截"这个钩子和权限关卡有重叠,实际上权限系统可以看作一种特殊的、内置的钩子。
- 钩子可以由用户自己配,也可以由插件(9.3)带来------插件能在挂载点上挂它自己的动作。
9.3 插件:别人写的扩展怎么装、凭什么信任
斜杠命令和钩子是"你自己一个个配"。插件则是打包好的一整套扩展------别人(或官方)把命令、工具、钩子、界面主题、子助手打包在一起,你一键安装就能用。
插件能包含什么
一个插件就是一个符合约定的包,里面可以有:
- 新的斜杠命令;
- 新的工具(第 4 篇讲的工具,装上后模型就能用);
- 新的钩子(自动在某些节点做事);
- 新的子助手类型(9.4 讲);
- 界面主题、输出风格等。
插件通过一个"清单文件"声明自己带来了什么,程序读清单后把这些能力注册进系统------工具进工具箱、命令进命令列表、钩子挂上挂载点。
从哪装:插件市场
插件可以来自:
- 本地文件夹(你自己写的);
- 插件市场(类似应用商店,集中浏览、搜索、安装别人发布的插件);
- 官方内置的一些插件。
装插件有完整的浏览/安装/更新/卸载流程,界面上能看到每个插件带来了什么、开关哪些能力。
信任问题:凭什么让插件在你电脑上跑
插件能跑命令、能加工具、能读你的文件------这是很大的权力,所以信任是核心问题:
- 首次安装要确认:装一个新插件时,程序会明确警告"这个插件能做这些事,你信任它吗",你确认了才装;
- 信任记录:信任过的插件记下来,不会每次都问;没确认的插件代码不会被加载执行;
- 隔离执行:插件代码在受限环境里运行,不能为所欲为;
- 来源管控:企业可以限制只能装官方/内部市场的插件(和第 7 篇外部服务的五层级配置、白名单是同一套管控思路)。
热重载
开发插件时不用反复重启程序:有"重新加载插件"的命令,改完插件代码一键重新读取,方便调试。
加载策略:先读清单,不急着实例化
和命令、工具一样,插件也是"轻装"加载:启动时只读所有插件的清单(知道装了哪些插件、各自带来什么),不真正执行插件代码;等真要用到某个插件的工具/命令时,才把它的代码加载进来。清单加载很快,实例化留到需要时。
9.4 派小弟:它怎么复制一个"自己"去并行干活
这是最能体现"智能体"威力的扩展能力:助手可以派一个"分身"(子助手 / subagent)去独立完成子任务。第 4 篇在工具里提到过它,这一章讲清楚机制。
为什么需要分身
设想一个任务:"把这个代码库里所有和登录有关的代码摸清楚。"主助手如果自己干,要读几十个文件,过程中会产生海量的工具调用和文件内容,全塞进主对话------聊天记录被这些探索过程撑爆,而且大部分细节(读了哪个无关文件、哪条路走岔了)对最终结论毫无价值。
派分身去做就干净了:
scss
主助手:(调用"派分身"工具)给我摸清登录相关代码
↓
分身:(独立地跑一整套核心循环)
读文件 A、搜索、读文件 B、走错路、折返、读文件 C......
(这几十轮探索过程,全在分身自己的对话记录里)
↓
分身:(干完)汇报结论:
"登录逻辑在 auth.ts、session.ts、middleware.ts 三个文件,
入口是 login() 函数,权限校验走 checkAuth()。"
↓
主对话里只多出这一段结论。干净。
分身是"跑着同款发动机的独立实例"
关键认知:分身不是一个简化版脚本,它内部跑的就是第 3 篇那台完整的发动机(核心循环)------它有自己的系统提示、自己的聊天记录、自己的一套工具、自己转自己的圈。它和主助手的区别仅仅是:
- 它是被主助手用工具"派"出来的;
- 它的对话记录独立,不进入主对话;
- 它干完只把最终结论汇报回来。
这就是为什么第 3 篇反复强调"核心循环要做成不关心谁在用它的纯发动机"------主助手、分身、被程序调用、被编辑器调用,跑的都是同一台发动机。
分身有不同"工种"
不是所有分身都一个样。可以定义不同类型的分身,各有专长和权限:
- 探索分身:只做调查研究,工具是只读的(读文件、搜索),不许改东西,专心"摸清情况";
- 计划分身:专门做方案规划,产出计划不动手;
- 通用分身:能干完整的活,包括改文件;
- 用户/插件还可以自定义分身类型(用一段说明文字定义"这个分身是干什么的、什么风格、能用哪些工具")。
主助手根据任务挑合适的分身:要调查就派只读的探索分身(安全、不会乱动),要完整实现一个功能就派通用分身。
并行与管理
- 可以同时派多个分身并行干活(比如三个分身分别调查三个模块),它们之间互不干扰,各有各的记录;
- 每个分身在界面上有独立的状态显示(不同颜色、名字,方便区分谁在干什么);
- 分身可以后台跑,主对话不被阻塞,你能看到"分身 A 正在搜索......分身 B 正在读文件";
- 分身理论上还能再派分身(嵌套),但通常会限制层级,防止无限套娃。
分身的记忆和主对话的关系
分身开始任务时,主助手会把"你要干什么、相关背景"作为任务说明交给它;分身执行中如果需要主对话才知道的信息,会通过任务说明传入或在结论里追问。分身探索到的结论回到主对话后,主助手再基于这些结论继续决策或动手。
这是一种"分而治之"的工作方式:主助手像项目经理,把大任务拆成小块、分派给专门的分身、收齐结论、做最终决策和整合。既保护了主对话的上下文不被探索过程淹没,又能并行提速。
本篇小结
- 斜杠命令:四十多个独立小包,统一约定描述自己,启动只登记、用到才加载;分一次性动作和打开界面两种;命令排队执行,老命令搬走会留路标。
- 钩子:在程序生命周期的固定节点(工具前后、提交时、停止时、压缩前......)挂自定义动作,能跑任意命令、能拦截/补充/叫停流程,是比权限关卡更通用的扩展点。
- 插件:打包好的一整套扩展(命令+工具+钩子+主题+分身),从市场或本地安装;信任是核心------首次安装确认、记录信任、隔离执行、企业可管控来源;清单先加载、代码用到才实例化。
- 子助手:主助手用工具派"分身",分身内部跑同款核心循环、有独立对话记录、只回传最终结论;分探索/计划/通用等工种,可并行、可后台、有限嵌套;本质是"分而治之",保护主对话上下文不被探索过程淹没。
下一篇讲高级能力:后台常驻、自主模式、各种工作模式、语音和看屏幕。