dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
DeepSeek usage monitor as a DeepSeek Harness (DSH) plugin: balance / day-month-all-time token & cost panel in the chat UI with drag-reorder config, plus an optional local usage proxy
_✨ DeepSeek Harness 插件:余额、Token 用量与费用实时可见 ✨_
中文 | English
DeepSeek 用量监控 —— DeepSeek Harness (DSH) 插件:在会话头部与侧边栏实时显示 DeepSeek 平台的余额、日/月/累计 Token 总量与费用,支持长按拖动排序与开关配置;另附一个本地用量代理, 为走 Anthropic 兼容协议的子代理(如 Claude Code)精确记账。
本插件使用 platform.deepseek.com Web 端内部接口(非公开契约)查询你自己的账户数据,仅限个人使用;
接口结构若被 DeepSeek 变更,需要同步更新 lib/platform.mjs。标准 DSH bundle 格式(根包即插件,既可从 npm 安装,也可从 GitHub 一条命令安装)。当前版本 0.4.2,npm 包名 dsh-deepseek-monitor-moyuer233。
# 从 npm 安装(推荐)
dsh plugin --profile web add dsh-deepseek-monitor-moyuer233
# 或直接从 GitHub 安装
dsh plugin --profile web add github:moyuer233/dsh-deepseek-monitor装完重启 DSH(宿主在启动时加载新 bundle;此后客户端改动走 HMR,刷新页面即可)。
安装命令会把本仓库作为依赖装进 profile(~/.dsh/profiles/web/),其 cordis.patch.yml 自动向 profile 注入 dsm-usage 条目(宿主路由 + 浏览器端 bundle)。
旧版手工安装(@local/dsh-host-deepseek-usage+@local/dsh-client-ui-deepseek-usage拷贝到 profile)
已被上面的命令取代。升级前请从~/.dsh/profiles/web/cordis.patch.yml移除对应的- insert:段,
并删除 ~/.dsh/profiles/node_modules/@local/ 下的两个旧目录。/dsm/events)在 agent 从运行转为空闲时推一次信号,面板马上重新拉数据;老宿主没有该路由时自动退回 60 秒轮询(页面隐藏时暂停;多个展示位与多个标签页共用同一次采集)total_costs,选中某个 Key 时按该 Key 逐月累加¥100(¥50赠送))会话头部(横排信息段)
配置面板(显示开关;排序改到会话头部直接拖)
侧边栏底部(竖排)
长按显示块拖动排序(拖动中即时预览)
余额不足提醒(点「去充值」跳转平台充值页)
在 DSH 里登录 DeepSeek 账号(设置 → 账号)即可,插件自动复用登录态,不用再抓 token。
凭据来源按顺序取第一个可用的:
DS_PLATFORM_TOKEN 环境变量(脚本 / 临时换号)getPlatformSession(),请求头 x-dsh-auth-token)Authorization: Bearer)手动填写出现在三种情况:没登录、想用别的账号、或平台换了接口导致账号态不可用。 抓 token 的老办法仍在「高级」里:打开平台页 → 书签/控制台代码复制 userToken → 粘贴保存 (保存走宿主 POST /dsm/token 原子写入 ~/.dsh/deepseek-monitor/platform-token)。
账号登录 / 退出 / 换 token 都会让用量缓存立刻作废,下一轮自动用新的凭据重算。
~/.dsh/deepseek-monitor/config.json(宿主,与应用端口无关)+ localStorage(会话内)接口 · 内容 GET /api/v0/users/get_user_summary · 余额 / 赠送 / 累计费用(账户级,无 Key 维度) GET /api/v0/users/get_api_keys · 账户下的 API Key 列表 GET /api/v0/usage/by_api_key/amount?start&end&tz · 按 Key 的 token 用量(窗口为秒级、按日边界对齐) GET /api/v0/usage/by_api_key/cost?start&end&tz · 按 Key 的费用
鉴权:DSH 账号登录态(请求头 x-dsh-auth-token),或手填的平台 token(Authorization: Bearer);两者都不是 API Key。
0.2.3 及更早用的是/usage/amount、/usage/cost:那两个接口是账户级、按模型聚合、
没有 Key 维度。账户下有多个 Key 时,用它们算出的数字必然大于平台页面筛掉其它 Key 之后的值
—— 所以 0.2.4 起改用 by_api_key 这一对,并在面板里提供 Key 选择。把子 Claude Code(或任何 Anthropic 兼容客户端)的 ANTHROPIC_BASE_URL 指向本地代理, 代理转发到 DeepSeek 并精确解析 token 用量记账:
客户端 ──▶ 本代理 (127.0.0.1:8899) ──▶ https://api.deepseek.com/anthropic
│
▼
usage.jsonl(每请求一条:token/费用/耗时)node proxy.mjs # 启动代理(默认 127.0.0.1:8899)
node stats.mjs # totals | today | recent [n] | live | balance
npm test # 自测:代理 + 宿主采集 + 宿主路由(全内置 mock,无需真实 Key)接入 @deepseek-ai/dsh-subagent-claude-code 时,在 profile 补丁的 provider 行加:
- id: subagent-claude-code
name: '@deepseek-ai/dsh-subagent-claude-code'
config:
env: !!js Object.fromEntries(Object.entries({
ANTHROPIC_BASE_URL: 'http://127.0.0.1:8899',
ANTHROPIC_AUTH_TOKEN: process.env.DEEPSEEK_API_KEY
}).filter(([, v]) => v !== undefined && v !== ''))变量 · 默认值 · 说明 DS_MONITOR_PORT · 8899 · 代理监听端口 DS_MONITOR_HOST · 127.0.0.1 · 监听地址 DS_MONITOR_UPSTREAM · https://api.deepseek.com/anthropic · 上游端点 DS_MONITOR_LOG · ~/.dsh/deepseek-monitor/usage.jsonl · 代理记账文件 DS_MONITOR_LOG_MAX_BYTES · 33554432(32 MB) · 记账文件上限,超过就轮转出一代 .1 DS_MONITOR_ALLOWED_HOSTS · 仅回环名与 IP 字面量 · 额外允许访问宿主路由的 Host(逗号分隔),* 关闭校验 DS_MONITOR_LATEST_BASE · 镜像 + 官方 registry · 新版本查询源(逗号分隔,按顺序尝试) DS_MONITOR_API_KEY · 回退 ANTHROPIC_AUTH_TOKEN/DEEPSEEK_API_KEY · stats balance 用 DS_PLATFORM_TOKEN · 无 · 手动指定平台 token,优先于 DSH 账号登录态 DS_MONITOR_TZ_OFFSET · 8 · 记账时区偏移(小时):平台按该时区切分「日」 DS_MONITOR_TTL_MS · 30000 · 宿主侧用量结果缓存时长(毫秒),0 关闭缓存 DS_MONITOR_HISTORY_CONCURRENCY · 6 · 历史月份并发拉取上限 DS_PRICE__IN/_CACHE_HIT/_OUT · 内置默认表 · 单价覆盖(元/百万 token)
DS_PRICE_* 覆盖)模型 · 输入 · 缓存命中 · 输出 deepseek-chat · 0.27 · 0.07 · 1.10 deepseek-reasoner · 0.55 · 0.14 · 2.19 deepseek-v4-pro · 1.00 · 0.25 · 3.00 未知模型 · 1.00 · 0.10 · 2.00
费用按 Anthropic 协议语义:cache_creation_input_tokens 按全价输入计, cache_read_input_tokens 按缓存命中价计。
{"ts":"2026-08-15T08:00:00.000Z","runId":"...","kind":"messages","streaming":true,"model":"deepseek-chat","status":200,"inputTokens":1000,"cacheCreation":200,"cacheRead":300,"outputTokens":500,"inputCost":0.00027,"cacheCreationCost":0.000054,"cacheReadCost":0.000021,"outputCost":0.00055,"totalCostCny":0.000895,"error":null,"durationMs":1234}--dsw-alias-fill-l2、--dsw-alias-accent、--dsw-alias-danger、--dsw-alias-success、--dsw-static-neutral-0 等一批变量改了名。插件用「新名 → 旧名 → 中性兜底」的链式 var(),0.1 与 0.2+ 都能取到主题色;兜底不再写死深色,浅色主题不会退化成黑底。webServer.register 依次尝试 0.2 的 { kind, path, handler }、{ path, handler } 与更早的 (path, handler) 三种签名。deepseekAccount 服务不存在或未登录时自动回落到手填 token,不阻塞面板。require("react") / require("react-dom"),dsh.client.inject 为空,不依赖任何 @deepseek-ai/dsh-client-* 子包。stats balance 走 DeepSeek 原生余额端点(https://api.deepseek.com/user/balance),需有效 API Keydsh-subagent-claude-code 的限制),监控粒度到请求级pnpm.cmd,找不到时再交给 cmd /d /s /c 让 shell 找;失败提示保留具体错误pnpm update 刷新依赖与锁(在此之前用 npm 会绕过锁文件,重装时版本被锁里的旧提交打回,实测从 0.4.0 退回 0.2.4);找不到 pnpm 时给出明确提示¥100(¥50赠送));余额不足提醒也改按合计判断/dsm/events(SSE),宿主检测到 agent 从运行转为空闲就推一条 refresh,面板立刻刷新;老宿主自动退回 60 秒轮询npm install,重启 DSH 生效;失败时把错误原因放进单行输入框,单击复制dsh.client.inject 置空userToken;登录 / 退出 / 换账号后用量缓存自动作废x-dsh-auth-token,手填 token 仍走 Authorization: BearergetPlatformSession(),不直接读 ~/.dsh/.credentials.yamlDS_PLATFORM_TOKEN、DS_MONITOR_* 环境变量全部保留,升级无需任何操作by_api_key 系列:此前的 /usage/amount、/usage/cost 是账户级、没有 Key 维度,账户下有多个 Key 时算出的数字必然大于平台页面筛掉其它 Key 之后的值total_costs;选中某个 Key 时改为按该 Key 逐月累加(账户汇总没有 Key 维度)by_api_key 的当日窗口(end 按平台自身算法取"结束日次日零点")后与平台页面一致≡ 手柄排序,只保留显示开关min(78vh, 760px)):内容变长后,底部「平台 Token」区不再掉出窗口点不到DS_MONITOR_ALLOWED_HOSTS 放行OPTIONS *,且上游配成"带端口无路径")抛未捕获异常、整个代理进程退出的问题alltimeErrorstats.mjs live 把跨轮询被截断的半行连游标一起吃掉、该记录永久丢失的问题stats.mjs 遇到字符串型记账字段直接崩溃的问题DS_MONITOR_LOG_MAX_BYTES,默认 32 MB),stats 两代都统计DS_MONITOR_TTL_MS 传非法值时回退默认,不再静默关掉缓存DS_MONITOR_TZ_OFFSET 调整)/v1/messages 记成 other、该请求 token 与费用记 0 的问题/dsm/usage 补方法校验与错误处理如果觉得好用,请给个 Star 支持一下,欢迎提交 Issue 和 Pull Request。
MIT