Slack 集成设置
将 Hermes Agent 通过 Socket Mode 连接到 Slack 作为机器人。Socket Mode 使用 WebSocket 而非公开的 HTTP 端点,因此你的 Hermes 实例无需对外公开 —— 它可以在防火墙后、你的笔记本电脑上或私有服务器上正常运行。
经典 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 应用
- 访问 https://api.slack.com/apps
- 点击 创建新应用
- 选择 从零开始
- 输入应用名称(如:“Hermes Agent”),并选择你的工作区
- 点击 创建应用
你将进入应用的 基本信息 页面。
第二步:配置 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:history 和 groups:history,机器人将 无法接收频道中的消息 —— 只能在私聊中工作。这是最常见的遗漏项。
可选权限:
| 权限范围 | 用途 |
|---|---|
groups:read | 列出并获取私有频道的信息 |
第三步:启用 Socket Mode
Socket Mode 允许机器人通过 WebSocket 连接,而无需公网 URL。
- 在侧边栏中,进入 设置 → Socket Mode
- 将 启用 Socket Mode 开关设为 开启
- 系统会提示你创建一个 App-Level Token:
- 命名为类似
hermes-socket(名称无关紧要) - 添加
connections:write权限范围 - 点击 生成
- 命名为类似
- 复制该令牌 —— 它以
xapp-开头。这就是你的SLACK_APP_TOKEN
你始终可以在 设置 → 基本信息 → App-Level Tokens 中找到或重新生成应用级令牌。
第四步:订阅事件
此步骤至关重要 —— 它决定了机器人能看到哪些消息。
- 在侧边栏中,进入 功能 → 事件订阅
- 将 启用事件 开关设为 开启
- 展开 订阅机器人事件,添加以下内容:
| 事件 | 是否必需 | 用途 |
|---|---|---|
message.im | 是 | 机器人接收来自用户的直接消息 |
message.channels | 是 | 机器人接收其被加入的 公共频道 中的消息 |
message.groups | 建议 | 机器人接收其被邀请加入的 私有频道 中的消息 |
app_mention | 是 | 防止当机器人被 @ 提及时出现 Bolt SDK 错误 |
- 点击页面底部的 保存更改
如果机器人在私聊中可以工作,但在 频道中无法响应,几乎可以肯定是忘记了添加 message.channels(公共频道)和/或 message.groups(私有频道)。没有这些事件订阅,Slack 根本不会将频道消息传递给机器人。
第五步:启用消息标签页
此步骤允许用户直接向机器人发送消息。若不启用,用户尝试私聊时会看到 “向此应用发送消息已被关闭” 的提示。
- 在侧边栏中,进入 功能 → 应用主页
- 向下滚动至 显示标签页
- 将 消息标签页 开关设为 开启
- 勾选 “允许用户通过消息标签页发送 Slash 命令和消息”
即使所有权限和事件订阅都正确,Slack 也不会允许用户向机器人发送私聊消息,除非启用了消息标签页。这是 Slack 平台的要求,而非 Hermes 的配置问题。
第六步:将应用安装到工作区
- 在侧边栏中,进入 设置 → 安装应用
- 点击 安装到工作区
- 查看权限列表,点击 允许
- 授权成功后,你会看到一个以
xoxb-开头的 Bot User OAuth Token - 复制此令牌 —— 这就是你的
SLACK_BOT_TOKEN
如果你之后修改了权限范围或事件订阅,必须重新安装应用 才能使更改生效。安装页面会显示提示 banner,提醒你执行此操作。
第七步:查找允许列表中的用户 ID
Hermes 使用 Slack 成员 ID(而非用户名或显示名)进行允许列表控制。
要查找成员 ID:
- 在 Slack 中点击某用户的姓名或头像
- 点击 查看完整资料
- 点击 ⋮(更多)按钮
- 选择 复制成员 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,它将在同一线程中回复。一旦机器人在某个线程中建立了活跃会话,后续在该线程中的回复无需再次 @ 提及 —— 机器人会自然跟进对话。 |
在频道中,始终需 @ 提及机器人以开启对话。一旦机器人在某个线程中活跃,即可在该线程内自由回复而无需提及。在非线程环境下,未 @ 提及的消息会被忽略,以避免在繁忙频道中产生噪音。
配置选项
除了第八步所需的环境变量外,你还可以通过 ~/.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_thread | true | 当其设为 false 时,频道消息会直接回复到频道,而不是新建线程。已经处于现有线程中的消息仍会在线程内回复。 |
platforms.slack.extra.reply_broadcast | false | 当其设为 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: ""
与 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:
- 在 Slack 中右键点击频道名称
- 选择 查看频道详情
- 向下滚动 —— 频道 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映射到其对应的WebClient和bot_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.channels 和 message.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 会自动重连,但不稳定连接会导致延迟 |
| 更改权限或事件后无变化 | 必须重新安装 应用才能使权限或事件变更生效 |
快速检查清单
若机器人在频道中无法工作,请确认以下所有项目均已满足:
- ✅ 已订阅
message.channels事件(公共频道) - ✅ 已订阅
message.groups事件(私有频道) - ✅ 已订阅
app_mention事件 - ✅ 已添加
channels:history权限范围(公共频道) - ✅ 已添加
groups:history权限范围(私有频道) - ✅ 在添加权限/事件后已重新安装应用
- ✅ 机器人已被邀请至频道(
/invite @Hermes Agent) - ✅ 消息中已正确 @ 提及机器人
安全性
务必设置 SLACK_ALLOWED_USERS,并填入授权用户成员 ID 列表。若未设置,网关将默认 拒绝所有消息,作为安全防护措施。切勿分享你的机器人令牌——应将其视为密码对待。
- 令牌应存储于
~/.hermes/.env(文件权限设为600) - 定期通过 Slack 应用设置轮换令牌
- 审计谁有权访问你的 Hermes 配置目录
- 使用 Socket Mode 时,不会暴露公网端点 —— 减少攻击面