如何把AI同事请进Slack?OpenDots托管渠道接入完整指南(含白名单安全设置)
【免费下载链接】OpenDotsYour always-on AI coworkers that move between text, calls, and Slack.项目地址: https://gitcode.com/gh_mirrors/op/OpenDots
OpenDots是一个开源的「常驻 AI 同事」模板:你可以克隆它、定义自己的 Dot(AI 同事)、为每个同事配置角色和权限,并让它们在你与它们之间自由切换——文字聊天、语音通话,以及Slack 渠道。本指南将带你用最安全的托管渠道(managed channel)方式把 AI 同事请进 Slack:不写一行 Webhook 服务器代码,同时通过workspace/user 白名单严格控制谁能唤醒这位 AI 同事。
为什么用 OpenDots 接入 Slack?
大多数 AI 机器人接入 Slack,要自己写 Webhook 服务、管理 Socket Mode 连接、处理签名校验。OpenDots 走的是另一条更省心的路:
- 托管渠道模式:基于 CopilotKit 的 Channels SDK(
@copilotkit/channels),由 Intelligence 托管 Slack 适配与消息投递,应用端只声明「渠道 + 专家 Agent」,参考实现见 src/server/platform.ts - 零自建消息服务器:不需要单独的 Slack webhook 服务或 Socket Mode 连接
- 显式白名单安全:Slack workspace ID + 用户 ID 双重白名单,身份在服务端严格校验,详见 src/server/slack-channel.ts
- 完全自托管:MIT 协议,数据存本地 SQLite,凭据全部留在服务端
先认识一下你的 AI 同事
每个 Dot(AI 同事)都有自己的名字、角色指令和权限。它不只是聊天——每个 Dot 还可以拥有自己的「电脑」:独立浏览器、持久化文件、终端,在聊天里实时展示工作过程:
💡 正是因为它能在 Slack 线程里继续干「重活」,把 AI 同事接入团队日常最常用的 Slack,价值才真正体现出来。
前提准备:完成基础四步
Slack 渠道依赖会话服务,所以要先让 OpenDots 跑起来:
- 使用Node.js 24+ npm,克隆仓库并安装:
git clone https://gitcode.com/gh_mirrors/op/OpenDots cd OpenDots npm ci cp .env.example .env npm run dev- 打开 http://127.0.0.1:5173 确认应用可运行
- 在
.env中填入会话与模型凭据(变量说明见 docs/SETUP.md):
| 变量 | 作用 |
|---|---|
INTELLIGENCE_API_KEY | 会话持久化项目凭据(Slack 渠道必需) |
OPENAI_API_KEY/OPENAI_MODEL | 模型凭据与模型标识 |
OWNER_ID | 本部署的对话身份,保持稳定 |
- 至少创建一个 Dot(AI 同事),后面要把它绑定到 Slack 渠道
一键创建 Slack 托管渠道(CLI)
选择与应用相同的 Intelligence 项目,然后创建命名唯一的托管渠道(完整步骤见 docs/SETUP.md Slack 小节):
npx --yes copilotkit@latest project select npx --yes copilotkit@latest channels add --name opendots --display-name "OpenDots" --adapter slack --json接着按 CLI 返回的nextAction操作即可:
- 用生成的 manifest 在 Slack 控制台创建应用
- 通过托管设置流程填入 Slack 凭据(bot token、signing secret)
- 运行 CLI 给出的
resumeCommand完成激活
⚠️ 三个注意点:
- 保持 Socket Mode 关闭(托管渠道不需要它)
- 返回
blocked表示还差 Slack 控制台步骤;failed必须先解决再继续 - 多套部署请用不同的渠道名,避免互相争抢投递
白名单安全设置:4 个环境变量
打开应用服务端的.env(变量解析见 src/server/index.ts),与模型凭据放在一起配置:
SLACK_CHANNEL_NAME=opendots SLACK_TEAM_ID=T_REPLACE_WITH_WORKSPACE_ID SLACK_USER_IDS=U_REPLACE_WITH_YOUR_USER_ID SLACK_DOT_ID=REPLACE_WITH_DOT_ID| 变量 | 说明 |
|---|---|
SLACK_CHANNEL_NAME | 必须与托管渠道声明名完全一致(不是#general这类 Slack 会话名) |
SLACK_TEAM_ID | Slack workspace ID,限制「哪个团队」可用 |
SLACK_USER_IDS | 逗号分隔的 Slack 用户 ID,限制「哪些人」可用 |
SLACK_DOT_ID | 指定响应 Slack 的 Dot;省略时默认使用初始 Dot(ID 可在/api/workspace响应中查到) |
改完环境变量后重启 OpenDots,并在Settings & setup页面确认渠道状态变为激活(状态逻辑见 src/server/platform-config.ts)。渠道激活完成后,才能开始发消息测试。
白名单是怎么生效的?
OpenDots 在 slack-channel.ts 中做严格身份校验,一条消息要触发 AI 同事,必须同时满足:
- ✅ 来自
slack平台,且 workspace 匹配SLACK_TEAM_ID - ✅ 发言者必须是
human(机器人、应用、系统消息一律忽略) - ✅ 用户 ID 在
SLACK_USER_IDS白名单内 - ✅ 消息操作类型是
created——编辑消息补加 @ 不生效,请发新消息 - ✅ 是首次 @ 机器人,或该线程已被订阅(线程内后续消息才会继续触发)
这与 SECURITY.md 的原则一致:显式映射 Slack 身份,绝不把显示名或客户端自报的 ID 当作身份证明。
在 Slack 里唤醒 AI 同事并验证
- 在机器人可访问的频道中@ 提及该 bot,它会在同一线程回复
- 在该线程内继续发消息,对话保持连续(同一专家 Agent)
- 用白名单外的用户测试:应无法触发
- 在 OpenDots 里暂停(Pause)助理:白名单用户收到「已暂停」提示而非执行结果(实现见 slack-channel.ts)
🔍 完整验证清单(含检查连接失败状态)见 docs/SETUP.md 的Verify your deployment小节。
安全细节:别忽略的 3 件事
- 错误信息不泄露凭据:渠道失败时只上报安全化的错误名(如
Error (HTTP 401)),提供商原始报文不会进入日志或 Slack 回复,防止凭据泄漏(见 safeFailure) - 单所有者映射:模板把白名单内的 Slack 用户统一映射到同一个 OpenDots owner,回复对该 Slack 会话的所有成员可见——所以请提前收好该 Dot 的Space 访问权限和工具权限,这不是多用户身份模型
- 并发串行化:渠道以
concurrency: 'serial'运行,同一线程的请求排队处理,不会互相踩踏(见 createSlackChannel)
这些行为都有对应测试覆盖:tests/slack-channel.test.ts 验证了白名单拦截、线程订阅语义与错误隔离;tests/slack-channel-wiring.test.ts 验证渠道注册方式。
常见坑位清单
| 现象 | 原因与解决 |
|---|---|
改完.env没反应 | Slack 配置只在启动时读取,必须重启OpenDots |
渠道一直setup_required | SLACK_CHANNEL_NAME与SLACK_TEAM_ID必须与托管声明一致,且SLACK_USER_IDS非空 |
| 编辑旧消息补 @ 无效 | 设计如此,编辑/删除不触发,请发送新消息 |
| 多个部署互抢消息 | 每套部署使用唯一的渠道名 |
SLACK_DOT_ID报错 | 该 ID 必须指向已存在的 Dot,否则服务启动会失败 |
✅ 完成以上步骤,你就把一位受白名单约束、带自己电脑的 AI 同事正式请进了 Slack。后续还想让它拥有持久化「电脑」(浏览器 + 文件 + 终端),可继续参考 docs/COMPUTERS.md。
【免费下载链接】OpenDotsYour always-on AI coworkers that move between text, calls, and Slack.项目地址: https://gitcode.com/gh_mirrors/op/OpenDots
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考