Slack 配置
通过 Socket Mode 将 Hermes Agent 连接到 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 |
| 所需认证令牌 | 机器人令牌(xoxb-) + 应用级令牌(xapp-) |
| 用户识别 | Slack 成员 ID(例如:U01ABC2DEF3) |
第一步:创建 Slack 应用
- 访问 https://api.slack.com/apps
- 点击 创建新应用
- 选择 从零开始
- 输入应用名称(例如:“Hermes Agent”),并选择你的工作区
- 点击 创建应用
你将进入应用的 基本信息 页面。
第二步:配置机器人令牌权限
在侧边栏中导航至 功能 → OAuth 与权限。滚动到 权限 → 机器人令牌权限,添加以下权限:
| 权限 | 用途 |
|---|---|
chat:write | 以机器人身份发送消息 |
app_mentions:read | 检测在频道中是否被 @提及 |
channels:history | 读取机器人所在公开频道的消息 |
channels:read | 列出并获取公开频道的信息 |
groups:history | 读取机器人受邀加入的私有频道的消息 |
im:history | 读取私信历史记录 |
im:read | 查看基本的私信信息 |
im:write | 打开和管理私信 |
users:read | 查询用户信息 |
files:write | 上传文件(图片、音频、文档) |
如果没有 channels:history 和 groups:history,机器人将 无法接收频道中的消息 —— 仅在私信中可用。这是最常见的遗漏权限。
可选权限:
| 权限 | 用途 |
|---|---|
groups:read | 列出并获取私有频道的信息 |
第三步:启用 Socket Mode
Socket Mode 允许机器人通过 WebSocket 连接,而无需公开 URL。
- 在侧边栏中,进入 设置 → Socket Mode
- 将 启用 Socket Mode 开关设为 开启
- 系统会提示你创建一个 应用级令牌:
- 将其命名为类似
hermes-socket(名称无关紧要) - 添加
connections:write权限 - 点击 生成
- 将其命名为类似
- 复制该令牌 —— 它以
xapp-开头。这就是你的SLACK_APP_TOKEN
你始终可以在 设置 → 基本信息 → 应用级令牌 下找到或重新生成应用级令牌。
第四步:订阅事件
此步骤至关重要 —— 它决定了机器人可以看到哪些消息。
- 在侧边栏中,进入 功能 → 事件订阅
- 将 启用事件 开关设为 开启
- 展开 订阅机器人事件,添加以下事件:
| 事件 | 是否必需 | 用途 |
|---|---|---|
message.im | 是 | 机器人接收私信 |
message.channels | 是 | 机器人接收其加入的 公开频道 中的消息 |
message.groups | 建议 | 机器人接收其受邀加入的 私有频道 中的消息 |
app_mention | 是 | 防止机器人被 @提及时出现 Bolt SDK 错误 |
- 点击页面底部的 保存更改
如果机器人在私信中正常工作,但在 频道中无法工作,你几乎肯定遗漏了 message.channels(公开频道)和/或 message.groups(私有频道)的订阅。没有这些事件,Slack 根本不会将频道消息发送给机器人。
第五步:启用消息标签页
此步骤启用用户直接向机器人发送消息。若未启用,用户尝试向机器人发送私信时会看到 “向此应用发送消息已被关闭” 的提示。
- 在侧边栏中,进入 功能 → 应用主页
- 滚动至 显示标签页
- 将 消息标签页 开关设为 开启
- 勾选 “允许用户通过消息标签页发送斜杠命令和消息”
即使所有权限和事件订阅都正确,Slack 也不会允许用户向机器人发送私信,除非启用了消息标签页。这是 Slack 平台的要求,而非 Hermes 的配置问题。
第六步:将应用安装到工作区
- 在侧边栏中,进入 设置 → 安装应用
- 点击 安装到工作区
- 查看权限并点击 允许
- 授权完成后,你会看到一个以
xoxb-开头的 机器人用户 OAuth 令牌 - 复制此令牌 —— 这就是你的
SLACK_BOT_TOKEN
如果你之后更改了权限或事件订阅,必须重新安装应用 才能使更改生效。安装应用页面会显示提示 banner,提醒你执行此操作。
第七步:查找允许列表中的用户 ID
Hermes 使用 Slack 成员 ID(而非用户名或显示名称)作为允许列表的标识。
要查找成员 ID:
- 在 Slack 中,点击用户的姓名或头像
- 点击 查看完整资料
- 点击 ⋮(更多)按钮
- 选择 复制成员 ID
成员 ID 的格式如下:U01ABC2DEF3。您至少需要拥有自己的成员 ID。
第 8 步:配置 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
第 9 步:将机器人邀请至频道
启动网关后,您需要将机器人邀请至您希望它响应的任何频道:
/invite @Hermes Agent
机器人不会自动加入频道。您必须为每个频道单独邀请它。
机器人响应机制
了解 Hermes 在不同上下文中的行为:
| 上下文 | 行为 |
|---|---|
| 私信(DMs) | 机器人对每条消息都作出响应——无需 @提及 |
| 频道 | 机器人仅在被 @提及时响应(例如:@Hermes Agent 现在几点了?)。在频道中,Hermes 会在该消息的线程中回复。 |
| 线程 | 如果您在现有线程中 @提及 Hermes,它将在同一线程中回复。一旦机器人在某个线程中建立了活跃会话,后续在该线程中的回复无需再次 @提及——机器人将自然延续对话。 |
在频道中,始终需要 @提及机器人以开启对话。一旦机器人在某个线程中活跃,您可以在该线程中直接回复而无需提及。在非线程环境中,未被 @提及的消息将被忽略,以避免在繁忙频道中产生噪音。
配置选项
除了第 8 步中必需的环境变量外,您还可以通过 ~/.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 启动对话。然而,一旦机器人在某个线程中建立了活跃会话,后续的线程回复无需再次提及。在私信中,机器人始终会响应,无需提及。
未授权用户处理
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
主频道
将 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 会使用正确的 workspace 特定客户端进行响应。
- 主
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 权限范围,然后重新安装应用并使用 /invite 邀请机器人 |
| 私信中提示“向此应用发送消息已被关闭” | 在应用主页设置中启用 消息标签页(参见第 5 步) |
| 出现 "not_authed" 或 "invalid_auth" 错误 | 重新生成 Bot Token 和 App Token,并更新 .env 文件 |
| 机器人能响应但无法在频道中发帖 | 使用 /invite @Hermes Agent 将机器人邀请至频道 |
| 出现 "missing_scope" 错误 | 在 OAuth & 权限中添加所需权限范围,然后重新安装应用 |
| 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 无需暴露公网端点——减少一个攻击面