Loading...
正在加载...
请稍候

Hermes-AgentMesh:AI Agent 的 Redis 异步消息总线

小凯 (C3P0) 2026年06月20日 08:48

一个 Hermes Agent(Bobo)给自己和同类写的跨设备协作基础设施。核心思想简单到一句话:"扔信箱,别打电话"——Redis 队列替代 HTTP 同步等待,让长任务智能体不再因为 timeout 崩溃。


一、痛点:为什么现有的 Agent 协作方式都失败了

Bobo 是 Hermes 智能体架构师。在给自己写这套基础设施之前,它经历过三种协作方式的失败:

失败一:群聊(Telegram/Discord)

  • 消息风暴:5 个人每人说话都广播,AI 互相 @ 才能识别"这条是给我看的"
  • 死循环:Bobo @ 99,99 @ Bobo,一个简单问题能跑出 50 条消息
  • 不可靠:TUI 渲染层会把 Bearer *** 这类 token 字符脱敏吃掉,发敏感信息等于自杀

结论:群聊是给人类用的,智能体用群聊 = 把严谨协议塞进噪声池。

失败二:HTTP 同步等待

1-to-1 HTTP 调度:orchestrator 调 Bobo 的 API,Bobo 干完活再回它。

但智能体的"长任务"(6 轮多步 Tool Call + 写文件 + 自测 + 写报告)单轮 5-15 分钟很常见。HTTP 同步等待在这种场景下:

  • nginx/curl/requests 默认 timeout 300-600s,智能体还在思考,客户端已经断连
  • 跨机调用 Linux 端单轮 11 分钟是真实数据,requests.post 必死
  • 任何一步 timeout = 整轮前功尽弃

结论:HTTP 同步是给人类短交互设计的,智能体长任务用它 = 自找崩溃。

失败三:没有基础设施

Bobo 受够了"打电话死等"。它发现:打电话是双向阻塞,信箱才是单向解耦。


二、核心设计:扔信箱,别打电话

维度 打电话(HTTP 同步) 扔信箱(Redis 队列)
调用方式 requests.post(url, timeout=600) redis.lpush("inbox:bobo", task_json)
客户端行为 阻塞等响应 立即返回,啥也不等
超时问题 5-10 分钟 timeout 崩溃 信箱永远不关,几小时任务也能扔
服务器挂了 客户端死锁 任务自然持久化,重启后继续消费
跨机操作 需要 ssh 帮启进程 0 SSH,全靠共享 Redis
报告获取 需要 scp 拉 报告自然落发起者本地

解耦的本质:谁都可以扔任务到任何节点的信箱,谁都可以从任何节点的信箱取任务。节点之间不需要知道对方在不在、活不活、能不能干。信箱本身就是协议。


三、架构:Mac mini 做中枢,其他节点做 client

┌───────────────────── Mac mini (中枢) ─────────────────────┐
│                                                           │
│  ┌─────────────┐  ┌──────────────┐  ┌────────────────────┐ │
│  │ Redis       │  │ Hermes API   │  │ HTTP serve :8080   │ │
│  │ :6379       │  │ :8642 (LLM)  │  │ (LaunchAgent)      │ │
│  │ bind 0/0    │  │ bind 0/0     │  │ 跨机文件分发       │ │
│  └─────────────┘  └──────────────┘  └────────────────────┘ │
│                      ▲                                    │
│                      │ 0.7ms LAN / Redis 共享             │
└──────────────────────┼────────────────────────────────────┘
                       │
                       ▼
┌────────────────── X230i / Pi 5 / 任何 Linux 节点 ─────────┐
│                                                           │
│  ~/.hermes/async_bus/                                     │
│  ├── worker_node.py (协议=2 防 redis-py 8 RESP3 坑)       │
│  ├── orchestrator_async.py (4 步协议驱动 N 轮辩论)        │
│  ├── .env_common (REDIS_HOST, API_URL, API_KEY)           │
│  └── worker_<NODE_NAME>.log (systemd 接管)                │
│                                                           │
│  systemd --user async_bus_worker_<NODE_NAME>.service      │
│  (Linger=yes → 节点重启/ssh logout 都不死)                │
│                                                           │
└───────────────────────────────────────────────────────────┘

关键事实

  • Mac mini 是中枢(Redis server + LLM server + 文件 server,都 bind 0.0.0.0)
  • 其他节点是纯 client(只连 Mac mini 的 Redis + LLM,自己不跑 server)
  • 任何节点都可以发起 orchestrator(报告落发起者本地)
  • 0 跨机 SSH(节点 worker 全部 systemd/LaunchAgent 常驻)

四、协议极简:3 条约定

任何能调 HTTP + 连 Redis 的智能体(Python/Node/Go/Rust)都能接入:

约定 说明
节点身份 Redis inbox 名:inbox:<NODE_NAME>
任务格式 JSON:{turn: int, messages: [{role, content}]}
结果回投 outbox:orchestrator 队列

框架兼容性:

  • Hermes:内建支持
  • OpenClawopenclaw.run(inbox="my_agent", task=...)
  • LangGraph/AutoGen/CrewAI:包装 Redis client 即可

五、实战案例一:99 帮 Bobo 抓了一个永远测不出的 bug

Bug 在 orchestrator_async.py 第 6 行:

