dsh-readprune
为 DeepSeek Harness 会话节省 token:按行号或符号定位读取文件而不是整份读,并对过大的工具结果设上限且保留取回路径。修剪发生在源头,而不是内容进入上下文之后。在建模的 30 步会话上实测 prompt tokens 减少 43.9%。
安装
dsh plugin --profile web add dsh-readprune
沙箱测试
这个插件还没测过。提交测试 →
README
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。图标为本插件原创。
以上内容来自 npm 上的 README,我们只做格式化,不改内容。
版本
npm 上共发布:2,最后更新 2026-10-30