dsh-dsml-guard:抹掉正文裏的 DSML 泄漏,並在「這一輪其實沒產出」時自動續跑

前言

在 DeepSeek Harness(DSH)裏走第三方直連的 deepseek-v4.1-flash 時,模型偶爾會把 DSML 調用標記寫進助手正文。宿主側 turn/end 仍可能是 {"kind":"completed"},看起來像正常結束,但屏幕上會出現 ||DSML|| 包裹的 invoke / tool_calls 殘渣,或只有結尾閉合標籤。更麻煩的是:若只在流式增量上清洗,落進會話歷史的正文仍可能和 block-end 裏的完整塊一致且帶標記,下一輪會把髒上下文再發給上游。

社區裏常見的自動繼續插件只認 kind === 'error' 且錯誤碼在白名單內,對這種「已完成卻泄漏」的輪次不會補發「繼續」;已有 DSML 清洗插件若只匹配單豎線 |DSML|,而真實流量多爲雙豎線 ||DSML||,實測會原樣放行。下面介紹維護者 Jessicaisleep 發佈的工作流類插件 dsh-dsml-guard:在 llm/stream 與 session/event 鉤子上做顯示與歷史一致的清洗,並在啓發式判定「這一輪確實沒產出」或遇到可重試的網絡類失敗時,通過 agent.followup() 補一條「繼續」;對餘額、額度、上下文超限等錯誤 deliberately 不續跑。

這是什麼

dsh-dsml-guard 是 DSH 宿主插件(npm 包名 dsh-dsml-guard),源碼與說明見 GitHub:Jessicaisleep/dsh-dsml-guard,社區目錄頁爲 skillhub.cn/plugins/Jessicaisleep/dsh-dsml-guard。分類爲工作流;許可證 MIT。當前 package 版本 0.1.2(以 package.json 爲準)。

一句話:抹掉漏進助手 prose 的 DSML 標記,並只對「真的什麼都沒產出」的輪次或超時 / 斷聯等可重試失敗自動補「繼續」;quota、rate-limit、上下文超限等一律不自動重試。

核心功能

清洗(llm/stream,只改顯示與落歷史路徑,不改請求)

認三種豎線寫法:||DSML||(README 稱實測主流)、|DSML|、||DSML||。處理四類殘渣:完整 invoke / tool_calls 塊(按標籤深度配對摘除)、結尾連綴閉合標籤、孤立外層包裹殘片、無標籤名的光頭標記。Markdown 代碼圍欄與行內 `code` 內不改動。

要點在 block-end:適配器在 finish 前發出的 block-end 攜帶完整 block 全文;README 記錄 2026-10-29 實證,髒消息落盤正文與 block-end.text 逐字節相等,與僅拼接 text-delta 不相等。插件在 block-end 上把文本塊替換成實際發出去的內容,使 歷史與屏幕一致,避免標記在後續輪次被反覆喂回上游。README 註明 0.1.0 僅處理 text-delta,0.1.1 起 才覆蓋 block-end。

插件只對新產生的回合生效;已有存檔中的髒消息需 /compact、開新會話或自行批量處理(README 稱 _probe/ 下有解碼思路,本插件不提供改存檔動作)。

續跑(session/event 的 turn/end)

在以下情況通過 agent.followup() 補 configurable 的「繼續」(默認文案 "繼續"):

  • invoke-block 泄漏且該輪未發出任何 tool-call-delta;
  • tail-close 泄漏且正文短於 tailCloseMinChars(默認 80);
  • turn/end 錯誤碼屬於可配置白名單,默認含 TIMEOUT、TRANSPORT、SERVER、MALFORMED_RESPONSE、PI_AI_ERROR、UNKNOWN。

不續跑的錯誤包括 QUOTA、QUOTA_EXCEEDED、ACCOUNT_QUOTA、RATE_LIMIT、AUTH、MISSING_CREDENTIAL、CONTEXT_WINDOW_EXCEEDED、UNKNOWN_MODEL、HTTP_413、INVALID_REQUEST,以及 aborted / interrupted。