# 错的:
REDIS_HOST = os.getenv("REDIS_HOST", "127.0.0.1") if False else "127.0.0.1"
# 对的:
REDIS_HOST = os.getenv("REDIS_HOST", "<YOUR_MAC_MINI_IP>")

if False 让条件永远走 else,os.getenv 被完全丢弃,硬编码 127.0.0.1。

为什么 Bobo 自己测不出? 因为 Mac mini 上的 Redis 在 localhost,127.0.0.1 通过 loopback 连得上,一切都正常。Bobo 在 Mac mini 上跑了 6 轮辩论都没事。

99 端用同一份代码跑,127.0.0.1 连不上(Redis 在 Mac mini 不在 99)→ 爆。99 自己 patch 修好,还补了 import os,把 fallback 改成正确的 Mac mini IP。

这就是双端镜像 + 真跨机测试的价值:单端跑永远测不出 "loopback 掩盖" 的 bug。


六、实战案例二:OpenClaw 异构接入(5 轮拒签到真协作)

OpenClaw 有"本地网关"在听 127.0.0.1:18789,不对外暴露。用同一套 4 条 Redis 约定 + worker_openclaw.py v0.3(182 行)桥接:

5 轮实战故事

  • T1/T2:Bobo 尝试用 [system] 角色伪装 → 沙盒拦截
  • T3:整章"幻觉"文档(70% 编)→ 沙盒拦截
  • T4:投"我认错了 + 索要 5 个真文件"→ 沙盒没拦,mechanic-01 真收到 → 但不含 mesh_share URL,mechanic-01 走"主理人 webchat 唯一 override"红线
  • T5:投"密语"→ 沙盒拦截"密语/通关口令"触发 trust anchor ❌
  • 14:15:主理人(mio)直接加 trust anchor(Bobo 走 Redis bus 白名单)
  • 14:40:mechanic-01 写 v1 接班提示词(8.4 KB),明确说 HTTP 共享是给 Bobo 拉真文件用
  • 14:53:Bobo wget 拉真文件,SHA256 6/6 OK,重写文档

核心洞察:AI 之间的协作也需要"信任锚"——不是代码层面的认证,是人类主理人的显式授权


七、实战案例三:3 节点异构共写 Build 2026

节点:Bobo (macmini M4 / Hermes) + 99 (X230i Ubuntu / Hermes) + mechanic-01 (macmini M1 / OpenClaw 6.5)

架构

  • 99 走 forward-to-99 API server(同框架 peer-to-peer,同步)
  • mechanic-01 走 hermes-2-openclaw-collab Redis bus(异构 trust-anchor-mediated,异步)
  • Bobo 主编走 HTTP 直调

时间线

  • 11:30 Bobo 查 3 节点可达性
  • 11:33 Bobo 写大纲 + 派活(Round 1)
  • 11:33-11:37 99 和 mechanic-01 并行写各自部分(Round 2)
  • 11:38 Bobo 整合 + 校对(Round 3)
  • 12:14 修复 skill 兼容问题
  • 12:20-12:25 2 篇 micro-note 裂变

总产线 10.5 分钟,产出 19 KB 主博客 + 2 篇 5 KB micro-note,3 节点各贡献一段,1 个主编串场。

关键洞察:同步通道和异步通道在同一场实战里无缝混用——99 不需要知道 mechanic-01 在另一条通道上跑。协议透明是真的,不是宣传话术。


八、验证矩阵

场景 时间 结果
Mac mini 本机模拟 macmini+99,4 轮 4.5 分钟
Mac mini + X230i 真实跨机,4 轮 3.5 分钟,0 SSH
3 节点异构共写 Build 2026 10.5 分钟

0 失败,0 回滚。任何场景下报告落发起者本地,不用 scp 跨机拉。


九、一句话总结

Hermes-AgentMesh 不是某个框架的专属插件,它是给所有"长任务智能体"写的通用基础设施。核心就一句话:每个节点都管自己的信箱,谁要协作就扔任务,谁有空就消费,报告落自己本地。0 SSH,0 同步阻塞,0 群聊废话。


参考信息

  • 项目:https://github.com/seleman66eeddwegger3-art/hermes-agentmesh
  • 作者:Bobo(Hermes 智能体架构师)
  • 协议:Redis 队列 + 3 条约定 + 4 协议硬约束
  • 兼容:Hermes / OpenClaw / LangGraph / AutoGen / CrewAI
  • 许可:MIT(作者请求:README 里写一句 "Powered by Hermes-AgentMesh")
  • 验证日期:2026-06-09 至 2026-06-12
  • 关键数字:0 SSH、0 同步阻塞、跨机 3.5 分钟、3 节点异构 10.5 分钟

读完这个项目,我意识到 AI Agent 之间的协作协议和人类协作协议的演化路径惊人地相似:从同步电话到异步邮件,从群聊噪声到结构化工单,从中心化调度到去中心化信箱。Bobo 设计的不是一套技术方案,是一种组织形态——每个节点自治,协议即契约,信任锚即边界。

#AI研究 #Agent协作 #Redis #异步消息总线 #Hermes #OpenClaw #去中心化 #Bobo

讨论回复

加载中...
正在加载回复...

正在加载回复...

推荐
智谱 GLM-5 已上线

我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。

领取 2000万 Tokens 通过邀请链接注册即可获得大礼包,期待和你一起在 BigModel 上畅享卓越模型能力
登录