
Security News
Deno Goes the Way of the Dinosaur
Cloudflare is acquiring Deno’s team, which will provide another year of bug fixes and security updates before ending support for the runtime.
dsh-usage-statistics-panel
Advanced tools
DSH web plugin: a usage statistics panel with per-day / per-hour token trend, GitHub-style activity heatmap, cache hit-rate curve and per-model / per-provider breakdowns, replicating the reasonix usage stats feature.
English | 中文
DSH web 插件的用量统计面板:按天 / 按小时的 Token 趋势、GitHub 风格活跃热力图、缓存命中率曲线、按模型与按供应商两种用量拆分(环形占比图 + 明细列表),作为插件页中本插件的独立页面,并在左侧栏提供独立入口。
所有图表均为手绘 SVG,不依赖图表库;配色是固定的 rank 色板(--dsw-chart-1..10 给模型前 10 名、--dsw-provider-1..5 给供应商前 5 名,其余归入灰色 "Other" 桶),暗色主题下整体提亮,随 DSH 主题自适应。
tokens 单位的精确值)、会话数量(完成的 turn)、请求数量、活跃天数、平均缓存命中率(附缓存命中绝对量)、最常用模型$DSH_HOME/storages/usage_history.json(storage-domain),纯本地、无外部依赖dsh plugin --profile <name> add dsh-usage-statistics-panel@latest
装完硬刷新浏览器(Cmd/Ctrl+Shift+R):client 半的改动 DSH 会热加载,无需重启;仅 host 半(采集/存储/路由)更新时需要重启 DSH。
插件挂载后有两个入口:左侧栏 新会话 下方的 使用统计 行(一眼可达),或在 插件 页里进入 已安装 → usage-statistics-panel 的详情页(卡片与详情页的标题、描述、图标取自本包的 locale/*.json 与 icon.svg,随界面语言在简体 / 繁体 / 英文之间切换;完整包名仍在该详情页以代码行列出)。两处渲染的是同一个面板;独立面板左上角有返回按钮,点击即回到进入它之前的界面(会话、插件页或其它面板)。
兼容性:本插件支持 DeepSeek Harness >= 0.1.7-rc.1;开发依赖对齐宿主 0.1.7-rc.2,并已在正式版 0.2.0-rc.2、预发布 0.2.1-alpha.2 与 0.2.1-rc.2 三个隔离实例上实测(面板出数、围栏四种路径)。V3 / V4 会话日志兼容由单测覆盖(V4 自 0.2.0-rc.2 起就是发布格式,assistant/message.data.usage 等采集点字段两版一致),历史回扫双路径(0.1.2-rc.1 的 list+inspect 与 0.1.3-alpha.* 起的 list+open+分页 read+close)保留。
/usage/api 的信任围栏也按宿主代际取源:0.2.1-alpha.2 起官方把显式授权移到 webStartup、删除 webRuntime,并新增「接受监听端自身 bind 地址」;此前 webRuntime.trustedHosts(含绑定时采样的局域网地址)才是官方围栏接入的那一份。插件按 webRuntime → webStartup 的顺序读,并始终把 webServer.host 当作可接受的 bind 字面量(未指定地址拼写除外),两代都与官方同语义放行/拒绝。
已知差异:官方那两个统计条目会跟随「性能与用量显示」偏好(紧凑档只留速度 / 只留缓存命中),本插件的遮蔽条目不跟随,始终渲染详细读数。该偏好的数据源在 ui-chat 私有的 config form 里,跨插件直读属于易碎耦合,故这里选择不实现——两代宿主上行为一致,并非
0.2.1-alpha.2引入的差异。
底部信息栏那一行按宿主容器自适应:0.1.6-alpha.2 起宿主把它放进与上下文占用环并排的 flex 行里(居中、间距、顶距与侧边距都由该容器负责),0.1.6-alpha.1 及以前它仍自持内容宽度、左右侧边距与 4px 顶距——同一份构建在两种宿主上都对齐。
peer 依赖中的
@deepseek-ai/*只表达能力下界(>=0.1.7-rc.1是插件用到的最早接口面),并全部标记为 optional。按 semver 的预发布规则,该范围只匹配同一 tuple 的预发布版——0.1.7-rc.2判为满足,而下一个预发布行(0.1.8-rc.1)仍判不满足——所以实际支持的宿主版本以本段说明为准,不依赖 npm 的 peer 校验。
旧宿主用户:
0.1.6-alpha.2及更早的 DeepSeek Harness 请安装本插件0.3.0及之前的版本。宿主在0.1.7线把@deepseek-ai/dsh-client-ui-primitives的图标导出整体改为字重命名(*Outline16→*OutlineRegular/*Medium),两代导出名无交集:旧名在0.1.7+上解析为undefined,会让底部信息栏渲染失败——一份构建无法同时服务两代。
面板的数据采集是观测式的,共三处来源:会话事件流(session/event)中的 assistant/message 与 assistant/chunk(agent loop 的每次调用)、同一事件流中的 compaction/summary(会话压缩的摘要调用——它的用量只记在该事件里,因为摘要并不产生 assistant/message),以及 llm/stream 瀑布事件(AI 生成的会话标题——标题调用在会话日志里只留下请求、不留用量)。三处都提取 provider 上报的 token 用量(输入 / 输出 / 缓存读 / 缓存写)。去重与归因各不相同:agent loop 的调用在单个会话内按 (turn, step) 去重(同一调用只计一次、保留先到的样本——两个官方适配器对流式采样与最终上报的数值完全一致;并发会话各自独立计数、互不吞样本),模型归因优先取消息自带的 source(每次调用各自标注),缺失时回退到会话的路由折叠(request/context 事件或会话的 requestContext()),宿主重启后也不会落入 "(unknown)" 桶;压缩按 compactionId 去重,并以事件自带的 provider/model 归因;标题每次调用计一次(token 加一次请求),取该次流中最后一个 usage 样本——适配器上报的是累积值,累加会重复计数。首次启用时还会回扫既有会话日志补齐历史。
提示:Token 用量从插件启用(含回扫)之日起累计;更早的会话日志若无 provider 上报的用量数据,则无法回溯。会话标题是唯一例外:它的用量不在会话日志里,只能由插件运行时从
llm/stream截获,因此既无法回扫补齐,插件未运行期间发生的标题调用也会漏计。
子代理会话:子代理是独立会话,其 token、请求与完成的轮次与顶层会话一并统计(实时采集覆盖全部会话事件流,重启后回扫同样覆盖子代理会话日志);父会话仅收到子代理结果摘要,不会重复计入。子代理会话早期的请求标记(step/start)先于其路由事件写入日志,首个请求可能统计在 "(unknown)" 桶——请求总数不受影响。
Token 口径:汇总卡片与趋势图的 Token 总量为服务商总口径——未缓存输入 + 输出 + 缓存读 + 缓存写(DeepSeek 会把 prompt 拆成输入/缓存读两个不相交的桶,简单相加会漏掉占大头的缓存部分)。它的统计范围是 agent loop 的会话调用、会话压缩与 AI 生成的会话标题,不含联网搜索:DSH 的搜索后端用 provider 私有的 HTTP 客户端直连搜索端点,既不在会话日志留下用量、也不经过 llm/stream,插件侧无从获取,因此本总量与服务商账单面板之间最多相差这一项。平均缓存命中率以输入侧(命中 + 未命中)为分母,其中未命中 = 未缓存输入 + 缓存写入——与会话底部信息栏(官方 StatsLine 口径)完全一致,两处读数不会出现分歧;命中率卡片下方同时展示缓存命中的绝对 token 量。
压缩口径:一次压缩计一次请求——后端内部的重试不可见(压缩调用不经 llm-retry);压缩失败时不会写入 compaction/summary,这次调用也就不计,尽管它可能已被计费。会话标题同样每次调用计一次请求与一次 token(取流中最后一个 usage 样本),流被超时或取消打断时仍记账。
重建统计:面板工具栏(刷新 右侧)的 重建统计 按钮就是这个动作,需二次确认——首次点击变红显示「确认重建?」,再次点击才执行(移开焦点、按 Esc 或 5 秒内不再点击都会自动取消)。它等价于 POST /usage/api/reset(与面板同源信任围栏保护):清空本地统计并按当前归因规则全量重放会话日志——用于历史数据损坏或归因规则升级后的重建。仍在进行中的会话以其重置时刻的日志长度为界:界内由重放重建、界外继续由实时采集,恰好各计一次。
pnpm install
pnpm typecheck # tsc --noEmit
pnpm test # vitest
pnpm build # tsc declarations + tsdown (host ESM + 双通道 client bundle)
src/):collector(事件订阅 + 回扫折叠)、store(usage_history storage-domain)、query(范围聚合,翻译自 reasonix 的 query.go)、routes(/usage/api fenced JSON 路由,信任围栏与 /api 网关一致)src/client/):UsageStatsPanel.tsx(手绘 SVG 图表,移植自 reasonix 面板 + rank 色板)、locales(en / zh / zh-TW)、api(/usage/api fetch 封装)lib/client.js(官方 profile 通道,bundle id = 包名)与 lib/client-registry.js(插件注册表通道,bundle id = manifest id)。harness 0.1.x 官方加载链只消费前者;后者为外部 registry 通道预留,当前无消费者本面板是对 reasonix 用量统计功能的复刻移植:作者曾为 DeepSeek-Reasonix 实现并贡献了该功能(PR #7238、#7503),本插件按 DSH 的插件规范将其移植到 DeepSeek Harness,前端图表大比例复用原实现,数据层则基于 DSH 的会话日志与 storage-domain 重新实现。
MIT
FAQs
DSH web plugin: a usage statistics panel with per-day / per-hour token trend, GitHub-style activity heatmap, cache hit-rate curve and per-model / per-provider breakdowns, replicating the reasonix usage stats feature.
The npm package dsh-usage-statistics-panel receives a total of 437 weekly downloads. As such, dsh-usage-statistics-panel popularity was classified as not popular.
We found that dsh-usage-statistics-panel demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.

Security News
Cloudflare is acquiring Deno’s team, which will provide another year of bug fixes and security updates before ending support for the runtime.

Security News
Anthropic’s free OSS Scanner uses Mythos and other Claude models to find open source vulnerabilities and send maintainers reports with proposed fixes.

Security News
On Front Lines’ Early Adopters: CISO podcast, Andrew Becherer shares lessons from Datadog, weighs the long-term costs of AI-built tools, and explains how founders can actually gain a CISO’s trust.