用 dsh-slack 给 DeepSeek Harness 接上 Slack 双向通道

前言

DeepSeek Harness(简称 DSH)把智能体运行时拆成一套可插拔的宿主:官方仓库的口号是「Everything is a Plugin」(一切皆插件)。任务跑完、需要人拍板、或者要把结论同步给同事时,很多人还在终端或网页界面里盯着输出。团队日常沟通往往在 Slack 里,终端通知和桌面弹窗解决不了「把智能体放进频道」这件事。

社区插件 dsh-slack 做的就是这一层桥接:让当前这套 DSH agent 能向 Slack 发消息、列频道,也能用 Socket Mode 把频道/私信里的消息收进进程内收件箱,再按线程回复。它由 STARDUSTLC666 维护,分类在「通知与集成」。本文依据插件目录页、GitHub 仓库 README 与源码交叉核实后整理,版本以仓库 package.json 中的 0.2.3 为准。

需要先说明生态边界:DSH 本体是 DeepSeek 开源的 agent harness;社区插件目录 是独立站点,用来检索和安装社区插件,与 DeepSeek / 幻方没有官方从属关系,不要把它当成官方应用商店。

这是什么

dsh-slack 是一款跑在 DSH 宿主进程里的社区插件。安装后会向模型注册四个工具:slack_notifyslack_channelsslack_inboxslack_reply。目录页给出的定位是:让 DSH agent 与 Slack 双向通信。

仓库 README 把能力按版本拆开写得很清楚:

  • v0.1:只做「agent → Slack」单向通知。
  • v0.2:加上 Socket Mode,支持「Slack 消息 → agent」。收消息走 slack_inbox,回线程走 slack_reply

未配置 App-Level Token 时,插件不会崩溃,只打印告警,slack_inbox 返回空队列,相当于退回单向模式。发消息、列频道、线程回复仍然可用(前提是机器人令牌配好了)。

GitHub 仓库地址:https://github.com/STARDUSTLC666/dsh-slack
目录详情页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-slack/

截至 2026-08-18,目录页与 GitHub 仓库均显示 4 颗星;主要语言是 TypeScript。仓库 README 与 package.json 标注许可证为 MIT;GitHub 仓库元数据里尚未识别到独立的 LICENSE 文件,安装前应自行打开仓库核对。

核心功能

四个工具对应四件实事,底层分别打 Slack Web API 的 chat.postMessageconversations.list

1、slack_notify:往频道或线程发一条 Markdown 文本

