pi-subagents

5670 字
28 分钟
pi-subagents

pi-subagents 本质上是一个 面向 Pi 的多 agent 编排扩展。它把一个 Pi 会话变成 父 agent(parent agent),从而可以将聚焦的细分工作委派给额外的 Pi 会话或外部编码 agent CLI。

简明结构:

你
│
▼
Pi 主会话
(parent / orchestrator)
│
├── scout ───────► 探索代码库
│
├── worker ──────► 应用代码修改
│
├── reviewer ────► 审阅代码修改
│
└── oracle ──────► 挑战 plan
│
▼
results returned to parent

1. 使用#

内置的 subagents(部分拥有别名):

Agent用途
scout代码库侦察:快速定位入口、关键文件、接口、数据流、依赖和风险,整理供后续 agent 使用的上下文,默认输出 context.md.
researcher网络与文档研究:搜索、读取原始来源、比较证据,产出带引用的研究简报,默认输出 research.md.
evidence-auditor独立证据审计:检查已有研究中的重要结论是否真的得到来源支持,指出矛盾、过时来源和证据缺口
worker / developer / coder / implementer / develop代码实现:按任务或已批准的方案修改文件、运行检查和测试;遇到未批准的架构或产品决策时向主 agent 请示
reviewer审查与验证:审查代码 diff、计划、解决方案、代码库状态,以及 PR/issue 的完成情况,给出有证据的问题和结论
oracle / advisor第二意见:结合已有对话与约束,检查隐藏假设、决策矛盾和方向偏移,挑战当前方案
delegate通用委派:行为接近主 agent,没有固定的默认预读文件,直接完成一个边界明确的任务

可调用的外部 CLI subagents:

Agent用途
claude-code只分析传入的交接材料,无工具,不可编辑文件,适合对已提供的方案或材料给出意见
claude-code-writer修改文件;开放 Read、Write、Edit、Glob、Grep,不开放 Bash
codex-exec在 read-only 沙箱里做只读分析
codex-exec-writer在 workspace-write 沙箱里执行工作区修改
cursor-agentask 模式做只读分析
cursor-agent-writer启动沙箱的非交互模式执行工作区修改

在调用外部 CLI subagents 前,需要先安装并认证相应 CLI. 另外,内置的 subagents 没有默认绑定模型,可以通过设置单独覆盖。

使用示例:

让 scout 梳理这个项目的支付流程,列出关键文件和风险。
让 worker 按这个计划实现修改,然后让 reviewer 独立审查。
请 oracle 挑战这个架构方案,重点检查是否违反我们之前确定的约束。
让 researcher 调研这两个库,再让 evidence-auditor 核验关键结论。
使用 codex-exec 对当前改动做只读分析。

1.1 创建自定义 subagents#

分为两种情况:

  • 创建新 subagent:写一个 markdown agent 文件
  • 修改内置 subagent:少量修改可以用 settings.json 覆盖设置,大幅修改则复制同名的 agent 文件

配置文件位置:

用途用户级:跨项目使用项目级:仅当前项目
自定义 agent 定义~/.pi/agent/agents/<名称>.md<项目根目录>/.pi/agents/<名称>.md
覆盖内置或自定义 agent 的字段~/.pi/agent/settings.json<项目根目录>/.pi/settings.json

同名 agent 定义的优先级是:

项目级 > 用户级 > 安装包提供的定义 > 内置定义

设置中的覆盖字段也遵循项目级优先于用户级。

Warning

subagents.agentOverrides 应写进 Pi 的 settings.json,不是扩展的 ~/.pi/agent/extensions/subagent/config.json。

1.1.1 创建自定义 subagent 示例#

以创建一个只读安全审查员为例。

创建文件:

~/.pi/agent/agents/security-reviewer.md

内容如下:

