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更高效
  • 注意并发限制,避免资源耗尽