前言¶
在 DeepSeek Harness 中切換會話時,有時會感到明顯的等待。這通常是因爲 Host 需要加載大量歷史消息,以及頁面在初始化時多次發起相同的只讀請求。
dsh-fastswitch 針對這兩個環節做了一次瀏覽器端的優化:把首次加載的歷史消息窗口從 50 條調小到 20 條,並對只讀 RPC 請求做去重與緩存。兩個功能可以獨立開關。
這是什麼¶
dsh-fastswitch 是一個 DeepSeek Harness 客戶端插件,由 guofug 維護,通過瀏覽器端的 window.fetch 包裝和請求重寫來實現性能提升。它不修改 DSH 本身或 Host 的行爲,隻影響本地請求。
核心功能¶
1. 可配置的首次加載窗口¶
當切換 Session 時,DSH 會請求 Host 返回該會話的初始快照。默認的窗口大小是 50 條消息。對於長對話,這會生成約 2 MB 的響應幀,造成等待。
dsh-fastswitch 在發送 session/follow 請求前,將 turnWindow.minMessages 從 50 修改爲 20。Host 對 0 < minMessages <= maxMessages 的請求是支持的,因此這是合法的請求重寫,而非補丁。
如果需要加載更早的消息(例如 200 條),可以手動將該值設爲 200,插件不會覆蓋它。
2. 只讀 RPC 去重與緩存¶
頁面初始化時,多個組件會在掛載時各自發起相同的只讀請求,如 session/modelCatalog、credentials/describe、agentPresets/list、cotTranslation/limits 等,沒有去重也沒有緩存。
dsh-fastswitch 通過包裝 window.fetch,將只讀的 catalog 請求緩存 5 分鐘,並將同一時間窗口內的併發請求合併爲一次網絡調用。
安裝與啓用¶
在插件市場中搜索 fastswitch,或使用以下命令安裝:
dsh plugin --profile web add github:guofug/dsh-fastswitch
安裝後重啓一次(或等待 HMR 重新加載)即可生效。
典型用法¶
所有配置通過 localStorage 完成,沒有配置文件。
默認配置:
| Key | 默認值 | 說明 |
|---|---|---|
dsh-fastswitch |
— | 設爲 off 可關閉所有功能 |
dsh-fastswitch-window |
20 |
首次加載窗口大小,設爲 0 則不修改 |
dsh-fastswitch-ttl |
300000 |
緩存過期時間(毫秒),設爲 0 禁用緩存 |
dsh-fastswitch-merge |
800 |
併發請求合併的時間窗口(毫秒) |
示例:將窗口設爲 10 條,同時關閉緩存:
localStorage.setItem('dsh-fastswitch-window', '10')
localStorage.setItem('dsh-fastswitch-ttl', '0')
檢查是否生效¶
在瀏覽器控制台執行:
window.__dshFastswitch
返回對象示例:
// { installed: true,
// ws: { rewritten: 3, untouched: 40 },
// fetch: { calls: 51, hits: 10, dedup: 8, bypass: 33 } }
ws.rewritten:每次成功重寫turnWindow.minMessages的次數fetch.calls:總請求次數fetch.hits:命中緩存的次數fetch.dedup:去重合並的次數fetch.bypass:未命中緩存且未被去重的請求次數
適用場景與注意¶
- 僅對 Web 客戶端生效,SDK、ACP 等其他客戶端不受影響。
- 不修改 DSH 或 Host 的文件,卸載後即可恢復默認行爲。
- 插件不維護會話緩存,無法實現跨會話的即時切換,因此不適合需要“快速切回上一個會話”的場景。
- 緩存僅覆蓋只讀的 catalog 請求,不涉及寫入、流式響應或認證接口。
生態背景¶
DeepSeek Harness 的插件化架構允許在不修改核心代碼的情況下擴展能力。dsh-fastswitch 是社區維護的插件,獨立於 DeepSeek 或幻方,其功能與行爲由源碼與文檔保證。
鏈接¶
- 插件目錄頁:https://www.skillhub.cn/plugins/guofug/dsh-fastswitch
- GitHub:https://github.com/guofug/dsh-fastswitch