消息网关
通过 Telegram、Discord、Slack、WhatsApp、Signal、SMS、电子邮件、Home Assistant、Mattermost、Matrix、钉钉(DingTalk)、飞书(Feishu/Lark)、企业微信(WeCom)、微信(Weixin)、BlueBubbles(iMessage)、QQ、元宝(Yuanbao)、Microsoft Teams、LINE 或您的浏览器与 Hermes 聊天。网关是一个单一的后台进程,连接您配置的所有平台,处理会话(session),运行定时任务(cron job),并传递语音消息。
关于完整的语音功能集 — 包括 CLI 麦克风模式、消息中的语音回复以及 Discord 语音频道对话 — 请参阅语音模式和使用语音模式与 Hermes。
平台对比
| 平台 | 语音 | 图片 | 文件 | 线程 | 反应 | 输入状态 | 流式输出 |
|---|---|---|---|---|---|---|---|
| Telegram | ✅ | ✅ | ✅ | ✅ | — | ✅ | ✅ |
| Discord | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Slack | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Google Chat | — | ✅ | ✅ | ✅ | — | ✅ | — |
| — | ✅ | ✅ | — | — | ✅ | ✅ | |
| Signal | — | ✅ | ✅ | — | — | ✅ | ✅ |
| SMS | — | — | — | — | — | — | — |
| 电子邮件 | — | ✅ | ✅ | ✅ | — | — | — |
| Home Assistant | — | — | — | — | — | — | — |
| Mattermost | ✅ | ✅ | ✅ | ✅ | — | ✅ | ✅ |
| Matrix | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| 钉钉 | — | ✅ | ✅ | — | ✅ | — | ✅ |
| 飞书/Lark | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| 企业微信 | ✅ | ✅ | ✅ | — | — | ✅ | ✅ |
| 企业微信回调 | — | — | — | — | — | — | — |
| 微信 | ✅ | ✅ | ✅ | — | — | ✅ | ✅ |
| BlueBubbles | — | ✅ | ✅ | — | ✅ | ✅ | — |
| ✅ | ✅ | ✅ | — | — | ✅ | — | |
| 元宝 | ✅ | ✅ | ✅ | — | — | ✅ | ✅ |
| Microsoft Teams | — | ✅ | — | ✅ | — | ✅ | — |
| LINE | — | ✅ | ✅ | — | — | ✅ | — |
语音 = TTS 音频回复和/或语音消息转录。图片 = 发送/接收图片。文件 = 发送/接收文件附件。线程 = 线程化对话。反应 = 消息上的表情反应。输入状态 = 处理时显示输入指示器。流式输出 = 通过编辑实现渐进式消息更新。
架构
flowchart TB
subgraph Gateway["Hermes 网关"]
subgraph Adapters["平台适配器"]
tg[Telegram]
dc[Discord]
wa[WhatsApp]
sl[Slack]
gc[Google Chat]
sig[Signal]
sms[SMS]
em[Email]
ha[Home Assistant]
mm[Mattermost]
mx[Matrix]
dt[钉钉]
fs[飞书/Lark]
wc[企业微信]
wcb[企业微信回调]
wx[微信]
bb[BlueBubbles]
qq[QQ]
yb[元宝]
ms[Microsoft Teams]
api["API 服务器<br/>(兼容 OpenAI)"]
wh[Webhook]
end
store["会话存储<br/>每个聊天"]
agent["AIAgent<br/>run_agent.py"]
cron["定时调度器<br/>每 60 秒执行"]
end
tg --> store
dc --> store
wa --> store
sl --> store
gc --> store
sig --> store
sms --> store
em --> store
ha --> store
mm --> store
mx --> store
dt --> store
fs --> store
wc --> store
wcb --> store
wx --> store
bb --> store
qq --> store
yb --> store
ms --> store
api --> store
wh --> store
store --> agent
cron --> store
每个平台适配器接收消息,通过按聊天隔离的会话存储(session store)路由消息,并将消息分发给 AIAgent 进行处理。网关还运行定时调度器,每 60 秒执行一次到期的任务。
快速设置
配置消息平台最简单的方式是使用交互式向导:
hermes gateway setup # 所有消息平台的交互式设置该向导将引导您使用方向键选择配置每个平台,显示哪些平台已配置,并在完成后提供启动/重启网关的选项。
网关命令
hermes gateway # 前台运行
hermes gateway setup # 交互式配置消息平台
hermes gateway install # 安装为用户服务(Linux)/ launchd 服务(macOS)
sudo hermes gateway install --system # 仅 Linux:安装开机自启系统服务
hermes gateway start # 启动默认服务
hermes gateway stop # 停止默认服务
hermes gateway status # 检查默认服务状态
hermes gateway status --system # 仅 Linux:显式检查系统服务聊天命令(消息平台内)
| 命令 | 描述 |
|---|---|
/new 或 /reset | 开始新对话 |
/model [provider:model] | 查看或切换模型(支持 provider:model 语法) |
/personality [name] | 设置个性 |
/retry | 重试上一条消息 |
/undo | 删除上一轮对话 |
/status | 显示会话信息 |
/whoami | 显示您在当前作用域(scope)的斜杠命令访问级别(管理员/用户/无限制) |
/stop | 停止正在运行的 agent |
/approve | 批准待处理的危险命令 |
/deny | 拒绝待处理的危险命令 |
/sethome | 将此聊天设为主频道 |
/compress | 手动压缩对话上下文 |
/title [name] | 设置或查看会话标题 |
/resume [name] | 恢复之前命名的会话 |
/usage | 显示当前会话的 token 用量 |
/insights [days] | 显示使用情况洞察和分析 |
/reasoning [level|show|hide] | 更改推理强度或切换推理过程显示 |
/voice [on|off|tts|join|leave|status] | 控制消息语音回复和 Discord 语音频道行为 |
/rollback [number] | 列出或恢复文件系统检查点 |
/background <prompt> | 在独立的后台会话中运行提示词 |
/reload-mcp | 从配置重新加载 MCP 服务器 |
/update | 将 Hermes Agent 更新到最新版本 |
/help | 显示可用命令 |
/<skill-name> | 调用任意已安装的技能 |
会话管理
会话持久化
会话在重置之前会持续存在。Agent 会记住您的对话上下文。
重置策略
会话根据可配置的策略进行重置:
| 策略 | 默认值 | 描述 |
|---|---|---|
| 每日 | 凌晨 4:00 | 每天在指定时间重置 |
| 空闲 | 1440 分钟 | 在 N 分钟无活动后重置 |
| 两者 | (组合) | 以先触发的为准 |
在 ~/.hermes/gateway.json 中配置按平台的覆盖规则:
{
"reset_by_platform": {
"telegram": { "mode": "idle", "idle_minutes": 240 },
"discord": { "mode": "idle", "idle_minutes": 60 }
}
}安全
默认情况下,网关拒绝所有不在白名单(allowlist)中或未通过 DM 配对的用户。 这是对有终端访问权限的 bot 的安全默认设置。
# 限制为特定用户(推荐):
TELEGRAM_ALLOWED_USERS=123456789,987654321
DISCORD_ALLOWED_USERS=123456789012345678
SIGNAL_ALLOWED_USERS=+155****4567,+155****6543
SMS_ALLOWED_USERS=+155****4567,+155****6543
EMAIL_ALLOWED_USERS=trusted@example.com,colleague@work.com
MATTERMOST_ALLOWED_USERS=3uo8dkh1p7g1mfk49ear5fzs5c
MATRIX_ALLOWED_USERS=@alice:matrix.org
DINGTALK_ALLOWED_USERS=user-id-1
FEISHU_ALLOWED_USERS=ou_xxxxxxxx,ou_yyyyyyyy
WECOM_ALLOWED_USERS=user-id-1,user-id-2
WECOM_CALLBACK_ALLOWED_USERS=user-id-1,user-id-2
TEAMS_ALLOWED_USERS=aad-object-id-1,aad-object-id-2
# 或全局允许
GATEWAY_ALLOWED_USERS=123456789,987654321
# 或显式允许所有用户(对于有终端访问权限的 bot 不推荐):
GATEWAY_ALLOW_ALL_USERS=trueDM 配对(白名单的替代方案)
无需手动配置用户 ID,未知用户在 DM 机器人时会收到一次性配对码:
# 用户看到:"Pairing code: XKGH5N7P"
# 您通过以下方式批准:
hermes pairing approve telegram XKGH5N7P
# 其他配对命令:
hermes pairing list # 查看待处理 + 已批准的用户
hermes pairing revoke telegram 123456789 # 移除访问权限配对码 1 小时后过期,有速率限制,并使用加密随机数生成。
管理员与普通用户
白名单回答的是”此人能否联系到机器人?“的问题。管理员/用户分拆回答的是”既然他们能进来,他们可以做什么?“的问题。
每个被允许的用户在每个作用域(DM 与群组/频道)中属于两个层级之一:
- 管理员 — 完全访问权限。可以运行所有已注册的斜杠命令(内置 + 插件)并使用所有受控功能。
- 普通用户 — 受限访问权限。可以正常与 agent 聊天,但只能运行您显式启用的斜杠命令。始终允许的基础命令是
/help和/whoami。
层级按平台和作用域分别配置。DM 管理员身份并不等同于群组/频道管理员身份——每个作用域都有自己的管理员列表。
当前层级控制的内容: 斜杠命令。这种分拆通过实时命令注册表运行,因此涵盖内置命令和插件注册的命令,无需逐个功能配置。普通聊天不受影响——非管理员仍可与 agent 对话。
未来可能控制的内容: 更多功能面(工具访问、模型切换、高开销操作)将挂接到相同的管理员/用户区分上。现在配置好分拆,未来这些限制就能干净地落地,而无需您重新建模谁是谁。
配置
gateway:
platforms:
discord:
extra:
allow_from: ["111", "222", "333"]
allow_admin_from: ["111"] # 管理员 → 所有斜杠命令
user_allowed_commands: [status, model] # 非管理员可运行的命令
# 可选:独立的群组/频道作用域
group_allow_admin_from: ["111"]
group_user_allowed_commands: [status]向后兼容: 如果某个作用域未设置 allow_admin_from,则该作用域的层级分拆被禁用,每个被允许的用户拥有完全访问权限。现有安装无需任何更改即可继续工作——当您需要此区分时再选择启用。
查看您的访问权限
在任何平台使用 /whoami 查看当前作用域、您的层级(管理员/用户/无限制)以及您可以运行的斜杠命令。请参阅 Telegram 和 Discord 页面了解平台特定示例。
中断 Agent
当 agent 正在工作时发送任意消息即可中断它。关键行为:
- 正在进行的终端命令被立即终止(先 SIGTERM,1 秒后 SIGKILL)
- 工具调用被取消——只有当前正在执行的工具会运行,其余被跳过
- 多条消息被合并——中断期间发送的消息被合并为一条提示词
/stop命令——中断而不排队后续消息
队列 vs 中断 vs 引导(忙碌输入模式)
默认情况下,向忙碌的 agent 发送消息会中断它。另外两种模式可用:
queue(队列)— 后续消息等待,在当前任务完成后作为下一轮运行。steer(引导)— 后续消息通过/steer注入到当前运行中,在下一个工具调用后到达 agent。不会中断,不会开启新的一轮。如果 agent 尚未开始,则回退到queue行为。
display:
busy_input_mode: steer # 或 queue,或 interrupt(默认)
busy_ack_enabled: true # 设为 false 可完全关闭 ⚡/⏳/⏩ 聊天回复您第一次在任何平台向忙碌的 agent 发送消息时,Hermes 会在忙碌确认消息后附加一行提示告知此设置(”💡 首次提示 — …“)。该提示每个安装触发一次——onboarding.seen.busy_input_prompt 标志会记住此状态。删除该键可再次看到提示。
如果您觉得忙碌确认消息过于嘈杂——尤其是在语音输入或快速连续发送消息时——请设置 display.busy_ack_enabled: false。您的输入仍然会正常排队/引导/中断,只是聊天回复被静音。
工具进度通知
在 ~/.hermes/config.yaml 中控制工具活动的显示程度:
display:
tool_progress: all # off | new | all | verbose
tool_progress_command: false # 设为 true 可在消息中启用 /verbose 命令启用后,机器人会在工作时发送状态消息:
💻 `ls -la`...
🔍 web_search...
📄 web_extract...
🐍 execute_code...后台会话
在独立的后台会话中运行提示词,让 agent 独立工作,同时您的主聊天保持响应:
/background 检查集群中所有服务器,报告任何宕机的服务器
Hermes 立即确认:
🔄 后台任务已启动:"检查集群中所有服务器..."
任务 ID: bg_143022_a1b2c3
工作原理
每个 /background 提示词会生成一个独立的 agent 实例,异步运行:
- 隔离的会话 — 后台 agent 拥有自己的会话和对话历史。它不知道您当前聊天的上下文,只接收您提供的提示词。
- 相同的配置 — 继承当前网关设置中的模型、提供商、工具集、推理设置和提供商路由。
- 非阻塞 — 您的主聊天保持完全交互。在工作进行期间发送消息、运行其他命令或启动更多后台任务。
- 结果交付 — 任务完成后,结果会发送回您发出命令的同一聊天或频道,前缀为”✅ 后台任务完成”。如果失败,您会看到”❌ 后台任务失败”及错误信息。
后台进程通知
当运行后台会话的 agent 使用 terminal(background=true) 启动长时间运行的进程(服务器、构建等)时,网关可以将状态更新推送到您的聊天中。通过 ~/.hermes/config.yaml 中的 display.background_process_notifications 控制:
display:
background_process_notifications: all # all | result | error | off| 模式 | 您收到的内容 |
|---|---|
all | 运行中的输出更新和最终完成消息(默认) |
result | 仅最终完成消息(无论退出码如何) |
error | 仅在退出码非零时发送最终消息 |
off | 没有任何进程监视器消息 |
您也可以通过环境变量设置:
HERMES_BACKGROUND_NOTIFICATIONS=result使用场景
- 服务器监控 — “/background 检查所有服务的健康状态,如有宕机请提醒我”
- 长时间构建 — “/background 构建并部署预发布环境”,同时继续聊天
- 研究任务 — “/background 研究竞争对手定价并汇总为表格”
- 文件操作 — “/background 将 ~/Downloads 中的照片按日期整理到文件夹中”
:::tip 消息平台上的后台任务是”发后即忘”的——您无需等待或检查。任务完成时结果会自动出现在同一聊天中。 :::
服务管理
Linux(systemd)
hermes gateway install # 安装为用户服务
hermes gateway start # 启动服务
hermes gateway stop # 停止服务
hermes gateway status # 检查状态
journalctl --user -u hermes-gateway -f # 查看日志
# 启用持续运行(注销后仍保持运行)
sudo loginctl enable-linger $USER
# 或安装开机启动的系统服务(仍以您的用户身份运行)
sudo hermes gateway install --system
sudo hermes gateway start --system
sudo hermes gateway status --system
journalctl -u hermes-gateway -f在笔记本电脑和开发机上使用用户服务。在 VPS 或无头主机上使用系统服务,以便在启动时自动恢复,无需依赖 systemd linger。
除非确实需要,否则避免同时安装用户服务和系统服务网关单元。如果 Hermes 检测到两者均已安装,会发出警告,因为启动/停止/状态行为会变得不明确。
:::info 多个安装
如果您在同一台机器上运行多个 Hermes 安装(使用不同的 HERMES_HOME 目录),每个安装都有自己的 systemd 服务名称。默认的 ~/.hermes 使用 hermes-gateway;其他安装使用 hermes-gateway-<hash>。hermes gateway 命令会自动针对您当前 HERMES_HOME 对应的正确服务进行操作。
:::
macOS(launchd)
hermes gateway install # 安装为 launchd agent
hermes gateway start # 启动服务
hermes gateway stop # 停止服务
hermes gateway status # 检查状态
tail -f ~/.hermes/logs/gateway.log # 查看日志生成的 plist 位于 ~/Library/LaunchAgents/ai.hermes.gateway.plist。它包含三个环境变量:
- PATH — 安装时的完整 shell PATH,前面加上 venv
bin/和node_modules/.bin。这确保用户安装的工具(Node.js、ffmpeg 等)可被网关子进程(如 WhatsApp 桥接器)使用。 - VIRTUAL_ENV — 指向 Python 虚拟环境,使工具能正确解析包。
- HERMES_HOME — 将网关限定到您的 Hermes 安装。
:::tip 安装后 PATH 更改
launchd plist 是静态的——如果您在设置网关后安装了新工具(例如通过 nvm 安装新版本的 Node.js,或通过 Homebrew 安装 ffmpeg),请再次运行 hermes gateway install 以捕获更新的 PATH。网关会检测到过期的 plist 并自动重新加载。
:::
:::info 多个安装
与 Linux systemd 服务类似,每个 HERMES_HOME 目录都有自己的 launchd 标签。默认的 ~/.hermes 使用 ai.hermes.gateway;其他安装使用 ai.hermes.gateway-<suffix>。
:::
平台特定工具集
每个平台都有自己的工具集:
| 平台 | 工具集 | 能力 |
|---|---|---|
| CLI | hermes-cli | 完全访问 |
| Telegram | hermes-telegram | 完整工具,包含终端 |
| Discord | hermes-discord | 完整工具,包含终端 |
hermes-whatsapp | 完整工具,包含终端 | |
| Slack | hermes-slack | 完整工具,包含终端 |
| Google Chat | hermes-google_chat | 完整工具,包含终端 |
| Signal | hermes-signal | 完整工具,包含终端 |
| SMS | hermes-sms | 完整工具,包含终端 |
| 电子邮件 | hermes-email | 完整工具,包含终端 |
| Home Assistant | hermes-homeassistant | 完整工具 + HA 设备控制(ha_list_entities, ha_get_state, ha_call_service, ha_list_services) |
| Mattermost | hermes-mattermost | 完整工具,包含终端 |
| Matrix | hermes-matrix | 完整工具,包含终端 |
| 钉钉 | hermes-dingtalk | 完整工具,包含终端 |
| 飞书/Lark | hermes-feishu | 完整工具,包含终端 |
| 企业微信 | hermes-wecom | 完整工具,包含终端 |
| 企业微信回调 | hermes-wecom-callback | 完整工具,包含终端 |
| 微信 | hermes-weixin | 完整工具,包含终端 |
| BlueBubbles | hermes-bluebubbles | 完整工具,包含终端 |
| QQBot | hermes-qqbot | 完整工具,包含终端 |
| 元宝 | hermes-yuanbao | 完整工具,包含终端 |
| Microsoft Teams | hermes-teams | 完整工具,包含终端 |
| API 服务器 | hermes-api-server | 完整工具(移除了 clarify、send_message、text_to_speech——程序化访问没有交互式用户) |
| Webhook | hermes-webhook | 完整工具,包含终端 |
运营多平台网关
一个网关通常同时运行多个适配器(Telegram + Discord + Slack 等)。以下部分涵盖跨所有平台的日常运营操作。
/platform 命令
网关运行后,使用 /platform 斜杠命令从任何连接的 CLI 会话或聊天中检查和操控各个适配器,无需重启整个网关:
/platform list # 显示所有适配器及其状态
/platform pause <name> # 停止向某个适配器分发新消息
/platform resume <name> # 重新启用暂停的适配器
/platform list 显示每个适配器是 running(运行中)、paused(手动暂停)还是 paused-by-breaker(断路器暂停,见下文)。暂停会让适配器保持加载状态,其后台循环保持存活——传入消息被丢弃,但连接本身保持开启,因此恢复是即时的。
另请参阅更广泛的状态汇总命令 /platforms。
自动断路器
每个适配器都包含一个断路器。重复的可重试故障(网络波动、速率限制回复、5xx 上游响应、WebSocket 断开连接)会导致断路器跳闸——适配器自动暂停,当配置了主频道时,会向另一个在线平台的主频道发送操作员通知,并输出结构化的日志行。
断路器不会自动恢复——它会保持断开状态,直到您手动运行 /platform resume <name>。这是有意为之:如果某个平台持续故障,您不希望网关反复重连。
平台暂停时如何排查
当适配器暂停时,请检查:
- 网关日志(
~/.hermes/logs/gateway.log或 systemd/launchd 单元日志)。搜索平台名称和circuit breaker、paused或disabled。跳闸事件包括失败次数和最后的错误。 /platform list输出 — 显示当前状态和最后原因。- 提供商的状态页面(Telegram bot API 状态、Discord 状态等)。断路器跳闸是因为平台不健康;在它恢复之前不要尝试恢复适配器。
一旦上游恢复健康,/platform resume <name> 会清除断路器并重新启用适配器。
重启通知
当网关重启(或关闭时仍有进行中的会话)时,它可以将一次性的”agent 已返回”/“agent 被中断”消息发送到每个平台的主频道。这由 gateway-config.yaml 中的 gateway_restart_notification 标志控制,默认为 true:
gateway:
platforms:
telegram:
home_chat_id: "123456789"
gateway_restart_notification: false # 对此平台选择退出
discord:
home_chat_id: "987654321"
# gateway_restart_notification 省略 → 默认为 true在嘈杂或低优先级的平台上禁用它,同时在您的主要聊天中保持开启。无论有多少会话在进行中,每次重启只发送一次通知。
网关重启后的会话恢复
当网关关闭时,如果存在进行中的工具调用或生成,受影响的会话会被标记为 restart_interrupted。下次启动时,网关会为每个会话安排自动恢复——用户会在聊天中收到简短的提示(“重启后发送任何消息,我将尝试从您离开的地方继续。”),当他们回复时,会话会从上次已提交的回合继续。
此行为默认开启,并在网关启动时记录日志:
Scheduled auto-resume for N restart-interrupted session(s)
无需配置。如果您不希望看到提示,在平台上设置 gateway_restart_notification: false。
进度气泡清理(选择加入)
工具进度消息、“仍在工作…”心跳和状态回调气泡可以在最终响应送达后自动删除。通过 display.platforms.<platform>.cleanup_progress 按平台启用:
display:
platforms:
telegram:
cleanup_progress: true
discord:
cleanup_progress: true默认为 false。只有其适配器实现了 delete_message 的平台才支持此设置(目前为 Telegram 和 Discord)。失败的运行跳过清理,气泡保留为线索。