前言¶
在 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 秒后到
核心功能¶
拆句与发送流程¶
经过上面的挂载,插件大致做这些事:
- 拿到整段文本。
- 按
。!?!?…~和换行切开(换行是否分段由splitOnNewline控制)。 - 太短的碎片并回上一句,段数超过上限则合并。
- 相邻两条之间在
minIntervalMs–maxIntervalMs之间随机等待。 - 逐条调用原有发送逻辑。
不改官方包,只包原型方法;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。