hugoyee75-cmyk/dsh-token-metrics

dsh-token-metrics

DSH 插件:统计所有经过 DeepSeek Harness 的模型调用——Token 用量、成本核算(含峰谷计价)、供应商余额与配额,并按模型/供应商/项目/来源/账号/日期拆分。A token usage, cost and provider-balance plugin for DeepSeek Harness.

待分类api-costbalance-monitorcost-tracking

dsh-token-metrics

中文 | English

一个 DSH 插件:把经过 DeepSeek Harness 的每一次模型调用都记下来,在侧边栏给你一个 Token 用量统计页,顺带管好成本与供应商余额。

统计

  • 今天、近 7 天与全部的 token 总量,以及趋势涨跌
  • 各模型、各供应商的用量排行
  • 缓存命中率——钱有没有花在重复输入上
  • 各项目、各子代理的 token 消耗
  • 首字延迟与输出速度——调用快不快,而不只是花了多少
  • 活动热力图:一年里哪天用得多,一眼看出使用节奏

成本

  • 按模型估算实际花费,价格取自 LiteLLM 公开价目表(约 2800 个模型)
  • 峰谷计价:DeepSeek 谷时价是峰时的一半,按调用时刻区分,不虚高
  • 美元 / 人民币一键切换,汇率实时拉取
  • 匹配不到价格的模型明确列出「未定价」并提供补价入口,不静默算成 0
  • 预算:设日 / 月预算,全局或按模型分组(一组可含多个模型),实时看已用百分比

模型接入

  • 34 个服务预设,国内优先排序,选中即填好地址与协议
  • 供应商余额与配额:覆盖 Sub2API / new-api / one-api 三类网关与 10 家官方平台
  • 从 pi-ai 模型目录(1241 个模型)自动识别上下文、输出上限、思考档位与附件能力
  • 一键把供应商与模型写入 DSH 模型配置

提醒

  • 余额不足、配额将尽、配额即将重置、查询失败、插件更新,以及峰谷切换前提醒、预算将尽,八类告警推送到右下角

数据来自 DSH 自己的会话日志,不额外发请求、不上传任何东西。

安装

按包名安装(推荐,走 npm)

在 DSH 的「添加插件」搜索框输入 dsh-token-metrics,或在插件管理里执行:

plugin_manager install_bundle dsh-token-metrics
走已发布到 npm 的版本,国际(npm 官方源)与国内(npmmirror 镜像源)都能装。
DSH 会并行探测两个源、自动选响应更快的一个,无需手动挑:海外用户走官方源,
国内用户走镜像源,都覆盖到。
发布只需推到 npm 官方源,npmmirror 会自动镜像同步(通常几分钟内)。刚发新版
若镜像还没跟上,在「添加插件」里把安装源临时切到官方源,或到 npmmirror 搜
本包点「同步」。

从 GitHub 安装

不依赖任何 npm 源、或想用尚未发布的最新版时,直接从仓库装:

plugin_manager install_bundle github:hugoyee75-cmyk/dsh-token-metrics

锁定某个版本加 #v0.3.2:

plugin_manager install_bundle github:hugoyee75-cmyk/dsh-token-metrics#v0.3.2

本地开发(link)

改代码即时生效时用本地目录,把 dsh-token-metrics 指到你的仓库:

{
  "dsh": { "profile": { "bundles": ["dsh-token-metrics"] } },
  "dependencies": { "dsh-token-metrics": "link:/path/to/dsh-token-metrics" }
}

装完重启 DSH(或热重载),侧边栏就会出现「Token 用量统计」图标。第一次打开页面,插件会自动回扫历史会话日志,把以前的用量补上。

界面

统计页(深色主题)

顶部是时间范围与模型筛选,中间是九项总计指标,下方是趋势图与模型占比环形图, 再往下是按模型 / 来源 / 项目 / 供应商 / 账号 / 日期切换的明细表。 切换「今日 / 近 7 天 / 全部」时,指标卡、图表、明细表与金额一起联动。

模型接入

