dsh-readprune(Token 修剪)
为 DeepSeek Harness 会话节省 token:让内容一开始就不进入上下文。
Host 插件,在源头修剪输入而不是事后压缩:按行号或符号定位读取文件而非整份读,
并对过大的工具结果在边界处设上限,同时保留取回路径。
与压缩类插件的区别
大多数省 token 插件处理的是已经进入上下文的内容:摘要它、折叠它、事后裁剪它。
这个插件试图让昂贵的内容一开始就不进来:
- 问一个函数在哪,不再要付一整个文件
- 一个 17.7 万字符的文档页,不再要付一整页
不做模型改写,也不丢信息:每个被修剪的原文都已存档,可以按偏移读回来。
三个延迟加载工具
| 工具 | 作用 |
|---|---|
read_range |
只读需要的行:行号窗口、按符号找出所有出现位置并带上下文、或只列结构大纲。输出有硬上限。 |
tool_catalog |
一行一个列出本会话可调用的工具,让延迟后的工具集仍可被发现。 |
fetch_recall |
按字符偏移读回任意被修剪结果的片段。 |
两道结果整形
通过 tools/post-execute,按工具名限定范围:
- 网页 —— 有界正文头部(页面标了内容地标时从其开始)+ 章节摘要。
- shell 输出 —— 头 + 尾。诊断信息在尾部,宿主自带的字节上限否则会把它丢掉。
实测
会话级(真正要紧的数字)
工具结果进入上下文后,每一步都会重发一遍,所以它的真实成本是
大小 × 剩余步数。以一个 30 步、读 4 个文件的会话建模:
| prompt tokens | |
|---|---|
| 整份读 | 667,776 |
| 修剪后 | 374,512 |
| 节省 | 293,264(43.9%) |
节省比例随会话变长而上升:10 步 33.6%,30 步 43.9%,100 步 47.8%。
上限低于 50%,因为固定的 prompt 基线(开场消息、系统提示、工具 schema)每一步都要付,
而本插件不碰它。
你可以自己复现:
npm run measure:session
单次操作
同一个问题,只换读法:
| 文件 | 行数 | 整份读 | read_range |
节省 |
|---|---|---|---|---|
| index.js | 464 | 4,661 tok | 188 tok | 96.0% |
| client.js | 710 | 9,389 tok | 274 tok | 97.1% |
| bench/index.js | 875 | 8,999 tok | 513 tok | 94.3% |
过大的结果:
| 对象 | 原始 | 修剪后 | 节省 |
|---|---|---|---|
| 文档页(真实抓取) | 46,582 tok | 583 tok | 98.7% |
| shell 输出(287 万字符,宿主截断后) | 16,842 tok | 1,515 tok | 91.0% |
单次数字之所以大,是因为一次操作可以替掉一整个文件。它们不是会话级节省,
需要会话级数字请用上面的表。
token 数为对 Harness 计费规则的确定性近似(中文约 1.7 字/token,代码约 3.8 字符/token),
用于横向比较,不等于账单。
安装
dsh plugin install dsh-readprune
行 id 保持 token-diet 不随改名变化,因此你在自己 cordis.patch.yml 里的
config 覆盖会继续生效。
配置
| 键 | 默认 | 含义 |
|---|---|---|
guide |
true |
注入「优先用 read_range」的系统提示词段落。没有它,工具存在但模型仍会整份读。每轮约 162 token。 |
exposeCatalog |
true |
是否注册 tool_catalog。 |
slim |
true |
通过 tools/post-execute 修剪过大的结果。 |
slimWebTools |
["web_fetch"] |
网页类结果:正文头部 + 章节摘要。 |
slimShellTools |
["pwsh","bash","wsl","tty_run"] |
shell 类结果:头 + 尾。post-execute 是全局 waterfall,只处理列出的工具。 |
maxInlineChars |
8000 |
超过此字符数才修剪。 |
headChars |
1500 |
网页模式保留的头部字符数。 |
shellHeadLines / shellTailLines |
60 / 60 |
shell 模式两侧各保留的行数。 |
durableArchive |
true |
把修剪后的原文存到 ~/.dsh/token-diet/archive,定位符可跨重启。磁盘不可用时回退内存。 |
maxArchiveFiles |
200 |
超过后修剪最旧的存档。 |
测试
npm test # 五套测试,不联网
npm run measure:reads # 单次操作对照表
npm run measure:page # 网页修剪数字(会抓取 docs.python.org)
npm run measure:session # 会话级对照表
npm test 覆盖:工具端到端调用、离线夹具上的修剪、post-execute 接线
(含 read/grep/edit 不被触碰的证明)、以及持久化存档。
诚实的边界
- 它不能压缩其他插件的工具 schema。 没有服务或事件能把别的插件的
ToolSchema
标记为deferLoading,只有本插件自己的工具会被延迟。插件很多的 profile 上,
每轮固定的 schema 开销依然存在。 symbol模式是文本匹配,不是语义匹配。 搜save也会命中savesSelection;
不确定标识符时先用mode: outline。- 原版
read未被改动。 上游文件工具照常可用,所以模型总能回退——
这意味着只有它真的选用read_range时才省。 - 存档是用户目录下的明文文件,任何以你身份运行的程序都能读。抓取内容可能敏感,
共享机器上请慎用。 - 没有使用
spillStore:其运行时可用性无法确认,硬依赖会在其缺失时让修剪整体失效。
许可
MIT。图标为本插件原创。