前言¶
用 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