pi-subagents
pi-subagents 本质上是一个 面向 Pi 的多 agent 编排扩展。它把一个 Pi 会话变成 父 agent(parent agent),从而可以将聚焦的细分工作委派给额外的 Pi 会话或外部编码 agent CLI。
简明结构:
你 │ ▼Pi 主会话(parent / orchestrator) │ ├── scout ───────► 探索代码库 │ ├── worker ──────► 应用代码修改 │ ├── reviewer ────► 审阅代码修改 │ └── oracle ──────► 挑战 plan │ ▼results returned to parent1. 使用
内置的 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-agent | ask 模式做只读分析 |
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 定义的优先级是:
项目级 > 用户级 > 安装包提供的定义 > 内置定义设置中的覆盖字段也遵循项目级优先于用户级。
subagents.agentOverrides 应写进 Pi 的 settings.json,不是扩展的 ~/.pi/agent/extensions/subagent/config.json。
1.1.1 创建自定义 subagent 示例
以创建一个只读安全审查员为例。
创建文件:
~/.pi/agent/agents/security-reviewer.md内容如下:
---name: security-reviewerdescription: 只读安全审查员,检查认证、授权、输入校验及敏感信息泄漏aliases: security-auditoradvertise: truemodel: inheritthinking: hightools: read, grep, find, ls, contact_supervisorsystemPromptMode: replaceinheritProjectContext: trueinheritGlobalContext: falseinheritSkills: falsedefaultContext: freshacceptanceRole: read-onlyasync: truetimeoutMs: 900000---
你是一个只读安全审查员。
任务:- 审查指定文件或主 agent 提供的 diff。- 重点检查认证绕过、权限校验缺失、输入校验和敏感信息泄漏。- 从实际代码中验证问题,不凭猜测报告漏洞。
边界:- 不修改文件,不运行 shell 命令。- 如果缺少必要材料,报告缺口。- 如需主 agent 做决定,使用 contact_supervisor 请求确认。
输出:1. 审查范围。2. 已确认问题:严重程度、文件路径、行号、证据与修复建议。3. 未验证事项与剩余风险。4. 若无已确认问题,明确说明。字段说明:
| 字段 | 含义 |
|---|---|
name | 调用时使用的正式名称。这里是 security-reviewer;同名定义会发生覆盖。 |
description | 角色简介,帮助主 agent 判断它适合什么任务。 |
aliases | 可选别名。这里也可以用 security-auditor 选择该角色。 |
advertise | true 表示在 subagent 工具激活时,将名称和简介加入主 agent 的角色目录,不代表会自动启动或自动委派。 |
model | 默认模型。inherit 表示使用当前父会话模型;也可填已配置的 provider/model-id。 |
thinking | 推理强度。示例为 high;实际是否支持取决于模型及提供方。 |
tools | 子会话的严格工具白名单。此例没有 bash、edit、write。 |
systemPromptMode | replace:使用该 agent 的独立提示词;append:把正文追加到 Pi 的基础提示词。默认是 replace。 |
inheritProjectContext | 是否保留项目指令,例如仓库的 AGENTS.md、CLAUDE.md。 |
inheritGlobalContext | 是否保留用户全局上下文。只有 inheritProjectContext: true 时才有效,默认是 false。 |
inheritSkills | 是否让子会话看到 Pi 发现的 skills 目录。也可以用 skills 单独选择需要的技能。 |
defaultContext | fresh:默认从新上下文开始;fork:默认继承父会话对话上下文。与是否继承项目指令是两回事。 |
acceptanceRole | 用于自动验收推断的角色标记:read-only 或 writer。本身不授予或撤销工具权限。 |
async | 单 agent 调用默认是否后台执行。显式调用参数可以覆盖,强制异步配置除外。 |
timeoutMs | 默认运行时限,单位毫秒。900000 是 15 分钟。 |
如果不需要这些控制项,最小定义也可以很简单:
---name: security-reviewerdescription: 只读安全审查员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 } } }}设置覆盖不仅适用于内置角色,也能覆盖同名自定义角色。因此,如果你的 Markdown 配置没有按预期生效,应检查用户和项目的 agentOverrides。
1.1.3 修改内置 subagent:方式 B,创建同名完整定义
适合:大幅改变角色职责、重写系统提示词或重新设计工具集。
以 reviewer 为例,可以先把随包定义复制到用户目录:
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:实践取舍 ─────┘默认角度是:
- 外部证据。
- 本地代码上下文。
- 实践取舍与风险。
通常使用 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 我想给这个项目增加多租户支持,先看现有实现再问我问题该模板明确要求使用 interview 工具提问,但模板本身不提供这个工具。如果当前会话没有 interview,需要补齐工具,或者明确让主 agent 改为普通对话提问。
1.2.5 /parallel-cleanup:并行清理审查
这是聚焦代码与文字质量的专项审查,不是完整的正确性审查。
默认启动两个只读 reviewer:
| 审查分工 | 重点 |
|---|---|
| Deslop pass | AI 式冗余注释、占位文字、掩盖错误的防御代码、宽泛类型转换、无价值包装、生成腔文案等。 |
| Verbosity pass | 重复逻辑、啰嗦分支、无价值临时变量、重复测试、重复说明与样板代码等。 |
- 如果有
deslop或verbosity-cleanerskill,就使用它们。 - 没有这些 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 31.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 testnpm run typecheck1.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 的编排指导。
这种模板不是固定执行图。主 agent 阅读说明后组织子 agent,可能会根据实际情况调整、暂停和澄清流程。
方式 B:用 /prompt-workflow 串联多个模板
如果希望每一步明确交给一个角色,可以拆成多个文件。
1. 第一步:代码侦察
~/.pi/agent/prompts/map-task.md:
---description: 收集任务所需的代码上下文subagent: scoutfresh: true---
任务:$@
只收集上下文,不实现。返回关键文件、接口、约束、测试位置和待确认事项。2. 第二步:执行已批准任务
~/.pi/agent/prompts/build-task.md:
---description: 根据上下文执行已批准任务subagent: workerfresh: true---
已批准任务:$@
上一步的代码上下文:{previous}
执行最小必要修改并验证。如遇到未批准的范围或架构选择,请向主 agent 请求决定。返回修改文件、验证命令与结果、剩余风险。3. 第三步:独立审查
~/.pi/agent/prompts/check-task.md:
---description: 独立审查实现结果subagent: reviewerfresh: 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 主会话继续 reasoning2.1 Agent 的定义
从根本上说,一个 agent 就是一个带 YAML frontmatter 的 Markdown 文件。例如,文档中给出的等价写法是:
---name: scoutdescription: Fast codebase recontools: read, grep, find, ls---
Your system prompt goes here.因此,一个 agent 定义会指定如下内容:
rolesystem prompttoolsmodelthinking levelskillsextensionsoutput 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 workingwhile those agents run.它会维护异步运行状态、日志、产物和 run ID。Pi 的 TUI 会获得一个常驻的 FleetView,而 /subagents-fleet 提供了一个用于查看活动子会话的检查器。
你可以:
inspect a running childread its transcriptsteer itstop itwait for itresume certain completed children文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!





