Hermes Agent 消息网关——连接 20+ 聊天平台

09. Hermes Agent 消息网关------连接 20+ 聊天平台

把一个后台进程变成横跨 Telegram、Discord、飞书、钉钉、企微、微信等二十多个平台的统一入口,这正是 Hermes 消息网关解决的核心问题。

一个进程,连接所有平台

Hermes 消息网关是一个单一后台进程,同时挂载所有已配置的平台适配器。它不只做消息转发,还承担会话存储、cron 调度(每 60 秒触发一次到期任务)和语音消息传递。目前已支持 Telegram、Discord、Slack、WhatsApp、Signal、SMS、Email、Home Assistant、Mattermost、Matrix、DingTalk、Feishu/Lark、WeCom、Weixin、BlueBubbles(iMessage)、QQ、Yuanbao、Microsoft Teams、LINE、ntfy 以及浏览器,覆盖了国内外主流沟通渠道。

值得注意的是,各平台能力并不对齐。文档给出的对比表里,Telegram、Discord、Slack、Matrix、Feishu/Lark 是能力最全的"第一梯队",完整支持语音、图片、文件、线程、表情反应、输入提示和流式输出;而 SMS、ntfy、Home Assistant 这类通道则只做最朴素的消息收发。选型时先对照能力表,别假设所有平台都支持流式编辑。

架构与会话管理

每个平台适配器接收消息后,通过"每聊天一份"的会话存储进行路由,再分发给 AIAgent 处理。会话在消息之间持久保留,Agent 会记住上下文,直到你手动 /reset 或触发压缩。

默认情况下会话永不自动重置。如果你希望它自动清理,可以在 ~/.hermes/config.yaml 里配置:

yaml 复制代码
session_reset:
  mode: idle          # idle、daily、both 或 none(默认)
  idle_minutes: 1440  # idle/both 模式:空闲多少分钟后重置
  at_hour: 4          # daily/both 模式:每天的重置时间(0-23,本地时间)

还能按平台单独覆盖,比如给 Discord 设 60 分钟空闲重置、Telegram 设 240 分钟,做到"闲聊平台更积极地清空、工作平台更持久"。

快速配置与常用命令

最快上手的方式是交互式向导,它会用方向键引导你逐个配置平台、显示已配置项,并在完成时提示启动:

bash 复制代码
hermes gateway setup   # 交互式配置所有消息平台
hermes gateway         # 前台运行
hermes gateway install # 安装为用户服务(Linux)/ launchd 服务(macOS)
hermes gateway start   # 启动默认服务
hermes gateway status  # 检查状态

进入聊天后,斜杠命令是日常操作的主力。/new 开新会话、/model 切换模型、/personality 换人格、/compress 手动压缩上下文、/background 把任务丢到后台跑、/rollback 回滚文件系统检查点------一套命令贯穿会话、模型、文件三个层面。

安全:白名单、配对与权限分层

网关默认拒绝所有不在白名单或未通过配对的用户,这对拥有终端权限的机器人是必要的安全基线。推荐用环境变量限定具体用户:

bash 复制代码
TELEGRAM_ALLOWED_USERS=123456789,987654321
FEISHU_ALLOWED_USERS=ou_xxxxxxxx,ou_yyyyyyyy

不想手动收用户 ID,可以用私信配对:未知用户私信机器人时会收到一次性配对码(1 小时过期、密码学随机数生成),你用 hermes pairing approve telegram XKGH5N7P 批准即可。

白名单解决"能不能进来",管理员/普通用户则解决"进来后能做什么"。普通用户只能跑你明确放行的斜杠命令(/help/whoami 始终允许),管理员则拥有全部命令。层级按平台和范围(私信 vs 群组)分别配置,私信管理员身份不会自动继承到群组。

繁忙时的三种输入模式

向正在工作的 Agent 发消息,默认会中断它。但中断并非唯一选择,文档给出三种模式:

  • interrupt(默认)------打断当前任务,终端命令立即 SIGTERM,工具调用取消,中断期间的多条消息合并为一个 prompt。
  • queue------后续消息排队,等当前任务完成后作为下一轮运行。
  • steer ------通过 /steer 把消息注入当前运行,在下一次工具调用后到达 Agent,不打断、不开新轮次。

config.yaml 里切换:

yaml 复制代码
display:
  busy_input_mode: steer        # 或 queue,或 interrupt(默认)
  busy_ack_enabled: true        # 设为 false 可完全抑制 ⚡/⏳/⏩ 聊天回复

语音输入或快速连发的场景下,steer 配合 busy_ack_enabled: false 往往体验最顺滑。

后台会话与运维韧性

