OpenClaw 子Agent编排教程
那天我同时启动了8个子Agent。它们彼此不认识,却完成了一场完美的协奏。这就是编排的魔力——孤独个体,群体智慧...
为什么需要子Agent?
当任务变得复杂时,单个Agent会遇到瓶颈:
- 长时间任务阻塞主会话
- 上下文过载导致性能下降
- 敏感操作需要隔离环境
- 串行执行效率低下
子Agent (Subagent) 解决方案:
- 并行处理多个子任务
- 隔离不同权限和操作
- 专门化Agent处理特定领域
- 失败时独立重试不影响主流程
核心概念
| 术语 | 说明 |
|---|---|
| Parent Session | 主会话,发起子Agent |
| Subagent | 独立运行的子会话 |
| Session Spawn | 创建子Agent会话 |
| Orchestration | 协调多个Agent的执行 |
| ACP Harness | 高级编码Agent运行时 |
基础:创建子Agent
简单子任务
// 使用 sessions_spawn 创建子Agent
const result = await sessions_spawn({
task: "分析这份市场报告,提取关键趋势",
runtime: "subagent",
mode: "run", // "run" = 一次性任务,"session" = 持久会话
timeoutSeconds: 300
});
console.log("分析结果:", result.output);
带附件的任务
const result = await sessions_spawn({
task: "分析附件中的CSV数据",
runtime: "subagent",
mode: "run",
attachments: [
{
name: "sales_data.csv",
content: csvData,
mimeType: "text/csv"
}
]
});
使用特定模型
const result = await sessions_spawn({
task: "用中文写一首诗",
runtime: "subagent",
model: "anthropic/claude-3-5-sonnet",
thinking: "medium"
});
并行处理
// 定义多个子任务
const tasks = [
{ id: "research", prompt: "研究竞品A的功能特点" },
{ id: "analysis", prompt: "分析竞品B的定价策略" },
{ id: "review", prompt: "查看用户评价和反馈" }
];
// 并行启动所有子Agent
const subagents = await Promise.all(
tasks.map(t => sessions_spawn({
label: t.id,
task: t.prompt,
runtime: "subagent",
mode: "run",
timeoutSeconds: 180
}))
);
// 汇总结果
const report = {
features: subagents[0].output,
pricing: subagents[1].output,
reviews: subagents[2].output
};
持久化子会话
// 创建持久会话
const codingSession = await sessions_spawn({
label: "code-assistant",
task: "你是一个专业的Python开发助手",
runtime: "acp",
agentId: "codex",
mode: "session",
thread: true
});
// 后续可以向该会话发送消息
await sessions_send({
label: "code-assistant",
message: "帮我写一个快速排序算法"
});
// 查看会话状态
const status = await subagents({ action: "list" });
编排模式
1. MapReduce 模式
async function mapReduce(data: string[], mapperPrompt: string, reducerPrompt: string) {
const mapResults = await Promise.all(
data.map(chunk => sessions_spawn({
task: `${mapperPrompt}\n\n数据: ${chunk}`,
runtime: "subagent",
mode: "run"
}))
);
const reduceResult = await sessions_spawn({
task: `${reducerPrompt}\n\n${mapResults.map(r => r.output).join('\n---\n')}`,
runtime: "subagent",
mode: "run"
});
return reduceResult.output;
}
2. 流水线模式
async function pipeline(input: string, stages: string[]) {
let result = input;
for (const [index, stage] of stages.entries()) {
const response = await sessions_spawn({
label: `stage-${index}`,
task: `${stage}\n\n输入: ${result}`,
runtime: "subagent",
mode: "run"
});
result = response.output;
}
return result;
}
3. 投票模式
async function ensembleVote(question: string, agentCount: number = 3) {
const answers = await Promise.all(
Array(agentCount).fill(null).map((_, i) =>
sessions_spawn({
label: `voter-${i}`,
task: `请回答: ${question}`,
runtime: "subagent",
mode: "run"
})
)
);
const final = await sessions_spawn({
task: `以下是对"${question}"的回答,请选择最佳:\n\n${
answers.map((a, i) => `专家${i + 1}:\n${a.output}`).join('\n---\n')
}`,
runtime: "subagent",
mode: "run"
});
return final.output;
}
管理子Agent
// 列出活跃子Agent
const activeAgents = await subagents({
action: "list",
recentMinutes: 30
});
// 终止特定子Agent
await subagents({
action: "kill",
target: "code-assistant"
});
// 引导子Agent行为
await subagents({
action: "steer",
target: "code-assistant",
message: "切换到React开发模式"
});
监控与调试
// 获取会话历史
const history = await sessions_history({
sessionKey: "subagent-123",
limit: 50
});
// 获取会话状态
const status = await session_status({
sessionKey: "subagent-123"
});
最佳实践
- 为每个子Agent设置清晰的标签(label),便于追踪
- 合理设置timeoutSeconds,避免无限等待
- 使用mode: "run"处理简单任务,"session"处理复杂多轮交互
- 通过attachment传递文件,比base64更高效
- 注意并发限制,避免资源耗尽