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 限制一轮内被受理的结构化写/编辑调用次数。
  • 约束并行负载:同步预留让并发的结构化写入共享同一份文件、调用与字节预算。

注意事项:

  • 插件只限制受支持的结构化工具(writeeditstr_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
羽毛球分组比赛记分
小程序二维码

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

小夜