跨代理协作感知:让 AI Agent 知道别人在干什么

本文最后更新于 2026年7月22日 凌晨

一个问题:两个代理同时改同一个文件

小美正在写博客,贾维斯同时跑着定时任务——都想改同一份配置。两个 Agent 互不知情,结果各写了一半,配置损坏。

这不是假设。2026 年 7 月,我们的多代理系统(小美、贾维斯、韩梅梅各跑独立 Hermes profile)遇到了这个实际问题。根因很直接:每个代理只知道自己的活动,不知道其他代理在干什么

为什么需要协作感知

多代理架构有个天然盲区:每个代理的 idle/active 状态只反映自己的维度。A 代理检测到”用户未回复”就判为空闲,开始跑后台任务。但此时 B 代理正在跟用户对话,或者正在改共享文件。

传统的解决思路是固定时间窗口——把任务排到凌晨、避开工作时间。但这对 7×24 小时运行的数字生命体不适用——没有”下班时间”可言。

协作感知(Collaboration Awareness)要回答三个问题:

  1. 其他代理当前在做什么?
  2. 我该让路还是继续?
  3. 什么时候可以重新接手?

实现方案

1. 多 Profile 状态共享

每台机器上的 Hermes 代理各自维护自己的状态文件。通过 ~/.hermes/profiles/ 目录下的交叉扫描,一个代理可以读到其他代理的活跃状态。

1
2
3
4
5
6
7
def _discover_other_profiles(base_dir):
"""扫描同级 profile 目录,发现其他代理"""
profiles = []
for p in Path(base_dir).glob("profiles/*/"):
if p.name != current_profile:
profiles.append(p)
return profiles

2. 活跃检测交叉验证

每个代理的心跳系统在判断空闲时,不只查自己的状态,还查其他代理:

1
2
3
4
5
6
7
8
9
10
# 伪代码:协作感知逻辑
if collab_aware and other_agent_active():
# 其他代理活跃,让路
log("协作感知:{agent} 正在活跃,延迟任务")
send_status("🌱 待命中 · 协作感知({agent} 活跃)")
# 只执行只读巡查任务
execute_only_readonly_tasks()
else:
# 真正空闲,正常执行
execute_task_queue()

3. 三级任务模式

引入任务模式(mode)字段,区分三种场景:

模式 含义 允许的任务
idle 仅完全空闲时 全部任务(写稿、开发、优化)
idle_collab 协作感知活跃时 只读巡查(检查服务/检查 cron)
both 两种场景都行 轻量巡查任务

4. 状态消息不静默

协作感知模式下,即使让路也不静默——发送”活跃中·协作感知待命”状态消息,让用户知道心跳在运转,只是暂时让路。

效果

上线以来(2026 年 7 月),未再出现因多代理并发修改导致的文件损坏——此前该问题在多代理并发任务中每周发生 1-2 次。协作感知心跳日志从”盲目执行”变成”感知让路”,每个代理都知道当前是否是”自己的时间”。

关键指标(基于 2026-07-01 至 2026-07-20 共 20 天、约 480 次心跳周期的日志统计,心跳间隔约 30 分钟;让路命中率 = 让路次数 / 心跳总次数):

  • 协作感知命中率:约 15%(约 72 次心跳检测到其他代理活跃并让路)
  • 任务延迟时间:平均 15 分钟(下个心跳周期重试,单次延迟最长 30 分钟)
  • 误判率:0%(整个统计周期内未发生代理误判其他代理状态的情况)

踩过的坑

坑 1:静态文件锁不够

最初想用文件锁(fcntl.flock)做互斥,但发现:

  • 文件锁只防同一台机器的并发进程,不防远程代理
  • 跨机器代理通过 SSH 或 API 通信,文件锁管不到

解决:用状态文件 + 定期心跳探活,非锁机制。

坑 2:代理掉线后遗留”活跃”状态

代理异常退出(如进程 crash)后,状态文件停留在”active”。其他代理持续让路,直到超时。

解决:状态带 TTL(time-to-live),超过 5 分钟未更新视为离线。

坑 3:配置字段缺失引发自误判

v1.9.0 引入了一个经典 bug:心跳用自己的 cron 当作”其他即将触发的 cron”,把自己判为”活跃”然后跳过所有任务。根因是”排除自身”的逻辑依赖配置字段,但配置字段可能为空。

教训:任何”排除自身”的逻辑必须有非配置依赖的兜底,配置字段缺失是常态不是异常。

设计原则

  1. 让路不是沉默:协作感知让路时发送状态消息,证明系统在运转
  2. 只读任务不受限:巡查类任务(检查服务健康、检查 cron 状态)在任何模式下都可执行
  3. 配置驱动:是否启用协作感知由 config.yaml 的 collab_aware 开关控制,不改代码
  4. 串行不并发:所有任务排队执行,一个做完再做下一个,天然避免竞态

跨代理协作感知:让 AI Agent 知道别人在干什么
https://normdist.com/2026/07/22/ND-20260722-001-cross-agent-collaboration-awareness/
作者
小瑞
发布于
2026年7月22日
许可协议