---
name: security-reviewer
description: 只读安全审查员,检查认证、授权、输入校验及敏感信息泄漏
aliases: security-auditor
advertise: true
model: inherit
thinking: high
tools: read, grep, find, ls, contact_supervisor
systemPromptMode: replace
inheritProjectContext: true
inheritGlobalContext: false
inheritSkills: false
defaultContext: fresh
acceptanceRole: read-only
async: true
timeoutMs: 900000
---
你是一个只读安全审查员。
任务:
- 审查指定文件或主 agent 提供的 diff。
- 重点检查认证绕过、权限校验缺失、输入校验和敏感信息泄漏。
- 从实际代码中验证问题,不凭猜测报告漏洞。
边界:
- 不修改文件,不运行 shell 命令。
- 如果缺少必要材料,报告缺口。
- 如需主 agent 做决定,使用 contact_supervisor 请求确认。
输出:
1. 审查范围。
2. 已确认问题:严重程度、文件路径、行号、证据与修复建议。
3. 未验证事项与剩余风险。
4. 若无已确认问题,明确说明。

字段说明:

字段含义
name调用时使用的正式名称。这里是 security-reviewer;同名定义会发生覆盖。
description角色简介,帮助主 agent 判断它适合什么任务。
aliases可选别名。这里也可以用 security-auditor 选择该角色。
advertisetrue 表示在 subagent 工具激活时,将名称和简介加入主 agent 的角色目录,不代表会自动启动或自动委派。
model默认模型。inherit 表示使用当前父会话模型;也可填已配置的 provider/model-id。
thinking推理强度。示例为 high;实际是否支持取决于模型及提供方。
tools子会话的严格工具白名单。此例没有 bash、edit、write。
systemPromptModereplace:使用该 agent 的独立提示词;append:把正文追加到 Pi 的基础提示词。默认是 replace。
inheritProjectContext是否保留项目指令,例如仓库的 AGENTS.md、CLAUDE.md。
inheritGlobalContext是否保留用户全局上下文。只有 inheritProjectContext: true 时才有效,默认是 false。
inheritSkills是否让子会话看到 Pi 发现的 skills 目录。也可以用 skills 单独选择需要的技能。
defaultContextfresh:默认从新上下文开始;fork:默认继承父会话对话上下文。与是否继承项目指令是两回事。
acceptanceRole用于自动验收推断的角色标记:read-only 或 writer。本身不授予或撤销工具权限。
async单 agent 调用默认是否后台执行。显式调用参数可以覆盖,强制异步配置除外。
timeoutMs默认运行时限,单位毫秒。900000 是 15 分钟。

如果不需要这些控制项,最小定义也可以很简单:

---
name: security-reviewer
description: 只读安全审查员
tools: read, grep, find, ls
---
审查指定代码中的安全问题,只报告有证据的问题,不修改文件。

保存后执行:

/reload

然后告诉 Pi:

请使用 security-reviewer 审查 src/auth/ 下的认证和权限逻辑,只报告有证据的问题。

也可以让 Pi 帮你确认加载结果:

列出当前可用的 subagents,并显示 security-reviewer 的配置。

1.1.2 修改内置 subagent:方式 A,覆盖部分字段#

适合:改模型、推理强度、工具权限、上下文策略、描述等少量配置。

例如,将内置 reviewer 调整为高推理强度、默认使用新上下文,并修改简介。

编辑:

~/.pi/agent/settings.json

合并以下内容:

{
"subagents": {
"agentOverrides": {
"reviewer": {
"description": "独立只读审查员,重点检查正确性、回归风险和测试覆盖",
"model": "inherit",
"thinking": "high",
"defaultContext": "fresh",
"inheritProjectContext": true,
"inheritGlobalContext": false,
"inheritSkills": false
}
}
}
}

这里:

  • subagents:扩展的设置命名空间。
  • agentOverrides:按 agent 正式名称配置覆盖项。
  • reviewer:要修改的角色。
  • 内层字段替换该角色对应的默认值;没写的字段继续保留原定义,包括原系统提示词和工具白名单。

如果仅希望某个项目采用这个配置,写到:

<项目根目录>/.pi/settings.json

已有 settings.json 时,请合并字段,不要用示例覆盖整个文件。 修改后执行 /reload。

还可以禁用某个角色:

{
"subagents": {
"agentOverrides": {
"reviewer": {
"disabled": true
}
}
}
}
Info

设置覆盖不仅适用于内置角色,也能覆盖同名自定义角色。因此,如果你的 Markdown 配置没有按预期生效,应检查用户和项目的 agentOverrides。

1.1.3 修改内置 subagent:方式 B,创建同名完整定义#

适合:大幅改变角色职责、重写系统提示词或重新设计工具集。

