前言¶
在 DeepSeek Harness(DSH)裏跑智能體,讀文件是高頻操作。同一份源碼被反覆 read、大文件只改了幾行卻要整本重發、上下文裏已經出現過卻還要再佔 token——這些都會直接喫掉窗口預算。原生 read 工具每次返回完整正文,沒有跨次調用的賬本。
下面介紹社區插件 dsh-file-mount(維護者 acefun29)。它在 tools/post-execute 面攔截 read / write / edit,記錄每個文件哪些行範圍已進入模型上下文;重複讀取只補缺失部分,磁盤改動時按行級 diff 只補變動行,並在 Web 端提供「掛載文件」儀表盤。機制移植自 piwpi 的 context-mount。
這是什麼¶
dsh-file-mount 是 DSH 的雙半部插件:宿主側(dsh.bundle.patch)接管文件讀寫結果,瀏覽器側(dsh.client manifest)渲染掛載儀表盤。當前版本 0.5.1,MIT 許可證,GitHub 約 13 stars。目錄頁:SkillHub;源碼:github.com/acefun29/dsh-file-mount。
依賴 DSH 0.1.0-rc.5 及以上,需要本機 pnpm 和 Node ^22.19 || >=24。
核心功能¶
模型側:增量讀取與去重¶
插件在 read 結果返回給模型前做三分支決策:
- 完全覆蓋:已讀行範圍全部在賬本內,結果換成去重 marker,不重複發送正文。
- 部分覆蓋或文件 hash 變化:缺失或改動的正文寫進本次 read 工具結果(每行帶
N:行號,與原生 read 對齊);紙條只留 head-only 賬本聲明。 - 首次掛載:保留原生 read 正文,同時附加賬本紙條。
文件在磁盤上變化時,插件拿行級底稿做 diff,只補改動行;日誌追加場景只補新尾巴。AI 通過 write 寫過的完整文件,回頭 read 直接免單。模型還可調用 file_mount_forget 工具主動作廢某文件的賬,強制下次整本重讀。
write 會把整本書標記爲「已知道」;edit 會使緩存失效但保留行指紋底稿,下一次讀必重讀盤並走行級 diff。
界面側:掛載文件儀表盤¶
Web 端「掛載文件」標籤頁提供:
- 頂欄固定淨節省與路徑搜索,文件列表單獨滾動。
- 每個文件行可展開爲文件段列表,每段帶新鮮度色帶(綠 / 黃 / 橙 / 紅 / 灰)和過期次數。
- 覆蓋圖用色塊標出已掛載行在文件中的位置,支持搜索、排序、淨節省與人民幣折算。
- 對話區有上下文注入摺疊行;「文件已變更」時行上有角標。
節省統計按中文 1 字 ≈ 1 token、其他 4 字符 ≈ 1 token 估算,界面顯示淨值(省下的減去紙條花掉的,爲負時按 0 顯示)。可選配置 statsFile 把跨會話總賬落盤。
新鮮度與安全閥¶
掛載段記錄載體消息的 seq,按其在當前上下文中的位置判斷是否還適合去重。接近窗口上限時,越靠前的內容越容易被摘賬;過期一次後按 pinAfter 釘住。另有重讀安全閥(valveReads):連續全覆蓋去重達到次數後放行原生 read。
安裝與啓用¶
插件以當前 DSH 進程權限運行,安裝前應閱讀倉庫源碼與 MIT 許可證。裝好 profile 後必須重啓 harness(刷新頁面不夠)。
推薦:GitHub Release¶
npx --yes @deepseek-ai/dsh plugin --profile web add https://github.com/acefun29/dsh-file-mount/releases/latest/download/dsh-file-mount.tgz
npx --yes @deepseek-ai/dsh --profile web
已有全局 dsh 時,第一行可換成:
dsh plugin --profile web add https://github.com/acefun29/dsh-file-mount/releases/latest/download/dsh-file-mount.tgz
裝的是預構建包,無需 allowBuilds,也不走 npm。不要用 github:acefun29/dsh-file-mount 裝源碼——倉庫不含 lib/,且包已去掉 prepare。
本倉庫開發版¶
pnpm dsh:install
Windows 上不要對目錄路徑用 dsh plugin add . 或 file:E:\...(pnpm 會把盤符拼進 profile 目錄,插件裝上但不激活)。
配置¶
在 profile 的插件配置中加入:
- id: file-mount
name: dsh-file-mount
config:
enabled: true # 總開關;關閉後所有讀取原生透傳
capacity: 32 # 文件身份緩存容量(掛載中文件不受淘汰影響)
ttlMs: 300000 # 緩存安全閥:同 stat 內容被改的兜底重讀間隔
maxPinnedFiles: 256 # 單個會話最多釘住多少個掛載文件
minSavedTokens: 16 # 去重/增量淨收益低於此值則原生透傳且不寫賬本
maxFingerprintBytes: 1000000 # 超過此大小的文件不留行級底稿
maxManagedBytes: 16777216 # 超過此大小的文件不接管,原樣放行
excludeGlobs: ['**/node_modules/**'] # 這些路徑永遠原樣放行
statsFile: ./dsh-file-mount-stats.json # 可選:跨會話總賬落盤路徑
freshnessEnabled: true # 新鮮度:默認開
pinAfter: 1 # 過期一次後釘住
contextWindow: 128000 # 會話未報告窗口時的默認 W
valveReads: 2 # 重讀安全閥:連續攔截達到此次數觸發原生透傳重讀(0=關閉)
想少管一些文件,調 excludeGlobs 和 maxManagedBytes 即可;名單外或超大文件原樣放行。
典型用法¶
經過上面的安裝步驟,正常使用 read / write / edit 工具即可,插件自動介入,無需額外命令。
強制重讀某個文件:讓模型調用 file_mount_forget 作廢該文件賬,下次 read 整本重發。去重 marker 也會提示:上文找不到內容時,先 forget 再 read。
查看跨會話統計:配置 statsFile 後自動累計,可通過 fileMount.stats() 讀取(界面展示暫緩)。
排除不需要接管的目錄:在 excludeGlobs 中加入模式,例如 ['**/node_modules/**', '**/dist/**']。
適用場景與注意¶
適合誰
- 長會話裏反覆讀取同一份源碼、配置或文檔的智能體任務。
- 大文件局部改動後只需補 diff 行的場景。
- 需要在 Web 端直觀看到上下文掛載狀態與 token 節省估算的開發者。
已知限制
- compaction 後「已掛載」保證失效:被壓縮掉的掛載內容離開模型上下文,下一次讀取重新錨定。
- 增量 / 去重替換了結果文本,UI 的 read 卡片會降級爲通用卡片(canonical value 完整保留)。
- 超過
maxManagedBytes的文件與excludeGlobs命中的路徑不接管。 - 新鮮度是啓發式:段過期不代表內容被移出上下文(只有壓縮纔會),過期重發是故意的 token 開銷。
- 省的數字是估算,不宜當作精確計費依據。
插件與 DSH 宿主、read / write / edit 工具結構耦合;升級 DSH 後建議關注插件 Release 是否跟進。社區目錄 SkillHub 是獨立站點,與 DeepSeek / 幻方無官方從屬關係。
結尾¶
dsh-file-mount 把文件讀取從「每次全量」變成「賬本 + 增量」,在重複讀、局部改、長會話三類場景裏都能省下上下文 token,同時用儀表盤把掛載狀態可視化。若你正在 DSH 上跑代碼類智能體,值得一試。
- 目錄頁:https://www.skillhub.cn/plugins/acefun29/dsh-file-mount
- GitHub:https://github.com/acefun29/dsh-file-mount