前言¶
在 DSH 网页聊天里,用户常会一句接一句补全想法。若不处理,每条消息都会走一遍 agent 的 followup(),模型可能被连续唤醒、连回好几轮,既费 token,也容易打断上下文节奏。常见做法是让用户自己等几秒再发,或在前端做防抖——前者靠习惯,后者往往动不到服务端的唤醒逻辑。
下面介绍社区插件 dsh-send-debounce(维护者 praystring,分类:工作流):在服务端对「用户连发的短消息」做缓冲,停手默认 5 秒后再合并成一轮送进模型,只唤醒一次。长消息、带图片/附件的消息仍立即发出;插件来源消息与 steer() 插话不受影响。
这是什么¶
dsh-send-debounce 是 DeepSeek Harness(DSH)的 npm 公开包插件,当前版本 1.0.0(MIT)。它只做一件事:拦截每个 agent 的 followup()(@deepseek-ai/dsh-agent-loop),把网页用户自己发的短消息先入队、延迟合并,到点再调用原生 followup()。
- 目录页:https://www.skillhub.cn/plugins/praystring/dsh-send-debounce
- 源码与说明:https://github.com/praystring/dsh-send-debounce
DSH 生态强调「一切皆插件」;SkillHub 等社区目录独立于 DeepSeek / 幻方,并非官方应用商店。安装前建议自行查看 index.mjs 与许可证。插件在 当前 dsh 进程权限 下运行;本插件声明不联网、不读工作区、不写文件、不读环境密钥,仅读取三个 DSH_SEND_DEBOUNCE* 配置项。
核心功能¶
缓冲与合并¶
- 用户消息立刻进入排队区(页面上可见),但先不唤醒模型。
- 默认静默 5000 毫秒;静默期内每来一条新的短消息会重置计时。
- 计时结束后,这一批消息合并成一条(两条之间插入空行,保留原文与顺序,不改写内容),再唤醒一次。
立即放行的情况¶
- 消息长度达到「短话」上限(默认 ≥120 字符)时立即发出,不延迟。
- 带图片或附件的消息立即发出。
steer()(插话)不受本插件影响。- 来自其他插件的
agent.followup(如dsh-proactive、dsh-tick)原样放行。
安全与降级¶
- 仅处理
message.source.kind === "user"的用户消息。 - 读队列、合并或发送失败时,
try/catch后逐条补发或放行,避免聊天框卡住。 - 任何异常均退回原生
followup()行为。
已知限制(使用前需知)¶
- 静默依赖进程内定时器:dsh 在合并触发前重启时,消息仍在会话里,但不会自动被唤醒,需等新消息或手动触发;重启前建议等待数秒让缓冲落地。
- 环境变量修改需重启 dsh,不支持热更新。
- 长短仅按字符数判断,不看语义;极短但紧急的内容也会被默认静默时长缓冲。
- 合并后模型看到的是合并文本;原始入队记录仍在 inbox 事件中,便于排查。
- 仅在服务端生效(手机浏览器同样受益),不改变前端界面。
安装与启用¶
从 npm 安装(公开包):
dsh plugin --profile web add dsh-send-debounce
本地目录开发/自用:
dsh plugin --profile web add file:/path/to/dsh-send-debounce
装完后需把 dsh-send-debounce 写入该 profile 的 dsh.profile.bundles(cordis.patch.yml 即这一层),再重启并确认服务正常:
dsh --profile web --dump-config | grep -n dsh-send-debounce
sudo systemctl restart dsh
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:3080/
package.json 要求 Node >=22.5,DSH peer 范围为 >=0.1.5-rc.2 <0.2.0-0(及文档列出的若干 alpha 区间)。
配置¶
通过环境变量配置,改完需重启 dsh 生效:
| 变量 | 默认 | 含义 |
|---|---|---|
DSH_SEND_DEBOUNCE |
开 | off / 0 / false / no 可一键关闭 |
DSH_SEND_DEBOUNCE_MS |
5000 |
静默时长(毫秒);0 等于关闭延迟;非法值退回默认 |
DSH_SEND_DEBOUNCE_MAX_CHARS |
120 |
「短话」字符上限;0 表示一律延迟;非法值退回默认 |
典型用法¶
无需完整 dsh 环境即可在仓库根目录跑自测(覆盖连发合并、长消息直发、插件来源直通、图片直发、超时各成一轮、开关与非法配置等):
npm test
等价于:
node test.mjs
线上行为可这样理解:用户在聊天框连续发送多条不足 120 字的短句,中间不触发多次模型回复;停手约 5 秒后,内容合并为一条再进入一轮对话。若某条已超过 120 字或含附件,该条会立刻进入正常 followup 流程。
回滚与卸载¶
按 profile 备份还原 package.json:
cp ~/.dsh/profiles/web/package.json.bak-<日期> ~/.dsh/profiles/web/package.json
sudo systemctl restart dsh
或从 dsh.profile.bundles 中移除 dsh-send-debounce 后重启,即可恢复原生 followup()(卸载会清掉定时器)。
结尾¶
dsh-send-debounce 适合习惯在 DSH 网页里分段输入、又希望减少连发导致的多次唤醒的场景。它把防抖放在服务端 followup() 入口,与前端无关,并明确不干扰 proactive、tick 等插件消息与插话。更多细节见 GitHub README:https://github.com/praystring/dsh-send-debounce;目录入口:https://www.skillhub.cn/plugins/praystring/dsh-send-debounce。