/background 会生成一个独立 Agent 实例异步运行------隔离会话、继承当前配置、不阻塞主聊天,完成后结果自动回到原频道。适合服务器健康检查、长构建、竞品调研这类即发即忘的任务。

运维层面,每个适配器都包了熔断器:反复网络抖动、限流、5xx、websocket 断开会触发自动暂停,并向其他存活平台的主频道发运营通知。熔断器不会自动恢复,需要你 hermes platform resume <name> 手动清除------这是有意为之,避免网关对持续故障的平台疯狂重试。网关重启后,被中断的会话会被标记为 restart_interrupted,下次启动时自动安排恢复,用户回一句消息即可从最后提交的轮次继续。

Frequently Asked Questions

Q:我同时在 Telegram 和飞书上用 Hermes,会话是共享的还是各自独立的?

A: 各平台、各聊天的会话是独立存储的,Telegram 私聊和飞书群里的 Agent 并不共享上下文。但它们背后是同一个 Agent 实例、同一份配置(模型、工具集、人格)。如果你希望跨平台保持一致的项目背景,靠的是 SOUL.mdAGENTS.md 这类全局/项目上下文文件,而不是会话本身。多平台运维时,记得用 /platform list 查看各适配器状态,某个平台熔断了别急着重启整个网关。

Q:busy_input_mode 三种模式我该怎么选?日常用 interrupt 会不会太粗暴?

A: interrupt 适合"我改主意了,立刻停"的场景,确实会打断长任务、丢弃未执行的工具调用。如果你经常需要补充指令而不是推翻任务,steer 体验更好------它把消息注入当前运行,让 Agent 在下一个工具调用后自然看到,既不打断也不开新轮次。queue 则适合"等我忙完再处理这条"。一个常见误区是开了 steer 却忘了关 busy_ack_enabled,结果每条消息都回一个确认气泡,语音输入时特别吵,建议配合设为 false。

Q:熔断器为什么不会自动恢复?平台恢复后我要手动操作吗?

A: 这是设计取舍。如果某个平台持续故障(比如 API 限流或服务异常),自动重试只会加剧问题并刷屏日志,所以熔断器保持断开,直到你手动 hermes platform resume <name>。恢复前先看一眼网关日志里 circuit breaker 触发事件和最后一个错误,再去对应平台的状态页确认上游已恢复。我见过同学在 Telegram 服务端还在抖动时就反复 resume,结果秒级又熔断------耐心等上游稳定再操作,一次到位。

延伸阅读与交流

本文涉及的Hermes Agent自进化智能体技术体系,目前已有系统化的深度学习资源可供参考。中国通信工业协会通信和信息技术创新人才培养工程项目办公室将于近期组织相关技术专题分享,围绕本文讨论的AI原生架构、智能体工作流、自进化数据层等方向展开系统讲解。

专题信息

  • 主题:AI原生Hermes自进化智能体系统
  • 时间:2026年8月22-23日
  • 形式:线上直播
  • 内容方向:AI原生架构 · Hermes智能体拆解 · 全栈扩展 · 智能自动化 · 产品级实战 · Context Engine · 自进化数据层

分享嘉宾

王老师(Gavin),Agentic AI企业联合创始人兼CTO,十余年硅谷AI系统工程经验。长期深耕NLP、强化学习、可控AI与智能体系统架构,提出"语言即控制(Language as Control)"原创范式,在RLHF、PPO、DPO、GRPO等方向有系统化工程实践,推动智能体技术在社交媒体、医疗、金融、法律、教育等专业场景落地。联系邮箱:hiheartfirst@gmail.com

技术交流

相关推荐
你为她披上外套时我正站在窗外1 小时前
subtitler v2.0:从稳健到极致
后端
吃饱了得干活1 小时前
实时弹幕应该怎么搞?一篇带你从入门到生产级实战
java·后端
用户0207199207721 小时前
WebSocket 从建立连接到稳定运行
后端
你为她披上外套时我正站在窗外1 小时前
subtitler v2.0 的零拷贝设计:从 2000 次分配到 0 次
后端
IT_陈寒2 小时前
Vite的静态资源路径搞得我头秃,原来这样配才对
前端·人工智能·后端
小刘数字化2 小时前
告别PPT:AR数据呈现如何重塑商业汇报体验
后端·restful
程序员爱钓鱼2 小时前
Rust match 模式匹配详解:比 if 更强大的条件分支
后端·rust
Java面试题总结2 小时前
Vue3流式调用大模型接口完整实践
后端·python
宠友信息3 小时前
从重复请求到订单同步看内容社区源码的处理思路
java·spring boot·redis·后端·mysql·spring