DeepSeek Harness(DSH)仪表盘 UI 插件。
以可视化方式展示当前会话的上下文占用、Token 用量与费用估算、DeepSeek 账户余额、会话统计、目标、待办、后台任务与工作区信息,支持两种展示形态:
- 右侧栏:占据 shell 内置的
details槽位(右侧第三栏,同官方ui-sidebar占据sidebar的方式),通过会话头部工具区的「仪表盘」按钮打开; - 会话标签页:注册进
conversation.view槽位(加法席位),与内置「对话」「轨迹」标签并列,点击「仪表盘」标签整页查看。
| 卡片 | 内容 | 数据来源 |
|---|---|---|
| 上下文 | 左:粗圆环(14px 描边,按系统提示/工具/消息三色分段,百分比内嵌环心);右:组成列表 + 比例条 | contextPressure / contextBreakdown 投影 |
| 用量 · 费用 · 统计(融合版块) | KPI 汇总格(轮次/步骤/总 Token/费用 ¥)→ 金额占比单条图 → 行内 token · 金额 → 合计 → 统计徽章(模型/工具耗时、平均首字延迟、生成速度) |
tokenUsage / sessionStats 投影 + Host 模型选择 |
| 余额/用量 | 跟随当前 provider:DeepSeek 官方显示金额(币种总额 + 充值/赠送);OpenCode Go 显示套餐用量(rolling/weekly/monthly 已用百分比 + 重置时间);带手动刷新按钮 | Host RPC balance(按 provider 路由分发到官方 API:DeepSeek / OpenCode Go) |
| 目标 | 目标文(两行截断)+ 阶段 + 轮次进度条 | goal 投影 |
| 待办 | 完成进度条 + 状态圆点列表 + 汇总 | todos 投影 |
| 后台任务 | 状态计数徽章 + 任务列表 | useSessions().jobsBySession |
| 工作区 | 标题 + 路径 | useWorkspaces 反查 |
费用估算:按 官方定价页 的 V4 系列高峰时段价(deepseek-v4-flash:未命中 ¥3 / 命中 ¥0.1 / 输出 ¥9 每百万 tokens;deepseek-v4-pro:¥9 / ¥0.3 / ¥27;空闲时段约为一半),
基于 tokenUsage 投影分三桶计算:输入(未命中缓存)(含缓存写入,按未命中价)/ 输入(命中缓存) / 输出;当前模型由 Host 半边通过 RPC current-model 读取默认模型选择。仅为估算,可能与实际账单不符。
右栏顶部提供「仪表盘 / 文件树」两个标签页。文件树页懒加载当前工作区(WorkspaceView.path 根目录)
的完整目录树(含文件,Host 经 fs 服务列出;目录点击展开、子目录按需加载),可切换显示隐藏项。
费用版块底部展示官方 tokenizer 离线统计:Host 读取会话日志全部 user/assistant 消息文本,用官方
deepseek_tokenizer(本机 Python + tokenizers 库)批量编码,
汇总输入/输出 token(LRU 缓存避免重复计算)。不含缓存命中,与账单口径不同,仅供参考。
- 默认 tokenizer 目录:
E:\Dsh\deepseek_v3_tokenizer\deepseek_v3_tokenizer(官方 zip 解压处) - 配套脚本:
scripts/deepseek_tokenize.py(stdin 收{"texts":[…]},stdout 输出[count,…]) - 本机需安装:
python -m pip install tokenizers - 目录/脚本可用插件配置覆盖:
config.tokenizer.dir/config.tokenizer.script
卡片跟随当前默认模型的 provider 路由(agentDefaultModel.currentSelection()),
按 provider 分发到对应官方 API。三种形态:
money(金额):币种总额 + 充值/赠送明细 —— DeepSeek、Moonshot(Kimi)usage(用量百分比窗口):rolling(5h)/weekly/monthly + 重置时间 —— OpenCode Gocredits(预付费余额):总量 / 已用 / 剩余 —— OpenRouter
内置映射(用该 provider 自己的 API key 即可直查):
| provider 路由 | 形态 | 数据来源 |
|---|---|---|
deepseek-official |
money | GET https://api.deepseek.com/user/balance(官方文档) |
opencode-go |
usage | GET https://opencode.ai/zen/go/v1/usage |
openrouter |
credits | GET https://openrouter.ai/api/v1/credits(文档) |
moonshotai-cn |
money | GET https://api.moonshot.cn/v1/users/me/balance(Kimi 余额文档) |
有端点但需实测/自行配置(未内置):
kimi-coding:标准余额端点与moonshotai-cn相同(api.moonshot.cn/v1/users/me/balance,用KIMI_API_KEY);Coding 套餐剩余量无公开 API;xiaomi:社区端点GET https://api.mimogateway.com/v1/users/me/balance(官方未显式文档化,需实测后按balance.providers配置);fireworks:官方GET /v1/accounts/{account_id}/billing/summary(文档)端点含 account_id,需先拿到账户 id 再配置。
未内置/不支持的 provider(完整调研见 docs/providers.md):
-
有官方端点但需额外凭据(企业/云计费):
openai(org admin key)、anthropic(Admin key)、github-copilot(仅企业管理员)、vercel-ai-gateway/cloudflare-ai-gateway/cloudflare-workers-ai(需平台 token,无"余额"概念)、amazon-bedrock(AWS Cost Explorer,需 IAM)、qwen-token-plan(阿里云 BSS 云账户余额,非套餐)、mistral(org 级/v1/admin/*,官方 SDK 未发布)、xai(management-api.x.aiprepaid/balance,需 Management Key)—— 可在balance.providers里自行配置; -
无公开余额/用量 API(仅控制台):
google、google-vertex、azure-openai-responses、together、groq、cerebras、nvidia、huggingface(whoami 无 credits)、opencode、ant-ling、qwen-token-plan-cn、xiaomi-token-plan-ams、minimax、minimax-cn、moonshotai(国际站域名待实测)。 -
未在映射中的路由 → 卡片明确提示"provider 无可用余额/用量来源";
-
未配置对应 key → 提示"未配置 {keyRef}"。
-
API key 只在 harness 进程内解析(credentials 服务),不会下发到浏览器。
自定义来源:可在插件配置中声明 balance.providers(持久安装版在 profile 的
cordis.patch.yml 条目里加 config):
- insert:
- id: ui-dashboard
name: ui-dashboard
config:
balance:
providers:
my-route: # provider 路由名
kind: credits # money | usage | credits
shape: openrouter # deepseek | moonshot | opencode | openrouter(缺省按 kind 推断)
keyRef: MY_API_KEY # credentials 中的 key 引用
baseUrl: https://api.example.com
path: /credits # 默认:money → /user/balance,usage → /usage,credits → /creditskind: money期望返回balance_infos[](DeepSeek 同构)或 Moonshot 式顶层available_balance等字段(shape: moonshot);kind: usage期望返回usage.{rolling,weekly,monthly}.{status,percent,resetsAt}(OpenCode Go 同构);kind: credits期望返回total_credits/total_usage(OpenRouter 同构,兼容credits/balance/usage等字段名)。
三种方式任选。方式一最省事且热生效(无需重启);方式二是 DSH 官方插件管理路径;方式三是内存态动态插件。
git clone https://github.com/Plocr/ui-dashboard.git
cd ui-dashboard
node scripts/install.mjs # 默认安装到 desktop profile
node scripts/install.mjs --profile=web # 指定 profile脚本会把 package.json + lib/(已构建的持久插件双半)复制到
$DSH_HOME/profiles/<profile>/node_modules/ui-dashboard/,并在该 profile 的
cordis.patch.yml 中幂等插入插件条目(cordis.patch.yml 被 DSH 热监听,通常立即生效)。
然后刷新 DSH 页面(未热生效就重启 app),打开任意会话即可看到入口。
仓库同时是合规的 DSH bundle(package.json 声明 dsh.bundle.patch),可用官方命令安装:
# 需要 pnpm(dsh plugin 会在 profile 目录转发给 pnpm)
dsh plugin --profile desktop add git+https://github.com/Plocr/ui-dashboard.gitlib/ 已随仓库提交、安装无需构建(无需 allowBuilds)。完成后重启 app(bundle 层在启动时解析),
插件会作为 profile 层自动加载。卸载:dsh plugin --profile desktop remove ui-dashboard。
在 DSH 会话中用 Cordis 动态插件机制加载:
- 用
cordis_define定义插件(idPrefix建议udash):src/client.js内容作为code.client、src/host.js内容作为code.host; cordis_run激活(首次需在界面批准);- 打开任意会话 → 会话头部「仪表盘」按钮 / 会话标签「仪表盘」。
动态包只存在于共享 DSH 进程内存,cordis_stop/cordis_undefine 或重启后消失;要保留请用方式一或二。
打开任意会话 → 点会话头部工具区「仪表盘」按钮(右侧栏展开仪表盘),或点会话标签栏的「仪表盘」标签(整页查看)。 右上角 × 关闭右侧栏。
src/client.js:Client 半边源码(动态插件函数体,无 JSX/TS)。注册:details槽位(single / session 作用域)→ 右侧栏仪表盘主体DashboardPanelconversation.view槽位(list,加法席位,id:dashboard,order: 20)→ 会话标签页「仪表盘」conversation.session.header.utilities槽位(list,加法席位,id:dashboard)→ 「仪表盘」入口按钮- 包级样式经
styles.insert()注入(udash-前缀类名,随插件卸载自动清理) - 中英文文案经
ctx.locale.register('dashboard', { zh, en })
src/host.js:Host 半边源码(动态形式,harness.handle('current-model'))。lib/:持久插件构建产物(随仓库提交)。lib/client.js由build-client.js从src/client.js生成 (__ModuleLoader__包装、require('react')、styles/host替身、details注册补priority: -100遮蔽内置面板);lib/index.js是持久 Host 半边(ctx.connection.rpc.handle('/rpc')提供current-model)。scripts/install.mjs:一键安装脚本(方式一)。bundle.patch.yml:bundle 层 patch(方式二)。
改动 src/client.js 后运行 node build-client.js 重新生成 lib/client.js。
- 方式一安装:删除
<profile>/cordis.patch.yml里的- insert: … ui-dashboard …块,并删除<profile>/node_modules/ui-dashboard/; - 方式二安装:
dsh plugin --profile <profile> remove ui-dashboard。
- 依赖 DSH 官方 Client 槽位与投影接口(
details、conversation.view、conversation.session.header.utilities、contextPressure、contextBreakdown、tokenUsage、sessionStats、goal、todos、jobsBySession),随 DSH 版本演进可能需要适配。 - 占据
details槽位会替换内置的「工具调用详情」面板(官方标注 replaceRisk: shadows-shipped-ui),当前版本未内嵌conversation.details.tool子席位。
MIT