消息网关

通过 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
WhatsApp
Signal
SMS
电子邮件
Home Assistant
Mattermost
Matrix
钉钉
飞书/Lark
企业微信
企业微信回调
微信
BlueBubbles
QQ
元宝
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=true

DM 配对(白名单的替代方案)

无需手动配置用户 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 查看当前作用域、您的层级(管理员/用户/无限制)以及您可以运行的斜杠命令。请参阅 TelegramDiscord 页面了解平台特定示例。

中断 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>。 :::

平台特定工具集

每个平台都有自己的工具集:

平台工具集能力
CLIhermes-cli完全访问
Telegramhermes-telegram完整工具,包含终端
Discordhermes-discord完整工具,包含终端
WhatsApphermes-whatsapp完整工具,包含终端
Slackhermes-slack完整工具,包含终端
Google Chathermes-google_chat完整工具,包含终端
Signalhermes-signal完整工具,包含终端
SMShermes-sms完整工具,包含终端
电子邮件hermes-email完整工具,包含终端
Home Assistanthermes-homeassistant完整工具 + HA 设备控制(ha_list_entities, ha_get_state, ha_call_service, ha_list_services)
Mattermosthermes-mattermost完整工具,包含终端
Matrixhermes-matrix完整工具,包含终端
钉钉hermes-dingtalk完整工具,包含终端
飞书/Larkhermes-feishu完整工具,包含终端
企业微信hermes-wecom完整工具,包含终端
企业微信回调hermes-wecom-callback完整工具,包含终端
微信hermes-weixin完整工具,包含终端
BlueBubbleshermes-bluebubbles完整工具,包含终端
QQBothermes-qqbot完整工具,包含终端
元宝hermes-yuanbao完整工具,包含终端
Microsoft Teamshermes-teams完整工具,包含终端
API 服务器hermes-api-server完整工具(移除了 clarifysend_messagetext_to_speech——程序化访问没有交互式用户)
Webhookhermes-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>。这是有意为之:如果某个平台持续故障,您不希望网关反复重连。

平台暂停时如何排查

当适配器暂停时,请检查:

  1. 网关日志~/.hermes/logs/gateway.log 或 systemd/launchd 单元日志)。搜索平台名称和 circuit breakerpauseddisabled。跳闸事件包括失败次数和最后的错误。
  2. /platform list 输出 — 显示当前状态和最后原因。
  3. 提供商的状态页面(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)。失败的运行跳过清理,气泡保留为线索。

下一步

此文件夹下有26条笔记。