接入 Slack
从 Slack 发起电脑上的 Ghast 任务,并在原 Slack 线程接收回复。入口是 设置 → 渠道 → Slack。
使用期间让 Ghast 保持运行,电脑保持联网。这是桌面连接,不是独立托管的机器人。请先按照 配置 Provider 和 选择并启用模型 准备可用模型。
1. 创建并安装 Slack 应用
先使用私人测试频道,以及允许你安装应用的 Slack 工作区。不要直接从共享的生产频道开始。
创建应用
- 打开 Slack Apps 控制台。
- 选择 Create New App → From scratch。
- 给应用取一个容易识别的名字,选择目标 Slack workspace。这里的 workspace 是外部 Slack 组织,不是 Ghast 的本地工作区。
- 如果组织要求管理员审批,先完成审批;Ghast 不会绕过 Slack 的安装政策。
添加 Bot Token Scopes
进入 OAuth & Permissions → Bot Token Scopes,添加 Ghast 配置指引列出的权限:
| 权限 | 用途 |
|---|---|
app_mentions:read | 接收对应用的提及 |
channels:history、channels:read | 机器人可访问的公开频道消息及频道信息 |
groups:history、groups:read | 机器人可访问的私密频道消息及信息 |
im:history、im:read | 私信消息及会话信息 |
mpim:history、mpim:read | 多人私信消息及会话信息 |
chat:write | 发送和更新回复 |
files:read、files:write | 下载收到的附件、上传回复文件 |
reactions:write | 给消息添加表情回应 |
users:read | 获取发送者的显示名称 |
这是当前客户端的配置权限列表,不代表 Ghast 会导入全部历史消息。还需要订阅对应事件,授予权限不等于订阅消息。参见 Slack Events API。
启用 Socket Mode,生成 App Token
- 进入 Socket Mode,开启 Enable Socket Mode。
- 进入 Basic Information → App-Level Tokens → Generate Token and Scopes。
- 添加
connections:write权限并生成 Token。 - 妥善保管得到的
xapp-Token。
Socket Mode 通过向外建立的 WebSocket 长连接接收事件,不需要公开 webhook URL、开放本地端口或配置隧道。App-Level Token 用于建立这条连接,不是发送回复的凭据。Slack Socket Mode、connections:write。
订阅机器人事件
在 Event Subscriptions 开启事件,向 Subscribe to bot events 添加:
| 事件 | 接收内容 |
|---|---|
app_mention | 对应用的明确 @提及 |
message.channels | 公开频道消息 |
message.groups | 私密频道消息 |
message.im | 私信 |
message.mpim | 多人私信 |
选择 bot events,不是用户 Token 的事件订阅。如果希望用户从应用的 Messages 标签发消息,在 App Home 启用该标签及 Allow users to send Slash commands and messages from the messages tab。这项 Slack 设置允许发送消息,不会给 Ghast 增加斜杠命令。Slack 私信配置说明。
安装并邀请
- 选择 Install App → Install to Workspace,批准请求的权限。
- 在 OAuth & Permissions 复制以
xoxb-开头的 Bot User OAuth Token。 - 后续增加 scopes 后,重新安装应用,使已安装的 Token 获得新权限。Slack 本地配置指引。
- 在测试频道使用 Slack 的频道集成功能,或输入
/invite @YourBot邀请机器人。
两个 Token 必须属于同一个目标应用。不要使用 Signing Secret、Client Secret、Verification Token 或 xoxp- 用户 Token 代替。
2. 在 Ghast 填写凭据

