中文EN

dsh-readprune

usagenpmMIT

为 DeepSeek Harness 会话节省 token:按行号或符号定位读取文件而不是整份读,并对过大的工具结果设上限且保留取回路径。修剪发生在源头,而不是内容进入上下文之后。在建模的 30 步会话上实测 prompt tokens 减少 43.9%。

下载量 / Downloads
657

安装

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

链接

GitHub · Homepage · npm

同类插件