OpenClaw 多智能体协作:Agent 间通信与子任务编排实战

引言

在 AI Agent 的实际生产中,单一 Agent 往往难以应对复杂任务——它需要并行处理、独立审查、任务委派和结果汇聚。OpenClaw 为此提供了一套完整的多智能体(Multi-Agent)协作框架,通过子代理(Subagent)机制,让多个 Agent 协同完成原本需要人工拆分的复杂工作流。

本文将深入剖析 OpenClaw 的多智能体架构,从核心原理到生产级实战,带你掌握 Agent 间通信与子任务编排的全部技巧。

1. 多智能体架构概览

OpenClaw 的多智能体系统基于三个核心概念:

概念 说明 典型用途
Subagent(子代理) 独立的 Agent 会话,由父会话派生 并行任务执行、专项处理
sessions_spawn 创建子会话的 API 动态启动子任务
agents_wait 收集子代理结果的机制 汇聚并行任务输出

架构图

┌─────────────────────────────────────────┐
│              主会话 (Main)               │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐  │
│  │ 数据处理  │  │ 代码审查  │  │ 测试生成  │  │
│  │ Subagent │  │ Subagent │  │ Subagent │  │
│  └────┬────┘  └────┬────┘  └────┬────┘  │
│       │            │            │        │
│       └────────────┼────────────┘        │
│                    ▼                     │
│            agents_wait 汇聚              │
│                    │                     │
│                    ▼                     │
│            综合结果 → 用户                │
└─────────────────────────────────────────┘

2. sessions_spawn:子代理的创建与调度

2.1 基本语法

# sessions_spawn 核心参数
sessions_spawn(
    agentId="my-specialist-agent",  # 目标 Agent 配置
    model="volc-coding/deepseek-v4", # 可选:覆盖模型
    context="isolated",             # isolated | fork
    mode="run",                     # run(一次性)| persistent
    cleanup="delete",               # delete | keep
    collect=True                    # 需要收集结果时设为 True
)

2.2 上下文模式选择

OpenClaw 提供两种子代理上下文模式,选择正确的模式至关重要:

isolated 模式(推荐):
– 子代理拥有全新的纯净上下文
– 大上下文时节约 Token
– 适合独立任务(代码审查、测试生成、数据处理)

fork 模式:
– 子代理继承父会话的完整历史
– 需要上下文延续的场景(续写、深入分析)
– Token 消耗较高

2.3 并行子代理实战

以下是一个典型的并行任务编排示例——同时进行代码审查、安全扫描和文档生成:

# 同时启动三个独立子任务
sessions_spawn:
  - agentId: "code-reviewer"
    context: "isolated"
    collect: true
    runId: "review-001"
  - agentId: "security-scanner"  
    context: "isolated"
    collect: true
    runId: "scan-001"
  - agentId: "doc-generator"
    context: "isolated"
    collect: true
    runId: "doc-001"
# 等待任意一个完成(非阻塞等待其他)
results = agents_wait(
    runIds=["review-001", "scan-001", "doc-001"]
)
# 返回最先完成的结果,包含 pending 列表

3. agents_wait:子任务结果收集

3.1 工作模式

agents_wait 是子代理结果收集的核心工具,支持两种模式:

any 模式(默认):
– 等待任意一个子代理完成即返回
– 返回值包含已完成结果 + 未完成 runId 列表
– 适合需要逐步处理结果的场景

all 模式:
– 等待所有指定子代理完成
– 全部完成后统一返回
– 适合结果间有依赖关系的场景

3.2 实战:渐进式结果处理

# 第一阶段:启动所有子代理
spawn_results = sessions_spawn([
    {"agentId": "data-processor", "runId": "dp-1", "collect": True},
    {"agentId": "data-processor", "runId": "dp-2", "collect": True},
    {"agentId": "data-processor", "runId": "dp-3", "collect": True},
])

# 第二阶段:逐个收集并处理
pending = ["dp-1", "dp-2", "dp-3"]
processed = []

while pending:
    result = agents_wait(runIds=pending)
    # 处理已完成的结果
    processed.append(process_result(result.completed))
    # 更新待处理列表
    pending = result.pending

# 最终汇总
final_report = aggregate(processed)

4. Subagent 通信模式

4.1 父→子:参数传递

父代理通过 sessions_spawn 的 prompt/instruction 参数向子代理传递任务:

sessions_spawn(
    agentId="code-reviewer",
    context="isolated",
    instruction="""
    请审查以下代码文件的安全性:
    - 文件路径:/project/src/auth/login.js
    - 重点检查:SQL注入、XSS、认证绕过
    - 输出格式:Markdown 报告,按严重程度排序
    """,
    collect=True
)

4.2 子→父:结果回传

子代理完成后的输出通过 agents_wait 收集:

result = agents_wait(runIds=["review-001"])
# result.completed.structuredOutput 包含子代理的结构化输出
# result.completed.transcript 包含完整对话记录

4.3 子→子:间接通信

子代理之间不直接通信,但可以通过两种方式间接协作:

  1. 父代理中转:父代理收集子A的输出,处理后传递给子B
  2. 共享文件系统:子代理写入文件,其他子代理读取
# 管道模式:子A输出 → 父中转 → 子B输入
spawn("data-extractor", runId="extract-1")     # 从网站提取数据
result_a = agents_wait(runIds=["extract-1"])    # 收集提取结果

spawn("data-analyzer",                           # 分析提取的数据
    instruction=f"分析以下数据:n{result_a.output}",
    runId="analyze-1"
)
result_b = agents_wait(runIds=["analyze-1"])     # 收集分析结果

5. 高级编排模式

5.1 扇出-扇入(Fan-out/Fan-in)

