Skip to main content

Slack 集成设置

将 Hermes Agent 通过 Socket Mode 连接到 Slack 作为机器人。Socket Mode 使用 WebSocket 而非公开的 HTTP 端点,因此你的 Hermes 实例无需对外公开 —— 它可以在防火墙后、你的笔记本电脑上或私有服务器上正常运行。

经典 Slack 应用已弃用

经典 Slack 应用(使用 RTM API)已于 2025 年 3 月起完全弃用。Hermes 使用现代 Bolt SDK 的 Socket Mode。如果你拥有旧版经典应用,请按照以下步骤创建新应用。

概览

组件
slack-bolt / slack_sdk(Python,Socket Mode)
连接方式WebSocket —— 不需要公网 URL
所需认证令牌Bot Token(xoxb-) + App-Level Token(xapp-
用户识别Slack 成员 ID(例如:U01ABC2DEF3

第一步:创建 Slack 应用

  1. 访问 https://api.slack.com/apps
  2. 点击 创建新应用
  3. 选择 从零开始
  4. 输入应用名称(如:“Hermes Agent”),并选择你的工作区
  5. 点击 创建应用

你将进入应用的 基本信息 页面。


第二步:配置 Bot Token 权限范围

在侧边栏中导航至 功能 → OAuth 与权限。滚动到 权限 → Bot Token 权限范围,添加以下权限:

权限范围用途
chat:write以机器人身份发送消息
app_mentions:read检测是否在频道中被 @ 提及
channels:history读取机器人所在公共频道中的消息
channels:read列出并获取公共频道的信息
groups:history读取机器人受邀加入的私有频道中的消息
im:history读取直接消息历史记录
im:read查看基本的 DM 信息
im:write打开和管理 DM
users:read查找用户信息
files:read读取和下载附件(包括语音笔记/音频)
files:write上传文件(图片、音频、文档)
缺失权限 = 功能缺失

如果没有 channels:historygroups:history,机器人将 无法接收频道中的消息 —— 只能在私聊中工作。这是最常见的遗漏项。

可选权限:

权限范围用途
groups:read列出并获取私有频道的信息

第三步:启用 Socket Mode

Socket Mode 允许机器人通过 WebSocket 连接,而无需公网 URL。

  1. 在侧边栏中,进入 设置 → Socket Mode
  2. 启用 Socket Mode 开关设为 开启
  3. 系统会提示你创建一个 App-Level Token
    • 命名为类似 hermes-socket(名称无关紧要)
    • 添加 connections:write 权限范围
    • 点击 生成
  4. 复制该令牌 —— 它以 xapp- 开头。这就是你的 SLACK_APP_TOKEN
tip

你始终可以在 设置 → 基本信息 → App-Level Tokens 中找到或重新生成应用级令牌。


第四步:订阅事件

此步骤至关重要 —— 它决定了机器人能看到哪些消息。

  1. 在侧边栏中,进入 功能 → 事件订阅
  2. 启用事件 开关设为 开启
  3. 展开 订阅机器人事件,添加以下内容:
事件是否必需用途
message.im机器人接收来自用户的直接消息
message.channels机器人接收其被加入的 公共频道 中的消息
message.groups建议机器人接收其被邀请加入的 私有频道 中的消息
app_mention防止当机器人被 @ 提及时出现 Bolt SDK 错误
  1. 点击页面底部的 保存更改
未订阅事件是设置失败的首要原因

如果机器人在私聊中可以工作,但在 频道中无法响应,几乎可以肯定是忘记了添加 message.channels(公共频道)和/或 message.groups(私有频道)。没有这些事件订阅,Slack 根本不会将频道消息传递给机器人。


第五步:启用消息标签页

此步骤允许用户直接向机器人发送消息。若不启用,用户尝试私聊时会看到 “向此应用发送消息已被关闭” 的提示。

  1. 在侧边栏中,进入 功能 → 应用主页
  2. 向下滚动至 显示标签页
  3. 消息标签页 开关设为 开启
  4. 勾选 “允许用户通过消息标签页发送 Slash 命令和消息”
若跳过此步骤,私聊将完全被阻止

即使所有权限和事件订阅都正确,Slack 也不会允许用户向机器人发送私聊消息,除非启用了消息标签页。这是 Slack 平台的要求,而非 Hermes 的配置问题。


第六步:将应用安装到工作区

  1. 在侧边栏中,进入 设置 → 安装应用
  2. 点击 安装到工作区
  3. 查看权限列表,点击 允许
  4. 授权成功后,你会看到一个以 xoxb- 开头的 Bot User OAuth Token
  5. 复制此令牌 —— 这就是你的 SLACK_BOT_TOKEN
tip

如果你之后修改了权限范围或事件订阅,必须重新安装应用 才能使更改生效。安装页面会显示提示 banner,提醒你执行此操作。


第七步:查找允许列表中的用户 ID

Hermes 使用 Slack 成员 ID(而非用户名或显示名)进行允许列表控制。

要查找成员 ID:

  1. 在 Slack 中点击某用户的姓名或头像
  2. 点击 查看完整资料
  3. 点击 (更多)按钮
  4. 选择 复制成员 ID

成员 ID 的格式如 U01ABC2DEF3。至少需要包含你自己的成员 ID。


第八步:配置 Hermes

将以下内容添加到你的 ~/.hermes/.env 文件中:

# Required
SLACK_BOT_TOKEN=xoxb-your-bot-token-here
SLACK_APP_TOKEN=xapp-your-app-token-here
SLACK_ALLOWED_USERS=U01ABC2DEF3 # Comma-separated Member IDs

# Optional
SLACK_HOME_CHANNEL=C01234567890 # Default channel for cron/scheduled messages
SLACK_HOME_CHANNEL_NAME=general # Human-readable name for the home channel (optional)

或运行交互式设置:

hermes gateway setup    # Select Slack when prompted

然后启动网关:

hermes gateway              # Foreground
hermes gateway install # Install as a user service
sudo hermes gateway install --system # Linux only: boot-time system service

第九步:将机器人邀请至频道

启动网关后,你需要 手动将机器人邀请至 你希望它响应的每个频道:

/invite @Hermes Agent

机器人将 不会自动加入 频道。你必须为每个频道单独邀请。


机器人响应机制说明

了解 Hermes 在不同场景下的行为表现:

场景行为
私聊机器人对每条消息作出响应 —— 无需 @ 提及
频道机器人 仅在被 @ 提及 时响应(例如:@Hermes Agent what time is it?)。在频道中,Hermes 会在该消息的线程中回复。
线程如果你在已有线程中 @ 提及 Hermes,它将在同一线程中回复。一旦机器人在某个线程中建立了活跃会话,后续在该线程中的回复无需再次 @ 提及 —— 机器人会自然跟进对话。
tip

在频道中,始终需 @ 提及机器人以开启对话。一旦机器人在某个线程中活跃,即可在该线程内自由回复而无需提及。在非线程环境下,未 @ 提及的消息会被忽略,以避免在繁忙频道中产生噪音。


配置选项

除了第八步所需的环境变量外,你还可以通过 ~/.hermes/config.yaml 自定义 Slack 机器人的行为。

线程与回复行为

platforms:
slack:
# Controls how multi-part responses are threaded
# "off" — never thread replies to the original message
# "first" — first chunk threads to user's message (default)
# "all" — all chunks thread to user's message
reply_to_mode: "first"

extra:
# Whether to reply in a thread (default: true).
# When false, channel messages get direct channel replies instead
# of threads. Messages inside existing threads still reply in-thread.
reply_in_thread: true

# Also post thread replies to the main channel
# (Slack's "Also send to channel" feature).
# Only the first chunk of the first reply is broadcast.
reply_broadcast: false
默认值描述
platforms.slack.reply_to_mode"first"多部分消息的线程模式:"off""first""all"
platforms.slack.extra.reply_in_threadtrue当其设为 false 时,频道消息会直接回复到频道,而不是新建线程。已经处于现有线程中的消息仍会在线程内回复。
platforms.slack.extra.reply_broadcastfalse当其设为 true 时,线程回复也会同步广播到主频道。只有首条回复的第一个片段会被广播。

会话隔离

# Global setting — applies to Slack and all other platforms
group_sessions_per_user: true

当设置为 true(默认值)时,共享频道中的每位用户都会拥有自己独立的对话会话。在 #general 这类共享频道中,两人与 Hermes 对话时会分别拥有独立的历史记录和上下文。

若希望启用协作模式,即整个频道共享一个统一的对话会话,请设为 false。请注意,这会导致所有用户共享上下文增长和 token 成本;任意用户触发的 /reset 都将清空全体用户的会话。

提及与触发行为

slack:
# Require @mention in channels (this is the default behavior;
# the Slack adapter enforces @mention gating in channels regardless,
# but you can set this explicitly for consistency with other platforms)
require_mention: true

# Custom mention patterns that trigger the bot
# (in addition to the default @mention detection)
mention_patterns:
- "hey hermes"
- "hermes,"

# Text prepended to every outgoing message
reply_prefix: ""
info

与 Discord 和 Telegram 不同,Slack 并没有等效于 free_response_channels 的功能。Slack 适配器要求通过 @mention 来启动频道内的对话。但一旦机器人在某个线程中建立了活跃会话,后续该线程中的回复无需再次提及。在私聊(DMs)中,机器人始终会响应,无需提及。

未授权用户处理

slack:
# What happens when an unauthorized user (not in SLACK_ALLOWED_USERS) DMs the bot
# "pair" — prompt them for a pairing code (default)
# "ignore" — silently drop the message
unauthorized_dm_behavior: "pair"

你也可以在全局范围内为所有平台设置:

unauthorized_dm_behavior: "pair"

平台特定的设置(位于 slack: 下)优先于全局设置。

语音转录

# Global setting — enable/disable automatic transcription of incoming voice messages
stt_enabled: true

当设置为 true(默认值)时,系统会自动使用配置的语音识别(STT)服务对传入的音频消息进行转录,再交由代理处理。

完整示例

# Global gateway settings
group_sessions_per_user: true
unauthorized_dm_behavior: "pair"
stt_enabled: true

# Slack-specific settings
slack:
require_mention: true
unauthorized_dm_behavior: "pair"

# Platform config
platforms:
slack:
reply_to_mode: "first"
extra:
reply_in_thread: true
reply_broadcast: false

主频道(Home Channel)

SLACK_HOME_CHANNEL 设置为一个频道 ID,Hermes 将在此频道中发送定时消息、cron 任务结果及其他主动通知。要获取频道 ID:

  1. 在 Slack 中右键点击频道名称
  2. 选择 查看频道详情
  3. 向下滚动 —— 频道 ID 位于页面底部
SLACK_HOME_CHANNEL=C01234567890

请确保机器人已 被邀请加入该频道/invite @Hermes Agent)。


多工作区支持

Hermes 可通过单个网关实例同时连接 多个 Slack 工作区。每个工作区均使用独立的机器人用户 ID 进行认证。

配置方式

SLACK_BOT_TOKEN 中以 逗号分隔列表 提供多个机器人令牌:

# Multiple bot tokens — one per workspace
SLACK_BOT_TOKEN=xoxb-workspace1-token,xoxb-workspace2-token,xoxb-workspace3-token

# A single app-level token is still used for Socket Mode
SLACK_APP_TOKEN=xapp-your-app-token

或在 ~/.hermes/config.yaml 中配置:

platforms:
slack:
token: "xoxb-workspace1-token,xoxb-workspace2-token"

OAuth 令牌文件

除了环境变量或配置文件中的令牌外,Hermes 还会从以下路径加载 OAuth 令牌文件

~/.hermes/slack_tokens.json

该文件是一个 JSON 对象,将团队 ID 映射到对应的令牌条目:

{
"T01ABC2DEF3": {
"token": "xoxb-workspace-token-here",
"team_name": "My Workspace"
}
}

此文件中的令牌将与通过 SLACK_BOT_TOKEN 指定的令牌合并,重复项会自动去重。

工作原理

  • 列表中的 第一个令牌 为主令牌,用于 Socket Mode 连接(AsyncApp)。
  • 启动时,每个令牌均通过 auth.test 进行身份验证,网关将每个 team_id 映射到其对应的 WebClientbot_user_id
  • 当收到消息时,Hermes 使用对应工作区的客户端进行响应。
  • bot_user_id(来自首个令牌)用于向后兼容那些期望单一机器人身份的功能。

语音消息支持

Hermes 支持 Slack 上的语音消息:

  • 接收端:语音/音频消息将自动通过配置的 STT 服务转录:本地 faster-whisper、Groq Whisper(GROQ_API_KEY)、或 OpenAI Whisper(VOICE_TOOLS_OPENAI_KEY
  • 发送端:TTS 响应将以音频文件附件形式发送

故障排查

问题解决方案
机器人不回应私聊确认 message.im 已订阅事件,并重新安装应用
机器人在私聊中正常,但在频道中无响应最常见问题。添加 message.channelsmessage.groups 到事件订阅,重新安装应用,并通过 /invite @Hermes Agent 将机器人邀请至频道
机器人忽略频道中的 @提及1) 检查是否订阅了 message.channels 事件;2) 机器人必须已加入频道;3) 确保已添加 channels:history 权限范围;4) 在更改权限或事件后重新安装应用
机器人忽略私有频道中的消息添加 message.groups 事件订阅和 groups:history 权限范围,然后重新安装应用并邀请机器人
私聊中提示“Sending messages to this app has been turned off”在应用主页设置中启用 Messages Tab(参见第 5 步)
出现 “not_authed” 或 “invalid_auth” 错误重新生成 Bot Token 和 App Token,并更新 .env
机器人能回复但无法发帖至频道通过 /invite @Hermes Agent 将机器人邀请至频道
出现 “missing_scope” 错误在 OAuth & Permissions 中添加所需权限范围,然后 重新安装 应用
Socket 频繁断开检查网络状况;Bolt 会自动重连,但不稳定连接会导致延迟
更改权限或事件后无变化必须重新安装 应用才能使权限或事件变更生效

快速检查清单

若机器人在频道中无法工作,请确认以下所有项目均已满足:

  1. ✅ 已订阅 message.channels 事件(公共频道)
  2. ✅ 已订阅 message.groups 事件(私有频道)
  3. ✅ 已订阅 app_mention 事件
  4. ✅ 已添加 channels:history 权限范围(公共频道)
  5. ✅ 已添加 groups:history 权限范围(私有频道)
  6. ✅ 在添加权限/事件后已重新安装应用
  7. ✅ 机器人已被邀请至频道(/invite @Hermes Agent
  8. ✅ 消息中已正确 @ 提及机器人

安全性

warning

务必设置 SLACK_ALLOWED_USERS,并填入授权用户成员 ID 列表。若未设置,网关将默认 拒绝所有消息,作为安全防护措施。切勿分享你的机器人令牌——应将其视为密码对待。

  • 令牌应存储于 ~/.hermes/.env(文件权限设为 600
  • 定期通过 Slack 应用设置轮换令牌
  • 审计谁有权访问你的 Hermes 配置目录
  • 使用 Socket Mode 时,不会暴露公网端点 —— 减少攻击面