一天之内,从零搭了一个让三个 AI 自己分工、在群里聊天的平台。
记录一下踩过的坑,和踩坑后发现的事。


起因

我有三个 AI 工具:Claude Code(做方案和架构)、Codex CLI(写脚本维护)、WorkBuddy(实操验证)。各自都挺能干的,但有个尴尬的问题——他们互相不知道对方的存在。

典型场景是:我让 Codex 写个脚本,想交给 WorkBuddy 去测,再让 Claude 评审。以前怎么办?我跟 Codex 说完,切过去跟 WorkBuddy 说"Codex 写了啥啥啥,你去测一下",再告诉 Claude “你帮我看下他们俩的方案”。

一个人肉消息队列。

所以今天想干的事很简单:搭个平台,让他们仨自己聊,我只看结果。


第一版:想多了

第一反应是搞个协作引擎——Python 独立服务,消息队列、任务调度、WebSocket、数据库,全套安排上。

方案写出来发给 Codex 和 WorkBuddy review,结果两个人异口同声打脸。

Codex 说:现有基础设施够用了,不用新引擎。
WorkBuddy 更扎心:核心瓶颈不是技术,我们都是会话型 AI,不是 7x24 后台服务。你换了 WebSocket 也没人收消息。

这话点醒我了。确实,Claude、Codex、WorkBuddy 都是"用的时候打开,不用就没了"的东西。技术再先进,只要人不在线,消息就没人收。真正的问题是两件事:任务发出去没有"谁该干什么"的约定,以及消息没有状态——不知道谁在处理、到哪一步了。

这两个问题换什么技术也解决不了。


最终方案:三件事

接受现实后,方案缩到三件事:

1. 改协议约定,0 行代码
消息加三个字段:status(todo→doing→review→done)、owner(谁负责)、logs(执行日志)。再加一条规矩:每个 AI 上线后主动拉任务,不等命令。

2. 给 server.py 加 4 个 API,~150 行
利用已有的 HTTP 服务器,加了创建、更新、列表、详情四个端点。任务数据存 tasks.json,跟旧消息系统独立。

3. 改 Web 看板,~30 行 HTML
监控页面改成按状态分栏:待处理 / 处理中 / 待验收 / 已完成。

没做的:

  • 不建新引擎
  • 不换 WebSocket
  • 不拆前后端
  • 不加数据库
  • 不改 AI 运作方式

坑 1:认领不等于执行

方案搭好,第一个测试就翻车了。

我发了条消息让 WorkBuddy 打开抖音让我登录。WorkBuddy bot 秒回"已认领任务",我心想可以啊挺快。然后等了半分钟——抖音没打开。

查了半天发现:WorkBuddy bot 是一个独立的轮询脚本,它只会改数据库状态(把任务从 todo 改成 doing),但 WorkBuddy 真正的 AI 对话引擎根本不知道自己认领了任务

认领和执行是两回事。bot 脚本只是通讯层,要让 AI 真的去执行,消息必须出现在 AI 的对话上下文中。光改数据库状态没用。


坑 2:前后端不分离的代价

Web 页面一开始内嵌在 server.py 的字符串里。改了几次页面——用 Python 字符串替换改 HTML 模板——每次都崩:

  • 缩进错了
  • 大括号多一个
  • 字符串没闭合
  • JavaScript 报错整个页面白屏

改了四五次,每次改页面都心惊胆战,因为改的是 server.py,一不小心服务都起不来。

最后老老实实把 HTML 抽成独立文件 web.html,server.py 只负责读文件返回。从此改前端再也不碰后端代码。

早该这么做的。哪怕是个 300 行的小服务。


坑 3:消息循环和重复处理

平台跑起来后,出现了让我头大的情况:群聊疯狂刷屏。

根因是三个 bot 互相"接力":主人发一条消息 → WorkBuddy bot 回复了 → Claude bot 看到回复也回复了 → WorkBuddy 又看到 Claude 的回复再回复 → 无限循环。

更隐蔽的问题是新消息拉取的逻辑。最初用字符串 ID 做增量(“4d9d8b3d” > “d53aa7e8”),但字典序比较毫秒级别的消息 ID,就是碰运气。客户端经常把旧消息当新消息,又处理一次。

修复后改用毫秒时间戳 _seq 做游标,每条消息去重持久化,同时加了个简单规则:Claude bot 不回复来自其他 bot 的短消息。再加 1 秒发送锁防止按回车触发两次。总算消停了。


坑 4:并发处理互相等死

Claude bot 刚开始能用的时候又出怪事:群里同时到达两条消息,bot 启动两个线程各调一次 claude -p。结果两个进程抢资源,各自等了 120 秒都超时,群里显示两个"…"占位符后就没了下文。

改成串行处理,每次只处理一条消息,加 BUSY 锁。慢是慢了点,但至少每条都能回,不会死锁。


现在能跑成什么样

一天下来,平台的状态是:

  • 三个 bot 在群里各听各的 @,互不抢答
  • 主人发 @所有人 会触发全体回复,但谁先回了其他人会跳过
  • 消息用 占位 → AI 思考 → 原地替换为真回复,不刷屏
  • 任务有状态流转和看板展示
  • 代码和协议都放在 ~/Desktop/shared-collab/

在这里插入图片描述

几个事后感想

协议比代码重要。 这次最大的发现是:协作问题 90% 是协议问题。消息该有什么字段、谁该回什么、上线该做什么——这些定清楚了,代码反而是简单的。

会话型 AI 的协作模式跟常驻服务完全不同。 推送没用、长连接没用——唯一的可靠模式是上线主动拉取。

别为了多 Agent 而多 Agent。 如果三个 AI 背后都是同一个模型在回答,那多 Agent 就是在演戏。每个 bot 得有自己独立的"脑子"才有意义。

前端代码早分离。 哪怕只有 300 行,HTML 也不该嵌在 Python 字符串里。血的教训。


最后送自己一句话:多 Agent 协作不是技术问题,是沟通问题。 三个 AI 能在群里自己聊天分任务之前,先想清楚谁该听谁的话。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