lantiosity/dsh-token-fee ↗★ 1

@lantiosity/dsh-token-fee

Real-time per-session token cost for the DeepSeek Harness web GUI, with per-provider pricing and configurable peak/off-peak tariffs 适合按供应商费率及API峰谷时段估算会话费用的用户,支持统计DSH子代理用量。

패키지
@lantiosity/dsh-token-fee
호환성
미검증
버전
0.6.0
라이선스
MIT
최근 업데이트
2026. 10. 22.

설치

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:lantiosity/dsh-token-fee

使用

  • 费用胶囊:位于输入框下方,与内置的「轮次 / 速度」和「token 用量」胶囊并排。默认显示 ¥0.12 这样的金额;会话中还有未配置价格的模型时,会额外标注未定价数量。
  • 计费模式:金额后面跟着当前正在使用的模型的计费模式。只有单一单价时显示 · 计费模式:统一;配置了空闲价时显示 · 计费模式:峰谷 · 当前时段:高峰 · 剩余时间:01:22:32,其中剩余时间每秒刷新,倒数到下一次时段切换。模式取自投影里最近一次请求的路由,因此切换模型后立刻跟着变。
  • 费用明细:点击胶囊打开。顶部是合计金额,下面按供应商分组;每个模型默认只显示总 token 数与费用,点它展开才是四个计费桶各自的 token 数与金额。区分峰谷的条目会标注「区分峰谷」。折叠时仍会显示警示徽章(未记录时段、缺少价目条目),因为那关乎账单准不准,不该藏在一次点击之后。
  • 子代理用量:当前会话调用的子代理(含嵌套调用)跑在各自的会话里,用量默认不在这条会话的账上。插件会把它们的消耗计入合计,并在明细里单独成组:每个子代理一行「标签 + 总 token + 费用」,点开才是它自己的按供应商/模型明细。有子代理时合计标题写成「合计(含子代理)」以作区分;某个子代理的用量暂时读不到时会在面板里说明有几个没算进来,而不是当成 0。已知限制:跑在 DSH 之外的后端(ACP、Codex、Claude Code 等)不产生 DSH 会话日志,其 token 无处可读,这类子代理只有 0 可以显示。
  • 价格设置:面板内的第二个标签页,或在 dsh 设置中打开「Token 费用」页。

价格配置

存储与优先级

价目表由三层合并而成,后者覆盖前者:

  1. 插件内置层:DeepSeek 官方定价——deepseek-flash、deepseek-v4-pro 两个模型各一条,共 2 条;一条覆盖 deepseek-official 与 deepseek-account 两条路由(账号路由经 provider 别名命中同一条);
  2. 用户文件层:/token-fee.json;
  3. 插件配置层:cordis 配置中的 pricing / schedules 字段。

插件不会为其他供应商内置任何价格:同一模型经由中转商、聚合网关或自建代理调用时价格并不相同,用官方价冒充会得出错误的账单。其他供应商的价格请自行添加条目。

插件配置(cordis.yml)

cordis.yml 里该条目的 config 接受五个键:

键默认含义
displayCurrencyCNY胶囊与合计使用的展示币种,必须是 ICU 认识的 ISO 4217 代码。
exchangeRates无折算汇率表 { 币种: 数值 },含义为 1 单位该币种等于多少展示币种,例如 { USD: 7.2 }。通常写在 token-fee.json 里(改完即生效),这里的一份作为管理员覆盖。
pricingFile/token-fee.json用户价目表路径;相对路径按 DSH_HOME 解析。
schedules无额外或覆盖内置的命名峰谷规则。
pricing无额外或覆盖其它层的价目条目。

配置在装载期校验:未知键、拼错的币种、结构不合法的条目都会让插件以 FAILED 结束,而不是被静默忽略——写错配置时应当立刻知道。

- id: token-fee
  config:
    displayCurrency: CNY
    pricingFile: my-prices.json

汇率写在 token-fee.json 里(docs/configuration.md 的「文件格式」给的是完整示例,见 docs/configuration.md):

{
  "version": 1,
  "exchangeRates": { "USD": 7.2 },
  "entries": []
}

文件按 mtime 热读,改完不用重启 dsh:打开「价格设置」页会重新拉取,胶囊在刷新页面后更新。写在 cordis.yml 里的 exchangeRates 仍然有效,保留给管理员覆盖——同一个币种以配置为准,没写的沿用文件。设置页保存价目表时会把文件里那份汇率原样带回去,不会顺手清空。

多币种:价目条目各带 currency,同一会话里可能既有人民币也有美元用量。胶囊与合计始终按币种并列累加(¥1.23 + US$0.56),不会丢掉任何一种;配了汇率之后再额外给出一个折算合计(≈ ¥5.26)。只要有一种外币缺汇率就不给折算合计——半个合计比没有合计更危险。

文件格式

