dsh-split-reply:讓 QQ 頻道回覆按句逐條發送

前言

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

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

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

小夜