「模型接入」页签管理第三方中转站与官方平台:余额、可用模型、订阅额度窗口 与重置倒计时。余额可点击在美元 / 人民币之间切换。

订阅制平台(如智谱 GLM Coding Plan、Kimi Coding Plan)没有「余额」概念, 这里显示的是各时间窗口的剩余比例与重置倒计时。

右下角通知

余额不足、配额将尽、配额即将重置、查询失败、插件新版本等状态变化会推送到 右下角。告警有服务端冷却、状态落盘、客户端记忆三层去重,不会反复弹。

特性

  • 总计:input / output / cacheRead / reasoning / total / 调用次数 / 缓存命中率 / 平均首字延迟
  • 时间维度:今日、近 7 天、全部
  • 图表:一张可切换的主趋势图,五种视角共用一张图

(总量 / 命中率 / 输入构成 / 按模型 / 成本),平滑曲线 + 悬停显示具体数值

  • 坐标刻度 + 一张模型用量占比环形图
  • 趋势粒度自适应:今日按小时、近 7 天按天、全部按月;数据跨年时可选年份
  • 模型筛选:下拉多选,可单选/多选/取消,指标卡与趋势图同时刷新
  • 模型合并:占比图与趋势按模型名合并(跨供应商),明细表仍按供应商拆分
  • 配色:图表分类色自带亮/暗两套值,跟随主题切换
  • 版本指示:右上角版本号本身就是按钮,点击即检查更新,

结果用弹窗告知(有新版可一键更新,无新版显示当前版本) 状态灯:绿=最新 / 蓝=有新版本 / 灰=未检查

  • 多语言:跟随 DSH 的语言设置自适应(中文 / English),运行时切换即时生效
  • 按来源:主会话 / 子代理 / workflow
  • 按项目:按会话工作目录归组
  • 按账号:当前登录账号 + 余额 + 官方用量入口
  • 明细表:按标签切换模型 / 来源 / 项目 / 供应商 / 账号 / 日期等视图

(会话明细默认隐藏,可配置打开)

  • 失败请求:次数,以及上游真计费时的 token
  • 启动回扫:首次安装即扫描已有会话日志补算历史,界面显示扫描进度
  • 模型筛选下拉:点击外部或按 Esc 自动收起
  • 两个可视化卡片等高对齐(趋势图与占比图上下边缘一致)
  • 持久化:重启不丢,跨会话累计
  • 自更新:检查新版本、安装、热重载,全程可回滚
  • 零运行时依赖:无构建步骤,不需要 npm install

配置

所有配置项都有默认值。要改的话,在你自己 profile 的 cordis.patch.yml 里加一条同 id 的 override:

- id: token-metrics
  config:
    showSessions: true
    snapshotCacheMs: 5000

注意:同 id 的 override 会整体替换 config,不是逐字段合并。改几项就把其余项一并写全,或者只写你要改的、其余依赖默认值。

配置项 · 默认值 · 范围 · 说明 flushDelayMs · 2000 · 250–60000 · 落盘防抖(毫秒)。调用本身很轻,磁盘写入才是开销 snapshotCacheMs · 3000 · 0–60000 · 聚合快照缓存时长(毫秒)。0 表示每次重算 retentionDays · 400 · 0–3650 · 按天分桶保留天数。0 表示不裁剪 maxSessions · 500 · 0–5000 · 统计页返回的会话明细上限 maxTrendSeries · 6 · 1–20 · 趋势图最多画几条模型曲线,多出的聚合成「其他」 maxSeenEntries · 200000 · 1000–2000000 · 去重表上限 showSessions · false · — · 是否展示「按会话」明细 trackFailedAttempts · false · — · 是否统计失败请求。详见「失败请求」 trackAccount · true · — · 是否读取登录账号身份与余额(只读,不碰凭据) autoUpdate · true · — · 是否启用自更新 watchFiles · false · — · 监视包目录,改文件即热重载。开发用 modelAliases · {} · — · 模型别名映射,把 provider 上报的内部代号转成真实模型名 alertThresholds.balanceLowUsd · 5 · 0–1e6 · 余额低于此值(美元)时通知;0 关闭 alertThresholds.quotaLowPercent · 10 · 0–100 · 配额窗口剩余低于此百分比时通知;0 关闭 alertThresholds.quotaResetSoonMinutes · 10 · — · 配额即将重置的提前量(分钟)

