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)。