🏗️ 1. Gateway 架构原理
Gateway 是 Hermes Agent 的接入适配层,负责将不同平台的消息协议统一转换为 Agent 可处理的标准格式,再将 Agent 的响应转换回平台格式发送出去。
平台消息层
Telegram Update
Discord Event
Slack Event
Email
↓ 原始事件 → Gateway 接收
Gateway 适配层
消息解析 / 权限校验
格式标准化
会话上下文管理
↓ 标准格式 → Agent Core
Agent Core
Agent Loop
工具执行
模型推理
↑ 响应格式化后回传给平台
消息流转机制
每条消息经历以下处理流程:
- 接收:Gateway 通过 Polling 或 Webhook 接收平台推送的原始事件
- 鉴权:校验发送者是否在白名单中(防止陌生人滥用)
- 解析:提取消息文本、附件、发送者信息,转换为统一格式
- 路由:根据会话 ID 找到或创建对应的 Agent 上下文
- 执行:将消息传入 Agent Loop,等待响应
- 回复:将 Agent 响应格式化后,通过平台 API 发送回去
🔍 会话隔离设计:Gateway 为每个用户(或群组)维护独立的 Agent 上下文,不同用户的对话互不干扰。这意味着每个用户都有自己的对话历史和工具执行状态。
🔵
2. Telegram 深度解析
最简单的接入方式,Polling 模式无需公网 IP,适合快速验证和个人使用
创建 Bot 与获取 Token
-
通过 @BotFather 创建 Bot在 Telegram 中搜索 @BotFather,发送
/newbot,依次输入 Bot 显示名称和用户名(必须以bot结尾)。BotFather 会返回 Bot Token,格式为123456789:ABCdef...。 -
配置 Hermes Gatewaybash
hermes gateway setup # 选择 Telegram,粘贴 Token # 或直接配置 hermes config set TELEGRAM_BOT_TOKEN 123456789:ABCdef... -
配置白名单(强烈建议)通过 @userinfobot 获取自己的 Telegram User ID,在配置中添加白名单,防止陌生人调用你的 Agent 消耗 API 额度。
-
启动并验证bash找到你的 Bot,发送
hermes gateway start hermes gateway status # 确认 Running 状态/start验证响应。
Polling vs Webhook 模式
Hermes Telegram Gateway 默认使用 Long Polling 模式:
| 模式 | 原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| Long Polling | Bot 主动向 Telegram 服务器轮询新消息 | 无需公网 IP,配置简单 | 有轻微延迟(通常 <1s) | 个人使用、开发测试 |
| Webhook | Telegram 主动推送消息到你的服务器 | 实时性更好,服务器压力小 | 需要公网 IP + HTTPS 证书 | 生产环境、高并发 |
💡 实践建议:个人使用和小规模场景用 Long Polling 完全够用。只有当你的 Bot 需要服务大量用户(100+ 并发)时,才需要切换到 Webhook 模式。
🚧 常见踩坑:Polling 和 Webhook 不能同时运行,否则会互相抢占消息导致丢消息。如果之前设置过 Webhook,切换到 Polling 前需要先调用 Telegram API 删除 Webhook:
https://api.telegram.org/bot{TOKEN}/deleteWebhook🟣
3. Discord 深度解析
适合游戏社区和创作者社区,需要理解 Intent 权限机制才能正确配置
-
创建 Discord Application访问 Discord Developer Portal,点击「New Application」,输入名称后进入应用设置页。
-
创建 Bot 并获取 Token左侧菜单选「Bot」→「Add Bot」→「Reset Token」获取 Token。Token 只显示一次,立即保存。
-
开启 Message Content Intent(关键步骤)在 Bot 设置页面,找到「Privileged Gateway Intents」,开启 Message Content Intent。不开启此项,Bot 将无法读取用户消息内容。
-
生成邀请链接并加入服务器「OAuth2 → URL Generator」中勾选
bot+applications.commands,Bot Permissions 勾选「Send Messages」「Read Message History」「Use Slash Commands」,复制链接邀请 Bot 加入你的服务器。 -
配置 Hermes Gatewaybash
hermes gateway setup # 选择 Discord,粘贴 Token
Discord Intent 权限机制深度解析
Discord 的 Intent 系统是其安全模型的核心。Bot 必须声明它需要接收哪类事件,Discord 才会推送对应的数据:
- GUILDS:服务器基本信息(默认开启)
- GUILD_MESSAGES:服务器频道消息事件(需要声明)
- MESSAGE_CONTENT:消息的实际文本内容(需要在 Portal 开启 Privileged Intent)
- DIRECT_MESSAGES:私信消息(需要声明)
⚠️ 2022 年后的重要变化:Discord 在 2022 年 9 月强制要求所有 Bot 申请 Message Content Intent 才能读取消息内容。如果你的 Bot 服务超过 100 个服务器,还需要向 Discord 提交申请并通过审核。
🔍 为什么 Discord 这么复杂?Discord 的权限系统设计是为了保护用户隐私,防止 Bot 滥采数据。理解这个设计后,配置起来就不会觉得繁琐了——每一步都有其安全意义。
🟢
4. Slack 深度解析
企业团队首选,Socket Mode 让你无需公网 IP 即可接收实时消息
-
创建 Slack App访问 Slack API,「Create New App」→「From scratch」,选择工作区。
-
配置 OAuth Scopes「OAuth & Permissions → Scopes → Bot Token Scopes」添加:
chat:write、channels:history、im:history、im:write、app_mentions:read。 -
安装到工作区获取 Bot Token「Install to Workspace」授权后,获取以
xoxb-开头的 Bot User OAuth Token。 -
开启 Socket Mode(推荐)「Socket Mode」→ 开启,生成以
xapp-开头的 App-Level Token。Socket Mode 让 Slack 主动推送事件到你的进程,无需公网 IP。 -
订阅事件「Event Subscriptions」→ 开启,订阅
message.im(私信)和app_mention(@提及)事件。 -
配置 Hermes Gatewaybash
hermes gateway setup # 选择 Slack,输入 xoxb- 和 xapp- Token
Socket Mode 原理
传统 Slack Bot 需要一个公网可访问的 HTTPS Webhook 端点。Socket Mode 通过 WebSocket 长连接解决了这个问题:
☁️
Slack 服务器
主动推送事件
→ WebSocket 长连接 →
← API 回复 ←
🖥️
你的 Hermes 进程
无需公网 IP
💡 Socket Mode 的优势:开发和部署都更简单,特别适合在内网服务器或本地机器上运行。唯一的要求是进程能访问公网(出站连接),而不需要公网能访问你的进程(入站连接)。
🚀 5. 生产部署方案
持久化运行
Gateway 进程必须持续运行才能响应消息。推荐使用 systemd 管理:
bash
# /etc/systemd/system/hermes-gateway.service
[Unit]
Description=Hermes Agent Gateway
After=network.target
[Service]
Type=simple
User=your-user
ExecStart=/home/your-user/.local/bin/hermes gateway start
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
bash
sudo systemctl enable hermes-gateway
sudo systemctl start hermes-gateway
sudo systemctl status hermes-gateway
多平台并行运行
Hermes Gateway 支持同时接入多个平台,一个 Agent 实例可以同时服务 Telegram 和 Discord:
bash
# config.yaml 中配置多个 Gateway
gateways:
telegram:
enabled: true
token: "${TELEGRAM_BOT_TOKEN}"
whitelist: [123456789]
discord:
enabled: true
token: "${DISCORD_BOT_TOKEN}"
⚠️ 注意:多平台并行时,所有平台共享同一个 Agent 实例和 API 额度。如果多个平台同时有大量请求,可能会触发模型 API 的速率限制。
🚧 6. 踩坑记录
| 平台 | 问题 | 根因 | 解决方案 |
|---|---|---|---|
| Telegram | Bot 不响应消息 | Polling 和 Webhook 同时运行 | 调用 deleteWebhook API 清除旧 Webhook |
| Telegram | 群组消息无响应 | Bot 未被设为管理员或未关闭隐私模式 | 通过 BotFather 关闭 Privacy Mode |
| Discord | 收不到消息内容 | 未开启 Message Content Intent | 在 Developer Portal 开启 Privileged Intent |
| Discord | Bot 加入服务器后无权限 | 邀请链接权限配置不完整 | 重新生成邀请链接,确认勾选所需权限 |
| Slack | 收不到私信 | 未订阅 message.im 事件 | 在 Event Subscriptions 中添加 message.im |
| Slack | Socket Mode 断连 | 网络不稳定或 Token 过期 | 配置自动重连,定期刷新 App-Level Token |
| 全平台 | 响应超时 | Agent 工具调用耗时过长 | 配置平台消息超时,先发"处理中..."再回复结果 |