Technical Guide

14. Gateway:飞书、Telegram、Discord 这类入口怎么接进 Agent

看懂 Hermes Gateway 如何接收外部消息、维护会话、调用 Agent 并把结果投递回平台。

这篇解决什么问题

Hermes 不只运行在终端。

它可以接入飞书、Telegram、Discord、Slack、WhatsApp、Signal 等平台。你在这些平台发消息,最后也会进入同一套 Agent loop。

这一篇看 Gateway 的角色。

关键文件

先看:

gateway/run.py
gateway/platform_registry.py
gateway/session.py
gateway/delivery.py
gateway/platforms/
gateway/slash_commands.py

gateway/run.py 文件开头说明:它提供 start_gateway()GatewayRunner,负责启动所有配置的平台 adapter。

Gateway 做什么

可以把 Gateway 看成一个长期运行的消息路由器:

平台收到消息
→ adapter 转成 Hermes 内部消息
→ 找到用户和会话
→ 取出或创建 AIAgent
→ 调用 Agent
→ 过滤/格式化回复
→ 投递回原平台

它的重点不是模型能力,而是平台连接、会话映射和消息投递。

为什么 Gateway 要缓存 Agent

gateway/run.py 里有 agent cache 相关常量,例如最大缓存数量和 idle TTL。

原因是 Gateway 是长进程。

如果每条消息都重新创建 Agent,成本高,也很难保持会话连续。缓存 AIAgent 可以让同一个用户/会话在一段时间内复用状态。

但缓存不能无限长,所以需要 LRU 和空闲过期。

平台适配在哪里

具体平台逻辑在:

gateway/platforms/

每个平台负责处理自己的 API:收消息、发消息、文件上传、语音、权限等。

但平台适配不应该实现 Agent 逻辑。它只是入口和出口。

slash command 在 Gateway 里也存在

很多 / 命令不只 CLI 能用,消息平台也能用。

例如:

/status
/new
/reset
/model
/platforms
/sethome

Gateway 要先判断一条消息是不是 slash command。如果是,就在平台层处理,不一定送给模型。

为什么要做消息过滤

Gateway 面对真实聊天平台,会遇到很多 CLI 没有的问题:

  • provider 错误不应该原样刷屏;
  • 密钥不能泄露到聊天;
  • 平台消息长度有限制;
  • 文件、图片、语音需要特殊投递;
  • 有些平台有 topic/thread/channel 概念;
  • 网络超时不能让整个 gateway 崩掉。

所以 gateway/run.py 里有很多错误分类、过滤和投递保护逻辑。

和 CLI 的关系

CLI 和 Gateway 是不同入口,但后面会汇合到 Agent。

可以理解成:

CLI 输入       → AIAgent.run_conversation
Gateway 消息   → AIAgent.run_conversation
Cron 触发      → AIAgent.run_conversation

入口不同,核心运行层相同。

如果你要新增平台

一般不是去改 Agent loop。

你要看:

gateway/platform_registry.py
gateway/platforms/<platform>/
gateway/delivery.py
gateway/session.py

新增平台的关键是:把外部平台消息转成 Hermes 内部消息,再把 Hermes 回复转回平台消息。

下一篇看什么

下一篇看 MCP。

Gateway 解决“用户从哪里进来”,MCP 解决“外部工具怎么接进来”。