| 控件 | 填写内容或操作 |
|---|---|
| Bot User OAuth Token (xoxb-) | 粘贴 xoxb- Token,供 Ghast 验证机器人身份并调用 Slack Web API。 |
| App-Level Token (xapp-) | 粘贴具有 connections:write 的 xapp- Token,供 Socket Mode 使用。 |
| 各 Token 右侧的眼睛按钮 | 分别显示或隐藏该字段。分享屏幕时保持隐藏。 |
| 默认模型 | 选择已启用、可用的 Slack 任务模型;它与 Chat 默认模型分开设置。 |
| 启用 Slack 桥接 | 先完成下方的访问、模型和工作区设置,再打开开关并点击 保存。 |
从关闭状态启用时,两个 Token 字段都必须非空。这不是凭据验证;启动机器人时才会检查格式并认证。Slack 设置目前没有“验证凭据”或“发送测试消息”按钮。
Token、模型、启用开关、白名单频道、仅响应提及和工作区绑定均为草稿,点击 保存 后才生效。切换平台标签不会保存。要放弃草稿,点击底部 关闭,确认不保存就关闭。
保存任何有变化的 Slack 设置都会重启连接,单独修改访问规则或模型也一样。先完成重要任务再保存,不要假设正在生成的回复能跨重启继续送达。
3. 限制允许接收消息的位置
无需写代码即可查 ID:在浏览器打开目标 Slack 频道,查看地址。例如 https://app.slack.com/client/TEXAMPLE/C0123456789 中,TEXAMPLE 是工作区,C0123456789 才是要填写的频道。只复制会话那一段,不要粘贴完整网址。私信则打开与此机器人的会话,不是个人资料页;使用会话 ID,不是 U… 用户 ID。Slack 的说明中给出了 工作区/频道网址结构。
无法可靠识别时,请 Slack 应用管理员确认;管理员可以通过 Conversations API 查询。不要为了发现 ID,临时清空生产工作区的白名单。
在 白名单频道 输入 Slack 会话 ID,例如虚构的 C0123456789,点击 添加 或按 Enter。确认它变成标签,再 保存。仅输入但没有添加,不会改变列表。
填写 ID,不是 #频道名称、应用 ID、Slack 工作区 ID 或消息链接。客户端会去掉首尾空格并忽略重复添加,但不会验证 ID 是否存在、机器人是否有权访问。点击标签的 × 可移除该项,仍需保存才生效。
| 白名单频道 | 实际效果 |
|---|---|
| 留空 | Ghast 不按会话 ID 限制;仍受 Slack 的消息交付权限和成员关系约束。 |
| 填写一个或多个 ID | 只允许完全匹配的会话 ID,也包括私信和多人私信。 |
| 添加某频道 ID | 该频道内的线程使用同一个白名单 ID,不要填写线程时间戳。 |
| 只添加一个公开频道 | 不会顺便允许私信;若要接收某个私信会话,也要添加它自己的会话 ID。 |
这不是按人的允许列表。允许会话内的参与者,只要消息能送到机器人并符合下方提及规则,就可能发起任务。工作区绑定不负责允许或拒绝访问。

