前言¶
DSH 已经记录了每个 step 的真实 token 用量,但本身并没有把用量换算成美元成本。对日常跑智能体任务的人来说,光看 token 数不够:还需要知道某一轮 assistant 回复花了多少钱、一个 session 累计花了多少钱,以及价格表过期后如何更新。
dsh-llm-cost 是一个 DeepSeek Harness(DSH)插件,用来补上这一环:在 host 端生成 costUsage session projection,在 Web 客户端把每个 turn 的成本渲染到消息下方,并在会话头显示整个 session 的累计成本。它还提供 llm_cost_refresh 工具,通过 LLM 加联网搜索自动抽取当前价格,并写入 override 价格文件。
这是什么¶
dsh-llm-cost 是仓库 owner 为 chenyinrusi 的 DSH 插件,许可证为 MIT。
它解决的问题可以概括为三件事:
- 把 DSH 已有的 token 用量换算成美元成本。
- 在 Web UI 中显示每个 turn、每个 step、整个 session 的成本。
- 当内置价格快照可能过期时,用 LLM 和联网搜索生成 override 价格文件。
该插件要求 DSH 不低于 0.1.1-rc.2,并且 package.json 的 engines 要求 node >= 20。
核心功能¶
成本投影:costUsage¶
插件会把成本结果写入 costUsage session projection,包含以下字段:
totalCostUsd
pricedSteps
unpricedSteps
token 分桶
byModel 聚合
steps[] 每步明细
其中:
totalCostUsd表示累计美元成本。pricedSteps和unpricedSteps用于区分已定价和未定价的 step。byModel按模型聚合成本。steps[]保存每一步的明细,便于排查某一轮为什么是这个价格。
每 turn 成本展示¶
在 Web 客户端中,插件会在每个完成的 assistant 消息下方的 stats 行渲染该 turn 的成本,例如:
$0.0042 · 1.2K tok
如果某个模型没有匹配到价格,插件显示:
unknown
未定价模型不会被显示为 $0.00,避免“未知”被误读成“免费”。
会话累计成本¶
插件还会在会话头右上角显示整个 session 的累计成本,并在存在未定价 step 时提示:
+ N unknown
价格自动维护:llm_cost_refresh¶
llm_cost_refresh 是一个用于维护价格表的工具。它的目标链路是:
- 联网搜索目标模型当前价格。
- 用 LLM 抽取 JSON 价格数据。
- 校验后写入
pricingFileoverride 文件。
这个工具不会覆盖内置快照,而是写入 override 文件。因此,抽取结果建议先人工抽查,再决定是否长期采用。
安装与启用¶
如果通过 GitHub 安装,使用下面命令:
dsh plugin --profile web add github:chenyinrusi/dsh-llm-cost#v0.6.1
如果使用本地 tarball,例如内网或离线环境,可以使用:
dsh plugin --profile web add ./dsh-llm-cost-0.6.1.tgz
插件要求:
DSH >= 0.1.1-rc.2
Node >= 20
npm 渠道暂未发布。如果希望使用包名形式安装,需要先在仓库中发布 npm 包:
npm login && npm publish
安装后可以用下面的命令启动本地 Web 验证:
pnpm dsh web --patch ./cordis.patch.yml
典型用法¶
1、安装插件¶
先选择 GitHub 或本地 tarball 渠道安装:
dsh plugin --profile web add github:chenyinrusi/dsh-llm-cost#v0.6.1
或者:
dsh plugin --profile web add ./dsh-llm-cost-0.6.1.tgz
2、启动 Web 会话¶
通过 DSH Web 进入会话,发送消息并等待 assistant 回复。
回复完成后,可以在消息下方查看该 turn 的成本行。会话头右上角会显示整个 session 的累计成本。
3、查看成本明细¶
costUsage 投影中会保留:
totalCostUsd
pricedSteps
unpricedSteps
byModel
steps[]
如果某一步显示 unknown,说明该模型没有匹配到内置或 override 价格。
4、配置价格刷新¶
cordis.patch.yml 中该插件行的 config 可以设置以下键,均为可选:
pricing
pricingFile
refreshProvider
refreshModel
各键的含义如下:
pricing:内联定价覆盖,合并到内置快照之上。pricingFile:llm_cost_refresh写出的 override 文件路径。refreshProvider:价格抽取调用优先使用的 provider 路由。refreshModel:价格抽取调用优先使用的模型 id。
配置由 zod Config schema 校验。省略 config 键表示使用全部默认值;config: {} 是合法的;不要写空的 config: 键,因为 YAML 会把它解析为 null,配置校验会拒绝;未知键会被静默丢弃。
价格刷新规则¶
llm_cost_refresh 可以自动执行整条价格更新链路,不需要 agent 逐步编排。
大致流程是:
- 使用 DSH 中已安装的 web 搜索 provider,搜索目标模型的当前价格。
- 使用可用 LLM 路由抽取 JSON 价格数据。
- 对抽取结果做宽松校验。
- 将有效结果合并进价格 registry,并写入
pricingFileoverride 文件。
自动维护价格需要满足两个前置条件:
DSH 中安装了 web 搜索 provider,例如 dsh-web-search-*
至少有一个可用 LLM 路由
如果配置了 refreshProvider 和 refreshModel,工具会优先使用这一组 provider/model。如果未配置,工具也能自动选择最便宜的可用模型。
需要注意:
- 工具写入的是 override 文件,不会覆盖内置快照。
- 抽取结果建议先人工抽查。
- 坏模型或无效价格会被丢弃,避免污染价格表。
峰谷定价¶
dsh-llm-cost 支持峰谷定价。
峰时窗口为:
01:00–04:00 UTC
06:00–10:00 UTC
这两个窗口仅适用于工作日。自 2026-08-23 起,UTC 周六和周日全天均按闲时处理。
对于声明了 offPeakFactor 的模型,闲时成本会乘以该折扣系数;未声明 offPeakFactor 的模型恒按峰值价计算。
价格匹配阶梯¶
插件按下面的阶梯匹配价格:
0. provider === "ollama" → 免费
1. 模型 id 精确匹配
2. 最长 key 子串匹配
3. 未知 → unknown
匹配到价格时,成本按对应单价计算;未匹配到价格时,显示 unknown,而不是 $0.00。
开发与维护¶
在插件仓库中,常用命令如下:
npm test
运行 node --test 纯逻辑测试。
npm run gen
重新生成价格快照:
pricing.json
src/pricing-data.ts
npm run build
使用 tsdown 打包 host、client 和声明文件。
适用场景与注意¶
适合使用 dsh-llm-cost 的场景包括:
- 使用 DSH Web profile,希望看到每个 turn 的美元成本。
- 需要查看一个 session 的累计成本。
- 使用多个模型,希望按模型聚合成本。
- 需要维护价格表,但不想每次都手工改配置。
安装前需要注意:
- 插件以当前
dsh进程权限运行,安装前应检查源码、依赖和许可证。 - 许可证为
MIT。 - npm 渠道暂未发布。
- 要求 DSH 不低于
0.1.1-rc.2。 - 要求 Node 不低于
20。 - 自动刷新价格需要 DSH 中安装 web 搜索 provider,并且至少有一个可用 LLM 路由。
unknown表示未匹配到价格,不表示免费。llm_cost_refresh写入的是 override 文件,不会覆盖内置快照。
结尾¶
dsh-llm-cost 的价值在于把 DSH 已有的 token 用量转化为可直接查看的美元成本,并保留每个 turn、每个 step 的成本明细。它还提供价格刷新工具,让内置价格表过期后可以通过 LLM 加联网搜索生成 override 文件。
GitHub 仓库:
https://github.com/chenyinrusi/dsh-llm-cost
DSH 社区目录是独立站点,与 DeepSeek / 幻方无官方从属关系;本材料未给出具体目录页 URL,可通过 GitHub 仓库查看完整 README 和发布版本。