跳转到内容

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 秒):

  1. Reclaim:回收过期 claim(工人失联或超时)
  2. Promote:提升就绪任务到可执行状态
  3. Atomic Claim:原子性地认领任务(防竞争)
  4. Spawn:为已分配的配置档案生成子代理

失败自动阻塞:同一任务连续失败(默认 2 次)后自动阻塞,防止自旋循环。

零 Schema 开销:工人不在 Kanban 任务内时,kanban_* 工具集从工具列表中移除,不占用模型上下文。

两种协作模式对比

维度delegate_taskKanban 板
生命周期临时,同步等待持久,跨会话
协调方式父子关系多工人异步协作
适用场景单次复杂任务分解长期项目流水线
可观测性_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.pytools/kanban_tools.pyagent/copilot_acp_client.py