必填参数是 channel(频道名如 #general,或频道 ID)和 text。可选 thread_ts,用来回某一条已有消息所在的线程。成功时返回消息的 ts 和频道,后续可以把这个 ts 再传给 thread_ts

2、slack_channels:列出机器人当前可见的频道

无参数。源码里会沿 next_cursor 自动翻页,公开频道和私有频道都会请求(types: public_channel,private_channel),并按频道 ID 去重。v0.2.3 给分页加了页数上限(源码中为 20 页),避免异常游标把请求打成死循环。企业工作区频道很多时,这一步比只拿第一页有用。

3、slack_inbox:读取 Socket Mode 收到的消息

收件箱是进程内内存队列,容量 200 条,新的在前;满了丢最旧的。Slack 事件是至少投递一次,队列会按 channel + ts + user + text 去重。可选参数:

  • limit:最多返回条数,默认 10,范围 1–50。
  • markRead=true:返回后原子消费并清空队列,避免「先列出再清空」的间隙里新消息被误删。

重启 dsh 进程后队列就没了,不会落盘。

4、slack_reply:按线程回复收件箱里的某条消息

必填 channeltextthread_tsthread_ts 应来自 slack_inbox 返回的 ts。底层同样是 chat.postMessage,只是带上 thread_ts

除此之外,有三项实现细节值得单独说:

  • Socket Mode,不需要公网回调 URL。 传统 Slack Events API 要暴露一个 HTTPS 端点给 Slack 推事件;Socket Mode 由客户端向 Slack 建长连接收事件。本机、内网、没有公网 IP 的开发机都可以用。开启后需要 App-Level Token(xapp- 开头),并订阅 message.channels(公开频道)和 message.im(机器人私信)。
  • 可自定义 slackApiUrl 源码 config.ts 会解析该字段,默认走官方 https://slack.com/api/。目录页和仓库简介写明:可用来对接代理网关;注释里也提到企业网格(Enterprise Grid)和本地协议级测试可以覆盖这个地址。WebClient 按 token + slackApiUrl 缓存,配置变了会重建客户端。
  • 内置假 Slack 服务器做协议级验收。 仓库 test/fake-slack-server.mjs 在本地起一个零依赖的 HTTP 服务,模拟 chat.postMessageconversations.listpnpm run test:protocol 会用官方 @slack/web-api 真实发 HTTP,打到 http://127.0.0.1:3999/api/,校验载荷、鉴权头和中文错误映射。这是开发测试基建,不是运行时依赖。

错误信息全部是中文,模型和人都能直接读。常见映射包括:令牌未配置、invalid_authchannel_not_foundnot_in_channel(机器人还没被拉进频道)、token_revoked / missing_scope / not_authed、频道已归档、单条消息超过 40,000 字符、触发限流。令牌缺失时插件仍会加载(懒加载),真正调用发消息/列频道/回复工具时才报错。

v0.2 明确不包含:RTM,以及按钮、弹窗、slash command 回复这类交互组件。README 写的路线图是 v0.3 计划做交互组件和持久化收件箱,目前还不是现成能力。

安装与启用

插件以当前 dsh 进程的权限运行,安装时可能执行代码。安装前请检查源代码仓库和许可证;如需可复现安装,请固定 commit 哈希。

目录页给出的安装命令如下,在 DeepSeek Harness 终端中运行:

dsh plugin add github:STARDUSTLC666/dsh-slack

固定某个 commit 时,按目录页的写法把哈希接在仓库名后面:

dsh plugin add github:STARDUSTLC666/dsh-slack#<commit>

仓库 README 另外记录了一种按 profile 安装的写法(安装进 web profile,重启后生效):

dsh plugin --profile web add dsh-slack

两处命令来源不同:前者以插件目录页原文为准,后者来自 GitHub README。装完后需要重启 dsh Web 服务,四个工具才会对模型可见。

配置 Slack App 与令牌

配置写在 profile 的 cordis.patch.yml 里,按 id: slack 覆盖这一行。覆盖是整段替换 config,不会和默认值做字段合并。可用项以 README 表格为准:

说明
token 机器人令牌(xoxb-)或用户令牌(xoxp-)。留空则回退环境变量 DSH_SLACK_TOKEN
appToken App-Level Token(xapp-),Socket Mode 收消息用。留空则回退 DSH_SLACK_APP_TOKEN
defaultChannel 例如 #general。目前只写进 channel 参数说明,不能代替必填的 channel

源码额外支持 slackApiUrl。需要走代理网关或本地假服务器时,可以在同一段 config 里加上该字段;README 的配置表目前没有列出它。

优先级:config.token 高于 DSH_SLACK_TOKENconfig.appToken 高于 DSH_SLACK_APP_TOKEN。README 推荐用环境变量,避免把令牌写进配置文件:

export DSH_SLACK_TOKEN=xoxb-你的机器人令牌
export DSH_SLACK_APP_TOKEN=xapp-你的App级令牌

如果写进 profile(路径以 README 为例:$DSH_HOME/profiles/web/cordis.patch.yml):

- id: slack
  config:
    token: 'xoxb-你的机器人令牌'
    appToken: 'xapp-你的App级令牌'
    defaultChannel: '#general'

创建 Slack App 并拿令牌,步骤按仓库 README 整理如下(应用在 Slack 官方的 App 管理后台创建):

  1. 新建 App(From scratch),选好工作区。
  2. OAuth & Permissions → Bot Token Scopes 勾选 chat:write(发消息)和 channels:read(列频道)。
  3. Install to Workspace 授权,复制 Bot User OAuth Tokenxoxb- 开头)。
  4. 在目标频道执行 /invite @你的机器人。私有频道这一步是必需的,否则会遇到 not_in_channel

