18. 多 Agent 协作
本章你将学到
- 什么时候需要"多 Agent"而不是"一个万能 Agent"
- 怎么在同一个 Gateway 下跑多个 Agent
- 三种协作模式:路由 / 主从 / 编排
- 实战:3 个 agent 协作做"项目监控 → AI 分析 → 飞书报警"
- Agent 之间怎么通信、共享数据
18.1 为什么要多 Agent
一个 Agent 装太多 skill 会有这些问题:
- soul.md 越写越长(要覆盖各种边界)
- LLM 决策时干扰多("这个用户的话该用哪个 skill?")
- 权限混乱(订餐 skill 不该知道你的 GitHub token)
- 账单不清楚(哪个功能烧钱多?)
多 Agent 的好处:
- 每个 agent 专精一件事,soul 短而准
- 权限隔离(坏 skill 影响范围有限)
- 模型可分级(chat agent 用便宜模型,coding agent 用贵模型)
- 账单分得清
- 不同 channel 路由到不同 agent(家庭群是 agent A,公司群是 agent B)
经验法则
当一个 agent 的 soul.md 超过 2000 字,或装了 8+ 个 skill,就该考虑拆成多个。
18.2 建多个 Agent
跟 9. 你的第一个 Agent 一样,每个新 agent 一个目录:
~/.openclaw/workspace/agents/
├── xiaozhao/ ← 通用个人助理
├── code-reviewer/ ← 代码 review 专家
├── news-collector/ ← 抓资讯做摘要
└── home-manager/ ← 家庭事务(给老婆/妈用)每个目录有自己的 agent.yaml + soul.md + memory.md。
18.3 路由:消息怎么分发到对的 agent
OpenClaw 提供 4 种路由策略,在 channel.yaml 里配。
策略 1:按 channel 分(最简单)
# telegram.yaml
default_agent: xiaozhao # Telegram 全归 xiaozhao 处理# feishu.yaml
default_agent: code-reviewer # 飞书全归 code-reviewer 处理每个 IM 接一个 agent,井水不犯河水。
策略 2:按用户 / 群 ID 路由
# feishu.yaml
routing:
- match: { chat_id: oc_family_group } # 家庭群
agent: home-manager
- match: { chat_id: oc_work_group } # 工作群
agent: code-reviewer
- match: { user_id: ou_boss_xxx } # 老板私聊
agent: xiaozhao
default_agent: xiaozhao策略 3:按关键词路由
routing:
- match: { contains: ['代码', 'review', 'PR'] }
agent: code-reviewer
- match: { contains: ['购物', '家务', '天气'] }
agent: home-manager
default_agent: xiaozhao策略 4:让 LLM 自己决定(智能路由)
routing:
mode: llm
router_agent: xiaozhao # 用 xiaozhao 当"前台"
available_agents:
- code-reviewer
- home-manager
- news-collector每条消息进来时,先让 router_agent(通常用便宜模型)判断"该给谁",再转发。最灵活但贵一点。
18.4 三种协作模式
模式 A:纯路由(最常见)
用户消息
↓
Gateway 按规则选一个 agent
↓
该 agent 处理 + 回复互相独立,互不感知。适合:不同场景不同 agent。
模式 B:主从(一个调另一个)
用户:写一个 hello world
↓
xiaozhao(前台 agent)收到
↓
xiaozhao 调用 code-reviewer agent 帮忙写代码
↓
code-reviewer 返回结果
↓
xiaozhao 整理回复给用户实现:在 xiaozhao 的 skills 里装 delegate-to-agent skill(OpenClaw 内置):
# xiaozhao/agent.yaml
skills:
- core/delegate
allowed_delegates:
- code-reviewer
- news-collectorxiaozhao 的 LLM 看到说明会知道"我可以委托任务给 code-reviewer"。
模式 C:编排(多 agent 流水线)
某事件触发(webhook / cron)
↓
news-collector:抓资讯
↓ 拿到原始数据
analyzer:AI 分析重要程度
↓ 拿到摘要
formatter:排版成报告
↓ 最终成品
notifier:发到飞书群每个 agent 是流水线一节,OpenClaw 用 Workflow 编排:
# workflows/daily-news.yaml
name: 每日资讯流水线
trigger:
cron: "0 8 * * *" # 每天 8 点
steps:
- id: fetch
agent: news-collector
task: "抓取今天的 V2EX + HN 头条 10 条"
output: raw_news
- id: analyze
agent: news-analyzer
task: "评估重要性,挑出最重要 3 条"
input: ${fetch.raw_news}
output: top_3
- id: format
agent: news-formatter
task: "排版成飞书消息卡片"
input: ${analyze.top_3}
output: card
- id: send
channel: feishu
target: oc_daily_news_group
message: ${format.card}跑:openclaw workflow run daily-news,或让它按 cron 自动跑。
18.5 实战:项目监控流水线
需求:GitHub CI 失败时 → AI 分析失败原因 → 找潜在责任人 → 飞书@他
三个 agent
ci-watcher —— 接 GitHub webhook,监听 workflow_run 事件
# ci-watcher/agent.yaml
model:
provider: deepseek
model: deepseek-chat
skills:
- core/webhook
- github
soul: ./soul.mdsoul.md:
# 你是谁
GitHub CI 监控员。专门处理 workflow_run 事件。
# 行为
收到 workflow_run.completed 事件且 conclusion=failure 时:
1. 调 github skill 拉失败 job 的日志
2. 把日志和元数据传给 ci-analyzer agent
3. 等待结果,转发给 ci-notifier agentci-analyzer —— 分析失败原因
# ci-analyzer/agent.yaml
model:
provider: anthropic # 用 Claude 分析更准
model: claude-sonnet-4-6
skills:
- core/text-analyze
soul: ./soul.mdsoul.md:
# 你是谁
CI 失败分析师。输入日志,输出:
1. 失败类型(test_fail / build_fail / lint_fail / network / timeout)
2. 关键错误行
3. 可能的责任 commit(看 git log 找最近修改这块的人)
4. 修复建议(一句话)
# 输出格式
JSON。ci-notifier —— 发飞书
# ci-notifier/agent.yaml
model:
provider: deepseek
model: deepseek-chat
skills:
- core/feishu-message
channels:
- feishu
soul: ./soul.mdsoul.md:
# 你是谁
告警通知员。把 CI 分析结果转成飞书卡片:
- 失败仓库 / workflow / branch
- 错误摘要
- 可能负责人 @
- 链接到失败的 runWorkflow 串起来
# workflows/ci-monitor.yaml
name: CI 失败监控
trigger:
webhook: github
filter:
event: workflow_run
conclusion: failure
steps:
- id: collect
agent: ci-watcher
task: "提取 workflow_run 数据和失败日志"
output: incident
- id: analyze
agent: ci-analyzer
task: "分析这次失败"
input: ${collect.incident}
output: analysis
- id: notify
agent: ci-notifier
task: "发送告警"
input: { incident: ${collect.incident}, analysis: ${analyze.analysis} }跑起来后,GitHub CI 一失败,30 秒内你的飞书群就有:
🚨 [CI 失败] backend-api / main 分支
类型: test_fail
错误: TypeError in user.test.ts:42
可能责任人: @张三(最近修过这文件)
修复建议: 检查 mockReturnValue 类型,可能传错对象。
📎 完整日志: github.com/.../actions/runs/12345效率提升 N 倍。
18.6 Agent 之间共享数据
3 种方式:
方式 1:共享 memory 文件夹
# 两个 agent 都用同一个 memory
agents:
shared_memory: ./shared-mem.mdxiaozhao 和 code-reviewer 共享一份 memory,知道彼此学到的事。
方式 2:用 KV 存储
# agent.yaml
storage:
type: kv
backend: sqlite # 或 redis
path: ~/.openclaw/shared.dbskill 里可以 await ctx.storage.set('key', value) / get('key')。
方式 3:通过 channel 发消息
最简单:让 agent A 在内部 channel 给 agent B 发消息。
// agent A 的 skill 里
await channel.send({
to: 'internal://agent/code-reviewer',
message: 'review this PR: ...'
});18.7 资源 / 成本控制
多 agent 容易失控。建议:
# global.yaml
agents:
per_agent_quota:
requests_per_minute: 20
cost_per_day: 5 # ¥5/agent/天上限
total_quota:
cost_per_day: 50 # 全站 ¥50/天上限超额自动 throttle,不会一夜烧光 ¥500。
18.8 常见误用
❌ "一个 agent 万能" 综合症
症状:xiaozhao 一个 agent 装 20 个 skill,soul 写 5000 字。 后果:响应慢、决策乱、调试难、贵。 解药:拆分。
❌ "agent 数量爆炸" 综合症
症状:每个小功能建一个 agent,30 个 agent 互相调来调去。 后果:路由复杂、维护噩梦。 解药:每个 agent 至少覆盖一个"完整角色"(如"个人助理""家庭管家"),不是单一动作。
❌ "深层主从" 综合症
症状:A 调 B,B 调 C,C 调 D……每层都过一次 LLM。 后果:响应慢 + 巨贵。 解药:层级 ≤ 2,更深用 workflow 编排而非 agent 嵌套。
看完这一章你应该知道
✅ 一个 agent 装太多 = 拆分时机 ✅ 4 种路由策略:按 channel / 按 ID / 按关键词 / 让 LLM 决定 ✅ 3 种协作:路由 / 主从 / 编排(workflow) ✅ workflow yaml 串联多 agent 实现复杂流水线 ✅ Agent 共享数据:共享 memory / KV 存储 / 互发消息 ✅ 必设 quota 防止失控
多 agent 玩明白了?下一章深入 Memory——让 agent 真正"记住"事的关键机制。