DSH 的 Agent 在一個 step 裏可能並行發出多個工具調用,也可能在同一個工具上反覆重試。本插件在工具真正執行之前按註冊名檢查配額:還有名額就放行,超了就拒絕——只限流,不改工具本身的行爲。
插件簡介¶
- 插件名稱:
@zhourenke/dsh-tool-call-limit - 維護者:
zhourenke - 核心功能:給 DSH 的每個 step 加上工具調用配額;限制每個 step 內的工具調用次數;同步預佔配額以防止並行超額;父 Agent 和子 Agent 各自擁有獨立的配額。
安裝與啓用¶
安裝命令如下:
dsh plugin --profile web add "github:zhourenke/dsh-tool-call-limit"
注意:安裝後必須重啓 DSH。bundle 集合是進程啓動時的快照,重啓前新插件不會被加載,刷新頁面無效。
卸載命令:
dsh plugin --profile web remove @zhourenke/dsh-tool-call-limit
配置方法¶
本插件默認不限制任何工具(limits: {})。要啓用限制,在 profile 補丁中覆蓋插件那一行。
# ~/.dsh/profiles/web/cordis.patch.yml
- id: tool-call-limit
name: '@zhourenke/dsh-tool-call-limit'
config:
limits:
web_search: 1
關鍵約束:
* 必須使用 - id: 覆蓋:不要用 - insert:。插件自帶的 bundle patch 已經用 insert 把這一行插進去了;在 profile 裏再 insert 一次不會報錯,而是多出一個同 id 的實例——插件跑兩遍、配額算兩遍。
* 配置是整體替換:不是逐字段合併。寫全 limits 與 onExceeded 即可。
確認配置已被加載:
dsh --profile web --dump-config
在輸出裏能看到 tool-call-limit 與預期的 limits 即已生效。
配額規則與維度¶
配額按四個維度分別計算,任一維度不同就是一份獨立的配額:
- Agent:父 Agent 與
subagent創建的子 Agent 是不同的 live Agent 對象,各自獨立計數。 - turn:一個 turn 內的多個 step 各自計數。
- step:配額的重置單位——進入新 step 時計數清零。
- 工具名:每個工具單獨計數,互不佔用。
其他規則:
* 配額通過即消耗,不退還。即使工具失敗、被取消或超時,名額也不會退還。
* 不支持 * 通配符,必須逐個工具名配置。
* 配額用盡後,不要在當前 step 內對同一個工具重試,直到進入下一個 step。
拒絕模式¶
配置項 onExceeded 控制配額用盡時的行爲,默認值爲 "deny"。
deny:直接拒絕調用。拒絕時會返回三條穩定的英文原因文本,第一條爲配額用盡。ask:每一次超額調用都要重新申請授權。它走的是 DSH 0.2.0 的審批通道。此時會看到the user rejected tool "<name>",先去查會話的審批策略(read-only/workspace-write爲ask,danger-full-access爲never),而不是去找那個“拒絕的人”。配置爲ask後,需要執行一次/permission <preset>重新應用策略。
限制邊界¶
本插件限制的是進入 DSH ToolRuntime 的調用次數,而不是工具實現內部發生的操作次數。
它不會限制:
* 一次 web_search 調用內部發出的多個 query。
* Web provider 內部的 HTTP 請求。
* 一次 bash 調用內部執行的多條 shell 命令。
* MCP 或其他自定義工具內部自行發起的 API 請求。
要限制這些內部操作,需要單獨配置對應工具的參數(如 Web 工具的 searchMaxQueries)。