{
  "version": 1,
  "schedules": {
    "my-peak": {
      "timezone": "Asia/Shanghai",
      "peakDays": [1, 2, 3, 4, 5],
      "peakWindows": [["09:00", "12:00"], ["14:00", "18:00"]]
    }
  },
  "entries": [
    {
      "id": "my-gateway-flash",
      "provider": "my-gateway",
      "model": "deepseek-flash",
      "currency": "CNY",
      "schedule": "my-peak",
      "prices": {
        "peak": { "input": 2, "cacheRead": 0.04, "cacheWrite": 0, "output": 8 },
        "offPeak": { "input": 1, "cacheRead": 0.02, "cacheWrite": 0, "output": 4 }
      }
    }
  ]
}
字段含义
provider路由 provider id,例如 deepseek-official 或你自己的中转商 id。* 表示通配。
model模型 id,例如 deepseek-flash。* 表示通配。
currency三位货币代码,决定金额的展示币种。
schedule引用 schedules 中的名字,或直接内联一份规则,或 null 表示不分峰谷。
prices.peak高峰(或唯一)单价,单位是每百万 token。
prices.offPeak空闲单价;出现时必须配 schedule。
cacheWrite未提供时按 0 处理。

匹配规则

条目按 (provider, model) 匹配,优先级从高到低:精确 → provider 通配 → model 通配 → 全通配;同一优先级内先出现的条目获胜。

没有命中任何条目的模型,其 token 数照常展示,金额标记为「未配置价格」,不计入合计。

内置价目同时覆盖 DSH 的两条 DeepSeek 路由:deepseek-official(API key)与 deepseek-account(「DeepSeek 账号」,账号令牌)。两者共用同一份模型目录,账号侧还能回退已下线的模型名。

峰谷规则

schedule 描述高峰时段:

字段含义
timezoneIANA 时区名,例如 Asia/Shanghai。
peakDays高峰星期,0 为周日。
peakWindows高峰时段,["HH:MM", "HH:MM"] 的左闭右开区间。
holidays节假日集合名或日期数组;这些日期不算高峰(即使落在高峰星期)。
workdays调休上班集合名或日期数组;这些日期算高峰(即使不在高峰星期)。默认不用。

插件内置一条名为 deepseek 的规则(北京时间周一至周五 09:00–12:00、14:00–18:00,法定节假日除外,调休上班的周末也按空闲计)。你可以在用户文件的 schedules 中定义同名规则来覆盖它,或新建自己的规则供条目引用——内置价目条目引用的是规则名而不是内联副本,因此覆盖会同时作用到内置条目上。

中国大陆法定节假日随包发布在 data/cn-holidays.json(数据取自国务院办公厅的年度放假安排通知),内置的 deepseek 规则引用其中的 cn 集合,因此官方「法定节假日除外」这条口径是默认生效的。编辑器的规则卡片里有「法定节假日」下拉框,自己的规则也能挂同一个集合。

注意官方口径:调休上班的周末不算高峰,所以按官方价计费时不要给 deepseek 规则挂 workdays。workdays 是给「你的提供方确实把调休周末算高峰」这种场景留的通用开关。

编辑器行为(建议列表、数字草稿与归零、保存前的本地拦截、规则卡片与改名、高峰时段的时/分输入框等)见 docs/configuration.md。

插件配置(cordis.yml)

cordis.yml 里该条目的 config 接受五个键:

键默认含义
displayCurrencyCNY胶囊与合计使用的展示币种,必须是 ICU 认识的 ISO 4217 代码。
exchangeRates无折算汇率表 { 币种: 数值 },含义为 1 单位该币种等于多少展示币种,例如 { USD: 7.2 }。通常写在 token-fee.json 里(改完即生效),这里的一份作为管理员覆盖。
pricingFile/token-fee.json用户价目表路径;相对路径按 DSH_HOME 解析。
schedules无额外或覆盖内置的命名峰谷规则。
pricing无额外或覆盖其它层的价目条目。

配置在装载期校验:未知键、拼错的币种、结构不合法的条目都会让插件以 FAILED 结束,而不是被静默忽略——写错配置时应当立刻知道。

- id: token-fee
  config:
    displayCurrency: CNY
    pricingFile: my-prices.json

汇率写在 token-fee.json 里(docs/configuration.md 的「文件格式」给的是完整示例,见 docs/configuration.md):

{
  "version": 1,
  "exchangeRates": { "USD": 7.2 },
  "entries": []
}

文件按 mtime 热读,改完不用重启 dsh:打开「价格设置」页会重新拉取,胶囊在刷新页面后更新。写在 cordis.yml 里的 exchangeRates 仍然有效,保留给管理员覆盖——同一个币种以配置为准,没写的沿用文件。设置页保存价目表时会把文件里那份汇率原样带回去,不会顺手清空。

多币种:价目条目各带 currency,同一会话里可能既有人民币也有美元用量。胶囊与合计始终按币种并列累加(¥1.23 + US$0.56),不会丢掉任何一种;配了汇率之后再额外给出一个折算合计(≈ ¥5.26)。只要有一种外币缺汇率就不给折算合计——半个合计比没有合计更危险。