dsh-token-saver:指令进模型前无损瘦身,左侧栏看省下多少 token

前言

在 DeepSeek Harness(DSH)里跑智能体,成本往往来自三块:每次请求的输入 token、缓存是否命中、以及你写进提示词里的冗余空白和重复段落。官方用量字段里还有一个容易踩坑的地方:usage.inputTokens 只统计缓存未命中部分,命中部分在 cacheReadTokens,两者相加才是本次真实输入量。若只盯前者,会低估实际花费,也很难判断提示词缓存是否在起作用。

下面介绍社区插件 dsh-token-saver(维护者 lucaixia1982,分类为模型推理):在指令进入模型前做不改语义的「瘦身」,并在左侧栏展示本次与累计省下的 token、金额,以及缓存相关指标。它与负责压缩上下文的 billion-context 等插件互补,只管进模型前的提示词与记账展示。

这是什么

dsh-token-saver 是 DSH 的省钱类插件:通过 agent/pre-step 钩子在自然语言指令送达模型前删除可安全去掉的冗余,同时监听 session/event 里带 usage 的 assistant/message,按 DeepSeek 定价口径记账,最后在 sidebar.footer.action(id token-saver)渲染侧边栏徽章。聚合数据落在 ~/.dsh/dsh-token-saver.json。

npm 包名为 @acmepoyen/dsh-token-saver,当前资料中的版本为 0.1.3,许可证 MIT,要求 Node >= 20。

指令瘦身(agent/pre-step)

插件在模型看到新消息之前,只做删除、不改语义,具体包括:

  1. 行尾空格
  2. 连续 3 个以上空格
  3. 连续 3 个以上空行
  4. 连续重复的非空行
  5. 重复段落(长度 ≥ 60 字符)
  6. 结尾寒暄(如「谢谢」「麻烦了」「thanks」等)

约束与保守策略(资料原文):

  • 代码块(``` 围栏)内一字不动。
  • 运行时上下文消息一律跳过,不瘦身。
  • 单条消息瘦身收益不足 15 token 或不足 4% 时保留原文。
  • 单条用户消息短于 80 字符 时不做瘦身(纯短指令省不下 token,属刻意取舍)。
  • 改写只影响进入转发的新消息,历史消息不会被改写。

真实用量记账与金额口径

每次模型调用,插件记录:输入未命中 token、输入命中缓存 token、输出 token,并正确处理 DeepSeek 将命中与未命中拆成两个字段的情况。

价格写死在 index.js 的 DEFAULTS(元/百万 token,DeepSeek 官方档):

配置项 含义 默认值
priceInputMiss 输入未命中 2
priceInputHit 输入命中 0.2
priceOutput 输出 3

据此:

  • 累计花费 =(未命中 × 2 + 命中 × 0.2 + 输出 × 3)/ 1e6
  • 缓存折扣已省 = 命中 token / 1e6 ×(2 − 0.2)
  • 瘦身已省 = 省下的指令 token / 1e6 × 当前输入均价

指令瘦身省下的 token 会留在会话请求前缀里,后续每次调用都会再省一次,累计值按调用次数累加。DeepSeek 调价后需改 DEFAULTS 并重启;价格是硬编码常量,不是在线拉取。

左侧栏徽章与缓存健康度

安装成功后,左侧栏底部会出现徽章,一般不需要重启 DSH 桌面端(改插件代码才需要重启装载)。

展示行为:

  • 宽栏:例如 本次 ¥0.02 · 累计 ¥13.11
  • 窄栏(56px 轨道):只显示本次
  • 悬停可见约八行明细:本次会话、累计省(缓存折扣 + 指令瘦身)、开启前/后对比、累计命中、调用次数、缓存前缀重建次数、瘦身条数等

「本次」按最近一次有模型调用的会话统计,随 ~/.dsh/dsh-token-saver.json 持久化,重启不清零;只保留最近 20 个会话。

缓存健康度:记录 request/header 里 startsSeries 的次数。每重建一次请求序列,可复用的前缀就作废一次、下一次调用几乎全价,这个数字越小越好。

客户端半 client.js 对宿主暴露的 stats 接口做约 5 秒 轮询(路径见 README:/plugins/dsh-token-saver/stats)。

安装与启用

插件以当前 DSH 进程权限运行,安装前应自行查看 GitHub 源码 与 MIT 许可证。资料中的安装方式如下,任选其一:

方式一:dshfind 插件市场

在 dshfind 插件市场里搜索 dsh-token-saver(包名 @acmepoyen/dsh-token-saver)一键安装。

方式二:npm 后挂载

npm i @acmepoyen/dsh-token-saver

安装后按文档将包目录交给 plugin_manager 的 install_bundle(target 使用绝对路径)。

方式三:本地包目录

把本包目录交给 plugin_manager 的 install_bundle,target 用绝对路径。

装载由 cordis.patch.yml 完成,插入 id: dsh-token-saver。主要文件:index.js(宿主:瘦身 + 记账 + stats HTTP)、client.js(侧边栏徽章)、locale/*.json 与 icon.svg。

关闭瘦身但保留记账

若只想看用量与侧栏、不改编译前进模型的文本,可在装载配置中关闭瘦身,记账与侧栏仍工作:

config:
  enabled: false

(给装载行加上上述 config,具体写法以 cordis.patch.yml 与 DSH 插件装载文档为准。)

适用场景与边界

适合谁

  • 长期在 DSH 里写长提示词、粘贴日志或重复说明的开发者,希望在不改语义的前提下去掉空白与重复。
  • 需要对照「未命中 + 命中」真实输入、并在 UI 里看累计省钱与缓存命中率的人。

明确不做的事(README 边界)

  • 不改写模型回复,也不压缩上下文(上下文压缩属 billion-context 等插件范畴)。
  • 只统计 assistant/message 里带 usage 的调用;子代理调用同样计入累计。

开发注意

已安装位置是拷贝而非软链;改 GitHub 工作区源码若不重新部署/install,安装目录不会自动更新。源码目录可用 deploy.ps1 将宿主半写成指向工作区的薄壳;修改 index.js / client.js 时勿用 PowerShell 5.1 的 Get-Content / Set-Content 处理 UTF-8,以免中文乱码,应使用编辑器或 Node 脚本(UTF-8 无 BOM)。

结尾

dsh-token-saver 把「提示词无损瘦身」和「按 DeepSeek 用量字段正确记账」收进一个侧边栏徽章里,适合作为日常跑 agent 时的成本可观测层。社区目录页:skillhub.cn/plugins/lucaixia1982/dsh-token-saver;源码与说明:github.com/lucaixia1982/dsh-token-saver。

羽毛球分组比赛记分
小程序二维码

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

Xiaoye