dsh-ui-billing
Verified@huanghanheng/dsh-ui-billing · v0.2.5 · MIT · Web UI
Billing widget for the DeepSeek Harness Web GUI: whole-log session cost projection and API balance at the sidebar foot
Install
dsh plugin add @huanghanheng/dsh-ui-billing Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Creators
Readme
dsh-ui-billing
DeepSeek Harness Web GUI 的计费控件插件:侧边栏底部(sidebar.footer.action)的一个条目,显示当前展示对话的费用——来自本插件注册的 billing 会话投影——以及 provider 账户余额——来自节点半端的 /api/billing.balance 端点。
GitHub 话题:dsh-plugin · deepseek-harness
功能
- 当前会话费用。节点半端把每条
assistant/message的 usage 记录折叠进billing会话投影(整篇日志的 CNY 费用与未计价 token 数),按组合加载时捕获的价格表计价;宽侧边栏渲染一行带标签的数值显示当前展示对话的金额。切换会话即切换数值;分页与压缩不会改变它。含未计价 token 的会话在金额上显示(+N tokens unpriced)提示。 - 实时 API 余额。余额行通过 harness 自身的 provider 事实(
llm-deepseek条目的实时配置 + 启动环境 + 凭据通道)读取 provider 账户,挂载期间每 60 秒刷新一次,连接重置后重读,也可通过行内刷新按钮手动刷新。这些事实给出的是 Messages 聊天根,因此余额读取取该/anthropic挂载之上的平台根,/user/balance在那里应答。 - 折叠轨道字形。侧边栏折叠时只渲染一个 ¥ 字形,提示气泡携带两行内容;点击即刷新余额。
- 默认空闲。没有订阅者挂载时不发起任何请求——余额轮询随第一个订阅者启动、随最后一个离开停止。
计价
费用折叠按每条 usage 步骤的 source.model 对照插件的默认 CNY/百万 token 价格表计价。V4 目录为官方现行价目表,已含 2026-09-10 的 flash 系列调价(缓存未命中 / 缓存读取 / 输出,均为空闲时段单价;官方高峰时段为北京时间周一至周五 09:00-12:00、14:00-18:00,各字段翻倍):
| 模型 | 输入(缓存未命中) | 缓存读取 | 输出 |
|---|---|---|---|
deepseek-flash |
1 | 0.02 | 4 |
deepseek-v4-flash |
1 | 0.02 | 4 |
deepseek-v4-pro |
4.5 | 0.15 | 13.5 |
deepseek-v4-flash-vision-exp |
1 | 0.02 | 4 |
deepseek-chat / deepseek-reasoner 保留 V3 时代锚点(2/0.5/8 与 4/1/16)以覆盖旧 usage 记录;现行 API 目录只有 V4 模型。deepseek-flash 是当前模型 ID(DeepSeek-V4.1-Flash),已下线的旧名 deepseek-v4-flash / deepseek-v4-flash-vision-exp 请求仍由该模型承接、按 Flash 价计费。没有价格条目的模型,其 token 计入 unpricedTokens 而不是假装免费,这样 GUI 可以放心显示"费用"而无需假装未知定价的模型免费。峰谷计价默认开启:peakHours 默认是官方高峰窗口 [[540, 720], [840, 1080]](价格时钟零点起算的分钟),utcOffsetMinutes 默认 480(北京时间);时间窗模型无法排除周末,需要精确周末空闲价时清空 peakHours 或自行覆盖。价格是部署方的责任,必须跟随 provider 的现行价目表——用插件 config.prices 整体覆盖默认表:
- id: ui-billing
name: '@huanghanheng/dsh-ui-billing'
config:
prices:
'deepseek-v4-pro':
offPeak: { inputPerM: 4.5, cacheReadPerM: 0.15, outputPerM: 13.5 }
peak: { inputPerM: 9, cacheReadPerM: 0.3, outputPerM: 27 }
peakHours: [[540, 720], [840, 1080]]
utcOffsetMinutes: 480
投影的 stateVersion 在折叠语义或默认价格表变化时升版,因此 harness 投影缓存会丢弃旧价格表折叠的行并整篇重算——历史对话总是按当前价格表一致地重计价。
安全
- 纯展示。控件只渲染会话投影或 provider 账户里已有的数据。它不产生任何模型可见输入、不写会话日志,除节点半端在 harness 连接传输层注册的只读
/api/billing.balance端点(其 Host/Origin 信任栅栏默认只放行 loopback)外不新增任何 RPC。 - 模型体验:不进入任何模型请求;Token 影响无;KV 缓存影响无。
- 凭据留在宿主侧。API key 由宿主半端通过 harness 的凭据服务或启动环境解析——与 DeepSeek provider 适配器同一通道——绝不进入浏览器包。
前置要求
- DeepSeek Harness 检出(或已发布的
@deepseek-ai/dsh-*包)为0.2.1-alpha.1或更新版本,并运行 web profile。 - 投影注册表已组合:费用行读取节点半端注册的
billing投影,需要 harness 的会话投影缝(@deepseek-ai/dsh-session-projection,随 web-app bundle 提供)。没有它插件仍可加载、余额行照常工作;费用行显示—。 - DeepSeek API key:通过 harness 的凭据服务配置(web Models 页写入)或在启动环境中导出,即
DEEPSEEK_API_KEY(DeepSeek API-key provider 条目的默认 key 引用)。 - 无需宿主插桩:控件注册的
sidebar.footer.action座位随已发布的@deepseek-ai/dsh-client-ui-sidebar提供。
安装
插件像其他 DSH bundle 一样安装进 web profile;无需对 harness 检出做任何源码修改。
方式一——通过 dsh plugin 的 bundle 安装(推荐)
本仓库是一个 DSH bundle:package.json 声明了 dsh.bundle.patch → ./cordis.patch.yml,因此 profile 插件管理器会把它作为补丁层安装,补丁会把插件插入 web profile 的浏览器花名册。
# 直接从 git 仓库安装(无需发版 npm):
dsh plugin --profile web add @huanghanheng/dsh-ui-billing
# 或发布到 npm 后(更短的 spec):
dsh plugin --profile web add @huanghanheng/dsh-ui-billing
dsh plugin 在 profile 目录里执行 pnpm add,并自动对账 dsh.profile.bundles:manifest 声明了 dsh.bundle.patch 的依赖会自动加入层栈。
方式二——手动 npm 安装
包发布到 npm,且构建产物(lib/)已提交,因此可以像普通包一样安装:
# 在应用运行的 profile 目录(或应用本身)里:
npm install @huanghanheng/dsh-ui-billing
# 或:pnpm add @huanghanheng/dsh-ui-billing
手动 npm install 不会自动加入 bundle 层——需要在 profile manifest 里声明,补丁才会插入插件行:
// $DSH_HOME/profiles/web/package.json
{
"dependencies": { "@huanghanheng/dsh-ui-billing": "^0.2.0" },
"dsh": { "profile": { "bundles": ["@huanghanheng/dsh-ui-billing"] } }
}
或者直接运行 dsh plugin --profile web add @huanghanheng/dsh-ui-billing,它会替你完成安装与 bundle 层对账(等价于方式一)。
Model Experience
模型看到什么
无。控件只读取 billing 投影与 /api/billing.balance 端点——两者都是只读展示面,数据已在会话日志或 provider 账户中。
Token 影响
无。
KV Cache 影响
无。
开发
pnpm install
pnpm test # vitest:节点半端 + host 测试(投影折叠、余额读取、注册)
pnpm exec tsc -p tsconfig.json # 类型检查浏览器半端 + 客户端测试
pnpm exec tsc -p tsconfig.host.json # 类型检查节点半端 + host 测试
pnpm build # tsc 产出 lib/types + tsdown 打包节点半端
仓库针对已发布的 @deepseek-ai/dsh-* 包编译 src/;类型层面的 @deepseek-ai/dsh-billing/client 导入由 types/dsh-billing/client.d.ts 镜像提供(该投影的 wire 视图由本插件自己拥有)。两个半端作为两个独立程序分别做类型检查,与 harness 的 host/client 项目拆分一致。pnpm build 只覆盖节点半端;浏览器半端以随包提交的 lib/client.js 交付,需在 harness 检出中用 harness 的 clientBundle 预设构建。组件测试内联已发布的 @deepseek-ai/dsh-client-ui-primitives bundle,因此该 bundle 导入的 Markdown、语法高亮与微解析包,以及它导入或再导出的图标、workspace-path、code-language 与 store 包(simple-icons、@deepseek-ai/dsh-util-workspace-path、@deepseek-ai/dsh-util-code-language,以及经由共享 store 的 zustand / immer)都在本仓库以 devDependencies 声明——上游已把它们列为仅开发依赖,运行期由 harness 应用提供。测试覆盖投影折叠(计价辅助、峰谷窗口、未计价模型、注册接线)、余额读取(HTTP 归一化、凭据解析)、响应式源及其接缝(投影跟随、展示迁移、轮询生命周期)、组件(两行、刷新、轨道字形),以及节点半端在真实 cordis 上下文上的注册与释放。浏览器半端的完整上下文注册测试保留在 harness 检出中:已发布的客户端包是 ModuleLoader 注册形态,普通 vitest 导入无法加载 renderer 的槽位服务。
Known Limitations and Deferred Work
- 未指定 provider 时余额行显示第一个 provider 路由的余额(默认
deepseek-official);多 provider 部署暂不能从控件选择路由(通道已接受provider,未来的选择器只是纯客户端改动)。 - 默认价格表是官方现行 V4 价目表的静态快照(含北京工作日峰谷窗口)。provider 改价后,部署方必须用
config.prices覆盖——请对照 provider 现行价目表核对。 - 不单独建模 provider 的 reasoning 附加费:适配器报告的
outputTokens已包含 reasoning token,因此只对四个计费字段计价。
许可
MIT