同一會話連續續跑上限 maxConsecutive 默認 5(範圍 1–100);用戶手動發消息會取消待發續跑並將計數歸零(插件自己補的那條不算用戶干預)。

安裝與啓用

DeepSeek Harness 版本要求 >=0.2.1-rc.2 <0.3.0(README 實測於 0.2.1-rc.3);Node.js >=20。裝到 engines.dsh 範圍外時,DSH 安裝階段會按 engines 拒絕。

給別人裝,從 npm 安裝(資料原文命令):

dsh plugin --profile <你的 profile> add dsh-dsml-guard

--profile 須與實際環境一致:桌面應用用 desktop,自啓的 dsh web 用 web。裝完重啓 DSH。

鎖 tag 從 GitHub 安裝(資料原文,勿用 github:owner/repo 簡寫):

dsh plugin --profile <profile> add https://github.com/Jessicaisleep/dsh-dsml-guard/archive/refs/tags/v0.1.0.tar.gz

加載成功後,profile 配置(示例路徑 profiles/desktop/cordis.patch.yml)中應出現:

- id: dsml-guard
  name: dsh-dsml-guard

web profile 可用 dsh --profile web --dump-config 檢查是否含 dsml-guard;desktop profile 下 --dump-config 可能被 Electron 拒絕,屬 README 所述正常現象。

可選配置

在 cordis patch 裏可爲插件增加 config(字段以 README 爲準):

- id: dsml-guard
  name: dsh-dsml-guard
  config:
    enabled: true
    sanitize: true
    autoContinue: true
    continueText: "繼續"
    maxConsecutive: 5
    tailCloseMinChars: 80
    retryCodes: [TIMEOUT, TRANSPORT, SERVER, MALFORMED_RESPONSE, PI_AI_ERROR, UNKNOWN]
    neverCodes: [QUOTA, QUOTA_EXCEEDED, ACCOUNT_QUOTA, RATE_LIMIT, AUTH,
                 MISSING_CREDENTIAL, CONTEXT_WINDOW_EXCEEDED, UNKNOWN_MODEL,
                 HTTP_413, INVALID_REQUEST]

驗證與測試(維護者倉庫)

維護者在倉庫內提供單元與回放測試,不含真實會話依賴時可跑:

node test/run.mjs

端到端用真實捕獲泄漏正文:

node test/replay-real.mjs

README 稱 replay-real.mjs 對 29 條樣本清洗後 0 殘留,續跑判定 19 條(13 invoke-block + 6 tail-close)。

適用場景與注意

適合:使用 DSH 0.2.1-rc.2 至 0.3.0 未發版區間、且通過第三方直連等方式遇到 DSML 標記漏進正文、或需要與「僅認 error 的 auto-continue」互補的場景。README 本機 28 次泄漏均來自 deepseek-v4.1-flash 第三方直連,官方通道未觀察到;模型字段本身不限。

務必知曉:

  • 插件以當前 DSH 進程權限運行;安裝前請自行查看源碼與 MIT 許可證,確認信任維護者與 npm/GitHub 來源。
  • 只處理流式正文;標記若只出現在 reasoning-delta 而非 text-delta / block-end,插件看不到。
  • 續跑判據含啓發式閾值,不改上游請求,泄漏仍可能發生,目標是界面與歷史乾淨、且無產出輪次不白跑。
  • DSH 生態強調「一切皆插件」;skillhub 社區目錄爲獨立站點,與 DeepSeek / 幻方無 README 所述官方從屬關係。

結尾

dsh-dsml-guard 針對 DSML 泄漏與「completed 卻無有效產出」兩類痛點,用 block-end 級清洗切斷上下文污染,並用剋制的自動續跑覆蓋網絡類失敗與實測定義的空產出形態。需要詳情、Issue 與發版流程時,請打開 GitHub 倉庫 或 SkillHub 目錄頁。

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

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

小夜