大家好,我是小木头。如果你用过 Codex、Claude Code,可能已经熟悉 subagent。把相对独立的任务交给其他 agent 分头处理再汇总结果,Pi 默认没有内置的 subagent。有这类需求的用户可以通过插件来补上,今天就介绍其中的一个。这个插件叫 pi-subagent,来自 Pi 的作者 Mario。每个 subagent 都在独立的 tmux 会话里运行。你可以打开它的终端查看任务的进展,也可以补充要求继续追问。

插件会为每个 subagent 启动独立的 Pi 进程,并单独保存聊天记录。不过,它们默认仍然访问同一个项目目录。下面直接在 Pi 的会话里,让它安排两个 subagent 检查代码,再来看看这些会话是怎么运行的。在安装之前首先呢,准备好 Pi、Node.js 以及 tmux。tmux 需要单独安装,macOS 可以使用 brew install tmux。

安装好以后插件会自动地为每个 subagent 创建会话,你并不需要手动创建也不需要提前把 Pi 放进 tmux 里运行。这里使用 Pi 官方的 pi install 命令,从 Git 仓库安装插件。执行后,用 pi list 确认安装结果,再把 subagent 命令加入 PATH。如果 Pi 已经在运行,那么你就在会话中输入 /reload,加载刚安装的扩展。

我们这里提的扩展实际上就是插件是同一个概念。安装完成后你可以在 Pi 对话里安排任务了。我们直接描述要检查什么、允许做什么,再让 Pi 创建 subagent,等待并整理结果。你会在执行过程中看到 subagent 命令,那是 Pi 通过 bash 工具完成的操作,并不需要自己逐条的输入。完整的安装命令我会放在视频的描述中。

咱们先在 Pi 的会话里提出一个需求:创建两个 subagent,分别检查分页函数和账单函数。只允许读取和搜索,不修改文件。需求说清楚以后 Pi 会创建任务,并显示任务的名称和编号。这些编号用于后续的管理。日常的使用中我们也可以直接告诉 Pi,要继续处理哪个任务。

想看看 subagent 执行过程你就可以在 Pi 输入 /subagent,选择对应的任务进入它的会话。看完以后,按 Ctrl-b,再按 d,返回原来的 Pi 的会话。这次分页检查发现了少取一项的问题:slice 不包含结束位置,想取三项代码呢却只返回了两项。去掉结束位置里的减一就符合需求了。

接着创建第二个任务,检查账单函数。这里 discount 表示折扣比例,0.2 就是打八折但代码却把它当成了固定金额直接减掉。比如单价一百,数量为二算出的结果是一百九十九点八而正确结果呢应该是十六十。这两个任务由 Pi 分别创建各自保留聊天记录,我们仍然在原来的对话里等待由 Pi 把检查结果整理出来。

这里用的是方便核对的一个小样本,一个小的演示场景还不能据此来判断在复杂项目里的审查效果。有了这么一个个初步的结果我们就还可以在原来的 Pi 对话里继续追问。比如让检查分页的 subagent 补充一条回归测试,但呢暂时不修改文件。

Pi 会找到对应的任务把要求发过去再取得回答,并不需要自己来复制任务的编号手动的拼接命令。当然了底层仍然由命令完成这些操作:send 发送要求,follow-up 把追问排在当前问题之后而 wait 则是读取最新的回答。对话负责表达你的需求插件提供执行和管理任务的能力需要查看完整的过程时仍然可以进入对应的会话。

这些任务为什么能够被查看追问还能保留记录呢?插件主要保存了三类信息:metadata 记录任务的标识模型和运行状态;inbox 接收追加的消息;session.jsonl 保存聊天的记录。在创建任务时插件通过 tmux 启动独立的 Pi 进程。

补充要求、追加提问时命令先把消息写入 inbox,subagent 中的扩展定期地检查再把消息呢交给 Pi。执行 wait 命令时它会检查任务的状态再从聊天记录中读取回答,所以打开终端可以观察过程而 wait 用来取得最终的回答。

当负责分派任务的 Pi 会话正常退出时插件会停止它创建的 subagent,同时保留聊天记录和任务的信息。之后如果我们恢复原来保存的会话这些 subagent 也会重新启动但它们会停在空闲状态,你需要再次发出指令它们才会继续工作。在实测中恢复会话后再追问账单的问题它仍然能够给出之前的修正公式。

我们也测试了 subagent 还在工作时正常关闭负责分派任务的 Pi 进程。需要注意的是重新加载的是聊天记录执行到一半的工具不会从中断处接着运行,本次没有测试到像断电强制结束进程或者异常崩溃的场景。

在会话恢复后还有一个容易误判的情况:我们发出一 条新的解释请求在它回答前中断任务再恢复会话,聊天记录里这条请求仍然还没有得到回答但执行 wait 返回的却是上一轮的修正公式还显示 finished,退出代码也是零。从源代码看 wait 会检查任务是否开始过、现在是否空闲以及是否还有消息等待投递满足条件后就能读取最新的模型回答。

但并没有核对这条回答是否对应刚才的请求所以中断恢复后要检查聊天记录确认当前问题有没有得到回答再决定是否让它继续。如果只看 finished 这个状态呢还不能够判断任务是否真的已经完成。咱们第一次使用的时候可以从一个小任务或者小文件开始比如在对话里说明检查的目标并明确不要修改代码。

如果让多个 subagent 同时修改代码需要自己分配文件或者准备独立的工作目录,这个插件并不允许 subagent 再来创建 subagent。任务结束后可以让 Pi 先汇总结论再停掉这些任务,停止会删除对应任务的聊天记录和任务信息需要的内容呢需要提前保存好。

如果这期对你有帮助欢迎大家继续关注咱们频道也来个一键三连支持一下吧。我是小木头,我们下期见。