4. 选择何时响应
通过 仅响应 @提及,要求公开和私密频道中的消息明确提及机器人。
| 已通过白名单的消息 | 开启仅响应提及 | 关闭仅响应提及 |
|---|---|---|
| 公开/私密频道中,使用 Slack 真正 @提及机器人的消息 | 接收 | 接收 |
| 公开/私密频道中,没有提及机器人的普通消息 | 忽略 | 接收 |
| 公开/私密频道线程内的回复,但未重新 @提及 | 忽略 | 接收 |
| 私信或多人私信 | 无需提及即可接收 | 无需提及即可接收 |
| 机器人发送的消息,包括 Ghast 自己 | 忽略 | 忽略 |
| 编辑或删除消息的事件 | 不会启动新一轮任务 | 不会启动新一轮任务 |
“接收”指有资格进入 Ghast,不保证模型最终成功回复。消息可以带有效附件;既无文字也无可用附件的空消息会被跳过。
请使用 Slack 真正的 @提及选择器。只输入 ghast、在线程里回复机器人,或照搬 Discord 的 !new,不会绕过 Slack 的提及规则。
Slack 在下载附件和记录最近历史之前检查白名单及提及规则。被这些规则拒绝的消息不会进入该入站处理路径,这与 Discord、Telegram 群聊不同。但收紧规则不会删除此前已接收并保存在 Ghast 对话或本地记忆中的内容。
界面提示“DM 始终响应”只是在说明私信无需 @提及。白名单非空时,它仍限制私信。私信和 @提及都不能绕过白名单。
5. 选择模型和本地工作区
模型选择
先配置 Provider 凭据并启用模型,Slack 的选择器才会列出已启用、具备使用条件的 Provider 模型。找不到目标模型时,回到 模型配置 检查,再重新打开选择器。
明确设置的 Slack 默认模型优先,已有 Slack 对话也会使用它。没有 Slack 专属默认模型时,优先沿用已有对话保存的模型,再回退到 Chat 默认模型。改变默认值不会自动启用模型、充值或修复 Provider 认证。
工作区绑定
- 先创建合适的非临时本地工作区。
- 在 工作区绑定 选择已知 频道 ID,或手动输入 ID。列表可能包含此前已知的会话,不证明机器人目前仍有访问权限。
- 选择 工作区,点击 添加。两个字段缺一不可。
- 检查 ID 到工作区的对应行,再 保存。
- 替换绑定时,先删除原行,再用同一 ID 添加新工作区,最后保存。
优先使用明确绑定且仍存在的工作区;没有有效绑定时,使用 通用 → 默认工作区,再回退到 Ghast 自动默认工作区。可通过“未绑定的聊天使用”一行核对回退位置。
绑定按频道/私信会话 ID,不按人或线程。该会话中新创建的线程会使用所选工作区。已有 Slack 线程保留其 Ghast 对话原来的工作区,保存新绑定不会移动这些对话。请发一条新的顶层消息使用新路由,并在请求文件访问前核对工作区。线程忙碌时到达的新消息可能创建分支,此分支使用当前的工作区选择。
绑定及回退工作区都应保持最小范围。Slack 消息可能在你的电脑上启动模型和工具任务,结果会发送给该 Slack 会话的参与者。
6. 验证首条回复
- 确认示例 ID 已换成真实 ID,模型可用,工作区正确。
- 启用 Slack 并 保存,展开 运行状态。
- 等待 已连接;有 Slack 工作区信息时确认是目标组织。
- 在允许的测试频道发送明确提及:“@YourBot 只回复
slack-ready-47。” - 在 Slack 打开这条消息的线程,确认准确回复已出现,不只是 Ghast 中生成成功。
- 在同一线程回复:“@YourBot 你刚才返回了什么字符串?”开启仅响应提及时,继续带上 @提及。
- 分别用无敏感内容测试允许的私信、未允许的会话、不含提及的频道消息,核对限制是否符合预期。
- 普通文字通过后,再测试附件。
Slack 集成没有用于 /new、/model、/stop 或切换对话的内置命令菜单。不要照搬 Telegram、Discord 的命令。模型配置和正在运行的任务请回到 Ghast 桌面端查看与操作。
线程、上下文和并发消息
- 每条 Slack 顶层消息都会建立独立的 Ghast 对话,私信顶层消息也一样。要延续同一个对话,请在线程内继续。
- 同一 Slack 线程中的参与者共享对应对话,不会按发送者分别隔离。
- 回复发送到原消息线程。新的顶层消息不会自动继承上一条顶层消息的上下文。
- 同一线程还在生成时,新消息会促使 Ghast 创建分支并将后续轮次路由过去,而不是简单排队。顺序重要时,等回复完成后再继续。
- 最近 Slack 上下文来自当前连接期间实际接收的消息,以及可用的本地发送者资料。首次接触线程时,不会自动抓取全部频道或旧线程历史。
- 已保存的 Ghast 对话历史与连接中的最近消息缓冲不是同一份数据。重启机器人不会清除已保存对话或记忆。
附件、流式回复和表情回应
收到的图片、音频、视频及文件可以下载并传给生成流程。实际理解能力取决于所选模型及可用工具;附件被接收,不代表它已被成功读取。
文件报告的大小超过 20 MiB 时会被跳过。没有可用私有下载地址、无权访问的文件,以及需要额外查询才能取得内容的 Slack Connect 附件占位信息,也可能被跳过。附件遗漏时,先在允许的测试会话中上传较小的普通文件并查看日志。
文字回复可以在生成过程中持续编辑同一条消息,长回复可能拆分。语音输入轮次不走这条部分文字流式更新路径。不要因为音频已显示在 Slack 就认定转写或语音回复可用;参见 语音输入与回复。
Ghast 可以把本地结果文件上传到同一线程,也可以给入站消息添加表情回应。表情不是模型任务完成的确认。请求发送文件前,确认该线程的所有接收者都应有权看到它。
查看运行状态和日志
展开 运行状态:
| 项目 | 能说明什么 |
|---|---|
| 连接 | Slack 是否停用、连接中、已连接或出现错误;已连接不证明消息送达或模型可用。 |
| Slack 工作区/启动时间 | 有数据时显示运行时的组织身份和本次连接启动时间。 |
| 最近事件 | 最近一次 Slack 事件信封到达客户端的时间;没有变成 Ghast 任务的事件也能更新时间。时间较旧也可能只是工作区暂时没有活动。 |
| 机器人日志 | 连接、认证、事件、过滤及 Slack API 失败。 |
| 桥接日志 | 消息到 Ghast 的路由、模型生成和回复处理。 |
运行时没有对应日志路径时,日志按钮禁用。可用日志在设置页内展开,默认显示最后 200 行;点击 刷新 重新读取,× 关闭。它不是持续自动更新的日志流。
日志可能包含消息片段、用户/频道 ID、组织名称和本地路径。分享前删除敏感内容,不要公开任何一个 Token。
排查问题
| 现象 | 依次检查 |
|---|---|
| 不能打开启用开关 | 两个 Token 字段均须非空;保存前确认 Token 类型正确。 |
| Token 前缀或认证错误 | xoxb- 填 Bot Token,xapp- 填 App Token,确认属于同一应用。在 Slack 替换已撤销的 Token,再保存。 |
| Socket Mode 连不上 | 确认已启用 Socket Mode,App Token 有 connections:write,电脑和网络允许建立连接。 |
| 已连接,但最近事件一直不变 | 检查 bot 事件订阅、应用安装和频道成员关系;增加 scopes 后重新安装。建立连接不等于已订阅消息事件。 |
| 有事件,但没有任务 | 检查准确的白名单会话 ID、提及规则、是否为机器人消息,以及空消息或不可用的纯附件消息。 |
| 频道可用,但私信不行 | 检查私信 ID 是否通过白名单、message.im 订阅、im:history 和 App Home Messages 设置。 |
| 首次提及可用,线程跟进没回复 | 开启仅响应提及时,在公开/私密频道线程里再次 @提及机器人。 |
| 模型缺失或 Provider 报错 | 配置并启用可用模型,检查余额及认证,选择 Slack 默认模型并保存。 |
| 新工作区绑定似乎没有生效 | 发送新的 Slack 顶层消息;已有映射线程保留原对话工作区。 |
| Ghast 已生成,但 Slack 没收到 | 打开原线程,查看两类日志,检查 chat:write、成员关系、限流和 Token 错误;不要反复重发可能仍在运行的任务。 |
| 文字正常,但文件缺失 | 检查入站 20 MiB 限制、私有文件访问、Slack Connect 限制以及 files:read/files:write。 |
| 英文标题显示 Title 或 Body | 此客户端的 Slack 英文翻译不完整。按照本指南的控件名称和 Token 前缀识别,中文界面有较完整的标签。 |
断开连接
关闭 启用 Slack 桥接 并 保存,停止连接。这不会卸载 Slack 应用、撤销凭据或删除 Slack/Ghast 的旧消息。
停用整个集成时,还应在 Slack 工作区移除应用或撤销 Token,并单独检查保存的对话与本地记忆。不要把重启连接当作隐私清除。