dsh-change-budget:給 DSH Agent 每輪的文件修改設一道預算上限

前言

用 Coding Agent 改代碼,跑得快,翻車也快:一條模糊指令、一次沒退出的循環、幾個並行的工具調用,都可能讓一個兩行的小改動變成對十幾個文件的改寫,等人發現時 diff 已經不好審了。常見的應對要麼靠提示詞約束,要麼靠事後人工審查,兩者都不是確定性邊界。

下面介紹的 dsh-change-budget 換了一種做法:在支持的寫/編輯工具運行前計數,首個將越過限額的調用在工具體執行前被拒絕。

這是什麼

dsh-change-budget 是一個 DeepSeek Harness(DSH)插件,爲每個 Agent 的每一輪提供獨立、可配置的變更預算,覆蓋三個維度:去重文件數、結構化修改調用數、提交的 UTF-8 字節數。

項目由 Raphaelutumn 維護,當前版本 0.1.0,許可證爲 MIT。

核心功能

1、每輪獨立預算。每個 Agent 每輪拿到獨立的預算,文件數、調用數、字節數三個維度分別計數,互不干擾。

2、工具體執行前拒絕。計數發生在支持的寫/編輯工具運行之前,首個將越過限額的調用在工具體執行前被拒絕,不會真正寫入。

3、並行安全。待處理調用會同步預留額度,併發寫入不能一起越過限額。

4、明確的計數範圍。只統計受支持的結構化修改調用:

  • write:計 content 的 UTF-8 字節數
  • edit:計 new_string 的 UTF-8 字節數
  • str_replace_editor:計 create / str_replace / insert 操作

只讀調用與畸形調用被忽略。str_replace 缺失 new_str 時視爲空替換,仍計爲一次修改。

5、配置嚴格。所有配置值必須爲正整數,非法配置會導致插件加載失敗,而不是靜默放寬限制。

安裝與啓用

從 npm 安裝:

dsh plugin --profile web add @raphelutumn/dsh-change-budget@0.1.0

注意 npm 包名是 @raphelutumn/dsh-change-budget,scope 拼寫與 GitHub 用戶名 Raphaelutumn 不完全一致,安裝命令以 README 原文爲準。

也可以下載 v0.1.0 的 tarball 後本地安裝:

dsh plugin --profile web add .\dsh-change-budget-0.1.0.tgz

想從源碼構建,先 clone 倉庫,再打包安裝:

git clone https://github.com/Raphaelutumn/dsh-change-budget.git
Set-Location .\dsh-change-budget
corepack pnpm install
corepack pnpm pack --pack-destination .
dsh plugin --profile web add .\raphelutumn-dsh-change-budget-0.1.0.tgz

移除插件:

dsh plugin --profile web remove dsh-change-budget

經過上面的步驟,插件會安裝到 web profile 並生效。兼容性方面,插件在 Node.js 20/22/24 上通過 CI 驗證(Ubuntu、macOS、Windows),DeepSeek Harness peer 範圍爲 ^0.1.0-rc.5。

配置預算

三個配置項與默認值:

配置項 默認值 含義
maxFilesPerTurn 12 一輪內去重文件數上限
maxMutationsPerTurn 24 一輪內結構化修改調用數上限
maxPayloadBytesPerTurn 262144 一輪內提交的 UTF-8 字節數上限

在 profile 的 cordis.patch.yml 中覆蓋插件配置行,例如把限額放寬:

- id: change-budget
  config:
    maxFilesPerTurn: 20
    maxMutationsPerTurn: 40
    maxPayloadBytesPerTurn: 524288

所有值必須爲正整數;非法配置會讓插件加載失敗,而不是靜默放寬限制。

跑一遍演示

倉庫自帶一個運行時演示:安裝依賴後執行

corepack pnpm demo

演示允許兩個文件的修改,第三個文件會在工具體運行前被攔截。

實際使用中,首個越限調用會收到這樣的報錯:

Change budget exceeded for this turn: files would reach 13/12. Blocked path: "src/generated/client.ts". Raise the plugin limit or continue in a new user turn.

報錯會指出越限的維度與數值,以及被攔截的路徑;當多個維度同時超限時,錯誤消息會一併報告所有越限項。

適用場景與注意

適合的場景:

  • 讓小請求保持小:maxFilesPerTurn 攔下第一個會越界的修改,避免模糊指令演變成大範圍改寫。
  • 打斷重複編輯循環:maxMutationsPerTurn 限制一輪內被受理的結構化寫/編輯調用次數。
  • 約束並行負載:同步預留讓併發的結構化寫入共享同一份文件、調用與字節預算。

注意事項:

  • 插件只限制受支持的結構化工具(write、edit、str_replace_editor 的指定操作),不覆蓋任意 Shell、PowerShell、Bash 寫入,也不覆蓋 symlink 或 junction 寫入。
  • 插件以當前 dsh 進程的權限運行,安裝前應檢查源碼與許可證;本插件許可證爲 MIT,源碼託管在 GitHub。

小結

dsh-change-budget 把「一輪能改多少文件、多少次調用、多少字節」變成一個可配置、可執行的硬約束,越限調用在工具體執行前就被拒絕,不需要事後補救。如果你在用 DeepSeek Harness 跑編碼 Agent,可以按上面的步驟把它加進 profile 試試。

  • 社區插件目錄頁:https://www.skillhub.cn/plugins/Raphaelutumn/dsh-change-budget
  • GitHub 倉庫:https://github.com/Raphaelutumn/dsh-change-budget
羽毛球分组比赛记分
小程序二维码

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

小夜