dsh-agent-speedup
工具执行效率套件 DeepSeek利用: 只读结果缓存、推测预取和并发只读shell命令—每个命令都有一个 测量的,有限的范围。
诚实的前提
在我们对6个真实代理会话(2,517个工具调用,1,311分钟)的测量中,模型延迟 (TTFT +思考+生成)需要 87.2% 关键路径,工具执行 22.1%。这 插件在22%的范围内工作-这里没有减少模型往返的次数,这就是 剩下的78%活了下来。
在这22%的问题中,存在三个不同的问题,每个能力针对一个问题:
| 能力 | 它解决的问题 | 测量 |
|---|---|---|
| 缓存 | 重复的只读调用 | 重复读 2023 ms→7 ms (连续运行,5运行对) |
| 动态合并 | 同一个调用在一个并行批处理中重复 | 3同时读取跨度 共计2027毫秒不是6秒 |
| 预取 | 文件后,模型将立即请求 glob | 工具的时间 10 084 ms→2 065 ms(−79.5%);每次读值 2016毫秒→11毫秒 |
| 壳牌并发 | 序列化多个只读shell命令 | 4 PWSH调用: 7 103 ms→317 ms (22×) |
有两件事它故意没有解决:在本地毫秒级的工具插件 无形的(工具在我们的运行中占了0.1-9.4%),DeepSeek Harness已经并行批处理了 并发安全的工具——在我们的基线中有7个工具调用(6个读取+ 1个shell)被调度 19毫秒,没有安装插件,5个相邻的工具结果落在100毫秒内。
不同于HarnessMM的图层。 HarnessMM 同样的目标 深寻挽具,但它移除 模型推理调用 通过重播谨慎的决定;这个插件 去除 工具执行 从不讲道理。它们组成了一个决策图 工具调用,缓存命中使这些调用更便宜。看到 文档/ BENCHMARK.md 对于会计警告,如果两者都安装。
完整的方法,样本大小,以及反对这个插件的发现: 文档/ BENCHMARK.md。
安装
dsh plugin --profile web add dsh-agent-speedup
Node 22+, dsh 0.2.x, pnpm (Windows: pnpm 10 - pnpm 12在某些设置上失败了它的store锁)。
的捆绑 cordis.patch.yml 立即激活缓存和预取。Shell并发性是
默认关闭 -请参阅下面的安全说明。
重写config: replace,而不是merge
一个具有相同的盘补丁条目 id 替换整个配置对象 -它不合并。如果
你覆盖了一个键,你必须重复你关心的每个键(默认值填充其余的键),
但您的意图可能与默认值不同)。捆绑的默认值已经出现
cordis.patch.yml。
三种能力
缓存
只读工具(read, glob, grep, read_image(可扩展)按工具名称加进行缓存
归一化参数。在命中时,插件返回存储的结果而不调用 next() - - -
真正的调度从未发生过。
条目携带一个统计指纹(size + mtimeMs)检查每次点击,所以文件被
任何方法都是无效的——包括 bash/pwsh 写,它不会产生文件系统事件。
fs/write-intent 和 fs/edit-intent 为编辑器路径添加即时无效。
相对路径解析 座席会话工作目录,同样的基础盘自己的
read 使用,所以代理 cdS不能与其他地方的同名文件冲突。
缓存是一个LRU,由 maxEntries (默认512),以及文件更改的结果 在
读取的数据不被存储。
空中凝聚。 DSH在一个并行批处理中调度一个回合的只读调用。一批 两次包含相同的调用都会错过缓存,因为两个调用都没有完成。调用 当一个相同的调用仍在运行时到达,共享执行而不是重复执行 这涵盖了单独缓存无法处理的并行情况。
工具名称是逐字匹配的。 read, glob, grep 和 read_image 是内置的;任何自定义
必须列出要缓存的MCP工具 readonlyTools (在 speculateOn 如果结果是
应该触发预取)。不知名的名字永远不会被认为是安全的。
预取
当一个 glob 结果返回时,插件对第一个N预执行同族读取工具
路径,在背景中。这些结果都在同一个缓存中,所以当模型真正问,
没有运行。预取调用通过普通的管道-相同的代理上下文,相同的工作
目录,相同的保护-因此拒绝和错误被相同地处理。
壳牌并发
近年来的 bash 和 pwsh 工具声明没有 isConcurrencySafe,因此每个shell调用都独占地运行-
四个只读的 Get-* 而应该共享一个并行窗口的调用只需要7.1秒
(测量:每次呼叫间隔为2.2-2.5秒)。启用此功能后,完成了相同的四个调用
317年。该功能附加一个标记命令的保守分类器
只有当每个段都匹配只读白名单并且没有出现写模式时,并发安全。
默认情况下是关闭的。 一个分类器错误意味着两个带有副作用的shell命令运行在 同一时间。只有在你接受风险的情况下才启用它:
- id: agent-speedup
config:
cache: true # repeat everything below — replace semantics!
readonlyTools: []
validateStat: true
maxEntries: 512
speculate: true
prefetchN: 3
speculateOn: [glob]
speculateRootPrefix: ""
shellConcurrency: true
shellTools: [bash, pwsh]
分类器是故意严格的: npm test, cargo build, python script.py 都得到了治疗
作为副作用(他们可能会写),未知的命令被拒绝而不是猜测。
子命令按谓词处理,而不是按程序名处理 git branch (list)是只读的
git branch new (create)不是; git remote 列出了但 git remote add 重写配置; find
允许 -print 但不是 -fprint/-exec/-delete; file -C, tree -o, date -s 被拒绝了。
有四个类被直接拒绝,因为它们的效果只有在运行时才知道:command
替换($(...)引号) ${VAR} 展开,转义shell元字符,和
NAME=value cmd 前缀(GIT_EXTERNAL_DIFF, LD_PRELOAD, NODE_OPTIONS 所有让一个“只读”
命令运行任意代码)。PowerShell脚本块({ ... },这 Where-Object /
ForEach-Object 执行)也被拒绝。一个光秃秃的 & 将命令行分开,如下所示 ; ——一个
攻击者无法将写入器隐藏在后台作业后面。
对这个分类器进行对抗性审查是发布过程的一部分;它发现的逃生通道
0.2.2中的每一个都包含一个回归测试(参见 test/classify-command.test.js, R2 套房)。
配置
所有默认值为zd的键;补丁覆盖替换整个对象。
| 关键 | 默认的 | |
|---|---|---|
cache | true | 只读结果缓存 |
readonlyTools | [] | 要缓存的额外工具名称 |
validateStat | true | 对每个命中的人进行指纹检查 |
maxEntries | 512 | 缓存结果的LRU上限(1-100000) |
speculate | true | 投机预取 |
speculateOn | ["glob"] | 其结果触发预取的工具 |
prefetchN | 3 | 每次预取最大文件数(1-64) |
speculateRootPrefix | "" | 只在该前缀下预取 |
shellConcurrency | false | 只读shell命令加入dsh的并行批处理 |
shellTools | ["bash","pwsh"] | 要修补的Shell工具 |
debugLogFile | 设置 | 在这里写入调度事件 |
安全
只读工具。 bash, pwsh, write 和 edit 没有被碰触过,永远不会
缓存或预取。错误结果,包括守卫拒绝,不会被记住。缓存和
当插件卸载时,在线预取将被清除(包括在线预取中止)。
在独立审查中发现的一个已知边界:
- Cache击中了瀑布,使其短路。 hit返回而不调用
next(),这也是 跳过tools/execute在此之后加载的插件注册的监听器。如果你运行其他 执行阶段插件,在此之前加载它们。
从0.2.1开始的工作目录边界是 固定 在0.2.2中:键和状态检查现在使用
workingDirectory (代理的会话目录),带有process-cwd 只有在这种情况下才能后退
服务未挂载。如果根本无法获取指纹,则不缓存该条目。
中文
深寻线束
- 缓存英文:1 .中文:5 .中文:2023ms→7ms)
- 在途合并: 3‰,2027ms, 6‰,1‰,1‰,1‰,1‰,1‰,1‰
- 预取:
glob10.08秒→2.07秒,−79.5%; 2016ms→11ms,−99.5%) - 壳,壳,壳/ / / / / / / / / / 开启后 317 毫秒完成,22 倍),本插件给只读命令打上并发标记, 【中文翻译】
- 判定粒度:按子命令和参数判定,不按程序名放行——
git branch(列举)只读、git branch new(创建)不是;find -print放行、-fprint/-exec/-delete拒绝。 命令替换、${VAR}、转义元字符、NAME=value cmd缀,PowerShell 一律拒绝(它们的实际行为要到运行时才知道)
前提要清楚:模型延迟占关键路径的 87%,工具占 22%。本地毫秒级工具上这个插件无感; 收益集中在"慢工具 + 重复调用"场景。数字、方法和反面结果在 文档/ BENCHMARK.md。
配置覆盖是整体替换不是合并——覆盖一个字段时请把要的字段全部写上。
许可证
麻省理工学院