以 reviewer 为例,可以先把随包定义复制到用户目录:

Terminal window
mkdir -p ~/.pi/agent/agents
cp ~/.pi/agent/npm/node_modules/pi-subagents/agents/reviewer.md \
~/.pi/agent/agents/reviewer.md

然后编辑:

~/.pi/agent/agents/reviewer.md

保留:

name: reviewer

并按需求修改配置与正文。执行 /reload 后,你的同名定义会覆盖随包的 reviewer。

也可以直接请 Pi 使用扩展的管理操作:

请将内置 reviewer eject 到用户级目录,供我编辑;不要启动审查任务。

其对应工具操作是:

subagent({
action: "eject",
agent: "reviewer",
agentScope: "user"
})

重要区别:同名文件是完整替换,不是字段合并。 自定义文件中省略的字段不会从原内置定义继承。

恢复默认时,可以删除同名自定义文件,并清除相应覆盖项;也可以请 Pi 执行 reset。如果项目级仍有同名定义或覆盖项,用户级恢复后也仍会受项目级影响。

1.2 工作流#

两类现成入口:

  • 6 个斜杠命令工作流模板
  • 2 个命名工作流资源:通过 subagent 工具调用,偏程序化集成。

此外,还支持自行组合串行、并行、审查循环等流程。

1.2.1 /parallel-review:多角度并行审查#

让多个 reviewer 从不同角度独立检查当前改动,再由主 agent 汇总。

典型流程:

确定目标与审查角度
↓
并行 reviewer:正确性 / 测试 / 可维护性等
↓
主 agent 汇总:立即修复 / 可选改进 / 忽略或延期
  • 默认使用 fresh 上下文,不依赖主会话的推理历史。
  • 倾向使用 3 个有明确分工的 reviewer,但角度和数量不是固定死的。
  • 默认只审查,不修改文件。
  • 添加 autofix,会在汇总后修复“值得现在处理”的问题,并验证结果,不自动执行可选改进。

示例:

/parallel-review 审查当前 diff,重点关注权限校验和回归风险
/parallel-review autofix 审查 src/auth/ 的当前改动

1.2.2 /review-loop:实现、审查、修复循环#

典型流程:

worker 实现(如果尚未实现)
↓
并行 reviewer 审查
↓
主 agent 筛选问题
↓
worker 修复 → 必要时再次审查
  • 默认最多 3 轮审查,可以指定其他上限。
  • 如果目标是已有 diff,直接从审查开始。
  • 不会为了可选润色一直循环。
  • 遇到未批准的产品、范围或架构决定,会暂停询问。
  • 默认同一工作区一次只有一个 writer。

示例:

/review-loop 为登录接口增加速率限制,最多审查 2 轮
/review-loop 审查并修复当前 diff,最多 3 轮,不做范围外重构

这里的“干净”并非必须消灭所有建议,而是没有尚需处理的阻塞问题或重要修复;可选项可以记录并延期。

1.2.3 /parallel-research:并行调研与代码侦察#

组合 researcher 和 scout,同时调查外部证据、本地实现和实践取舍。

典型流程:

researcher:官方资料与外部证据 ─┐
scout:本地代码、约束与接入点 ──┼→ 主 agent 综合结论
researcher/scout:实践取舍 ─────┘

默认角度是:

  1. 外部证据。
  2. 本地代码上下文。
  3. 实践取舍与风险。

通常使用 2–3 个子 agent,默认只研究,不实现。

示例:

/parallel-research 结合当前项目,比较 PostgreSQL 和 SQLite 的适用性

条件: 使用 researcher 的部分要求子会话加载 pi-web-access 及所需网络工具。

1.2.4 /gather-context-and-clarify:先收集上下文,再澄清需求#

适合需求较模糊,但你希望 agent 先看代码,再问有针对性的问题。

典型流程:

scout 查看代码
+
必要时 researcher 查外部资料
↓
汇总已知信息与缺口
↓
向用户提出关键澄清问题

示例:

/gather-context-and-clarify 我想给这个项目增加多租户支持,先看现有实现再问我问题
Warning

该模板明确要求使用 interview 工具提问,但模板本身不提供这个工具。如果当前会话没有 interview,需要补齐工具,或者明确让主 agent 改为普通对话提问。

