前言¶
DSH(DeepSeek Harness)的會話是 append-only 的事件日誌,而模型每次請求都拿到一份由歷史拼出來的 messages。這帶來一個具體難題:同一會話裏問了兩次同一個問題,想並排看兩次回答的差異;或者長會話裏前面幾輪已經沒用了,但它們仍然留在每一次發給模型的請求裏,既不划算也影響後續判斷。已有的做法一般是開新會話,代價是丟掉上下文;手工改會話文件則會破壞 replay。
下面介紹的插件是 elegant01/dsh-scalpel,維護者 elegant01,分類爲「記憶」,許可證 MIT。它只做兩件事:同會話對比兩次(最多三次)回答,以及把指定的若干輪從之後每次請求裏摘掉。它的定位是「上下文手術刀」,而不是會話管理器——會話文件、界面、別人的視角都不動。
核心功能¶
同會話對比。 同一個會話裏選兩條(或三條)回答,段落級對齊 + 詞級高亮。面板提供左中右三列、⇄ 交換、僅看差異 摺疊相同段,以及按關鍵詞只留命中段落的搜索。
真實用量對照。 每條回答的 token 總量、未緩存輸入、緩存讀取 / 寫入、輸出和緩存命中率左右並排展示;VS 頭也帶一行 X tok · 緩存命中 Y%。
同會話剔除。 把指定輪從之後每一次發給模型的請求裏摘掉。規則按 sessionId + 輪號區間 存盤,每輪重讀,改規則不用重啓。
按預算選刪。 選目標 200K / 500K / 1M 和保留最近幾輪,插件自動算該刪 #1–#K,預覽刪完還剩多少 tok。
規則可視化。 面板可直接查看當前生效的剔除區間,一鍵應用或撤銷,走宿主半提供的本地接口,不用回終端。
需要先澄清的是:這裏的「剔除」不是「刪除」。歷史落盤後不可改,插件只改寫發給模型那份副本。因此它永遠不剔除當前正在回答的那一輪,也只能按整輪切,不能拆單條消息,以保證 tool_use / tool_result 成對,避免 400。前綴一變會讓 prompt cache 冷一次,這是設計選擇。
安裝與啓用¶
dsh plugin --profile desktop add dsh-scalpel
# 把 dsh.profile.bundles 里加上 "dsh-scalpel",然後完全退出 DSH 再啓動
該插件要求 dsh >=0.2.1-rc.1 <0.2.2。bundle 是開機捕獲的,只刷新頁面不生效。
本地開發時把倉庫鏈進 profile 的 node_modules,在 package.json 中加依賴 "dsh-scalpel": "link:../../local-plugins/dsh-scalpel",並把 dsh-scalpel 寫入 dsh.profile.bundles,然後完全退出 DSH 再啓動。注意 ~/.dsh/local-plugins/<name>/ 不會被自動掃描,文件夾存在不等於加載。
典型用法¶
對比有三個入口:會話視圖切換欄頂部的「對比」tab、assistant 消息動作行的「⚖ 對比」、以及終端的 scalpel compare。面板裏左選一條、右選一條,還能加第三條做三路對比;沒有重複提問時默認選最近兩條。端到端可復現的命令行:
scalpel sessions --limit 5 # 最近的會話
scalpel turns latest # 這個會話有幾輪
scalpel compare latest --a 1 --b 2 # 第 1 輪 vs 第 2 輪
scalpel compare latest --a 1 --b 2 --json # 結構化輸出,給別的工具喫
剔除主要走面板:頂部切到「刪除範圍」,在回合表裏點兩行選一個區間,每一行自己報 N 字 · 約 X tok。也可以命令行直接操作:
scalpel drop latest --from 5 --to 7 --dry # 只打印將寫入的規則,不落盤
scalpel drop latest --from 5 --to 7 # 真摘
scalpel undrop latest # 全撤
scalpel rules # 當前規則
scalpel audit --limit 20 # 每輪摘了幾條
規則文件是 ~/.dsh/scalpel-drop.json,格式如下:
{
"version": 1,
"sessions": {
"<sessionId>": {
"dropTurns": [[5, 7]], // 剔除第 5~7 輪;輪 = 一條用戶消息開始的一段
"dryRun": false // true 時只寫審計,不動 messages
}
}
}
會話數據來自 ~/.dsh/sessions/<workspace>/session-<uuid>/session.v4.jsonl.zstd,多幀 zstd 按 magic 28 B5 2F FD 切幀解壓,Node 22 內置 zstdDecompressSync 直接讀,無第三方依賴。每輪摘了幾條、省了多少字符,寫進 ~/.dsh/scalpel-audit.jsonl。
關於輪號,有兩個容易踩的定義:工具返回(role: "user" + tool_result 塊)不另起一輪;宿主給的是 session-<uuid>,CLI 和麪板用的是裸 <uuid>,兩種寫法都能命中。
裝了但沒生效時先跑診斷:
scalpel doctor
它會一次列出 Node 有沒有 zstd、exports["./client"] 在不在、dsh.client 的 platform/immediately 對不對、依賴和 dsh.profile.bundles 兩處是否都寫了、探針多久沒更新等。最常見的坑是隻加了依賴沒加 dsh.profile.bundles(宿主不加載、不報錯),以及改完只刷新頁面(探針時間戳會暴露這一點)。
適用場景與注意¶
適合這樣的開發者:需要在長會話裏控制發給模型的上下文體積,或者想確認兩次回答到底差在哪,並且希望變更規則後不必重啓。它是純 ESM、無構建步驟,client.js 是手寫 bundle。測試用 npm test 即可在不裝 DSH 的情況下驗證宿主半行爲。
幾點需要留意:插件以當前 DSH 進程的權限運行,安裝前應檢查源碼與許可證(MIT)。它不適用於想讓模型「以後再也不提 B」的場景——剔除只是讓模型看不見,你自己的會話裏 B 仍在,要徹底乾淨請開新會話加交接稿。也不要用它物理刪除某段歷史,直接改 session.v4.jsonl.zstd 會破壞 replay,真要刪就整會話歸檔。
結尾¶
dsh-scalpel 的價值在於把「對比」和「裁剪」這兩類上下文操作收進一個插件,且只作用於發給模型的副本,不動真相源。目錄頁見 https://www.skillhub.cn/plugins/elegant01/dsh-scalpel ,源碼見 https://github.com/elegant01/dsh-scalpel 。社區目錄是獨立站點,與 DeepSeek / 幻方無官方從屬關係。