elegant01/dsh-scalpel:在 DSH 會話裏做上下文對比與裁剪

前言

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 / 幻方無官方從屬關係。

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

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

小夜