dsh-mode-switch:給 DSH 會話配一套工具檔位

前言

DSH(DeepSeek Harness)每個會話都會把全部工具的說明塞進上下文。工具裝得多,說明本身就佔掉幾萬 token;同時模型每輪要從這堆工具裏挑,工具列表越長,挑錯或繞彎的概率越高。

已有的做法是寫在 preset 裏的模式切換。dsh-mode-switch 從另一個角度處理:不改 preset,而是給會話單獨配一層「檔位」,讓一個會話只帶當前用得上的工具,在界面上就能切檔、看省了多少、改規則。插件由 MOLMOORE 維護,分類屬於工作流,目前 GitHub 星標爲 0。

這是什麼

一句話:給 DeepSeek Harness 加一層工具檔位,讓每個會話按檔攜帶工具。

它不聲明 preset,也不動 preset 註冊表。官方那幾種模式照舊,檔位是疊在上面的另一層。預先聲明的工具集無法夠到的場景(preset 自帶工具、agent 作用域註冊的工具、其它插件的界面卡片)不在這層治理範圍內,後面「適用場景與注意」會具體說明。

安裝與啓用

需要 DSH 0.2.1 或更新。安裝命令:

dsh plugin --profile desktop add github:MOLMOORE/dsh-mode-switch

裝完重啓。輸入框上方會出現一行膠囊:

檔位 基礎檔 · 標準模式 · 62 工具 · ≈14.9k tok schema

其中 62 和 14.9k 是作者機器上的數,裝了什麼插件,數字就不一樣。這一步只負責把插件加進來,具體表現要重啓後在界面確認。插件的 package.json 裏標了 MIT 許可證。

核心功能:四個界面動作

  1. 點右邊的小膠囊換檔。只有還沒發過消息的會話能換。
  2. 點主膠囊展開明細:各檔的工具數、token、比全量檔省多少,以及這個會話第一個請求實際帶了多少工具。
  3. 右上角「編輯檔位」:加檔、改名、刪檔、勾選每檔保留的工具。改完保存,新會話生效。
  4. 編輯器裏的「AI 分配」:把當前機器的工具名和說明交給默認模型,讓它按用途分檔。結果先填進編輯器,人工看過再保存。

「AI 分配」要調一次模型(走默認路由),耗時幾十秒到一兩分鐘,費用算在使用者賬上;沒有可用模型時按鈕會報錯,手動勾選照樣能用。

規則怎麼算

核心規則只有一條:

可見工具 = 全局工具 − 當前檔的 deny 規則

deny 裏 foo_* 按前綴匹配,其它按完整名字匹配。preset 自帶的工具(讀寫文件、todo、問用戶)和 agent 作用域註冊的工具不在全局名單裏,任何檔都裁不掉它們。

規則存放在 ~/.dsh/state/mode-switch/catalog.json,首次運行自動生成。面板改的就是這個文件;直接編輯文件也行,不用重啓。結構如下:

{
  "version": 1,
  "modes": [
    { "id": "mode-basic", "name": "基礎檔", "order": 10, "deny": ["mcp__*", "ego_*", "ppt_*", "office_*"] },
    { "id": "mode-full",  "name": "全量檔", "order": 40, "deny": [] }
  ]
}

deny 爲空就是全帶。檔位被刪掉後,指向它的會話按 order 退到最前面那個檔位,不會變成不裁剪。

什麼時候生效

時機 行爲
新建會話,還沒發消息 可以切,選擇只記下來,還沒生效
發出第一條消息 按所選檔位裁一次,沒選就用默認檔
對話開始後 不能切,服務端返回 session-started
插件裝之前建的會話 不改寫,顯示全量檔

對話中不能切,是因爲 DSH 在第一次組裝請求時把工具目錄固定了,之後 ctx.tools.restrict() 只能收緊不能放寬。想換檔就新開會話。

默認的四個檔

檔位 留下的東西
基礎檔 核心工具。MCP、瀏覽器、PPT、Office、論文、論衡都摘掉
辦公檔 辦公文檔、PPT 相關留下,建模和瀏覽器摘掉
建模檔 SolidWorks 的 MCP 留下,辦公、PPT、瀏覽器摘掉
全量檔 不裁

