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 解决“外部工具怎么接进来”。