07 - 多 Agent 协作:Kanban 与 Delegation
学习目标
本章聚焦 Hermes Agent 的多 Agent 协作机制。你将了解:
delegate_task如何实现同步子代理委派与角色分级- Kanban 持久协作板的 SQLite 架构与 Dispatcher 循环
- Board 硬边界与 Tenant 软命名空间的隔离策略
- 子代理的安全约束与自动拒绝机制
前置知识
本章涉及多 Agent 路由的通用原理,建议先阅读:
下文直接聚焦 Hermes 的委派与 Kanban 协作具体实现。
项目实践
同步子代理委派(delegate_task)
Hermes 的 delegate_task 工具产生子 AIAgent 实例,采用同步等待模型:父 Agent 等待子 Agent 完成后才继续。
角色分级:
| 角色 | 能力 | 限制 |
|---|---|---|
leaf(默认) | 执行专注任务 | 不能调用 delegate_task、clarify、memory、send_message、execute_code |
orchestrator | 可继续生成子代理 | 受 max_spawn_depth(默认 2)限制 |
关键安全设计:
- 硬编码禁止列表(
DELEGATE_BLOCKED_TOOLS):子 Agent 不能与用户交互、不能写入共享记忆、不能产生跨平台副作用 - 审批回调隔离:子 Agent 运行在 ThreadPoolExecutor worker 线程中,CLI 的交互式审批回调不继承。自动安装
_subagent_auto_deny拒绝危险命令 - 活跃跟踪:模块级
_active_subagents字典跟踪所有运行中的子 Agent,支持 TUI 可观测层和中断
Kanban 持久协作板
不同于临时的子代理委派,Hermes 的 Kanban 板提供SQLite 驱动的持久协作:
核心架构:
| 概念 | 隔离级别 | 实现 |
|---|---|---|
| Board | 硬边界 | 通过 HERMES_KANBAN_BOARD 环境变量隔离,工人无法看到其他 Board 的任务 |
| Tenant | 软命名空间 | 同一 Board 内通过 workspace-path + memory-key 区分业务域 |
Dispatcher 循环(默认每 60 秒):
- Reclaim:回收过期 claim(工人失联或超时)
- Promote:提升就绪任务到可执行状态
- Atomic Claim:原子性地认领任务(防竞争)
- Spawn:为已分配的配置档案生成子代理
失败自动阻塞:同一任务连续失败(默认 2 次)后自动阻塞,防止自旋循环。
零 Schema 开销:工人不在 Kanban 任务内时,kanban_* 工具集从工具列表中移除,不占用模型上下文。
两种协作模式对比
| 维度 | delegate_task | Kanban 板 |
|---|---|---|
| 生命周期 | 临时,同步等待 | 持久,跨会话 |
| 协调方式 | 父子关系 | 多工人异步协作 |
| 适用场景 | 单次复杂任务分解 | 长期项目流水线 |
| 可观测性 | _active_subagents 字典 | SQLite 持久化,TUI 面板 |
| 失败处理 | 父 Agent 捕获异常 | 自动阻塞 + 重试计数 |
ACP 协议通信
agent/copilot_acp_client.py 实现了 Agent 间通过 ACP(Agent Communication Protocol)的通信,支持跨进程、跨网络的 Agent 消息传递。
问题与规避
子代理深度失控
问题:orchestrator 角色可以无限生成子代理,导致资源耗尽。
对策:max_spawn_depth 默认 2,从根 Agent 开始计算深度。达到上限后强制降级为 leaf 角色。
Kanban 工人僵尸进程
问题:工人进程崩溃后 claim 未释放,任务永久卡在 claimed 状态。
对策:Dispatcher 的 reclaim 阶段检测工人活跃状态,超时后自动回收 claim。超时阈值可配置。
设计取舍
同步委派 vs 异步委派
| 方案 | 优势 | 代价 |
|---|---|---|
| 同步等待(Hermes) | 实现简单、父 Agent 知道子任务结果、调试友好 | 父 Agent 阻塞等待、并发度受限 |
| 异步派发 | 父 Agent 可继续工作、高并发 | 需要结果回调机制、状态管理复杂 |
Hermes 选择同步委派是因为其目标场景是对话式交互,用户等待回复期间,父 Agent 阻塞等待子代理结果是可接受的。异步场景由 Kanban 板覆盖。
Board 硬边界 vs 软隔离
| 方案 | 优势 | 代价 |
|---|---|---|
| 硬边界(环境变量) | 工人完全隔离、无法越权访问 | 跨 Board 协作需要额外机制 |
| 软隔离(数据库行级) | 跨 Board 查询方便 | 需要权限检查、可能被绕过 |
Hermes 选择 Board 作为硬边界,因为多 Agent 协作的核心风险是任务干扰。环境变量隔离确保工人只看到自己 Board 内的任务。
参考来源
- 源码验证:
tools/delegate_tool.py、tools/kanban_tools.py、agent/copilot_acp_client.py