最经典的多智能体模式:一个任务拆分成N个子任务,并行执行后汇聚结果。

         ┌──→ Subagent A ──┐
Main ────┼──→ Subagent B ──┼──→ Main (汇总)
         └──→ Subagent C ──┘

适用场景:
– 多文件并行代码审查
– 多渠道数据采集
– A/B 测试并行分析

5.2 管道模式(Pipeline)

子代理按序执行,每个子代理的输出成为下一个的输入。

Main → Subagent A → Subagent B → Subagent C → Main

适用场景:
– ETL 数据管道
– 多阶段文档处理
– 渐进式代码优化

5.3 竞争模式(Competing)

多个子代理同时解决同一个问题,取最优结果。

         ┌──→ Subagent A (方案1) ──┐
Main ────┼──→ Subagent B (方案2) ──┼──→ 比较 & 选择最优
         └──→ Subagent C (方案3) ──┘

适用场景:
– 代码方案比较(不同架构思路)
– 多模型效果对比
– 创意生成(取最好创意)

5.4 监督模式(Supervisor)

一个监督 Agent 协调多个执行 Agent,根据执行结果动态调整策略。

# 监督 Agent 伪代码
def supervisor_loop(task):
    plan = decompose(task)              # 拆解任务
    for subtask in plan:
        result = spawn_and_wait(subtask) # 委托执行
        if result.quality < threshold:   # 质量检查
            plan = adjust_plan(result)    # 动态调整
            continue
        collect(result)                  # 收集结果
    return synthesize()                  # 最终综合

6. 实战案例:自动化代码发布流水线

以下是一个完整的自动化代码发布流水线,展示了多智能体协作的完整流程:

# === 阶段1:扇出 - 并行检查 ===
spawn_results = sessions_spawn([
    {
        "agentId": "code-reviewer",
        "runId": "lint-check",
        "instruction": "对 /project/src/ 进行 lint 检查",
        "collect": True
    },
    {
        "agentId": "security-scanner",
        "runId": "sec-scan",
        "instruction": "对 /project/src/ 进行安全扫描",
        "collect": True
    },
    {
        "agentId": "test-runner",
        "runId": "unit-test",
        "instruction": "运行 /project/ 单元测试套件",
        "collect": True
    }
])

# === 阶段2:扇入 - 收集结果 ===
pending = ["lint-check", "sec-scan", "unit-test"]
checks = {}

while pending:
    result = agents_wait(runIds=pending)
    checks[result.runId] = result.output
    pending = result.pending

# === 阶段3:决策 - 是否通过 ===
if all(passed(checks.values())):
    # === 阶段4:管道 - 构建 → 部署 → 通知 ===
    build_result = spawn_and_wait("build-agent", 
        instruction="构建并打包项目")

    if build_result.success:
        deploy_result = spawn_and_wait("deploy-agent",
            instruction=f"部署构建产物 {build_result.artifact}")

        # === 阶段5:通知 ===
        notify(f"✅ 发布成功:v{deploy_result.version}")
else:
    # 生成失败报告
    failure_report = spawn_and_wait("report-agent",
        instruction=f"生成检查失败报告:n{format_checks(checks)}")
    notify(f"❌ 发布受阻:{failure_report.summary}")

7. 最佳实践与避坑指南

7.1 Token 预算管理

每个子代理消耗独立 Token。并行3个子代理意味着3倍的Token消耗:

# 设置合理的 Token 预算
sessions_spawn(
    agentId="reviewer",
    token_budget=8000,  # 限制单个子代理的Token消耗
    context="isolated"   # 使用isolated减少上下文Token
)

7.2 错误处理策略

def safe_spawn_with_retry(agentId, instruction, max_retries=2):
    """带重试的子代理启动"""
    for attempt in range(max_retries):
        try:
            result = sessions_spawn(agentId=agentId, ...)
            return agents_wait(runIds=[result.runId])
        except Exception as e:
            if attempt == max_retries - 1:
                raise  # 最后一次重试仍失败,向上抛出
            log_warning(f"子代理失败,重试 {attempt + 1}/{max_retries}")

7.3 避免无限等待

# 设置超时,避免永久阻塞
result = agents_wait(
    runIds=pending,
    timeout="5m"  # 5分钟后超时
)
if result.timed_out:
    # 取消未完成的子代理
    for rid in result.pending:
        subagents(action="cancel", runId=rid)

7.4 何时使用多智能体 vs 单智能体

场景 推荐方案 原因
简单线性任务 单Agent 多Agent带来额外开销
需要并行处理 多Agent 显著提升速度
需要独立审查 多Agent 避免自我审查偏差
任务间有数据依赖 单Agent + 函数调用 数据传递更高效
CPU/IO密集型混合 多Agent 独立资源,不阻塞

8. 与 Skills 系统的协同

多智能体与 Skills 系统可以完美结合:

# 子代理加载不同 Skill 执行不同任务
spawn("research-agent", 
    instruction="请使用 web-crawler 技能抓取竞品价格数据",
    enabled_skills=["web-crawler", "data-analysis"]
)

spawn("report-agent",
    instruction="请使用报告模板生成竞品分析报告",
    enabled_skills=["report-generator"]
)

总结

OpenClaw 的多智能体协作框架为复杂自动化任务提供了优雅的解决方案。通过 sessions_spawn + agents_wait 的组合,配合扇出-扇入、管道、竞争、监督等编排模式,你可以构建出企业级的 AI Agent 流水线。

关键要点回顾:
1. 选对上下文模式:独立任务用 isolated,需要历史用 fork
2. 合理使用并行:扇出-扇入是最实用的模式
3. 做好错误处理:超时、重试、取消机制一个都不能少
4. 控制 Token 成本:设置预算、使用 isolated 模式
5. 与 Skills 协同:让不同子代理加载不同专项技能