xinmo114514/dsh-usage-dashboard0

dsh-usage-dashboard

DSH web plugin: 设置页 Token 消耗仪表盘 —— 总/输入/输出 token 指标卡、近7天每日 + 近24小时逐时趋势图、按模型/会话分布;宿主半扫描会话日志(assistant/message usage 事件)并提供 GET /usage/api/dashboard

AI Analysis

核心用途是本地化统计和分析 Token 消耗。适合需要掌握自身 API 使用趋势、分析高消耗模型或会话,且注重数据隐私(不上传外部)的用户。

Package
dsh-usage-dashboard
Version
0.1.0
License
Unlicense
Last updated
Aug 15, 2026

Install

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:xinmo114514/dsh-usage-dashboard

📊 dsh-usage-dashboard

DSH(DeepSeek Harness)Web 插件 —— 设置页 Token 消耗仪表盘

在 DSH 的 Web 界面(http://127.0.0.1:3080)设置对话框中,一键查看全部会话的 Token 消耗:核心指标卡、近 7 天每日趋势、逐时曲线、按模型 / 按会话分布,数据全部来自本机会话日志,真实可追溯、不上传任何外部服务。

license [version] node build stars forks issues PRs PRs Welcome


目录


简介

这是什么? 一个为 DSH(DeepSeek Harness)Web 界面打造的 Cordis 插件。它把散落在 ~/.dsh/sessions/ 下的全部会话日志中的 token 用量聚合起来,在 设置 → Token 用量 分区呈现为一个完整的消耗仪表盘。

解决什么问题? DSH 本身不提供全局的 token 消耗视图;想知道“近 7 天 / 今天 / 某个模型 / 某个会话花了多少 token”,只能翻原始日志。本插件把这些信息变成打开设置就能看到的图表。

核心亮点:

  • 📊 五维聚合:总量、按日、按小时、按模型、按会话,一次扫描全部折叠
  • 📈 零依赖图表:SVG 手写堆叠柱状图、双折线图、分布条,不引入任何图表库
  • 🛡️ RAW 日志直读:直接解压解析 session.jsonl.zstd(多帧 zstd),不依赖解释器逐条重放,数据完整可审计
  • 🔒 纯本地统计:所有聚合只在本机进程内完成,不发送任何外部请求
  • 🎨 主题自适应:复用 DSH shell 的 --dsw-alias-* 设计令牌,明暗主题、窄屏布局自动适配
  • 🌐 中英双语:内置 zh / en 两套文案,跟随浏览器语言自动切换

仪表盘截图

dsh-usage-dashboard 仪表盘全览(设置 → Token 用量)

设置对话框中的「Token 用量」分区:指标卡 + 近 7 天每日堆叠柱状图 + 逐时双折线 + 按模型 / 按会话分布(数据为真实会话日志聚合)

仪表盘在 DSH 设置页中的位置

仪表盘在 DSH Web 设置页中的实际位置:侧边栏底部齿轮 → 设置 → 左侧「Token 用量」

功能特性

功能说明截图
🧮 核心指标卡总消耗 / 输入 / 输出 / 缓存读取,附调用次数、会话数、占比、缓存写入、推理量、缓存命中率;数值按位数自动缩放字号,任何宽度下不截断dashboard.png
📊 近 7 天每日消耗输入 / 输出 / 缓存堆叠柱状图,悬停查看当日明细(总数、输入、输出、缓存、调用次数)同上
⏱️ 逐时消耗输入 / 输出双折线图,支持 7 小时 / 24 小时窗口切换,悬停查看整点明细同上
🤖 按模型分布横向条形 + 占比(模型名取自 assistant/message 事件的 data.message.source.model),品牌色同色系透明度阶梯,排名靠长度表达同上
💬 按会话分布会话列表(标题 + 调用次数 + tokens + 占比),可「展开全部」查看所有会话同上
🔔 状态反馈扫描中脉冲徽标、缺失会话警告徽标(悬停显示原因)、手动刷新按钮、空状态 / 错误状态同上
🌓 响应式布局容器查询自适应:宽容器 4 列 → 常规 2 列 → 极窄 1 列指标卡,手机宽度不横向溢出同上

数据来源与统计口径

仪表盘展示的每一个数字都可追溯到本机的会话日志文件。

  • 数据源:宿主半启动后异步扫描 ~/.dsh/sessions/**/session.jsonl.zstdDSH_HOME 可覆盖,默认 ~/.dsh),RAW zstd 直接解析(多帧用 zstd CLI 解压,Node 内置 zlib 只能解出首帧);RAW 解码失败(如仍在写入的尾部帧)自动回退 sessionQuery.readSession / sessionPersistence.readFrom
  • 统计口径assistant/message 事件的 data.usage.{inputTokens, outputTokens, cacheReadTokens, cacheWriteTokens, reasoningTokens}total = input + output + cacheRead + cacheWrite(不含 reasoning)。
  • 模型归属:事件 data.message.source.model(缺失时回退 data.model,再缺失记 unknown)。
  • 会话标题:取自 session/title 事件,缺省回退工作目录 basename,再缺省显示截断的会话 id。
  • 实时折叠:通过 ctx.on('session/event') 监听新产生的用量事件,每个会话以 maxSeq 水位去重,与扫描结果幂等合并。
  • 自愈重扫:每 60 秒增量重扫一次(防重入锁保证扫描不重叠);某轮无失败会话时自动清除历史错误标记。
  • 前端刷新:仪表盘挂载期间每 4 秒轮询一次 API,切换分区即停止轮询。

