bowenliang123/dsh-context
bowenliang123/dsh-contextDSH 上下文洞察面板:Context 仪表盘 + /context命令 + Context 浏览器,查看 Context的分类组成、内容详情、演进趋势、压缩/注入事件、统计等一站式 Context 全生命周期管理。
中文 · English
市面计费插件大多停在「token 数 × 单价」。dsh-ui-usage-billing 把计费做成一条可对账的账本链路——用量是真的、价格是活的、峰谷跟着模型走。
用量从持久化会话日志实时聚合,绝不伪造样本(数据到达前显示空快照);官方余额当日变动与本地账本交叉对账,偏差超阈值主动提示核对——账单经得起质疑。
models.dev 实时目录 + 内置 25 厂商 239 款模型 + 设置面板自定义单价(可按中转站绑定同模型不同价),新模型无需等发版;DeepSeek 分时价按官方变更节点分段计价(8-17 前基础价、8-17~8-23 周末计峰、8-23 起周末全谷),价格调整永不回写旧账。
计费通道按当前会话使用的模型自动识别:DeepSeek 按量走分时价(工作日 9-12 / 14-18 高峰 ×2、周末全天低谷),智谱 Coding Plan 走积分峰谷(工作日 14-18 高峰全额、非高峰积分 5 折),通道层可扩展、更多厂商逐步接入;切档前弹窗 / 系统通知自动提醒,且只有当前模型真正涉及峰谷才会提醒、费用条才显示档位——不用你盯时间表。
DeepSeek / Kimi / 智谱 GLM / 腾讯云 TokenHub 等 7 家官方余额、Coding Plan 额度、中转站滚动额度窗口、自声明端点,再加余额差对账——订阅扣的和余额扣的同屏可查、交叉验证。
usage_stats 工具让模型直接回答「今天花了多少」「哪个站点用得最多」。usage_stats 这一个只读工具(默认关闭);任何情况下都不注入系统提示、不写模型可见事件。/usage 命令直接拉起计费仪表盘(宿主无该能力时静默降级,不影响面板)。package.json(单一来源,发布自动正确),作者 / 仓库 / npm / 许可证一键可达。api.deepseek.com)而非路由名,deepseek-* 网关路由不再被误算官方。routeAliases 归位改名 / 删除的历史路由,modelKeyAliases 把目录外模型 id 绑定到计费键(日期后缀、组织前缀、TokenHub 短 id hy3 已内置识别)。minimax-token-plan-cn(自动对接 api.minimaxi.com),国际用 minimax / minimax-token-plan;可在该 provider 设置覆盖 baseUrl。Claude 订阅:本机登录 Claude Code 后自动发现(读 ~/.claude/.credentials.json 的 OAuth token),显示 5 小时 / 周窗口用量;llm-pi-ai 里按量 anthropic 路由不会被误识别,费用照常按 token 计。CommandCode:在 llm-pi-ai 给 commandcode 路由配 apiKeyEnv(user_ 前缀 key),显示 5 小时 / 周窗口与月度 Credits。src/tc3.ts)——凭据填 : 密钥对(非推理 key),路由命名 tencent-tokenhub / tokenhub / tencent / tencentcloud 任一即可命中,剩余与总额度都可解析时才产出百分比窗口(绝不猜总额度)。extract 支持常量 / 点路径 / 四则运算,请求头 {{ENV}} 经凭据 seam)。declaredEndpoints 自声明余额接口——只写「数字在哪里」的点路径、无表达式;安全边界(单斜杠绝对路径、仅 GET、拒跨源重定向、响应体 / 超时上限、凭据只取本 provider)由 src/declarative.ts 强制执行,取错路径在界面标 declared 与 reason。余额差对账(reconcilePath)用官方余额当日变动与本地账本交叉校验,偏差超阈值(0.3 元且 >15%)提示核对;充值 / 授信 / 币种变化重置基准而非告警,余额未减少(走订阅扣费)静默。baseURL 归一化 origin 归组,同站多把 key 合并一行、站名即域名;自动识别 New API 系(/api/status)与 Sub2API(/v1/usage)的余额与滚动额度窗口,读不出标「未读出额度」、剩余 <20% 标红;识别结果 5 分钟指纹缓存(同站多 key 独立熔断),relay-quotas 端点附 diagnostics 供「为什么不显示」自查;项目归属优先用工作区标题命名。全部渠道的适配矩阵(识别方式 / 端点 / 凭据要求 / 排查顺序)见 docs/adapters.md。
usage_stats 工具让模型自查今天 / 本月 / 当前会话 / 累计费用,还可查 bySite(按站点归组)与 relay(只看中转站)汇总。mi-mimo-2.5 → 小米);估算价模型标注「估算价」。127.0.0.1.evil.com 形式的 DNS rebinding(反向代理部署可用 trustedHosts 显式放行特定主机名,peer socket 校验仍为强制);写操作额外校验 Origin 回环与 Content-Type 并限制 body 上限,杜绝跨站改写;余额 / 订阅 / 定价拉取带有限重试与按上游维度熔断(鉴权失败属配置问题、不计入熔断)。= / + / - / @ 开头单元格前置单引号并完整转义,防止在 Excel / WPS 中被当作公式执行。usage_stats 只读工具(见「Model Experience」),该工具只读本插件自己的聚合结果,不读会话正文、不写回日志。先确认宿主代际(dsh --version),再按代际选安装命令——装错线会在市场侧被 `engines.dsh` 声明拦截(v1.0.41 起声明生效)。注意 dsh plugin add 需要显式 --profile(缺省会报 required option '--profile ' not specified),且建议钉具体版本号而非 @latest(pnpm 的 minimumReleaseAge 冷静期会让刚发布的版本被跳过、回退到旧线):
npm ls -g @deepseek-ai/dsh 显示 0.1.2-* ~ 0.2.0-*):dsh plugin --profile web add npm:@kenz1117/dsh-ui-usage-billing@lateststable 永久指向终版 v1.1.17,存量用户照常安装使用,但不再有新版本;冻结依据与正式停用时机见 COMPATIBILITY.md):dsh plugin --profile web add npm:@kenz1117/dsh-ui-usage-billing@stable也可以在宿主 cordis.patch.yml 中手动加入:
- insert:
- id: ui-usage-billing
name: '@kenz1117/dsh-ui-usage-billing'启动宿主后,侧边栏设置上方即出现计费入口。无需额外配置;sessionPersistence 可用时自动聚合真实用量。
本插件同时按 DSH Community Market 的 Path A 标准来源发布目录条目。在 DSH 的 「设置 → 插件 → 插件商店 → 来源管理 → 添加来源」粘贴下面的 manifest URL,即可把本目录 加为来源,随后在市场里浏览并一键安装:
https://kenz1117.github.io/dsh-ui-usage-billing/catalog-source.json市场托管安装只走 npm registry 的精确稳定版本(安装目标由 Host 解析 npm latest 决定, 目录里列出的版本仅用于展示)。目录文件在本仓 catalog/ 下,改动由 CI 校验后随 GitHub Pages 发布。
插件由服务端与浏览器端两部分组成:
浏览器端 服务端(Node)
│ │
├─ GET /api/billing/usage-stats ────────▶ ├─ sessionPersistence 遍历持久化会话日志
│ ├─ 按 request/header 归属模型
│ ├─ token 按缓存命中 / 未命中分桶
│ └─ 按实时单价表估算费用(人民币)
├─ GET /api/billing/pricing ────────────▶ ├─ models.dev 模型价 + 腾讯财经汇率(逐级降级)
├─ GET /api/billing/balance ────────────▶ ├─ DeepSeek 官方余额 API(凭据 seam 取 key)
├─ llm.models 健康探测 ─────────────────▶ └─ 返回聚合统计 JSON
└─ 渲染仪表盘src/index.ts):注入 webServer、sessionPersistence 与 credentials,注册 GET /api/billing/usage-stats、/api/billing/pricing、/api/billing/balance、/api/billing/subscriptions、/api/billing/relay-quotas、/api/billing/notify-claim(完成提醒跨实例认领)与 /api/billing/usage-tool(usage_stats 工具开关读写)。聚合器按会话缓存折叠结果:一次 LLM 调用归属到其前置 request/header 记录的模型,token 拆分到缓存命中 / 未命中桶,日期按本机时区归天;日志文件 mtime+size 不变则直接复用缓存,只有写过的会话重新折叠,整份文档另有 5 秒 TTL 合并密集轮询。每个成功折叠的会话同时原子写入独立的持久用量账本,永久删除会话后历史费用与 token 仍保留。src/client/):请求上述接口渲染仪表盘,通过 llm.models 探测各厂商连接状态。真实数据到达前显示全零空快照,不展示伪造样本。单价表(src/client/pricing.ts)采用原生币种存储:国内厂商直接录入人民币价格,国外厂商录入美元价格。费用统一以人民币计算与展示——美元模型按实时汇率折算,国内模型全程不经过汇率换算。启动时服务端拉取实时汇率与模型价(src/pricing-fetch.ts):USD→CNY 优先腾讯财经行情(免 key、国内可达),失败依次降级 open.er-api 与内置默认值;之后每 6 小时后台刷新,单价表弹窗标注「今日汇率」与实时 / 内置徽标。金额与费率表的展示币种跟随用户所选:切 ¥ / $ 时把每条每百万 token 单价经 convertUnitPrice 按实时汇率换算到目标币种再显示(汇率缺失时回退原生币种)。
cost(CNY)= (missInput × p_input + cacheHit × p_cacheHit + output × p_output) / 10⁶
—— 价格为原生币种;美元模型按实时 USD → CNY 汇率折算统计中的 input 为总输入(cacheHit + cacheMiss),估算按命中 / 未命中分拆计价,避免重复计费。支持双档计费的模型按 DEFAULT_PEAK_SHARE(默认 0.5)混合高峰与低谷档;周末(北京时间周六 / 周日)全天按低谷价计费。
联网搜索请求按次估算(issue #15):DSH 的联网搜索绕过对话通道直连官方 api.deepseek.com,会话日志只记请求、无用量事件,而开放平台照常计费。插件对这类 web/deepseek-search-llm-request 事件按次估值计入费用(默认 0.02 元/次,配置 searchCallEstimateCny 可调整;设 0 关闭),并单独累计 searchCalls 供面板提示估算口径。
自定义单价(设置 Tab,issue #16):结构化条目表(模型 + 可选来源 + 输入/缓存命中/输出 + 币种),不再手编 JSON。来源(中转站域名)留空 = 该模型默认价;填入中转站域名(如 https://api.my-relay.com)= 仅该来源的同名模型用此价(同名模型可同时存在默认价与多个来源价,互不覆盖)。显示层按「模型 × 来源」精确匹配重算,命中不到来源时回落该模型默认价,再无则用内置目录价。
完整目录见费率 Tab 及源码 src/builtin-catalog.ts 的 BUILTIN_MODEL_CATALOG(238 款在售 + 1 款退役型号保留历史回算),此处每厂商仅列代表型号。
厂商 · 代表模型 DeepSeek · V4.1 Flash、V4 Pro(等 3 款;按官方变更节点分段计价:基础价 → 峰谷 v1 → 周末全谷) 智谱 AI · GLM-5.3、GLM-5.2(等 17 款) 阿里通义 · Qwen3.8 Max、Qwen3-Coder 480B(等 27 款) 字节豆包 · Doubao Seed-2.1 Pro、Doubao Seed-2.0 Pro(等 13 款) 月之暗面 · Kimi K3、Kimi K2.7 Code(等 16 款) 小米 · MiMo V2.6 Pro(等 6 款) MiniMax · MiniMax-M3、MiniMax-M2.7(等 8 款) 云知声 · U2 Flash、Unisound U2(等 3 款) 百度文心 · ERNIE-5.1、ERNIE-4.5 300B(等 2 款) 腾讯混元 · 混元 Hy3、混元 T1(等 3 款) Anthropic · Claude Opus 5、Claude Sonnet 5(等 14 款) Mistral AI · Mistral Large 3、Mistral Small 4(等 30 款) Cohere · Command A、Command R(等 7 款) OpenAI · GPT-6 Astra、GPT-5.6 Sol / Terra / Luna(等 38 款) Google · Gemini 3.1 Pro、Gemini 3.6 Flash(等 25 款) xAI · Grok 4.7、Grok 4.20(等 8 款) Meta · Llama 4 Maverick、Muse Spark 1.3(等 8 款) 美团 · LongCat 2.0(估算价) 面壁智能 · MiniCPM-V 4.5(估算价) 小红书 · Dots3-Note Preview(估算价) 零一万物 · Yi-Lightning 阶跃星辰 · Step 3.7 Flash、Step 5 Preview(等 3 款) 科大讯飞 · Spark 4.0 Ultra(套餐制)¹ 商汤 · SenseNova 6.5(公测中)¹ 百川智能 · Baichuan M3-Plus 其他 · 未收录模型的统一回退定价(费用记 0)
¹ 讯飞、商汤及美团 / 面壁智能 / 小红书等未公布官方按量单价的模型,表内为估算价(estimated);这些模型走订阅通道(coding / token plan / opencode)时费用记 0。订阅通道与 pi-ai 内置提供方对齐(kimi-coding、zai-coding-cn、opencode、opencode-go、qwen / xiaomi 的 token-plan 各区域变体),可按subscriptionProviders配置覆盖。
新增模型:在 src/builtin-catalog.ts 的 BUILTIN_MODEL_CATALOG 追加条目(别名表 BUILTIN_MODEL_KEY_ALIASES 同文件维护;目录只随 node 半构建,经 /api/billing/pricing 由宿主下发注入客户端)。价源口径:海外厂商取 models.dev 实时目录原生 USD;国内厂商优先取官方 CN 价(models.dev 的 -cn 目录),该目录缺项时按 USD 价 × 汇率折算并在条目注释标注。存量条目的价格更正走独立的调价节点,不与扩容混在一起。
对外 HTTP 接口与字段定义详见源码:GET /api/billing/pricing、/api/billing/balance、/api/billing/usage-stats、/api/billing/subscriptions、/api/billing/relay-quotas(见 src/index.ts、src/aggregate.ts、src/relay.ts)。其中 usage-stats 返回的 bySite 字段为按中转站归组后的用量分布(site: / direct: / unknown),unpricedModels 为未计价模型的 id 列表;relay-quotas 返回 quotas(各中转站额度)与 diagnostics(每条路由的 origin / kind 归类,供「为什么不显示」自查)。全部端点仅接受回环请求(peer socket 地址 + Host 头校验)。
字段 · 默认 · 说明 statsPath · 未设置 · 回退统计文件 .dsh-usage-stats.json 的绝对路径(sessionPersistence 不可用时生效) ledgerPath · /.dsh-usage-ledger.json · 独立持久用量账本的绝对路径;只保存折叠后的统计(不保存消息正文或会话标题),永久删除会话不会删除已记录的费用与 token。默认根跟随宿主 harness home(DSH_HOME 环境变量优先,回退 ~/.dsh),自定义 DSH_HOME 的多套隔离环境互不污染(issue #52) balanceApiKeyEnv · DEEPSEEK_API_KEY · DeepSeek 余额查询的凭据引用;仅在 llm-pi-ai 未配置 deepseek 的 apiKeyEnv 时兜底使用 subscriptionProviders · 内置订阅通道清单(含 tencent-token-plan) · 订阅制(coding / token 套餐)provider id 列表,照常统计 token、费用记 0;与订阅卡识别口径对齐 routeAliases · 未设置 · 历史路由别名(旧 provider 路由名 → 当前路由名):改名/删除过的路由,其历史用量原落「未知路由」桶且订阅/官方判定失效;配置后按目标路由归位。例:{ "deepseek-official": "tencent", "tencent-cloud": "tencent" } modelKeyAliases · 未设置 · 用户自定义模型别名(真实日志 model id → 计费目录键,值须为 MODEL_CATALOG 既有 key):目录外新模型无需等发版,配一条别名即完成识别与计价。例:{ "hy4-preview": "hunyuan" } monthlyBudget · 未设置 · 月度预算默认金额(人民币元);随 usage-stats 下发,作为仪表盘预算条的初始金额(用户在界面上的设置优先并本地持久化) lowBalanceThreshold · 50 · 余额不足告警阈值(人民币元);随 usage-stats 下发,任一厂商余额折算人民币低于此值时每天提醒一次 subscriptionPlans · 自动识别 · 订阅额度适配器白名单({ provider, baseUrl?, region? });缺省时自动从 llm-pi-ai 设置识别所有订阅类 provider(有额度 API 的查额度,无 API 的仅标识) declaredEndpoints · 未设置 · 声明端点({ displayName, origin, path, fields?, windows?, raw? }):为内置表没有的供应商自声明余额/额度接口,只写「数字在哪里」的点路径、无表达式;请求由匹配到同源 provider 的 origin 构造,安全边界(单斜杠绝对路径、仅 GET、拒绝跨源重定向、响应体/超时上限、凭据只取匹配 provider 自有的 apiKeyEnv)由 src/declarative.ts 强制执行 reconcilePath · /.dsh-usage-reconcile.json · 余额差对账基准的绝对路径(默认根同样跟随 DSH_HOME / ~/.dsh);用官方(仅 DeepSeek 官方方向)余额当日变动与本地账本当日的官方渠道费用做交叉校验,偏差超阈值(0.3 元且 >15%)时提示核对;充值/授信/币种变化重置基准而非告警 searchCallEstimateCny · 0.02 · 联网搜索请求(web/deepseek-search-llm-request,日志无用量事件)的单次费用估算(人民币元);设 0 关闭估算(调用仍计数、不计费) trustedHosts · 未设置 · 反向代理场景下允许通过 Host 头校验的额外主机名(如 ['llm.example.com']);缺省空 = 与历史版本行为完全一致。仅在 peer socket 回环校验通过后才参考,只放宽「纵深防御」的第二层;精确主机名匹配(忽略大小写与端口),无后缀 / 通配符语义
环境要求:Node.js ^22.19 || >=24,pnpm。
pnpm install
pnpm test # 单元 + API 契约 mock + UI 组件测试(vitest + jsdom)
pnpm lint # 纪律守卫:类型 / 日志 / 空 catch / CSS↔TSX 类名 parity
pnpm run build # tsc -b && tsdown,产出 lib/index.js 与 lib/client.js本地真机调试:dsh plugin --profile web add "link:" 把宿主指向本仓,此后改代码 → pnpm run build → 重启宿主即生效,无需发 npm(加载链路详解见 docs/DEV-MODE.md)。HTTP 契约 e2e 用 pnpm test:e2e(需本地 dev host 在跑)。工程约定(双线发布策略、宿主升级 SOP、验收清单)见 AGENTS.md。
本包为独立 npm 包,发布走预览线(latest + alpha 双 tag 同步切换);稳定线(stable)已冻结,详见 COMPATIBILITY.md。
pnpm test && pnpm run build # 发版前全量测试 + 构建
npm publish --access public
npm dist-tag add @kenz1117/dsh-ui-usage-billing@<版本> alpha宿主通过 package.json 的 dsh.client 声明(platform: web)与 exports["./client"] bundle 自动发现浏览器端,无需注册中心登记。兼容矩阵以真机实测为准、逐版本精确声明(dsh.compatibility.dshReleases),发布前后跑 node scripts/check-compat.mjs --peer package.json 复核。
apiKeyEnv(凭据)、写入 harness home(DSH_HOME / ~/.dsh)下的账本与快照(持久状态);不含命令执行 / Shell。latest/alpha,1.6.x,自 v1.2.0 起恒高于稳定线以消除版本号倒挂)适配 DSH 0.1.2-alpha.1 ~ 0.2.1-rc.2(宿主 latest 现指向 0.2.0-rc.2、预览线最新为 0.2.1-rc.2;0.2.1 全系列逐版本声明);稳定线(npm stable,1.1.x,已冻结,终版 v1.1.17)适配旧宿主 0.1.0-rc.8 ~ 0.1.1-rc.2。逐版本声明见 package.json 的 dsh.compatibility,双线对照与监控机制见 COMPATIBILITY.md。Node.js ^22.19.0 || >=24.0.0。preinstall / install / postinstall / prepare(安装即用)。ui-usage-billing;对 @deepseek-ai/dsh-* 仅为 peerDependencies 依赖(不重复安装 / 不替换 / 不遮蔽官方组件),包名使用第三方命名空间 @kenz1117/*。lib/* 与 cordis.patch.yml 已随固定 Commit 提交并声明在 files。efd67dea133a4fee0aacfee8dff416f1ce418b14。DSH STORE 自动化每约 8 小时重新读取默认分支 HEAD 作为新的固定 Commit,并按 SemVer 变更判定是否重新审查。默认无——插件默认不向模型暴露任何工具:设置里的「注入用量查询」默认关闭,关闭状态下模型既看不到工具、也读不到任何本插件数据。
用户显式开启该开关后,注册一个只读工具:
工具 · 参数 · 行为 usage_stats · range:today / month / session / all / bySite / relay · 查询本插件已聚合的用量与估算费用(人民币,按官方目录价估算,非账单);session 需处于 agent 会话上下文
边界声明:该工具只读本插件自己的聚合结果,不读会话正文、不读提示词、不写回会话日志;插件任何情况下都不注入系统提示、不向会话日志写入模型可见事件、不触及会话 KV 缓存。用量统计由服务端从既有会话日志聚合,日志内容由其他包各自负责。工具会占用每次请求的上下文,因此保持默认关闭。
src/balance.ts(按厂商余额 API 增加查询器)。src/relay.ts 的解析器扩展。未知路由表示该路由在当前 provider 配置与宿主 llm 注册表里都不存在(配置已删、日志比安装更早等),历史调用数据未丢,重新配置同名路由即可自动归位。未知路由桶的费用一律记 0(issue #82):支出主体无法核实,与未收录模型、订阅通道同姿态——token 照常统计,面板组头费用显示「—」并附说明。由独立插件经 ctx.llm.registerAdapter 注册的通道(如 CommandCode)不属于未知路由:插件从宿主 llm 注册表发现它们,按 direct: 桶以模型官方目录价计费(issue #91);注册表读取走 ctx.get('llm')(免 inject 声明),读不到/读到空集合时告警一次(面板数字不变,unknown 口径不变),避免这类失效无声无息。.dsh-usage-ledger.json 及其 .bak 会清空独立保留的历史。账本只保留本插件已经成功观测过的调用。trustedHosts 反代支持(PR #60)、币种偏好持久化(PR #58)、费率表搜索(PR #67)、峰谷指示点与固定到输入框(PR #68)、EUR 展示币种与界面语言解耦(PR #70)、首次价目表拉取前置到预热回放(PR #55)、models.dev 收录按证据取舍(PR #56)、硬编码 UI 文案入词典(PR #61)src/tc3.ts)、提供商优先通道分组与网关徽标、routeAliases / modelKeyAliases 配置(PR #35)、订阅徽标按三维格逐通道判定(PR #83)minimax-cn 订阅凭据接线(PR #12)、Windows 下账本并发写入 MoveFileExW EPERM 修复(PR #11)zai-coding)订阅额度,两条路由各自固定区域与 key 双字段分离(PR #79)gpt-image-2 / gpt-image-2.5-sunburst(PR #88)sync.sh 在 macOS 缺省 bash 3.2 下的花括号变量兼容修复MIT © 2026 KenZ (kenz1117)