1.2.5 /parallel-cleanup:并行清理审查#

这是聚焦代码与文字质量的专项审查,不是完整的正确性审查。

默认启动两个只读 reviewer:

审查分工重点
Deslop passAI 式冗余注释、占位文字、掩盖错误的防御代码、宽泛类型转换、无价值包装、生成腔文案等。
Verbosity pass重复逻辑、啰嗦分支、无价值临时变量、重复测试、重复说明与样板代码等。
  • 如果有 deslop 或 verbosity-cleaner skill,就使用它们。
  • 没有这些 skill,也有模板内置指导,不是必需依赖。
  • 默认只报告;添加 autofix 后应用筛选出的必要修复。
  • 强调必须更短,同时更清晰且不改变行为。

示例:

/parallel-cleanup 检查当前 diff 中的冗余代码和注释
/parallel-cleanup autofix 仅清理本次改动,不做大规模重构

1.2.6 /council:有边界的顾问讨论#

适合重要架构选择、存在明显取舍的技术决策,或需要多个独立观点的问题。

典型流程:

主 agent 明确问题、范围和非目标
↓
2–3 名顾问给出意见
↓
主 agent 筛选并传递质疑,组织有限轮交叉检验
↓
主 agent 输出最终决策备忘录
  • 默认最多 2 个讨论 pass,可指定 2 或 3。
  • 通常选择 2–3 名顾问,最多 4 名。
  • 优先使用已配置的 council-* 自定义角色;没有足够角色时,通常使用 oracle 和 reviewer 补齐。
  • 顾问不直接互聊,也不默认共享完整彼此对话。
  • 主 agent 始终负责综合与最终决策。
  • council-* 是可自行添加的角色配置,不是随包默认提供的一组 agent。

示例:

/council 是否应该把当前单体拆成微服务? --max-passes 2
/council 比较两个迁移方案 --advisors oracle,reviewer --max-passes 3

1.2.7 2 个命名工作流资源#

这两个不是上述斜杠模板,而是扩展提供的可按名字解析的工作流资源。

名称功能参数
review启动一个 reviewer,返回其审查输出。不是多 reviewer 并行审查。args.task:非空任务字符串
run-ci执行受支持的非交互验证命令,收集有界日志和执行结果。args.command、可选 args.timeoutMs

对应工具调用示例:

subagent({
workflow: "review",
args: {
task: "审查当前 diff,报告有证据的正确性问题"
}
})
subagent({
workflow: "run-ci",
cwd: "/path/to/project",
args: {
command: "npm run typecheck",
timeoutMs: 120000
}
})

run-ci 当前仅支持:

npm test
npm run typecheck

1.2.8 创建自定义工作流#

有两种主要方式:

  • Markdown 提示模板:适合自然语言流程、简单串行步骤、斜杠命令。
  • JavaScript 工作流脚本:适合明确控制串行、并行、条件分支和结果汇总。

文件位置:

内容用户级,跨项目使用项目级
工作流提示模板~/.pi/agent/prompts/<名称>.md<项目>/.pi/prompts/<名称>.md
JavaScript 工作流自选路径,例如 ~/.pi/agent/workflows/review.js自选路径,例如 <项目>/.pi/workflows/review.js
包资源加载配置~/.pi/agent/settings.json<项目>/.pi/settings.json

区别:prompts/ 下的直接 .md 子文件会被发现并变成模板命令;工作流 .js 文件不会因为放进某个目录就自动变成斜杠命令,需要显式指定路径调用。

组合自定义工作流:Markdown 模板#

方式 A:用自然语言描述完整流程#

例如,创建:

~/.pi/agent/prompts/implement-and-review.md

内容:

---
description: 侦察、实现并独立审查一个已批准的任务
argument-hint: "<任务>"
---
针对以下任务,使用 pi-subagents:
$@
流程:
1. 让 scout 检查相关代码,定位关键文件、约束和测试。
2. 主 agent 汇总侦察结果。如果任务需要尚未批准的产品或架构决定,
先询问用户,不直接实现。
3. 让一个 worker 按已批准范围实现,并运行适当验证。
4. 实现完成后,让两个 fresh-context reviewer 并行审查:
- 一个检查正确性和回归风险;
- 一个检查测试覆盖和验证充分性。
5. 主 agent 汇总有证据的问题,不盲目接受所有建议。
6. 本轮仅报告审查结果,不自动追加修复。
限制:
- 同一工作区一次只允许一个 writer。
- reviewer 不修改文件。
- 最终报告修改文件、验证结果、审查发现及剩余风险。

