OpenClaw多Agent协作解读
OpenClaw 多 Agent 持久化交互与 Channel-Agent 协作机制深度解读
源码路径:
~/WorkBuddy/20260327195403/openclaw
版本: latest(2026年初)
关键文件:src/agents/acp-spawn.ts、src/agents/subagent-control.ts、src/agents/subagent-announce.ts、src/config/types.agents.ts、src/channels/plugins/binding-types.ts
一、持久化 Agent 之间可以交互吗?
可以,有两种交互模式,对应两种 Runtime 类型:
1. Subagent 模式(runtime: "subagent")
这是树状父子通信模型:
1 | Main Agent (持久 Session) |
关键交互机制来自 subagent-announce.ts 的系统提示规范:
“Auto-announce is push-based. After spawning children, do NOT call sessions_list, sessions_history, exec sleep, or any polling tool. Wait for completion events to arrive as user messages, track expected child session keys, and only send your final answer after ALL expected completions arrive.”
这意味着:子 Agent 完成后不是主动通知,而是由 OpenClaw 基础设施将子 Agent 的最终输出注入到父 Agent 的下一轮 user 消息中,触发父 Agent 继续运行。
2. ACP 模式(runtime: "acp")——持久化 Agent 的核心
这是独立持久会话模型,支持真正的”持久化 Agent 互相交互”:
1 | // acp-spawn.ts 中的核心逻辑 |
持久 ACP Session 的生命周期:
1 | Agent A (持久 Session) ──sessions_spawn(runtime="acp", mode="session")──► Agent B (持久 Session) |
Agent 间的”steer”(转向)操作:
subagent-control.ts 暴露了完整的控制接口:
1 | // 父 Agent 可以向运行中的子 Agent 发送新指令(不等待其完成) |
3. Agent 间交互能力对比
| 能力 | Subagent (runtime=”subagent”) | ACP (runtime=”acp”) |
|---|---|---|
| 持久化会话 | ❌ 一次性 | ✅ 支持 persistent 模式 |
| 跨 Agent 发消息 | ✅(通过 announce 推送) | ✅(通过 thread binding) |
| 实时转向(steer) | ✅ 支持 | ❌ 不支持 steer |
| 流式输出回父 | 有限(announce 批量) | ✅(streamTo=”parent”) |
| 可接受 follow-up | ❌ | ✅ |
| 深度嵌套 | ✅ 支持多层 | ❌ 沙箱中不能 spawn ACP |
| 适用场景 | 并行工作任务分解 | 长期运行的专家 Agent |
二、一个 Channel 可以和多个 Agent 交互吗?
可以,这是 OpenClaw 最核心的路由架构之一,通过 bindings 配置实现。
1. Channel → Agent 的路由绑定机制
types.agents.ts 定义了两种 Binding 类型:
1 | // 类型1: Route Binding —— 固定路由,将某 Channel 的对话转发给指定 Agent |
2. 一个 Channel 路由多个 Agent 的实现
配置示例(一个 Discord 频道根据角色路由到不同 Agent):
1 | # openclaw.yml 示例配置 |
3. Thread Binding —— Channel 与 Agent 的动态绑定
OpenClaw 还支持动态 Thread 绑定(来自 thread-bindings-policy.ts):
1 | 用户在 Slack 的 #engineering 频道发消息 |
这意味着一个 Channel 可以动态孵化多个绑定到不同 Agent 的子 Thread。
4. Channel 与 Agent 交互关系全景图
1 | Discord 频道 #general |
关键点:多个 Channel 可以路由到同一个 agentId(逻辑上同一个 Agent),但每个对话的 Session 是独立隔离的(agent:{agentId}:{channel}:{userId} 格式)。
三、协作模式与优秀实践
实践一:分层 Orchestrator 模式
1 | 用户消息 → Main Agent(协调者) |
关键注意(来自源码注释):子 Agent 完成后不要轮询,用 push-based 机制等待。
实践二:专家 Agent 持久化绑定(ACP + Thread)
将专业领域 Agent 绑定到特定 Channel 的 Thread:
1 | bindings: |
这个 security-auditor Agent 会在 #security 频道中持续存在,记住所有历史对话。
实践三:RBAC 角色路由
利用 Discord roles 或 Slack 权限来路由到不同能力的 Agent:
1 | bindings: |
实践四:跨 Agent 协作(steer + message)
父 Agent 在子 Agent 运行过程中动态干预:
1 | // 父 Agent 通过 subagents 工具发现子 Agent 运行过慢 |
实践五:深度隔离的沙箱子 Agent
sandbox: "require" 参数让子 Agent 运行在沙箱中(但注意:沙箱 Session 不能再 spawn ACP,只能 spawn subagent):
1 | sessions_spawn({ |
四、总结
| 问题 | 答案 |
|---|---|
| 持久化 Agent 间能交互吗? | ✅ 能,ACP session 模式支持持久双向通信;Subagent 模式支持父子 push-based 回调 |
| 一个 Channel 能和多个 Agent 交互吗? | ✅ 能,通过 bindings 配置 + ThreadBinding 动态绑定实现 1:N 路由 |
| Agent 间如何协作? | 父生子(spawn)、推送结果(announce)、转向(steer)、发消息(send)、终止(kill) |
| 最佳实践是什么? | 用 Orchestrator + 并行 Subagent 分解任务;用 ACP persistent 绑定专家 Agent;用 RBAC roles 做渠道级权限隔离 |