工作原理

插件分为两个“半”(与 DSH 插件惯例一致):

┌──────────────────────────── host 半(Node,src/index.ts)───────────────────────────┐
│  cordis 注入:webServer · sessionQuery · sessionPersistence · timer                    │
│  ┌─────────────┐   RAW 直读    ┌──────────────┐   五维折叠   ┌──────────────┐        │
│  │ 会话日志目录 │ ───────────▶ │ 扫描器(4 并发)│ ─────────▶ │ 内存聚合存储 │        │
│  │ ~/.dsh/sessions │  harness 兜底 │ 60s 自愈重扫  │  实时事件折叠  │  totals/daily │        │
│  └─────────────┘              └──────────────┘              │  hourly/byModel│        │
│                                                             │  /bySession    │        │
│  GET /usage/api/dashboard(仅回环 Host 可访问)◀─────────────┘                │        │
└──────────────────────────────────────────────────────────────────────────────────────┘
                                      │ HTTP(4s 轮询)
┌──────────────────────────── client 半(浏览器,src/client/index.tsx)─────────────────┐
│  slots.inject('settings.section') → 设置对话框左侧「Token 用量」(order 40)              │
│  指标卡 / SVG 图表 / 分布列表 —— 纯 createElement,无 JSX、无图表库依赖                    │
└──────────────────────────────────────────────────────────────────────────────────────┘
  • host 半只依赖 Node 内置模块,所有 DSH 服务通过 cordis 注入列表获得(export const inject = [...]),由插件自身声明。
  • client 半通过 window.__ModuleLoader__.load({ id, factory }) 注册进 Web shell 的冻结模块表,运行时仅 require('react')
  • API 路由注册为 exact 路由,可与 dsh-usage-widget 等插件的 /usage/api 前缀路由共存(webserver 优先匹配 exact 表)。

快速开始

环境要求

依赖版本
Node.js≥ 20
包管理器pnpm(npm / yarn 亦可)
zstd CLI可选:缺失时 RAW 解压自动回退 harness 读取
DSH Web 环境已运行的 DSH Web 实例(默认 http://127.0.0.1:3080

构建


### 使用

1. 刷新浏览器,打开 `http://127.0.0.1:3080`
2. 点击侧边栏底部 **齿轮**(设置)→ 左侧导航 **「Token 用量」**
3. 首次打开会自动扫描全部会话日志(右上角显示“正在扫描会话日志…”脉冲徽标),随后图表与分布自动填充,每 4 秒自动刷新