保存后执行:

/reload

使用:

/implement-and-review 给登录接口增加速率限制,不改变现有响应格式

这里:

  • 文件名决定命令名:implement-and-review.md → /implement-and-review。
  • description:命令说明。
  • argument-hint:参数提示。
  • $@:替换为调用时提供的全部参数。
  • 正文:交给主 agent 的编排指导。
Warning

这种模板不是固定执行图。主 agent 阅读说明后组织子 agent,可能会根据实际情况调整、暂停和澄清流程。

方式 B:用 /prompt-workflow 串联多个模板#

如果希望每一步明确交给一个角色,可以拆成多个文件。

1. 第一步:代码侦察

~/.pi/agent/prompts/map-task.md:

---
description: 收集任务所需的代码上下文
subagent: scout
fresh: true
---
任务:$@
只收集上下文,不实现。
返回关键文件、接口、约束、测试位置和待确认事项。

2. 第二步:执行已批准任务

~/.pi/agent/prompts/build-task.md:

---
description: 根据上下文执行已批准任务
subagent: worker
fresh: true
---
已批准任务:$@
上一步的代码上下文:
{previous}
执行最小必要修改并验证。
如遇到未批准的范围或架构选择,请向主 agent 请求决定。
返回修改文件、验证命令与结果、剩余风险。

3. 第三步:独立审查

~/.pi/agent/prompts/check-task.md:

---
description: 独立审查实现结果
subagent: reviewer
fresh: true
---
原任务:$@
实现者的交接说明:
{previous}
直接检查当前文件和工作区 diff,不把交接说明当作正确性证明。
只报告有证据的问题,并注明文件、行号和最小修复建议。
不要修改文件。

4. 总入口:串行组合

~/.pi/agent/prompts/deliver-task.md:

---
description: 侦察、实现、审查
chain: map-task -> build-task -> check-task
---
通过串行步骤执行任务。

调用:

/prompt-workflow deliver-task "为已确定的登录方案补充速率限制" --bg

关键字段与占位符:

字段或语法含义
subagent该步骤使用的 agent;省略时默认是 delegate。
fresh: true该步骤采用新上下文。
fork: true该步骤采用继承的父会话上下文;不要同时设置 fresh。
model可选,指定该步骤的模型。
skill可选,选择该步骤需要的技能。
chain用 -> 连接模板名称,按顺序执行。
$@用户传给总入口的参数,各步骤均可使用。
{previous}上一步的输出,由适配器传给下一步。
--bg后台运行,避免阻塞主聊天。

组合自定义工作流:JavaScript 脚本#

需要并行或明确判断执行结果时,使用脚本更合适。

例如创建:

<项目>/.pi/workflows/review-change.js

内容:

const target = args.target;
if (typeof target !== "string" || !target.trim()) {
throw new Error("必须提供非空的 args.target");
}
// 先串行侦察。
const scan = await runs.run("scan", {
label: "梳理审查目标",
agent: "scout",
context: "fresh",
task: `检查 ${target} 的当前改动,定位相关文件、约束和风险。不要实现。`
});
if (!scan.ok) {
throw new Error(`侦察未成功完成:${scan.runId}`);
}
// 再并行审查,runs.all 返回按输入顺序排列的数组。
const reviews = await runs.all([
{
key: "correctness",
label: "审查正确性",
agent: "reviewer",
context: "fresh",
task: [
`审查目标:${target}`,
"只读检查正确性和回归风险。直接检查文件与当前 diff。",
"以下上下文仅用于定位,不作为正确性证明:",
scan.output
].join("\n")
},
{
key: "tests",
label: "审查测试覆盖",
agent: "reviewer",
context: "fresh",
task: [
`审查目标:${target}`,
"只读检查测试覆盖、断言质量和验证缺口。",
"以下上下文仅用于定位:",
scan.output
].join("\n")
}
]);
return {
ok: reviews.every(result => result.ok),
reviews: reviews.map((result, index) => ({
angle: index === 0 ? "correctness" : "tests",
ok: result.ok,
runId: result.runId,
output: result.output
}))
};

