# dsh-usage-center
English · 简体中文
为 DeepSeek Harness Web 提供原生的用量与费用面板。插件会在 DSH 设置中新增独立的 **用量与费用** 页面,将 Provider 用量、订阅额度、账户余额、API 估价和年度活动集中展示。   ## 功能 - 按 Provider 和模型展示今日输入、缓存读取和输出 Token。 - 最近 365 天 Token 活动热力图,包括累计 Token、单日峰值、当前连续天数和最长连续天数。 - DeepSeek 账户余额,包括可用总额、充值余额和赠送余额。 - Z.ai Coding Plan 当前会话周期、每周和账期额度百分比。 - Kimi Code 会员等级、5 小时滚动额度和每周额度百分比。 - 按公开模型单价计算等量 API 调用的估价。 - 使用持久化快照和 stale-while-revalidate,重复进入时立即显示数据。 - UI 支持中文和英文,并跟随 DSH 当前语言设置。 - 所有聚合均在本机完成,只提供回环地址可访问的只读接口。 ## API 估价与实际扣费 API 估价回答的是:“相同 Token 用量按公开 API 单价计算需要多少钱?”它不是账单,也不会被当作订阅实际扣费。 - 按量计费 Provider 展示今日 API 估价,以及支持查询时的账户余额。 - 订阅 Provider 展示额度消耗百分比和等量 API 估价。 - 页面会直接展示价格来源链接和单价生效日期。 - 单价取自公开的 [models.dev](https://models.dev) 数据源,缓存 12 小时并按 ETag 条件刷新;可用 `DSH_USAGE_CENTER_CATALOG_URL` 换其他数据源。 - 数据源里已有的模型无需任何配置;`src/pricing.js` 中生效日期比数据源更新的条目优先,因此手工核对过的单价(以及 DeepSeek 的低谷价格,高峰时段按页面规则翻倍)仍然生效。 - 数据源无法获取时使用上一次缓存,已知模型仍由本地表兜底;单价按模型名回退匹配,因此经代理(如 LiteLLM)路由的同一模型也能取到单价。 ## 环境要求 - 支持插件的 DeepSeek Harness Web。 - Node.js `>= 22.19.0`。 ## 一键安装 ```sh dsh plugin --profile web add dsh-usage-center ``` 安装后重启 DSH Web: ```sh dsh web ``` npm 包和仓库均包含预构建插件 bundle,安装时不需要额外配置 pnpm `allowBuilds`。如需直接从 GitHub 安装,可将包名换成 `github:Tieboyh/dsh-usage-center`。 ## 从源码安装 ```sh git clone https://github.com/Tieboyh/dsh-usage-center.git cd dsh-usage-center npm install npm run check dsh plugin --profile web add "$PWD" ``` 开发或修改插件时使用源码安装流程。安装、升级或卸载后需要重启 DSH Web。 ## 凭据 插件复用 DSH 凭据。API Key 只由服务端进程解析,不会返回浏览器,也不会写入统计快照。 | 凭据 | 用途 | | --- | --- | | `DEEPSEEK_API_KEY` | 查询 DeepSeek 账户余额。 | | `ZAI_CODING_CN_API_KEY` | 查询中国区域 Z.ai Coding Plan 的额度周期。 | | `ZAI_API_KEY` | Z.ai Coding Plan 的备用凭据。 | | `ZAI_API_REGION` | 可选的 Z.ai 区域覆盖配置。 | | `KIMI_CODING_API_KEY` | 查询 Kimi Code 会员等级和订阅额度周期。 | ## 数据与刷新机制 用量从本机 DSH 会话事件中聚合。同一 turn 和 step 重复上报的累计 usage 会替换旧样本,不会重复计数。 - 活跃会话通过 `ctx.sessions` 的 `snapshotEvents` 增量读取;已落盘会话通过 `sessionPersistence` 的 `open`/`read` 读取,并按 `revision` 与读取游标跳过未变化的会话。 - 分叉(fork)会话会从 `inheritedEventCount` 之后开始统计,继承父会话的历史不会重复计入。 - 单次刷新只读取新增事件;服务端首次冷启动会完整读取一次历史,之后刷新通常只需几十毫秒。 - 最近一次成功结果保存在 `