
dsh 也能进 Discord 了:我给 DeepSeek Harness 写了个适配器
TL;DR
dsh-discord:给 DeepSeek Harness 写的 Discord 适配器。@机器人下任务,thread 即开,审批按钮直接送到手机。
为什么自己动手写一个
上回那篇《从聊天窗口到工作台:这半年,我的 Agent 工作流换了一代》里说过,我的 Agent 工作台已经统一到了 Discord:云上的 Hermes 原生支持 Discord,本地的 OpenCode 通过 Kimaki 接入,一个 thread 一个任务,thread 就是 session 的边界。
缺的一块是 dsh。DeepSeek Harness 是我最近用下来很顺手的 harness agent,尤其是插件系统——不用 fork,不用改源码,一个插件挂进 profile 就能扩展它的能力面,这是我最喜欢的样子。但官方入口只有 Web 页面,试过几个社区做的 Discord 插件,要么把整个会话糊在单频道里,要么 thread 状态管理形同虚设——Discord 最有价值的 channel 和 thread 结构,在这几个插件里基本没有被当成一回事。
工作台缺的这一块,与其等,不如自己补上。上周末动手,借助 dsh、OpenCode、zcode 和 omp,配合 GPT 和 GLM 交叉开发调试,OpenSpec 加 agent-skills 管着实现边界,出了初始版本。
插件的形态也省事:dsh-discord 不是独立进程,它就是一个 DSH 插件,直接挂载到 dsh web profile 上。会话状态仍在 DSH 里,适配器只负责 Discord 这一侧的进出。
它做了什么
@提及即会话。 在工作区频道里 @机器人描述任务,适配器锚定一条 thread——你的消息就是首帖——创建 DSH 会话并提交任务,一条 thread 就是工作区里的一个新会话。之后在 thread 里直接追加消息就能排队,不用再 @。发图也能带着走:适配器从 Discord CDN 下载后作为 image parts 交给多模态模型。
流式渲染。 回答在单条头消息里原地编辑,每个工具调用是一行活动记录,长答案按代码围栏自动分段。turn 结束,活动消息删除,thread 里只剩最终结果。
审批和提问都是按钮。 DSH 需要确认时,ask 帧渲染成按钮、下拉菜单或文本弹窗送到频道里,手机上点一下就完事。所有权有校验:谁发起谁点击,超时按拒绝处理,绝不默认放行。
会话控制齐全。 /steer 插话、/stop 取消、/queue 管理排队、/model select 切模型(provider → 模型 → 推理强度逐级选)、/session resume 恢复历史会话、/project bind 绑定工作区并创建工作区频道。
双语开箱即用。 所有 Discord 可见文案都有中英两份,跟随 DSH 语言偏好,也可以钉死。
安全是设计出来的,不是补出来的。 显式服务器白名单加 deny-first 授权,白名单外零响应、零调用;mention 双重抑制;任务提交至多一次,结果不明的投递绝不盲目重发;绑定持久化,重启不丢。
用起来只要五步
前置条件:dsh CLI 0.1.1-rc.2 以上、Node.js 22.19+ 或 24+,以及一个开了 MESSAGE CONTENT 特权 intent 的 Discord 应用。
- 装插件,dsh CLI 会自动注册 bundle:
dsh plugin --profile web add @addozhang/dsh-discord
- 重启 dsh web,刷新浏览器。
- Settings → Discord,贴入 bot token,点 Connect。token 进凭据服务,不落设置也不进日志。
- 填服务器白名单——白名单外的一切都会被忽略。
- 在 general(管理频道)里用 /project bind 绑定 dsh 工作区,会自动创建一个工作区频道;之后在工作区频道里 @机器人下第一个任务,一个任务一条 thread,就是工作区里的新会话。
常用命令速查:
| 命令 | 位置 | 作用 |
|---|---|---|
| /project bind | general(管理频道) | 绑定 dsh 工作区,自动创建工作区频道(管理员) |
| /steer、/stop | 会话 thread | 插话 / 取消当前 turn |
| /model select | 会话 thread | 切换模型 |
| /session resume | 工作区频道 | 恢复历史会话 |
收尾
初始版本已经挂上 npm(@addozhang/dsh-discord),装法就是上面一条命令。/preset、/skill 这几个命令还在路上,路由支持后就上线。
上回那篇的结论是:Agent 的交互容器,决定了它能不能真正变成工作流。dsh-discord 算是把这句话往 dsh 上又落了一步。造轮子的过程还是老配方:人定结构和边界,agent 轮班写代码,OpenSpec 管 spec,agent-skills 管实现纪律,GPT 和 GLM 交叉调试互相抓 bug。从想法到 npm,一个周末。
仓库在这里:addozhang/dsh-discord,MIT,issue 和 PR 都欢迎。



