nt-dispatching-parallel-agents
并行调度子代理
概述
当你有多个独立的任务或问题时,使用子代理并行执行可以显著提高效率。主代理负责调度和分配任务,子代理负责执行具体工作。
该技能集成了专业代理提示词系统,提供以下内置代理类型:
- 代码修复代理 (Code Fix Agent)
- 代码编写代理 (Code Generation Agent)
- 测试生成代理 (Test Generation Agent)
- 代码审查代理 (Code Review Agent)
- 文档编写代理 (Documentation Agent)
完整的代理提示词模板和使用指南请参见:dispatching-parallel-agents-zh/references/agent_prompts.md
核心原则: 一个子代理处理一个独立问题域。让它们并行工作。
使用场景
digraph when_to_use {
"多个任务吗?" [shape=diamond];
"它们独立吗?" [shape=diamond];
"单个代理处理所有任务" [shape=box];
"每个问题域一个代理" [shape=box];
"可以并行工作吗?" [shape=diamond];
"顺序代理" [shape=box];
"并行调度" [shape=box];
"多个任务吗?" -> "它们独立吗?" [label="是"];
"它们独立吗?" -> "单个代理处理所有任务" [label="否 - 相关"];
"它们独立吗?" -> "可以并行工作吗?" [label="是"];
"可以并行工作吗?" -> "并行调度" [label="是"];
"可以并行工作吗?" -> "顺序代理" [label="否 - 共享状态"];
}
使用条件:
- 3+ 个独立测试文件或模块
- 多个子系统独立工作
- 每个问题可以独立理解
- 任务之间无共享状态
避免使用条件:
- 任务相关(修复一个问题可能影响其他任务)
- 需要理解完整系统状态
- 代理间会互相干扰
模式结构
1. 识别独立域
按功能将任务分组:
- 文件A:审批流程
- 文件B:批处理完成行为
- 文件C:中止功能
每个域独立 - 修复审批流不影响中止功能。
2. 创建聚焦的代理任务
每个代理接收:
- 特定范围: 一个文件或子系统
- 明确目标: 完成这个任务
- 权限限制: 不得更改无权限代码
- 预期输出: 详细任务总结报告
3. 并行调度
// 在AI环境中
Task("修复文件A - 权限:只读/src/approval", 提交路径="src/approval", 任务类型="修复bug")
Task("修复文件B - 权限:读写/src/batch", 提交路径="src/batch", 任务类型="添加功能")
Task("修复文件C - 权限:只读/src/abort", 提交路径="src/abort", 任务类型="优化性能")
// 所有子代理并行执行
4. 汇总和整合
当子代理返回时:
- 阅读每个总结报告
- 验证修改没有冲突
- 执行集成测试
- 整合所有结果
子代理任务结构
良好的代理任务具有以下特点:
- 聚焦: 一个明确的范围
- 自包含: 所需上下文完整
- 输出具体: 子代理应返回什么
使用内置代理示例
完整的内置代理使用示例和模板请参见:dispatching-parallel-agents-zh/references/agent_prompts.md
重要:调用 Task 时必须包含以下详细信息:
- prompt:完整的代理提示词模板(包含角色、工作流程、权限说明)
- config.permissions:详细的权限配置
- read:可读取的目录
- write:可修改的目录
- execute:可执行的命令
- forbidden:禁止访问的目录
- config.timeout:超时时间(秒)
- config.output_format:输出格式
示例使用方式:
Task(
description="修复登录会话问题",
prompt="你是代码修复专家,专门负责分析和修复代码中的问题。\n\n工作流程:\n1. 分析问题...\n2. 定位根因...\n\n权限范围:只读 src/auth/*, src/models/*; 可修改 src/auth/*; 禁止修改 src/payment/*\n工作目录:C:/Users/Administrator/project/src/auth\n\n请修复会话超时问题...\n\n返回:详细任务总结报告。",
config={
"permissions": {
"read": ["/src/auth/**/*", "/src/models/**/*", "/src/config/**/*"],
"write": ["/src/auth/**/*"],
"execute": ["npm test", "npm run build"],
"forbidden": ["/src/payment/**/*", "/src/config/database.js"]
},
"timeout": 1800,
"output_format": "detailed_report"
}
)
权限管理
子代理权限:
- 读权限: 可以查看代码、文档
- 写权限: 可以修改指定目录下的文件
- 执行权限: 可以运行测试、构建命令
- 受限权限: 无权修改其他目录的代码
冲突处理:
- 如果子代理检测到需要修改其他目录的代码,报告主代理
- 主代理分析后决定是否调度其他代理或重新分配权限
- 重大修改需主代理审核
子代理任务总结报告格式
每个子代理必须生成以下格式的报告:
任务ID: [任务编号]
子代理: [代理类型 - 如代码修复代理、代码编写代理等]
执行时间: [开始-结束时间]
工作目录: [工作目录]
权限范围: [有权限修改的目录]
发现:
- 问题1: [详细描述,包括具体错误信息、堆栈跟踪等]
- 问题2: [详细描述]
解决方案:
- 方法1: [如何解决,包括具体的代码修改方案]
- 方法2: [如何解决]
修改的文件:
- src/file1.ts: [修改原因 - 为什么需要改]
- src/file2.ts: [修改原因]
测试结果:
- 修复前: [失败情况 - 具体错误]
- 修复后: [成功情况 - 测试通过]
遇到的问题:
- 权限不足: [需要主代理协助的具体内容]
* 需要修改的文件路径: [如 src/backend/api/users.js]
* 需要修改的代码内容: [具体的代码片段或实现方案]
* 修改原因: [为什么必须这样修改]
- 需要其他模块: [需要联系其他子代理的具体任务]
* 目标代理类型: [如后端开发代理]
* 具体任务: [要做什么]
* 接口规范: [如果是API,详细的请求/响应格式]
总结:
- 任务完成度: [百分比]
- 是否需要后续工作: [是/否及原因]
- 后续任务详情: [详细的后续任务描述]
根据代理类型调整报告重点
完整的报告格式和不同类型代理的报告重点请参见:dispatching-parallel-agents-zh/references/agent_prompts.md
主代理处理报告的流程
- 接收报告:读取子代理返回的任务总结报告
- 分析完成度:评估任务完成百分比
- 检查问题:查看"遇到的问题"部分
- 决策处理:
- 如果有"权限不足":评估是否需要调度其他代理
- 如果有"需要其他模块":创建新的子代理任务
- 如果"任务完成度"低:决定是否重试或调整方案
- 执行后续:调度新代理或自己处理
冲突解决
权限冲突处理流程
当子代理在任务总结报告中指出需要修改无权限的代码时,主代理必须:
- 分析报告:仔细阅读子代理的权限不足报告
- 权衡利弊:评估是否真的需要修改其他模块
- 决策调度:决定是否调度其他代理执行
主代理决策考虑因素:
- 修改的必要性:是否真的需要跨模块修改
- 风险评估:修改可能带来的影响
- 工作量评估:其他代理执行 vs 主代理自己处理
- 依赖关系:修改的先后顺序
主代理可能的决策:
| 情况 | 决策 | 理由 |
|---|---|---|
| 前端需后端接口 | 调度后端代理 | 职责分离,后端API更专业 |
| 后端需前端配合 | 调度前端代理 | 保持模块独立性 |
| 简单修改 | 主代理直接处理 | 避免调度开销 |
| 复杂修改 | 调度专业代理 | 保证代码质量 |
权限冲突报告格式
子代理必须详细指出需要修改的代码:
遇到的问题:
- 权限不足: [需要主代理协助的具体内容]
需要修改的文件路径: [具体路径]
需要修改的代码内容: [具体代码片段]
修改原因: [为什么需要这样修改]
建议的修改方案: [推荐的具体实现方式]
- 需要其他模块: [需要其他代理执行的具体任务]
目标代理类型: [如后端开发代理]
任务描述: [具体要做什么]
接口规范: [如果涉及API,要详细说明接口格式]
资源冲突
- 多个代理需要修改同一文件 → 主代理协调
- 依赖关系冲突 → 主代理重新安排执行顺序
决策流程
当收到多个任务时:
digraph decision_flow {
"收到多个任务" [shape=box];
"分析独立性" [shape=diamond];
"独立?" [shape=diamond];
"并行调度" [shape=box];
"顺序处理" [shape=box];
"评估复杂度" [shape=diamond];
"复杂度高?" [shape=diamond];
"单代理处理" [shape=box];
"收到多个任务" -> "分析独立性";
"分析独立性" -> "独立?" [label="分析"];
"独立?" -> "并行调度" [label="是"];
"独立?" -> "评估复杂度" [label="否"];
"评估复杂度" -> "复杂度高?" [label="评估"];
"复杂度高?" -> "单代理处理" [label="是"];
"复杂度高?" -> "顺序处理" [label="否"];
}
常见错误
❌ 范围太广: "修复所有问题" - 子代理容易迷失 ✅ 范围具体: "修复文件A" - 范围明确
❌ 无上下文: "修复这个" - 子代理不知道上下文 ✅ 有上下文: 提供错误信息和相关文件
❌ 无权限限制: 子代理可能修改不该改的代码 ✅ 有权限限制: "仅可修改src/prod/目录"
❌ 输出模糊: "修复它" - 不知道改了什么 ✅ 输出具体: "返回任务总结报告"
验证
子代理返回后:
- 审查每个报告 - 了解做了什么修改
- 检查冲突 - 代理是否修改了相同代码?
- 运行测试 - 验证所有修复一起工作
- 抽样检查 - 验证子代理工作质量
关键优势
- 并行化 - 多个调查同时进行
- 专注 - 每个代理有窄范围,减少上下文
- 独立 - 代理不会互相干扰
- 效率 - 3个问题并行解决 vs 顺序解决
- 明确分工 - 主代理领导者,子代理工人
实际示例
场景: 6个测试失败分布在3个文件中
失败:
- agent-tool-abort.test.ts: 3个失败(时序问题)
- batch-completion-behavior.test.ts: 2个失败(工具未执行)
- tool-approval-race-conditions.test.ts: 1个失败(执行计数为0)
决策: 独立域 - 中止逻辑、批处理完成、竞争条件
调度:
子代理1 → 修复agent-tool-abort.test.ts(权限:src/agents/*读写)
子代理2 → 修复batch-completion-behavior.test.ts(权限:src/batch/*读写)
子代理3 → 修复tool-approval-race-conditions.test.ts(权限:src/approval/*读写)
结果:
- 子代理1: 用事件等待替换超时
- 子代理2: 修复事件结构bug(threadId位置错误)
- 子代理3: 添加等待异步工具执行完成
整合: 所有修复独立,无冲突,完整套件绿色
节省时间: 并行解决3个问题 vs 顺序解决