dsh-split-reply: Send QQ Channel Replies Individually by Sentence

前言

在 DeepSeek Harness(DSH)里接 QQ 频道时,常用 @tencent-connect/dsh-qqbot。默认行为是把模型整段回复一次性推到 QQ,读起来像公告,缺少对话感。若希望回复按句号、问号拆开,中间隔一两秒再发下一条,更接近人在打字,需要在发送链路上做一层处理。下面介绍社区插件 dsh-split-reply(维护者 betty598,分类:联网工具):不改官方 QQ 包,只在 QQBot.prototype.sendMarkdown 外包一层,实现按标点拆句与间隔发送。

这是什么

dsh-split-reply 是 DeepSeek Harness 插件,仓库 betty598/dsh-split-reply,目录页见 SkillHub。当前 package 版本为 0.1.1,许可证 MIT。

它解决的是:dsh-qqbot 里正常回复、报错、文件投递、提问卡片等文字最终都经过 QQBot.prototype.sendMarkdown;本插件在该方法外包一层,拿到整段文本后按规则切开,逐条发出,两条之间随机等待约 0.7–1.6 秒(可在配置里改)。

README 中的效果示意:

你:今天好累啊

她:怎么啦。
    是工作那边的事吗?
    那你早点睡,别硬撑。
      ← 这条 1.4 秒后到
      ← 这条 1.2 秒后到

核心功能

拆句与发送流程

经过上面的挂载,插件大致做这些事:

  1. 拿到整段文本。
  2. 按 。!?!?…~ 和换行切开(换行是否分段由 splitOnNewline 控制)。
  3. 太短的碎片并回上一句,段数超过上限则合并。
  4. 相邻两条之间在 minIntervalMs–maxIntervalMs 之间随机等待。
  5. 逐条调用原有发送逻辑。

不改官方包,只包原型方法;dsh-qqbot 升级时一般不受影响。

宿主重载后的自愈(0.1.1)

宿主重载会把 QQBot 重新加载成新类,旧包层会丢;0.1.0 若不再执行 apply 会静默停止拆句。0.1.1 起每 5 秒检查原型上是否还有包层,缺失则补上;真正发消息时也会再补一次。纯本地判断,不消耗模型 token。

什么时候不拆

下列情况整段原样发出,不做拆分:

  • 带按钮/键盘的消息(提问卡片、审批按钮)。
  • 含代码块、表格、Markdown 标题的回复。
  • 整段字数少于 minTotalChars。
  • 配置里 enabled: false。

安装与启用

插件以当前 DSH 进程权限运行,安装前建议通读仓库源码并确认 MIT 许可证与行为是否符合预期。社区目录 SkillHub 为独立站点,与 DeepSeek / 幻方无官方从属关系。

手动安装(README 推荐)

在 desktop profile 下执行:

cd ~/.dsh/profiles/desktop

# 1. 把仓库放到 _plugins 下
git clone https://github.com/betty598/dsh-split-reply.git _plugins/dsh-split-reply

# 2. 跑安装脚本:写 package.json、建软链、加配置
node _plugins/dsh-split-reply/scripts/install.mjs "$PWD/_plugins/dsh-split-reply"

必须关闭 QQ 流式输出

流式通道不经过 sendMarkdown,插件不会生效。在 ~/.dsh/profiles/desktop/cordis.patch.yml 中为 im-qqbot 关闭流式:

# ~/.dsh/profiles/desktop/cordis.patch.yml
- id: im-qqbot
  config:
    appId: '你的AppID'
    appSecret: 你的Secret
    streaming: false      # ← 加这一行

修改后重启 DSH。

配置项

同一文件可调整 split-reply 段(安装脚本通常会写入片段,可按需改):

- id: split-reply
  name: dsh-split-reply
  config:
    enabled: true
    maxSegments: 4
    minSegmentChars: 4
    minTotalChars: 10
    minIntervalMs: 700
    maxIntervalMs: 1600
    splitOnNewline: true
键 默认 说明
enabled true 总开关
maxSegments 4 最多拆几条,超了自动合并
minSegmentChars 4 太短的碎片并回上一句
minTotalChars 10 整段短于这个字数就不拆
minIntervalMs 700 两条之间最短间隔
maxIntervalMs 1600 两条之间最长间隔
splitOnNewline true 换行也算分段点

典型用法

先做安装与 streaming: false,重启后在 QQ 频道与 Harness 对话即可;无需额外命令。适合希望 QQ 侧呈现「多句、有间隔」的对话体,且回复以中文标点为主的场景。

若模型整段不用标点,插件无法切分,只能一次性发完——这是拆句策略本身的限制。

适用场景与注意

  • 仅 QQ 频道有效;其他 IM 若走各自发送口,需单独对接。
  • QQ 被动回复同一条消息有次数上限(5 次),故 maxSegments 默认 4。调大可能被限流;发送失败时插件会吞掉失败条目不崩进程,但后续条也可能发不出。
  • 流式输出开启时本插件不生效。
  • 卸载时:从 cordis.patch.yml 删除 split-reply 段;从 package.json 的 dependencies 和 dsh.profile.bundles 去掉 dsh-split-reply;删除 node_modules/dsh-split-reply 与 _plugins/dsh-split-reply;再重启。

结尾

dsh-split-reply 在不动官方 dsh-qqbot 的前提下,把整段 Markdown 回复拆成多条并按间隔发出,并带重载自愈。需要查阅说明或提 issue 时,可用目录页 betty598/dsh-split-reply @ SkillHub 与源码 GitHub。

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

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

Xiaoye