dsh-send-debounce:连发短消息合并后再唤醒模型

前言

在 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()。

DSH 生态强调「一切皆插件」;SkillHub 等社区目录独立于 DeepSeek / 幻方,并非官方应用商店。安装前建议自行查看 index.mjs 与许可证。插件在 当前 dsh 进程权限 下运行;本插件声明不联网、不读工作区、不写文件、不读环境密钥,仅读取三个 DSH_SEND_DEBOUNCE* 配置项。

核心功能

缓冲与合并

  1. 用户消息立刻进入排队区(页面上可见),但先不唤醒模型。
  2. 默认静默 5000 毫秒;静默期内每来一条新的短消息会重置计时。
  3. 计时结束后,这一批消息合并成一条(两条之间插入空行,保留原文与顺序,不改写内容),再唤醒一次。

立即放行的情况

  • 消息长度达到「短话」上限(默认 ≥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。

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

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

小夜