只发通知做到这里即可。要收消息,再打开 Socket Mode:

  1. App 后台打开 Socket Mode
  2. Generate Token and Scopes,勾选 connections:write,保存只显示一次的 xapp- Token。
  3. Event Subscriptions 里订阅机器人事件:message.channelsmessage.im
  4. 把 App-Level Token 配进 appTokenDSH_SLACK_APP_TOKEN,重启 dsh Web 服务。插件会自行建连;Socket Mode 网络错误由 Slack SDK 自动重连,插件只记告警、不抛崩。

典型用法

装好并重启之后,模型能直接调这四个工具。下面的 JSON 形状来自 README 的返回约定,便于对照参数。

发一条通知:

{
  "channel": "#general",
  "text": "构建已完成,产物在 dist/"
}

slack_notify 成功时类似:

{ "ts": "1700000000.000100", "channel": "#general" }

列出可见频道(无参数),返回:

{ "channels": [{ "id": "C001", "name": "general" }, { "id": "C002", "name": "random" }] }

读取收件箱,读完标记已读:

{ "limit": 10, "markRead": true }

返回每条消息包含 tschannelusertext。再拿其中的 ts 做线程回复:

{
  "channel": "C001",
  "text": "收到,我去看日志。",
  "thread_ts": "1700000000.000100"
}

开发插件或做协议回归时,不必接真实 Slack。仓库提供:

pnpm install
pnpm build
pnpm test
pnpm run test:protocol

pnpm test 覆盖参数编译、配置解析(含环境变量回退)、四个工具注册、缺配置时的中文报错、注入 fake client 断言 postMessage(含 thread_ts)、收件箱容量/去重/原子 drain、Socket Mode 事件解析,以及缺少 appToken 时不崩溃。test:protocol 则走真实 SDK HTTP,打到本地假服务器。

适用场景与注意事项

比较适合这些情况:

  • 团队已经在 Slack 协作,希望 agent 把回合结果、构建状态或需要确认的事项发到指定频道。
  • 开发机或内网环境没有公网回调地址,但仍希望从频道或机器人私信把消息送进 agent。
  • 需要列出现有频道、按线程把回复钉在原消息下面,而不是另开一条新通知。
  • 走企业代理或自建网关访问 Slack API,可以覆盖 slackApiUrl

同一分类里,目录页还收录了桌面通知类插件(如 dsh-notificationdsh-web-ui-notify)和飞书通道 dsh-lark。它们解决的是「提醒你看终端」或「接到飞书」,和「进 Slack 频道做双向收发」不是同一件事,按工作区选用即可。

使用前把限制看清楚:

  • 插件以当前 dsh 进程权限运行,能访问该进程能访问的一切。安装前检查源码、依赖(运行时是官方 @slack/web-api@slack/socket-mode)和许可证。
  • 令牌不要提交进 Git。环境变量优先于把 xoxb- / xapp- 写进 yaml。
  • slack_inbox 不持久化,重启即空;容量 200,不能当历史归档用。
  • defaultChannel 目前只是提示,调用时仍必须传 channel
  • 不支持按钮、弹窗、slash command 回复和 RTM。
  • 机器人必须被邀请进目标频道;私有频道尤其容易漏这一步。
  • 源码会过滤带 subtype 的消息和带 bot_id 的消息,避免把机器人自己发的内容再吃进收件箱。

小结

dsh-slack 把 Slack 收发收成四个模型可调用的工具:通知、列频道、收件箱、线程回复。v0.2 用 Socket Mode 补上反向通道,不必暴露公网 webhook;slackApiUrl 方便对接代理或本地假服务器;仓库自带协议级验收测试。它是社区维护的 DSH 插件,不是 DeepSeek 官方应用。

目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-slack/
源码:https://github.com/STARDUSTLC666/dsh-slack
DSH 本体:https://github.com/deepseek-ai/deepseek-harness

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