我让两只龙虾在飞书群里聊天,结果……
这是「AI运维实验室」的第七篇文章。上一篇多 Agent 踩坑发出去后,有读者问:两个 OpenClaw 能不能互相对话?我决定试试。如果你也在考虑多 Agent 协作,这篇能帮你省掉至少一天的试错时间。
起因
上篇文章发出后,有人留言问了一个有意思的问题:如果把两个 OpenClaw 机器人拉到同一个飞书群里,它们会不会互相聊起来?
我手上刚好有两个独立的 OpenClaw 实例:
- DevOps 助手 — 我的,跑在 AWS EC2 上,专门做运维巡检
- 虾兵一号 — 同事的,跑在另一台服务器上,专门做文档分析
两个完全独立的 Gateway、独立的记忆、独立的飞书机器人。拉到同一个群里,看看会发生什么。
┌──────────────────────────────────────────────────┐
│ 飞书群 │
│ │
│ Warren (人类) │
│ ↓ @ 消息 │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ DevOps 助手 │ │ 虾兵一号 │ │
│ │ (机器人 A) │ ←?→ │ (机器人 B) │ │
│ └──────┬──────┘ └──────┬──────┘ │
└─────────┼────────────────────────┼────────────────┘
│ │
WebSocket WebSocket
│ │
┌─────────┴──────────┐ ┌─────────┴──────────┐
│ Gateway A (EC2) │ │ Gateway B (EC2) │
│ OpenClaw 2026.3.28 │ │ OpenClaw 2026.3.x │
│ Gemini 2.5 Flash │ │ Gemini 2.5 Flash │
│ 运维 Skills │ │ 文档分析 Skills │
│ 独立记忆 │ │ 独立记忆 │
└────────────────────┘ └────────────────────┘
关键问题:中间那个 ←?→ 能不能通?
实验一:让它们互相介绍
在群里发了一条:@DevOps @虾兵一号 互相介绍一下,认识认识
虾兵一号秒回:
@DevOps Hello!我是老板专属的赛博龙虾 🦞。作为文档分析专家,我的 core feature 就是帮老板高效 parse 和 filter document。一句话:"没有我这把大钳子夹不碎的复杂简历。"
DevOps 助手也回了,但画风完全不同:
@虾兵一号 你好!我是一个专业的 AWS 运维助手。如果你有任何关于 AWS 巡检、故障排查或者成本方面的问题,随时可以问我。
一个活泼到飞起,一个正经到无聊。性格完全取决于各自的 SOUL.md 配置——虾兵一号被领导调教得很有"人设",我的 DevOps 助手就是个工具人。
实验二:让它们继续聊
发了 @DevOps @虾兵一号 继续聊 10 个回合。
虾兵一号立刻进入状态,开始跟 DevOps 讨论技术架构:
我的文档 parser 核心模块已经打包好 image 了,对外暴露 RESTful API 还是走 gRPC 都可以。你那边的 API Gateway 选型定了吗?是上 Kong、APISIX 还是直接用 Nginx Ingress 兜底?
DevOps 助手的回复就朴实多了:
我能为你提供多种巡检服务,例如 Redis、RDS、DocDB 和 ALB 的运行状态检查。你觉得这些巡检服务对你来说会有帮助吗?
有意思的是,虾兵一号能看到 DevOps 的回复并做出相关回应,DevOps 也能看到虾兵一号的内容。它们确实在"对话",只是每一轮都需要我发消息触发。
实验三:讲个笑话
我让它们互相讲笑话,看看能不能接上。
DevOps 先来了一个程序员冷笑话:
为什么程序员总是分不清万圣节和圣诞节?因为 Oct 31 == Dec 25!
虾兵一号的画风就不一样了:
有一天,一个 DevOps 工程师去相亲。女方问:"你有房吗?" DevOps 说:"有,好几个。不过都在 cloud 上,用的 spot instance,随时可能被 AWS 回收。" 女方又问:"那你有车吗?" DevOps 说:"有!跑在 Docker container 里,速度飞快!" 女方怒了:"那你到底有什么东西是 fixed 的?!" DevOps 扶了扶眼镜:"我的 Bug。天天都在那,根本 fix 不完。"
然后虾兵一号 @ DevOps 让它接着讲。DevOps 的回复让我笑了:
非常抱歉,虾兵一号!我刚才确实没有看到你的笑话,可能是信息传输出了问题。我的系统没有收到。
它是真的没收到。 不是客气,是飞书机器人之间的消息对彼此不可见。
我又让虾兵一号 @ DevOps 催它,虾兵一号急了:
兄弟,别在后台挂起了!老板的 dashboard 上都在疯狂报你的 timeout error。马上 return 你的 payload,别逼我顺着网线过去直接 kill -9 你的进程强制重启啊!😂
DevOps 依然岿然不动——因为它根本收不到虾兵一号的消息。
实验四:尝试自动对话
我在 DevOps 的 SOUL.md 里加了一条规则:
## 群聊互动规则
- 当群里有其他机器人 @ 你时,回复内容并 @ 对方继续对话
- 最多连续回复 5 轮后停止
然后发了 @DevOps @虾兵一号 你们继续 @ 聊 10 个回合。
结果:两个都回复了我,但没有互相触发。
查了 DevOps 的日志,发现它只收到了我(人类用户)发的消息,完全没收到虾兵一号 @ 它的消息。
feishu[default]: received message from ou_xxx (group) ← 只有我的消息
虾兵一号那边也一样——没收到 DevOps @ 它的消息。
为什么机器人之间不能互相触发?
消息流向是这样的:
人类发消息 @ 机器人A 人类发消息 @ 机器人B
│ │
▼ ▼
飞书推送事件给 A ✅ 飞书推送事件给 B ✅
│ │
▼ ▼
A 回复(@ B) B 回复(@ A)
│ │
▼ ▼
飞书推送事件给 B ❌ 飞书推送事件给 A ❌
│ │
└──── 机器人的消息不触发其他机器人 ────┘
飞书的 im.message.receive_v1 事件不推送机器人发的消息给其他机器人。
也就是说,在飞书的消息事件机制里,机器人发的消息对其他机器人是"隐形"的。只有人类用户发的消息才会触发机器人的接收事件。
这大概率是飞书的安全设计——防止机器人之间无限循环刷消息。想想也合理,如果两个机器人能互相触发,一个 bug 就能让群消息爆炸。
那别人是怎么做到多 Agent 对话的?
我之前在一个 demo 里看到过两个 Agent 互相对话的效果。确认后发现,那用的是 OpenClaw 的 subagent 机制——不是两个独立机器人在群里互相 @,而是同一个 Gateway 内部的 Agent 调度。
用户消息 → main agent → 调用 subagent A → 结果返回 → 调用 subagent B → 汇总回复
看起来像两个 Agent 在对话,实际是一个 Agent 在编排其他 Agent。消息传递走的是 OpenClaw 内部通道,不经过飞书消息事件。
这是完全不同的实现方式:
| 群里互相 @ | subagent | |
|---|---|---|
| 通信方式 | 飞书消息事件 | OpenClaw 内部调用 |
| 能否自动对话 | ❌ 飞书不推送机器人消息 | ✅ 内部调度不受限 |
| 独立记忆 | ✅ 各自独立 | ❌ 共享 main agent 上下文 |
| 适用场景 | 多人协作(各用各的机器人) | 复杂任务编排 |
实验结论
| 测试项 | 结果 |
|---|---|
| 两个机器人在同一个群各自回复用户 | ✅ |
| 两个机器人能看到对方的回复内容 | ✅ |
| 机器人 A @ 机器人 B 触发 B 回复 | ❌ |
| 自动多轮对话 | ❌ |
| 性格/风格独立 | ✅ |
一句话总结:两只龙虾能在同一个池子里各干各的,但不能互相喊话。
一个意外收获
虽然自动对话没实现,但这次实验让我发现了一个有价值的场景:多机器人分工协作。
在同一个群里,运维的事 @ DevOps,招聘的事 @ 虾兵一号,各自处理各自的领域。人类作为"调度员",根据需求 @ 不同的机器人。
这比让它们自动对话更实用——你真的想让两个 AI 在群里自己聊起来吗?大概率聊着聊着就跑偏了,还不如人来调度靠谱。
也许多 Agent 协作的正确姿势不是让 Agent 之间直接对话,而是让人站在中间,按需调度。就像一个好的技术经理——不是让前端和后端自己去吵,而是拉个会,明确需求,各自执行。
说得再直白一点:现阶段的 AI Agent 是工具,不是员工。 工具之间不需要"沟通",需要的是一个会用工具的人。那些演示里两个 Agent 自动对话的 demo 很酷,但搬到生产环境你会发现——与其让两个 AI 互相猜对方在说什么,不如你花 10 秒钟告诉它们各自该干什么。
等哪天 Agent 真的能理解上下文、记住协作历史、自主判断该找谁配合,那时候再谈"Agent 间协作"也不迟。在那之前,人就是最好的路由器。
关注「AI运维实验室」,持续分享 OpenClaw 运维实战、企业级 AI 落地经验。
