前言¶
在 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 目錄頁。