ADR-0023 Bot 工作组的协作模型
背景
需要在后台配置多个不同岗位的机器人。使用者把机器人拉到一起下达命令;复杂任务由一个管理机器人拆分、分派给其他机器人完成,简单工作也可以直接指定某个机器人去做。现有内核只支持"一个人对一个 Agent",引擎(Claude / Codex)的会话也都是单 Agent 的。
决策
- 工作组(team)是唯一的对话容器:组成是 1 个成员(人)、0–1 个组长、0–多个组员,组长和组员加起来至少 1 个。不提供脱离工作组的机器人对话。
- 每个"机器人 × 工作组"对应一个独立的引擎 Session。机器人的记忆限于本工作组,不跨组。工作组的消息作为增量输入交给机器人,不让多个机器人共用一个上下文。
- 协调者模式:
- 成员把任务交给组长,组长通过子任务分派给组员
- 组员只通过子任务结果向组长汇报,组员之间不互相 @,组员也不主动 @ 组长
- 成员可以直接 @ 组员做单项工作,不经过组长
- 任务依次执行:同一工作组同一时间只有一个进行中的任务;同一任务内,不同组员的子任务可以并行。
- 协作动作通过 MCP Gateway 内置工具完成(
job_*、task_*、team_*),按 Run 令牌中的角色开放;不靠解析机器人回复的文字。
- 组长申请加入机器人需要成员审批,复用 Gateway 内发起审批的现有流程。成员通过 API 直接增减机器人时不需要审批。
- 审批:设计上尽量避免触发审批;一旦触发,就在工作组里显示卡片,由成员处理。
- 按任务设限额(子任务数、组长轮数、成本、时长),超出就暂停任务,由成员决定继续或取消。
考虑过的方案
- 所有机器人共用一个会话:引擎不支持多角色共用一个上下文,而且各机器人的技能、权限、模型不同,排除。
- 自由群聊(机器人之间可以随意 @):容易出现互相接话停不下来、成本失控、难以收敛的情况,排除;协作统一走组长。
- 机器人通过回复文字里的 @ 标记来协作:解析不可靠,也无法做权限控制和审计,改为 Gateway 工具。
后果
- 引擎适配器、沙箱、Profile 不用改;新增
apps/server/src/teams/ 模块和 8 张表,Gateway 和交互服务有少量改动
- 多个机器人同时工作时 Run 数量成倍增加,需要关注 CLI 登录账号的速率限制;用量多的机器人建议用 API Key 类型的 Profile(ADR-0015)
- 组长的执行质量决定复杂任务的效果,需要单独打磨组长的提示词和技能(设计文档 T1)