让 Pi 调用它,对应工具参数是:

subagent({
workflow: "./.pi/workflows/review-change.js",
cwd: "/你的项目绝对路径",
args: {
target: "src/auth/ 的当前工作区改动"
},
async: true
})

你可以直接说:

请运行 .pi/workflows/review-change.js,
target 是 src/auth/ 的当前工作区改动,后台执行。

也可以先要求只验证脚本、不启动子 agent:

subagent({
action: "validate",
workflow: "./.pi/workflows/review-change.js",
cwd: "/你的项目绝对路径"
})

脚本中的核心概念:

API 或字段用途
runs.run(...)启动一个具备稳定 key 的步骤。
runs.all([...])并行执行步骤,返回有序数组。
runs.lanes([...])多条路线并行,每条路线内部串行推进。
args调用传入的只读 JSON 参数。
key稳定的步骤标识,用于追踪和协调。
label显示给用户的简短步骤名称。
result.ok子 agent 是否成功完成;不等于代码一定正确或审查一定通过。
result.output子 agent 返回的文本。

脚本是扩展执行的 JavaScript 语句体:

  • 可以使用顶层 await 和 return。
  • 没有任意文件系统、shell 或主机全局变量访问。
  • 不要定义嵌套的 async 函数或 async 箭头函数。
  • 每个子任务应明确范围、权限、验收条件和停止条件。
  • 一般让外层工作流 async: true;不要为等待最终结果的子步骤显式设置 async: true,否则它返回的可能只是启动回执,而不是完成结果。

2. 内部工作原理#

subagent 并不仅仅是插入主上下文的另一段提示。它是一个 独立的子 agent 会话。

假设你说:

Use scout to understand the authentication system.

在概念上,Pi 会做类似这样的事情:

Pi 主会话
│
│ subagent({
│ agent: "scout",
│ task: "Understand the authentication system"
│ })
│
▼
新的 Pi 子会话
│
├── scout system prompt
├── scout tool permissions
├── selected model
└── task
│
▼
探索 repository
│
▼
final report
│
▼
Pi 主会话继续 reasoning

2.1 Agent 的定义#

从根本上说,一个 agent 就是一个带 YAML frontmatter 的 Markdown 文件。例如,文档中给出的等价写法是:

---
name: scout
description: Fast codebase recon
tools: read, grep, find, ls
---
Your system prompt goes here.

因此,一个 agent 定义会指定如下内容:

role
system prompt
tools
model
thinking level
skills
extensions
output behavior

因此你可以创建自己的专家 agent。

例如:

.pi/agents/
├── database-expert.md
├── security-reviewer.md
├── python-teacher.md
└── frontend-reviewer.md

项目定义的 agent 可以覆盖运行时同名的打包/内置 agent。

2.2 前台与后台 subagent#

pi-subagents 支持两种差异较大的执行模式。

前台子会话(foreground child) 在父 Pi 进程内运行,父级会等待它:

Parent
│
├── launch reviewer
│ ↓
│ reviewing...
│ ↓
│ result
│
▼
continue

后台子会话(background child) 通过一个脱离的 runner 运行:

┌─ reviewer A ──►
Parent ─────────────┼─ reviewer B ──►
└─ reviewer C ──►
Parent can continue working
while those agents run.

它会维护异步运行状态、日志、产物和 run ID。Pi 的 TUI 会获得一个常驻的 FleetView,而 /subagents-fleet 提供了一个用于查看活动子会话的检查器。

你可以:

inspect a running child
read its transcript
steer it
stop it
wait for it
resume certain completed children

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

pi-subagents
https://github.com/nicobailon/pi-subagents
作者
HAC
发布于
2026-10-02
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
HAC
观之非易,行且克难
Greetings
欢迎来到我的博客!这里主要分享我的学习笔记与兴趣爱好。
音乐
封面

音乐

暂未播放

0:000:00
暂无歌词
分类
标签
站点统计
文章
46
分类
8
标签
19
总字数
116,126
运行时长
0 天
最后活动
0 天前
文章目录