dsh-doctor
asdf17128
Find what your DeepSeek Harness (dsh) patches silently broke — dead patches, config fields dropped by whole-config repla…
PROJECT TOPICS
PROJECT README
DeepSeek 用量 / 成本 / 余额仪表盘 · DSH Web 插件
English · 问题反馈 · 更新日志(中文) · Changelog (EN)
界面预览:左侧为浅色英文界面,右侧为深色简体中文界面。两者均会跟随 DSH 的主题与语言设置。
![]() 浅色主题 · English |
![]() 深色主题 · 简体中文 |
图片仅使用虚构演示数据:不含真实会话内容、Token、成本、余额或 API Key。
在 DeepSeek Harness Web UI 的输入框下方实时显示 token 用量、成本估算、模型与账户余额;点击展开用量可视化图表面板(参考 DeepSeek 开发者平台的用量页组织方式),全部使用零依赖 SVG 自绘,不引入任何图表库。成本支持 USD / CNY 多币种显示与实时汇率刷新(v0.3)。
▸ 输入 12.4M · 输出 86.2K · 缓存 72% · 成本 ≈$0.042 / ≈¥0.284 · demo-model · 余额 --
点击 ▸ 展开面板:
tokenUsage / contextPressure 投影)pricing.json;未定价模型显式标记「未定价模型」contextPressure / contextWindow),随占用升高由绿转红GET /user/balance 接口实时查询(经宿主侧代理,密钥不暴露给浏览器)zh / en| 数据 | 来源 | 准确性 |
|---|---|---|
| token 用量 | DSH 官方 adapter 上报的会话投影(tokenUsage / contextPressure) |
✅ 官方真实数据,实时更新 |
| 成本 | 官方刊例价(内置表 + 可选用户覆盖 pricing.json)× adapter 上报用量 |
⚠️ 估算值,非官方账单;价格经宿主 /pricing 单点解析 |
| 成本币种 / 汇率 | 宿主 /meta 下发配置 + /rate 实时汇率代理(多源回退、上次汇率持久化) |
✅ 实时汇率(不可达时回退内置源/上次成功值) |
| 轮次明细 | 宿主会话日志折叠(/usage):耗时 / TTFT / TPS / 模型归因 / 结束原因 / 每轮成本 |
✅ 官方事件流折叠 |
| 余额 | 官方 GET https://api.deepseek.com/user/balance |
✅ 官方实时数据 |
| 模型名 | adapter 上报的请求 provenance / request/context |
✅ 官方真实数据 |
window.__ModuleLoader__.load({id, factory}) 工厂包,外部依赖与 DSH web 的 PLATFORM_MODULES 完全一致)前置要求:DSH ≥ 0.1.0-rc.6 · Node.js ≥ 20 · PATH 上有 pnpm(dsh plugin 会把安装命令转发给 pnpm)。
若提示
dsh: command not found(或 PowerShell无法将“dsh”项识别为…),说明只通过npx @deepseek-ai/dsh临时运行过、未安装全局命令——按 FAQ 第一条解决 (全局安装后重开终端,或每条dsh ...前加npx --yes @deepseek-ai/dsh)。
dsh plugin --profile web add dsh-usage-chart # 安装并自动登记为 profile 插件层
dsh web --profile web # 启动 DSH Web(已在运行时先停止再启动)
更新(升级到新版本):pnpm 对已安装的依赖重新 add 可能显示 Already up to date
而不升级,请用显式版本(推荐)或先卸载再安装:
# 方式①:显式指定目标版本
dsh plugin --profile web add dsh-usage-chart@0.3.0
# 方式②:先移除再重装(回到最新版)
dsh plugin --profile web remove dsh-usage-chart
dsh plugin --profile web add dsh-usage-chart
完成后重启 DSH Web。
⚠️ 升级后必须重启
dsh web进程:宿主在启动时缓存插件代码(无热重载), 新路由(如/pricing、/meta、/rate)只有重启后才生效。详见 更新日志。
⚠️ 未全局安装 dsh(报
dsh: command not found/ PowerShell无法将“dsh”项识别为…)? 把上面每条dsh都写成npx --yes @deepseek-ai/dsh,例如npx --yes @deepseek-ai/dsh plugin --profile web add dsh-usage-chart@0.3.0(原因与解法见 FAQ 第一条)。
dsh plugin --profile web add github:Max-Samson/dsh-usage-chart#<commit-sha>
Git 安装会执行包的 prepare 脚本(node build.mjs)从源码构建。pnpm ≥ 10 首次会拒绝运行
prepare,需要在 profile 的 pnpm-workspace.yaml 中放行:
allowBuilds:
dsh-usage-chart: true
放行意味着允许该包源码在安装时于本机执行,请只对可信来源这么做,并固定 commit (
github:Max-Samson/dsh-usage-chart#<sha>)。
git clone https://github.com/Max-Samson/dsh-usage-chart.git
cd dsh-usage-chart
npm ci && npm run build
dsh plugin --profile web add "$PWD" # 以链接方式安装当前目录
dsh web --profile web
组合配置中应出现插件行:
dsh --profile web --dump-config | grep -A4 'id: dsh-usage-chart'
打开 DSH Web,进入任意已有会话:输入框下方应出现「用量」指示器(含 token/成本/模型),
右侧为余额;点击 ▸ 展开可视化面板。未配置 API Key 时余额显示 –,面板内会提示配置方式。
余额查询需要 DeepSeek API Key,按以下优先级解析(每次请求实时解析,改后无需重启):
.credentials.yaml 用户层),
无需额外操作;dsh web 前导出 DEEPSEEK_API_KEY=sk-...(凭据服务的 env 层,同样生效);cordis.patch.yml 中覆盖(Key 会以明文落盘,仅建议用于受保护的本机 profile):- insert:
- id: dsh-usage-chart
name: dsh-usage-chart
config:
apiKey: 'sk-...' # 留空则回退到网页端/环境变量
baseUrl: 'https://api.deepseek.com'
# pricingFile: '/path/to/pricing.json' # 可选:价格覆盖文件(默认 $DSH_HOME/data/dsh-usage-chart/pricing.json)
# currency: 'cny' # 可选(v0.3):成本显示币种 'usd'(默认)| 'cny'
# cnyPerUsd: 6.76 # 可选(v0.3):cny 时使用的汇率(默认 6.76,可经界面「刷新汇率」实时更新)
# fxUrl: 'https://open.er-api.com/v6/latest/USD' # 可选(v0.3):自定义实时汇率源
插件版本 < 0.1.1 时不读取网页端密钥:请用环境变量或上面的
config.apiKey配置。
未配置 Key 时,指示器显示 余额 –,点击可重试;面板内会提示如何配置。
成本按「用户覆盖 > 内置刊例价 > 回退估算」解析(价格只在宿主解析,client 经
/dsh-usage-chart/pricing 快照消费,单一价格真相)。默认覆盖文件
$DSH_HOME/data/dsh-usage-chart/pricing.json(无 DSH_HOME 时 ~/.dsh/...),
支持两种形状,文件变更即时生效:
{
"deepseek-v4-flash": { "cacheMissInput": 0.14, "cacheHitInput": 0.0028, "output": 0.28, "verifiedAt": 1755100800000 }
}
或 { "models": { "<model>": { … } } }。verifiedAt(epoch 毫秒)可选,用于面板展示
核验日期;未收录的模型会在 UI 中显式标记「未定价模型」,不会静默按 0 计。
成本默认以 USD 显示,可在面板成本区一键切换 CNY(选择在浏览器记住)。CNY 显示使用
config.cnyPerUsd 汇率(默认 6.76),并可点击「刷新汇率」经宿主 /dsh-usage-chart/rate
代理拉取最新 USD→CNY 汇率立即重估:
config.fxUrl)不可达时自动回退内置备用源(frankfurter.dev);/dsh-usage-chart/meta 向 client 下发币种与汇率配置,价格注记跟随
显示币种并标注所用汇率。⚠️ 未全局安装 dsh(报
dsh: command not found/ PowerShell无法将“dsh”项识别为…)? 把下面每条dsh都写成npx --yes @deepseek-ai/dsh,例如npx --yes @deepseek-ai/dsh plugin --profile web remove dsh-usage-chart(原因与解法见 FAQ 第一条)。
dsh plugin --profile web remove dsh-usage-chart # 移除依赖并自动从 profile 插件层注销
dsh web --profile web # 重启后指示器/面板消失
remove 会同时清理 node_modules 中的包并把它从 dsh.profile.bundles 移除(无残留)。
彻底清理(按需):
cordis.patch.yml 中写过 config.apiKey/baseUrl 覆盖块,删除该段;allowBuilds,可移除 pnpm-workspace.yaml 中对应的 dsh-usage-chart 条目;~/.dsh/.credentials.yaml),
不要删除——DSH 自身的模型服务仍在使用该密钥;只有确定不再使用 DSH 的 DeepSeek 服务时才考虑移除。Q:dsh 命令找不到(command not found / PowerShell 无法将“dsh”项识别为…)?
A:npx @deepseek-ai/dsh 是临时运行、不产生全局命令。请 npm install -g @deepseek-ai/dsh
并重开终端(Windows 还需确保 npm config get prefix 目录在 PATH);或把每条 dsh ...
换成 npx --yes @deepseek-ai/dsh ...。pnpm 缺失同理:npm install -g pnpm。
Q:安装时提示 WARN missing peer react@^18.2.0?
A:正常且无害——react 由 DSH Web 平台在浏览器端内置,profile 无需安装。插件 ≥ 0.1.1
已把 react 标记为可选 peer,不再报警;0.1.0 的该警告可忽略。
Q:网页端配了 API Key,余额仍显示 – 或「未配置」?
A:请确认插件版本 ≥ 0.1.1(0.1.1 起余额查询才走 DSH 凭据服务读取网页端密钥);
升级后重启 dsh web。临时方案:先设环境变量 DEEPSEEK_API_KEY 或 config.apiKey。
Q:add 时报 dsh-usage-chart is not in the npm registry?
A:包尚未发布到 npm。请用「方式三:本地目录安装」测试,或等待维护者发布后重试。
git clone https://github.com/Max-Samson/dsh-usage-chart.git
cd dsh-usage-chart
npm ci
npm run verify # typecheck + build + node:test
npm pack --dry-run # 检查最终发布内容
本地自测安装见上文「方式三」;贡献前请阅读 CONTRIBUTING.md, 安全问题请按 SECURITY.md 私下报告。
scripts/ 下有基于 playwright-core 的探测脚本,针对已运行的 DSH Web(默认
http://127.0.0.1:3080,需要本机 Chrome/Chromium),通过环境变量与你的环境解耦:
| 环境变量 | 默认 | 说明 |
|---|---|---|
DSH_PROBE_URL |
http://127.0.0.1:3080 |
目标 DSH Web 地址 |
DSH_PROBE_CHROME |
平台常见位置 | Chrome/Chromium 可执行文件路径 |
DSH_PROBE_SESSION |
内置常用标题 | 目标会话标题片段(逗号分隔多个备选) |
DSH_PROBE_ARTIFACTS |
<仓库>/artifacts |
截图输出目录(已 gitignore) |
node scripts/shot.mjs # 收起/展开两张截图
node scripts/probe-panel.mjs # 面板是否被容器裁剪
node scripts/probe-popover.mjs # 悬浮面板边界与开合
node scripts/verify-render.mjs # 完整渲染验证(含明暗主题、中英文界面)
首次发布需要先在本地完成 npm 的账户验证并执行 npm publish --access public;包在 npm 上创建成功后,再为仓库配置 Trusted Publisher。之后创建 GitHub Release 即会由工作流发布新版本。工作流会检测版本是否已存在,因此补建 v0.1.0 Release 时不会重复发布。
package.json 与 CHANGELOG.md 版本一致并执行 npm run verify。v<version> GitHub Release。release.yml 通过 npm Trusted Publishing 发布带 provenance 的预构建包。dsh-plugin、dsh、deepseek-harness topics,供 Awesome DSH Plugin 自动发现。首次发布前,需要在 npm 包设置中把本仓库的 release.yml 配置为 Trusted Publisher,并在 GitHub 创建 npm environment。
dsh-usage-chart/
├── package.json # dsh.bundle(安装层)+ dsh.client(浏览器半区)+ exports["./client"]
├── cordis.patch.yml # 插件行插入(config.apiKey / baseUrl / pricingFile / currency…)
├── build.mjs # esbuild 双产物(+ client 纯模块测试束)+ tsc 类型声明(lib/types)
├── src/
│ ├── index.ts # host 半区:/balance 余额代理 + /usage 轮次折叠 + /pricing 价格快照
│ │ # + /meta 币种配置下发 + /rate 实时汇率代理(多源回退)
│ ├── pricing/
│ │ ├── calc.ts # 纯共享计算(成本分拆/多币种格式化;两个半区 bundle 同一份)
│ │ ├── source.ts # PricingSource 接缝:builtin 刊例价 + pricing.json 文件适配器
│ │ └── resolve.ts # PricingResolver:覆盖 > 内置 > 回退,未知模型显式标记
│ ├── usage/
│ │ └── rounds.ts # RoundFold:耗时/TTFT/TPS/模型归因/结束原因/每轮成本(纯函数)
│ └── client/
│ ├── index.ts # client 入口:注册 composer.dock + assistant-actions 槽位
│ ├── UsageIndicator.tsx # 输入框下方一行指示器(含上下文压力条)
│ ├── UsagePanel.tsx # 可视化面板(汇总 / 成本 / 每轮图表 / 余额)编排根
│ ├── charts.tsx # 零依赖 SVG/HTML 原语(堆叠条/图例)
│ ├── chart/RoundBars.tsx # 深模块柱状图(三视角 + 耗时叠加 + 异常标记 + 解释卡)
│ ├── rounds/ # observed.ts(本页观测)/ history.ts(宿主历史)/ types.ts
│ ├── diagnose/anomaly.ts # 成本突增判定(图表与徽章共享的纯模块)
│ ├── badge/CostBadge.tsx # assistant 消息尾部可关闭成本徽章
│ ├── pricing-api.ts # usePricing:/pricing 快照消费(client 唯一价格输入)
│ ├── currency.ts # 币种/汇率 store(/meta 配置 + 切换 + /rate 刷新)
│ ├── balance.ts # 余额读取 hook(经宿主代理)
│ └── styles.ts # 注入样式(<style data-plugin>)
└── types/ # vendored 最小类型声明(DSH client 包未发布稳定版)
pricing.json);价格只在宿主解析,client 经 /pricing 快照消费,官方价格调整后可通过覆盖文件即时修正。/meta 下发显示配置;/rate 经宿主代理拉取汇率(浏览器不直连外部汇率源);汇率源强制 HTTPS(仅回环放行 HTTP)。no-store;插件不会把 API Key 发送到浏览器。| 组件 | 支持范围 |
|---|---|
| DSH | ≥ 0.1.0-rc.6,当前按 0.1.x API 构建 |
| Node.js | ≥ 20 |
| Web UI | React 18 / conversation.composer.dock + conversation.chat.assistant-actions |
| 系统 | macOS、Linux、Windows(纯 JavaScript,无原生依赖) |
MIT
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。