建模檔是按作者自己的機器寫的:作者裝了 SolidWorks 的 MCP,所以專門留一個檔給它。沒裝 CAD 的機器上,這個檔和辦公檔基本一樣,分不出區別。裝完先看一眼自己的工具列表,或者直接點「AI 分配」重來一遍,比照搬默認值靠譜。

少帶工具的效果

以下是作者機器上的實測數,工具數量取決於各自裝了哪些插件,僅作量級參考。

  1. 省 token。作者機器上全量 198 個工具、約 54.8k token;基礎檔 62 個、約 14.9k。工具表在首次組裝時固定,之後每次請求都帶着同一套,省的是整段會話的每一次請求。
  2. 模型少分心。工具表越長,讀到的無關描述越多,挑工具時更容易挑錯,或者圍着一輪用不上的能力打轉。把用不上的先摘掉,選擇面小一些,回答也短一些。這是使用下來的判斷,作者沒有做過量化實驗。
  3. 界面上的動作也少。工具少了,模型不會再在「要不要用瀏覽器查一下」這類選擇上反覆試探。

典型用法:按項目類型先建檔,再新開會話

適用於工具集長期固定、按場景劃分的情形。

  1. 在右上角「編輯檔位」里加一個名爲「調試檔」的檔,deny 裏填 mcp__*,order 放在基礎檔之前。
  2. 保存,新會話即生效。
  3. 進入新會話,確認輸入框上方的膠囊顯示剛建的檔位。
  4. 若本機裝了 CAD 組件,改成在面板裏勾 SolidWorks 相關的 MCP,而不是直接套用默認的「建模檔」。

按文件直接配置也行,例如編輯 ~/.dsh/state/mode-switch/catalog.json,加一段:

{ "id": "mode-debug", "name": "調試檔", "order": 5, "deny": ["mcp__*", "ppt_*"] }

保存後不用重啓,新會話會讀到它。插件改名或新加工具時,規則要跟着改,否則會漏裁,因爲它靠的是名字匹配而不是能力描述。

適用場景與注意

適合這幾種情況:DSH 工具數量較多、token 佔用明顯;按項目類型劃分工具集;想讓團隊成員用同一套檔位約定。

使用前需要確認三件事。

  1. 插件以當前 DSH 進程的權限運行,安裝前應先讀一遍源碼與許可證,確認不引入額外敏感權限。
  2. 只能裁全局工具:preset 自帶工具、agent 作用域註冊的工具裁不掉。官方 slots 也沒有移除其它插件界面卡片的接口,那些條目會原樣留在界面上。
  3. deny 是名字規則,覆蓋面取決於工具命名是否穩定。

插件暴露的接口

插件本身帶一組 HTTP 接口,插件作者和調試腳本可以用來覈對檔位的實際效果:

方法 路徑 說明
GET /api/mode-switch/status?sessionId= 膠囊用的數據
GET /api/mode-switch/detail?sessionId= 面板數據:各檔足跡、逐工具開銷、全部工具
GET /api/mode-switch/verify?sessionId= 請求級證據:會話日誌裏每個請求真實帶了多少工具
POST /api/mode-switch/select?sessionId=&toolset= 選檔,僅限沒開始的會話
POST /api/mode-switch/modes 保存整個檔位列表
POST /api/mode-switch/auto 調模型提一版檔位方案(不寫入)

對要驗證省下多少 token 的場景,用 /api/mode-switch/verify 取請求級證據比較直接。細節和實測記錄在倉庫的 docs/LIMITATIONS.md。

結尾

dsh-mode-switch 解決的是「一個會話不該帶全量工具」這件事:用檔位把工具聲明和作用範圍分離,界面上切檔、編輯、按模型分配一次到位,不改 preset 註冊表。目錄頁:https://www.skillhub.cn/plugins/MOLMOORE/dsh-mode-switch ;源碼:https://github.com/MOLMOORE/dsh-mode-switch 。

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

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

小夜