@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子代理用量。
Install
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:lantiosity/dsh-token-feeREADME
Read the full README ↗使用
- 费用胶囊:位于输入框下方,与内置的「轮次 / 速度」和「token 用量」胶囊并排。默认显示
¥0.12这样的金额;会话中还有未配置价格的模型时,会额外标注未定价数量。 - 计费模式:金额后面跟着当前正在使用的模型的计费模式。只有单一单价时显示
· 计费模式:统一;配置了空闲价时显示· 计费模式:峰谷 · 当前时段:高峰 · 剩余时间:01:22:32,其中剩余时间每秒刷新,倒数到下一次时段切换。模式取自投影里最近一次请求的路由,因此切换模型后立刻跟着变。 - 费用明细:点击胶囊打开。顶部是合计金额,下面按供应商分组;每个模型默认只显示总 token 数与费用,点它展开才是四个计费桶各自的 token 数与金额。区分峰谷的条目会标注「区分峰谷」。折叠时仍会显示警示徽章(未记录时段、缺少价目条目),因为那关乎账单准不准,不该藏在一次点击之后。
- 子代理用量:当前会话调用的子代理(含嵌套调用)跑在各自的会话里,用量默认不在这条会话的账上。插件会把它们的消耗计入合计,并在明细里单独成组:每个子代理一行「标签 + 总 token + 费用」,点开才是它自己的按供应商/模型明细。有子代理时合计标题写成「合计(含子代理)」以作区分;某个子代理的用量暂时读不到时会在面板里说明有几个没算进来,而不是当成 0。已知限制:跑在 DSH 之外的后端(ACP、Codex、Claude Code 等)不产生 DSH 会话日志,其 token 无处可读,这类子代理只有 0 可以显示。
- 价格设置:面板内的第二个标签页,或在 dsh 设置中打开「Token 费用」页。
价格配置
存储与优先级
价目表由三层合并而成,后者覆盖前者:
- 插件内置层:DeepSeek 官方定价——
deepseek-flash、deepseek-v4-pro两个模型各一条,共 2 条;一条覆盖deepseek-official与deepseek-account两条路由(账号路由经 provider 别名命中同一条); - 用户文件层:
/token-fee.json; - 插件配置层:cordis 配置中的
pricing/schedules字段。
插件不会为其他供应商内置任何价格:同一模型经由中转商、聚合网关或自建代理调用时价格并不相同,用官方价冒充会得出错误的账单。其他供应商的价格请自行添加条目。
插件配置(cordis.yml)
cordis.yml 里该条目的 config 接受五个键:
| 键 | 默认 | 含义 |
|---|---|---|
displayCurrency | CNY | 胶囊与合计使用的展示币种,必须是 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 描述高峰时段:
| 字段 | 含义 |
|---|---|
timezone | IANA 时区名,例如 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 接受五个键:
| 键 | 默认 | 含义 |
|---|---|---|
displayCurrency | CNY | 胶囊与合计使用的展示币种,必须是 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)。只要有一种外币缺汇率就不给折算合计——半个合计比没有合计更危险。