Hermes Agent

🌐 Gateway 接入原理深度解析

深入理解 Hermes Gateway 的消息路由机制,Telegram/Discord/Slack Bot 的完整配置原理、踩坑记录与生产部署方案。

🏗️ 1. Gateway 架构原理

Gateway 是 Hermes Agent 的接入适配层,负责将不同平台的消息协议统一转换为 Agent 可处理的标准格式,再将 Agent 的响应转换回平台格式发送出去。

平台消息层
Telegram Update Discord Event Slack Event Email
↓ 原始事件 → Gateway 接收
Gateway 适配层
消息解析 / 权限校验 格式标准化 会话上下文管理
↓ 标准格式 → Agent Core
Agent Core
Agent Loop 工具执行 模型推理
↑ 响应格式化后回传给平台

消息流转机制

每条消息经历以下处理流程:

  1. 接收:Gateway 通过 Polling 或 Webhook 接收平台推送的原始事件
  2. 鉴权:校验发送者是否在白名单中(防止陌生人滥用)
  3. 解析:提取消息文本、附件、发送者信息,转换为统一格式
  4. 路由:根据会话 ID 找到或创建对应的 Agent 上下文
  5. 执行:将消息传入 Agent Loop,等待响应
  6. 回复:将 Agent 响应格式化后,通过平台 API 发送回去
🔍 会话隔离设计:Gateway 为每个用户(或群组)维护独立的 Agent 上下文,不同用户的对话互不干扰。这意味着每个用户都有自己的对话历史和工具执行状态。
🔵

2. Telegram 深度解析

最简单的接入方式,Polling 模式无需公网 IP,适合快速验证和个人使用

创建 Bot 与获取 Token

  1. 通过 @BotFather 创建 Bot
    在 Telegram 中搜索 @BotFather,发送 /newbot,依次输入 Bot 显示名称和用户名(必须以 bot 结尾)。BotFather 会返回 Bot Token,格式为 123456789:ABCdef...
  2. 配置 Hermes Gateway
    bash
    hermes gateway setup   # 选择 Telegram,粘贴 Token
    # 或直接配置
    hermes config set TELEGRAM_BOT_TOKEN 123456789:ABCdef...
  3. 配置白名单(强烈建议)
    通过 @userinfobot 获取自己的 Telegram User ID,在配置中添加白名单,防止陌生人调用你的 Agent 消耗 API 额度。
  4. 启动并验证
    bash
    hermes gateway start
    hermes gateway status   # 确认 Running 状态
    找到你的 Bot,发送 /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 权限机制才能正确配置

  1. 创建 Discord Application
    访问 Discord Developer Portal,点击「New Application」,输入名称后进入应用设置页。
  2. 创建 Bot 并获取 Token
    左侧菜单选「Bot」→「Add Bot」→「Reset Token」获取 Token。Token 只显示一次,立即保存。
  3. 开启 Message Content Intent(关键步骤)
    在 Bot 设置页面,找到「Privileged Gateway Intents」,开启 Message Content Intent。不开启此项,Bot 将无法读取用户消息内容。
  4. 生成邀请链接并加入服务器
    「OAuth2 → URL Generator」中勾选 bot + applications.commands,Bot Permissions 勾选「Send Messages」「Read Message History」「Use Slash Commands」,复制链接邀请 Bot 加入你的服务器。
  5. 配置 Hermes Gateway
    bash
    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 即可接收实时消息

  1. 创建 Slack App
    访问 Slack API,「Create New App」→「From scratch」,选择工作区。
  2. 配置 OAuth Scopes
    「OAuth & Permissions → Scopes → Bot Token Scopes」添加:chat:writechannels:historyim:historyim:writeapp_mentions:read
  3. 安装到工作区获取 Bot Token
    「Install to Workspace」授权后,获取以 xoxb- 开头的 Bot User OAuth Token。
  4. 开启 Socket Mode(推荐)
    「Socket Mode」→ 开启,生成以 xapp- 开头的 App-Level Token。Socket Mode 让 Slack 主动推送事件到你的进程,无需公网 IP。
  5. 订阅事件
    「Event Subscriptions」→ 开启,订阅 message.im(私信)和 app_mention(@提及)事件。
  6. 配置 Hermes Gateway
    bash
    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 工具调用耗时过长 配置平台消息超时,先发"处理中..."再回复结果

Hermes Agent 平台接入常见问题

Gateway 接入 FAQ

Hermes Agent 支持哪些平台接入?

Hermes Agent 通过 Gateway 适配层支持 Telegram、Discord、Slack 三大主流平台接入,同时架构设计允许扩展接入其他平台如 Email、微信等。每个平台都有对应的消息协议转换器,将平台特有的消息格式统一转换为 Agent 可处理的标准格式。

Telegram Bot 接入需要公网 IP 吗?

不需要。Hermes Gateway 默认使用 Long Polling 模式,由 Bot 主动向 Telegram 服务器轮询新消息,因此无需公网 IP 和 HTTPS 证书。只有在高并发生产环境(100+ 并发用户)下,才建议切换到 Webhook 模式,此时才需要公网 IP。

Discord Bot 收不到消息内容怎么办?

这是最常见的 Discord 踩坑问题。2022 年 9 月后 Discord 强制要求 Bot 申请 Message Content Intent 才能读取消息内容。解决方法是进入 Discord Developer Portal → Bot 设置页 → Privileged Gateway Intents,开启 Message Content Intent 即可。

Slack Socket Mode 和 Webhook 模式有什么区别?

Socket Mode 通过 WebSocket 长连接让 Slack 服务器主动推送事件到你的进程,无需公网 IP,配置更简单,适合大多数场景。Webhook 模式需要一个公网可访问的 HTTPS 端点,适合已有公网服务器的生产环境。对于 Hermes Agent 用户,推荐使用 Socket Mode。

多个平台可以同时接入同一个 Agent 吗?

可以。Hermes Gateway 支持多平台并行运行,在 config.yaml 中同时配置 Telegram 和 Discord 等多个 Gateway,所有平台共享同一个 Agent 实例。需要注意多平台并行时共享 API 额度,大量并发请求可能触发速率限制。