Back to home@ZhengDaoWang

dsh-token-usage-observer

No description

Stars
0
Language
TypeScript
Created
Aug 19, 2026
Updated
Aug 19, 2026
GitHub repo

Introduction

dsh-token-usage-observer

统计本机 DeepSeek Harness / Codex (ChatGPT) / OpenCode 的 token 用量与预计费用,提供 agent 工具(usage_stats)与 WebUI 侧边栏「Token 统计」看板。

Collect and summarize local token usage from DeepSeek Harness, Codex (ChatGPT) and OpenCode logs, exposed as a DeepSeek Harness plugin: an agent tool (usage_stats) plus a WebUI sidebar dashboard tab.

功能 / Features

  • 聚合三个来源的 token 用量:输入(缓存未命中)、输入(缓存命中)、缓存写入、输出,并计算缓存命中率与预计费用
  • WebUI 侧边栏新增「Token 统计」入口:打开中心列看板,支持按来源、时间段(YYYY-MM-DD)、分类(模型 id / agent preset)与分组维度筛选,单价可在看板内实时调整
  • 看板提供总量分布图表(按来源 / 分类 / 日期的堆叠条形图)与逐会话明细列表(各来源每个会话的会话名称、token 消耗、命中率与费用,按费用降序)
  • agent 工具 usage_stats:同样的统计管线,支持按来源 / 分类 / 日期 / 不分组四种分组维度,并附会话明细表(含会话名称)
  • 会话名称自动解析:Harness 取 session/title 事件、Codex 取 session_index.jsonlthread_name、OpenCode 取 session.title;缺失时回落为会话 ID
  • 费用单价可配置(默认按 DeepSeek 公开价:输入 $0.14 / 缓存命中 $0.014 / 输出 $0.28,每百万 token;缓存写入默认 $0,全部默认 0)
  • 只读本地日志,不修改任何数据;对损坏/无法读取的文件静默跳过

安装 / Install

通过 dsh 插件命令安装(bundle 形态,构建产物随仓库分发,无需本地构建):

dsh plugin --profile web add "github:ZhengDaoWang/dsh-token-usage-observer"

更新 / 移除:

dsh plugin --profile web update dsh-token-usage-observer
dsh plugin --profile web remove dsh-token-usage-observer

安装 / 更新后需重启 dsh web,侧边栏「Token 统计」入口与看板才会加载。

WebUI 看板 / Dashboard

安装并重启后,侧边栏出现「Token 统计」入口(New Session 按钮下方、与任务看板 / SSH 入口同一区块)。点击打开中心列看板:

  • 筛选栏:来源(全部 / DeepSeek Harness / Codex / OpenCode)、起始 / 结束日期、分类(模型或 preset 子串)、图表分组维度(按来源 / 分类 / 日期 / 不分组)、四档单价($ / 1M token)
  • 统计卡片:请求数、输入(缓存未命中)、输入(缓存命中)、缓存写入、输出、缓存命中率、预计费用
  • 总量分布图表:按所选分组维度绘制的堆叠条形图(输入未缓存 / 缓存命中 / 缓存写入 / 输出四段 + 各分组费用)
  • 会话明细列表:各来源逐会话展示(会话名称、会话 id、模型/预设、最近时间、请求数、各 token 指标、命中率、费用,按费用降序)
  • 扫描范围:各来源扫描的文件数与记录数

使用 / Usage

安装后,在 DeepSeek Harness 对话中直接询问即可,例如:

  • "统计我本机的 token 用量"
  • "看看 codex 这周花了多少 token"
  • "8 月 deepseek 模型的用量按天分组,并按公开价估算费用"

也可通过工具名 usage_stats 显式调用,参数:

参数类型说明
sourcestringall | deepseek-harness | codex | opencode,默认 all
fromstring起始日期(含),YYYY-MM-DD,本地时区
tostring结束日期(含),YYYY-MM-DD,本地时区
categorystring分类筛选(模型 id / agent preset,不区分大小写,子串匹配)
groupBystringsource | category | day | none,默认 source
pricesobject单价覆盖(每百万 token,USD):inputcacheHitcacheWriteoutput

数据来源 / Data sources

来源位置说明
DeepSeek Harness~/.dsh/sessions/<encoded-cwd>/session-<uuid>/session.jsonl[.zstd]读取 assistant/message 事件的 data.usageinputTokensoutputTokenscacheReadTokenscacheWriteTokens),模型来自 request/context 事件
Codex (ChatGPT)~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl逐文件累加 token_count 事件的 last_token_usageinput_tokenscached_input_tokenscache_write_input_tokensoutput_tokensreasoning_output_tokens),避免续写会话重复计数
OpenCode~/.local/share/opencode/opencode.db(依次尝试多个常见路径)只读查询 session 表的 tokens_input / tokens_output / tokens_reasoning / tokens_cache_read / tokens_cache_write,模型取自 model 字段

可通过环境变量 DSH_HOME / CODEX_HOME 覆盖 Harness 与 Codex 的日志根目录。

插件配置 / Plugin config

插件支持可选的 paths(各来源自定义路径)、prices(默认单价)与 announceToAgent(是否向 agent 公告本插件,默认 true)配置,通过 cordis patch 的 config 字段注入。

架构 / Architecture

  • Node 半区src/index.tssrc/routes.ts):注册 usage_stats 工具与 GET /dsh-token-usage/stats HTTP 路由(loopback + 浏览器同源防护),复用同一 collect/summarize 管线
  • 浏览器半区src/client/):lib/client.js__ModuleLoader__ 契约注入 WebUI,挂载侧边栏入口行与中心列看板 React 根
  • 构建:tsdown 双入口(src/index.tslib/index.jssrc/client/index.tslib/client.js

开发 / Development

npm.cmd install
npm.cmd run check   # typecheck + build

构建产物输出到 lib/(含 lib/client.js 浏览器半区)。插件遵循 deepseek-harness 插件规范(cordis patch + dsh-tools defineTool + dsh.client 声明)。

License

MIT