跳到主要内容

Slack 配置

通过 Socket Mode 将 Hermes Agent 连接到 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
所需认证令牌机器人令牌(xoxb-) + 应用级令牌(xapp-
用户识别Slack 成员 ID(例如:U01ABC2DEF3

第一步:创建 Slack 应用

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

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


第二步:配置机器人令牌权限

在侧边栏中导航至 功能 → OAuth 与权限。滚动到 权限 → 机器人令牌权限,添加以下权限:

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

如果没有 channels:historygroups:history,机器人将 无法接收频道中的消息 —— 仅在私信中可用。这是最常见的遗漏权限。

可选权限:

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

第三步:启用 Socket Mode

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

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

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


第四步:订阅事件

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

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

如果机器人在私信中正常工作,但在 频道中无法工作,你几乎肯定遗漏了 message.channels(公开频道)和/或 message.groups(私有频道)的订阅。没有这些事件,Slack 根本不会将频道消息发送给机器人。


第五步:启用消息标签页

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

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

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


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

  1. 在侧边栏中,进入 设置 → 安装应用
  2. 点击 安装到工作区
  3. 查看权限并点击 允许
  4. 授权完成后,你会看到一个以 xoxb- 开头的 机器人用户 OAuth 令牌
  5. 复制此令牌 —— 这就是你的 SLACK_BOT_TOKEN
提示

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


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

Hermes 使用 Slack 成员 ID(而非用户名或显示名称)作为允许列表的标识。

要查找成员 ID:

  1. 在 Slack 中,点击用户的姓名或头像
  2. 点击 查看完整资料
  3. 点击 (更多)按钮
  4. 选择 复制成员 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_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: ""
信息

与 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:

  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 会使用正确的 workspace 特定客户端进行响应。
  • 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 权限范围,然后重新安装应用并使用 /invite 邀请机器人
私信中提示“向此应用发送消息已被关闭”在应用主页设置中启用 消息标签页(参见第 5 步)
出现 "not_authed" 或 "invalid_auth" 错误重新生成 Bot Token 和 App Token,并更新 .env 文件
机器人能响应但无法在频道中发帖使用 /invite @Hermes Agent 将机器人邀请至频道
出现 "missing_scope" 错误在 OAuth & 权限中添加所需权限范围,然后重新安装应用
Socket 频繁断开检查网络连接;Bolt 会自动重连,但不稳定的连接会导致延迟
更改了权限范围或事件订阅但无变化必须在更改权限或事件订阅后重新安装应用到工作区

快速检查清单

如果机器人在频道中无法工作,请确认以下全部项目均已满足:

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

安全性

注意

始终设置 SLACK_ALLOWED_USERS,并填入授权用户的成员 ID。若未设置此选项,网关将默认拒绝所有消息,作为安全防护措施。切勿共享您的机器人令牌——应将其视为密码处理。

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