HTTP 接口

服务在宿主进程里,端口随 DSH。统计页顶部有对应按钮,也可以直接调:

方法 · 路径 · 作用 GET · /api/dsh-token-metrics/summary · 聚合快照,统计页的数据源 GET · /api/dsh-token-metrics/flush · 立即落盘并返回最新快照 GET · /api/dsh-token-metrics/version · 当前版本与更新状态 GET · /api/dsh-token-metrics/update/check · 检查新版本 POST · /api/dsh-token-metrics/update/apply · 安装新版本并热重载 POST · /api/dsh-token-metrics/reload · 只热重载当前磁盘代码 POST · /api/dsh-token-metrics/rebuild · 从会话日志重算全部统计

手动重算:

curl -X POST http://127.0.0.1:53414/api/dsh-token-metrics/rebuild

统计口径

数据来源是 DSH 的会话日志,这是唯一权威来源。每一次完成的模型调用都会在日志里 追加一条 assistant/message 事件,携带:

  • data.message.source.{provider, model} —— 谁被调用了
  • data.usage —— inputTokens / outputTokens / totalTokens /

cacheReadTokens / cacheWriteTokens / reasoningTokens

  • data.turn / data.step —— 天然的去重键
  • event.time —— 按天分桶

因此统计覆盖:

场景 · 是否计入 · 原因 主会话对话 · ✅ · 日志有 assistant/message 子代理 / teammate · ✅ · 各有独立会话日志 workflow 子会话 · ✅ · 同上 压缩(compaction) · ✅ · 由 llm/stream 补充捕获 会话标题生成 · ✅ · 由 llm/stream 补充捕获 失败的请求尝试 · ❌ · assistant/attempt 是重试中间态,计入会重复

多语言

界面文案通过宿主的 locale 服务注册,因此跟随 DSH 的语言设置(中文 / English), 运行时切换即时生效,不需要重开页面。

实现上有两个容易踩的坑,都已处理:

  • LocaleSnapshot 的当前语言字段是 `active`(不是 locale 或 id)。

早先读错字段名,导致语言永远退回默认值、完全不跟随设置。

  • 只在注册时读一次语言也不够:面板需要订阅 ctx.locale.subscribe,否则

语言切换后已经打开的页面不会重渲染。

模型口径:合并 vs 拆分

同一个模型可能挂在多个供应商下(例如 deepseek-v4.1-flash 同时出现在 trae / workbuddy / dshlinux / workbuddy-ai)。插件维护两套口径:

视图 · 口径 · 用途 byModelName / 占比图 / 趋势图 · 按模型名合并 · 同一模型的多条曲线合并成一条,否则图上会出现 4 条同名线、占比也被拆散 byModel / 明细表 · 按供应商拆分 · 需要区分「哪个渠道花的钱」时看这里

两套口径的合计严格相等——它们只是对同一批事件的不同分组。

跨平台支持

插件不调用任何 shell / 系统命令,路径全部通过 node:path 拼接, 因此 macOS、Windows、Linux 以及 Web 端 DSH 都可用:

平台 · 支持 · 说明 macOS · ✅ · 开发与验证环境 Windows · ✅ · 更新时 rename 带重试,见下 Linux · ✅ · fs.watch(recursive) 需 Node ≥ 20,engines 已要求 ≥ 22.19 Web 端 DSH · ✅ · 只依赖 Host 的 webServer 路由;没有它时其余功能仍工作

Windows 专有处理:运行中的 Node 会锁住模块文件,直接 rename 会抛 EPERM/EACCES(macOS/Linux 不会)。更新器用退避重试处理这类锁, 非可重试的错误照常抛出,不掩盖真实问题。

会话日志用 Node 内置 zstdDecompressSync 读取(跨平台一致的纯 JS/C++ 实现), 不依赖系统 zstd 命令。