dsh-context-show
September 14, 2026 · View on GitHub
实时上下文占用面板(DSH Web 客户端插件 + 主机投影插件)。
当前对齐 DeepSeek Harness
0.1.5-rc.2:contextUsage会话投影按新版 API 注册为stateSchema(折叠态校验)+wire(客户端可见视图);用量取数自 durable 结算事件(assistant/message/assistant/attempt的usage,否则取内嵌 stream 的最后一个 usage chunk,用官方lastAssistantStreamChunkhelper)。0.1.3-alpha.1起 npm 未发布对应版本,插件依赖宿主提供;0.1.1-rc.2及更早宿主缺少这些事件词汇,无法显示本插件的金额与用量,请升级宿主。
在会话头部右侧添加一个占用指示按钮(圆环 + 百分比),点击展开/收起可拖动的面板,实时展示:
- 上下文占用:
projectedTokens / contextWindow占用百分比(供应商上报锚定 + 表面增量,随 compaction 即时收缩),圆环按占用程度变色(<70% 中性、70–89% 琥珀、≥90% 红)。 - 来源构成:系统提示词 / 工具定义 / 对话消息的启发式 token 构成(来自 token-meter 的
contextBreakdown投影),分段进度条 + 明细行(详细版)。 - 工具占用:按工具名聚合的占用列表(bash / glob / read …),显示调用次数与约 token 数,不展示原始内容(详细版为表格,省略版为前 3 个工具一行)。
- 花费金额:顶部金额标为「本工作区花费」——同一工作目录(cwd)下所有会话的累计花费,由主机侧跨会话聚合(见下);详细版按花费降序列出每个模型的金额(模型名 + 供应商 + 输入/输出 token 明细)。按 priceUrls 显式配置过定价页的 provider(默认只有 deepseek-official)的官方价格链接集中显示在成本区底部的花费说明行。
- 今日花费:显示「今日 · 本工作区」与「今日 · 全部会话」两个估算值;详细版在每项下带按模型的明细(模型名 + 金额,按花费降序),省略版只显示两个金额、不带明细。按配置时区的当天(默认北京时间)统计。
- 计费口径:usage 取自 durable 结算事件(
assistant/message/assistant/attempt的usage,否则取内嵌 stream 的最后一个 usage chunk);每个请求按其请求时刻(最近一次request/header/request/context的时间)判定高峰/闲时与归属日,而不是结算落盘时间;fork / 延续(continuation)会话的继承事件前缀不计费(那部分请求已由祖先会话付过),因此本插件给出的是「本会话新产生的花费」——面板里的 Token 用量仍来自 token-meter(含继承前缀)。 - 跨会话口径(主机侧聚合 + 持久账本):面板打开时向插件的 loopback 桥
POST /api/dsh-context-show/settings/spend取快照(30 秒轮询)。主机侧把「每个会话的当日花费 + 累计花费」记入一份持久账本($DSH_HOME/storages/dsh-context-show/spend-ledger.json,原子写、容错读、按会话幂等覆盖);观察来源是投影变更事件(面板关闭时也会记录)与桥请求时的实时折叠。因此重启后「今日 · 全部会话」不再退化为“已加载会话”,切换工作区也不会变化;只有从未在本机被观察过的会话会缺失(运行期间随交互逐步补齐)。非回环浏览器(远程访问)取不到桥时,回退为「当前会话 + 会话列表投影缓存」的本地估算。 - 各供应商用量:按 provider/model 路由归因的累计用量(本插件自带的
contextUsage会话投影,主机侧对 durable 日志折叠),每次请求的 usage 归入当时生效的路由,同一步的重复样本按最后一次替换。
单价在哪里配置
推荐:Web 设置页的插件配置。打开 DSH Web 的「设置」面板,进入 插件 → 插件配置,找到最后一张卡片 「上下文占用 · 单价配置」(默认收起,点击标题行展开),可直接编辑:
- 币种(CNY / USD / CNH / EUR / GBP / JPY);
- 是否启用峰谷计价(启用后显示高峰时段与时区输入);
- 默认价(未配置供应商的兜底价);
- 供应商单价与模型级覆盖(
provider/model),每个条目一张 闲时/高峰 表; - 「保存」即时生效(主机投影按新 spec 重新计价,无需重启);「恢复默认」清空用户层回退到 bundle 默认值。
rc.6 宿主说明:0.1.0-rc.6 的 host-apiproxy 只放行硬编码的官方设置命名空间,第三方命名空间会被 RPC 层拒绝。因此本插件在主机侧额外注册了一对仅回环、仅 POST 的桥路由
/api/dsh-context-show/settings/describe|mutate,直接走宿主 settings seam(保留官方校验、版本冲突、持久化与事件),客户端在官方 scope 报 unavailable 时自动回退到该桥。宿主升级后若 apiproxy 已放行第三方命名空间,官方 scope 自动保持主路径,桥不会启用。
也可以直接编辑 patch 配置(从上到下优先级递增,后一层整段覆盖前一层的同一行 config):
- 插件默认值:
dsh-context-show/cordis.patch.yml(随插件分发)。 - profile 用户层:
$DSH_HOME/profiles/web/cordis.patch.yml(已预置一份当前峰谷价格配置)。 $DSH_HOME/cordis.patch.yml与命令行--patch。
当前默认价格
依据 https://api-docs.deepseek.com/zh-cn/quick_start/pricing/ ,DeepSeek 采用峰谷计价(人民币 / 每百万 token):高峰时段为北京时间周一至周五 9:00–12:00、14:00–18:00,周末与其余时段为闲时;闲时 = 高峰价的一半。
| 模型 | 时段 | 缓存命中 | 缓存未命中 | 输出 |
|---|---|---|---|---|
| deepseek-flash(V4.1-Flash) | 闲时 | ¥0.02 | ¥1 | ¥4 |
| deepseek-flash(V4.1-Flash) | 高峰 | ¥0.04 | ¥2 | ¥8 |
| deepseek-v4-pro | 闲时 | ¥0.15 | ¥4.5 | ¥13.5 |
| deepseek-v4-pro | 高峰 | ¥0.30 | ¥9.0 | ¥27.0 |
| deepseek-v4-flash / deepseek-v4-flash-vision-exp(旧名,按 Flash 计费) | 闲时 | ¥0.02 | ¥1 | ¥4 |
| deepseek-v4-flash / deepseek-v4-flash-vision-exp(旧名,按 Flash 计费) | 高峰 | ¥0.04 | ¥2 | ¥8 |
2026-09 起 DeepSeek 调整了 Flash 档价格(缓存命中/未命中/输出全面下调,Pro 档未变),模型主名改为
deepseek-flash;旧名deepseek-v4-flash、deepseek-v4-flash-vision-exp仍可调用并按 Flash 价计费。缓存写入按缓存未命中价计。
本插件默认已启用峰谷计价(peakHours: 9–12 / 14–18,timeZone: Asia/Shanghai,且周末自动按闲时),并预置上述闲时/高峰两套价格(base = 闲时,peak = 高峰)。价格后续调整直接在设置页改数字即可;若想改回平价,在设置页关闭「启用峰谷计价」或把 peakHours 清空。
面板交互
- 持久显示:展开后不会因失焦 / 点击外部收起,只有再次点击按钮或按 Escape 关闭。
- 可拖动:按住面板左上角的抓手(⠿)可把面板拖到任意位置,松手后保持(拖动后为 fixed 定位,仅关闭再打开会回到锚点)。
- 省略版 / 详细版:面板头部 ▾/▴ 切换。省略版只显示上下文占用与总花费;详细版显示来源构成、工具占用表格、各模型花费(含官方价格链接与分时计价说明)、Token 用量。
所有数值均通过会话投影推送实时更新(useProjection),对话快照变化时工具列表同步刷新。
安装
# 从本地路径安装到 web profile(推荐,与 dsh-agent-teams 相同的 link: 方式)
dsh plugin --profile web add "C:\path\to\dsh-context-show"
# 或从 npm / Git 安装
dsh plugin --profile web add dsh-context-show
dsh plugin --profile web add github:<owner>/<repo>
安装后重启目标 profile(host 插件与 client bundle 都要求重启;仅 bundle 内容变化才支持 client HMR)。设置页保存的价格修改走 settings seam,保存后即时生效,无需重启。
疑难排查:若 pnpm 报
ERR_PNPM_UNEXPECTED_STORE(本机 store 路径与 profile 不一致),给 add 追加--store-dir=<你的 pnpm store>(可用pnpm store path查询)。本机示例:--store-dir=C:\path\to\pnpm-store\v11。
依赖:@deepseek-ai/dsh-token-meter 的 tokenUsage / contextPressure / contextBreakdown 投影、@deepseek-ai/dsh-settings(dsh-base bundle 已内置),以及 host 侧的 webServer 服务(桥路由用,dsh-base / web 组合已提供)。缺少本插件主机半时,面板自动降级为仅展示 token-meter 已有的投影;缺少 token-meter 时面板显示空态。
开发
pnpm install
pnpm typecheck # host + client 双 tsc program
pnpm test # vitest:usage-fold 重放语义 + 分时计价 + 金额计算 + 快照估价 + 工具聚合 + 格式化
pnpm build # tsc 双 program + tsdown 产出 lib/client.js(ModuleLoader 包裹)
pnpm verify # typecheck + test + build
构建产物 lib/ 直接可被 profile 以 path/link 方式加载(无需 install 脚本)。
架构
src/index.ts—— host 插件入口:inject = ['sessionProjections'](必需服务)+ Config(币种 + 分时时段 + 价格表 + 官方价格链接,schemastery schema)+ 通过ctx.inject(['settings'])走ctx.settings.installSection(...)注册context-show设置命名空间(设置页读写 + 改后热重注册投影;0.1.3-alpha.1 起设置注册是 provider 方法)+ 直接ctx.sessionProjections.register(...)注册带定价 spec 的contextUsage投影单元(改价时 dispose 旧单元再注册新 spec,重新折叠计价)+ 维护持久花费账本($DSH_HOME/storages/dsh-context-show/spend-ledger.json:投影变更订阅 + 桥请求时折叠 → 1s 防抖原子写、卸载 flush)+ 挂载 loopback 桥(settings describe/mutate、models、spend)。src/usage-fold.ts—— 纯函数折叠:request/header与request/context记录当前路由与请求时刻,assistant/message与assistant/attempt结算事件(优先usage字段、否则取内嵌 stream 的最后一个 usage chunk)按请求时刻归入高峰 / 闲时桶并归因到当时路由;llm/retry-started关闭同一步替换槽,重试的 attempt 累加而不覆盖;event.seq < inheritedEventCount的 fork / 延续继承前缀直接跳过(祖先已付费);状态为纯 JSON(经stateSchema校验,stateVersion5),按provider\0model建表 + 首次使用顺序,每 provider 一个 last-sample 槽做同一步替换(跨档位不重复计费),并按「日 × 路由」分桶(days)供今日金额;金额、币种、时段与官方价格链接在wire.view()阶段计算,不进入折叠状态;通过 module augmentation 把contextUsage折叠态并进SessionProjectionStateMap。src/projection.ts—— 共享类型 +SessionProjectionMap(客户端 wire 视图)表 merge;src/usage-fold.ts另 augmentSessionProjectionStateMap(主机折叠态)。host 注册、clientuseProjection('contextUsage')共用同一 wire 类型表。src/bridge.ts—— host 侧 loopback 桥(仅回环、仅 POST):设置/api/dsh-context-show/settings/describe|mutate(直连 settings seam、镜像官方错误码)、模型目录/settings/models、跨会话花费/settings/spend(返回账本聚合快照)。src/bridge-protocol.ts—— host / client 共享的桥线协议类型(纯类型 + 前缀常量,双 tsc program 共用)。src/spend.ts—— 跨会话花费聚合:把每会话样本按「日 + 工作目录(cwd)+ 路由」折成面板快照(今日、累计、按模型明细)。src/spend-ledger.ts—— 持久账本:容错解析、按会话幂等覆盖、临时文件 + rename 原子写、1s 防抖与卸载 flush;路径由官方dshHomePath()解析。src/spend-protocol.ts—— host / client 共享的花费快照类型(纯类型;client 侧只import type,不把 host 代码带进 bundle)。src/client/price-input.ts—— 价格单元格的十进制解析(允许0.、.5等输入中间态,非法文本忽略并保留上一个有效值)。src/client/index.ts—— 浏览器半:locale 注册 +conversation.session.header.utilities槽注册(面板)+settings.plugin.item槽注册(插件配置卡片,order: 1000排在最后)。src/client/bridge-scope.ts—— rc.6 兼容 settings scope:官方 scope 为主,报 unavailable 且浏览器为回环时回退到桥控制器(串行队列 + revision 栅栏 + 失败重读)。src/client/ContextShowMeter.tsx—— 触发器 + 可拖动持久面板(抓手 pointer 拖拽、fixed 定位、省略/详细两态、Escape / 按钮关闭,aria-*,focus-visible)。src/client/ContextShowSettings.tsx—— 插件配置卡片:默认收起的可折叠外壳(对齐官方 PluginCard 样式),展开后编辑币种、峰谷开关与时段、默认价 / 供应商价 / 模型级覆盖(闲时+高峰双列表格)、保存 / 恢复默认。src/client/estimate.ts—— 客户端快照估价(与 token-meter 固定密度启发式同口径)+ 按工具名聚合。src/client/formats.ts—— token 紧凑格式 + 币种感知金额格式(CNY/USD/EUR/…)。cordis.patch.yml—— bundle 层:context-show行插入配置树,含当前峰谷默认价格表与官方价格链接。
验证
pnpm verify 覆盖:双 tsc 类型检查、usage-fold 的重放确定性 / 路由归因 / 同一步替换(含跨高峰档位替换)/ 未归属桶 / 缓存桶 / 分时与平价金额计算 / 默认价回退 / 币种与官方价格链接 / 高峰时段判定(含跨午夜与北京时区)、快照估价与工具聚合、token/金额格式化。
其中 test/cost.test.ts 用官方价手算核对金额(四桶、峰谷、替换、跨日一致性)、test/spend.test.ts 与 test/spend-ledger.test.ts 覆盖跨会话聚合与账本「序列化 → 重读」往返、test/price-input.test.ts 覆盖价格输入解析(0./.5/非法文本)。
另外:
node test/smoke-built.mjs/test/smoke-config.mjs/test/smoke-real-log.mjs校验构建产物、patch 配置与真实日志折叠;- 桥路由用假 settings seam 验证 describe / mutate / unset / 非回环 403;
- 无头浏览器(Playwright)验证:设置 → 插件 → 插件配置 中卡片位于最后、默认收起、点击展开显示表单、卡片背景色与官方卡片一致,且控制台无崩溃。