多账号余额与 token 费用实时统计
27.4/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/6 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add jsoncode/dsh-get-balance该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:需留意
是什么
dsh 原生插件 · model
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 51 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
⚠︎ 实装验证未通过(dependency_conflict · 2026/10/7) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 70 处,展示前 51 条)
- 读取本地文件lib/index.js:59
raw = readFileSync(path); - 读取本地文件lib/index.js:101
raw = await readFile(path); - 读取本地文件lib/index.js:230
stat = statSync(ref.path); - 读取本地文件lib/index.js:778
return readFileSync(path).toString("utf8").split("\n", 1)[0]; - 读取本地文件lib/index.js:785
const raw = readFileSync(path); - 读取本地文件lib/index.js:857
names = readdirSync(projectDirPath); - 写入本地文件lib/index.js:1343
await rename(configPath, backup); - 写入本地文件lib/index.js:1386
await mkdir(dirname(configPath), { recursive: true }); - 写入本地文件lib/index.js:1388
await writeFile(tmp, serialized, "utf8"); - 写入本地文件lib/index.js:1389
await rename(tmp, configPath); - 发起网络请求lib/index.js:1607
const response = await fetch(url, { - 写入本地文件lib/index.js:1697
await rename(storePath, backup).catch(() => void 0); - 写入本地文件lib/index.js:1751
await mkdir(dirname(path), { recursive: true }); - 发起网络请求lib/index.js:2708
const res = await fetch(REGISTRY_URL, { - 执行外部命令来自配置/变量lib/index.js:2777
const probe = spawnSync(WINDOWS ? "where" : "which", ["dsh"], { - 执行外部命令来自配置/变量lib/index.js:2801
child = spawn(command, [ - 读取本地文件.credtest.cjs:4
const text = fs.readFileSync(path, 'utf8'); - 发起网络请求src/client/rpc.ts:36
const response = await fetch('/dsh-balance/api', { - 发起网络请求src/host/balance.ts:62
const response = await fetch(url, { - 读取本地文件src/host/config-file.ts:138
await access(configPath) - 读取本地文件src/host/config-file.ts:216
text = await readFile(configPath, 'utf8') - 写入本地文件src/host/config-file.ts:244
await rename(configPath, backup) - 读取本地文件src/host/config-file.ts:267
text = await readFile(configPath, 'utf8') - 写入本地文件src/host/config-file.ts:290
await mkdir(dirname(configPath), { recursive: true }) - 写入本地文件src/host/config-file.ts:292
await writeFile(tmp, serialized, 'utf8') - 写入本地文件src/host/config-file.ts:293
await rename(tmp, configPath) - 读取本地文件src/host/cost.ts:590
return readFileSync(path).toString('utf8').split('\n', 1)[0] - 读取本地文件src/host/cost.ts:599
const raw = readFileSync(path) - 读取本地文件src/host/cost.ts:685
names = readdirSync(projectDirPath) - 读取本地文件src/host/cost.ts:729
projects = readdirSync(root) - 读取本地文件src/host/cost.ts:941
projects = readdirSync(root) - 读取本地文件src/host/cost.ts:952
sessionIds = readdirSync(projectDirPath) - 读取本地文件src/host/index.ts:173
iconCache = await readFile(iconPath) - 读取本地文件src/host/log-cache.ts:77
raw = readFileSync(path) - 读取本地文件src/host/log-cache.ts:129
raw = await readFile(path) - 读取本地文件src/host/log-cache.ts:310
stat = statSync(ref.path) - 读取本地文件src/host/plugin-update.ts:87
if (explicit !== undefined && explicit.trim().length > 0 && existsSync(explicit.trim())) { - 读取本地文件src/host/plugin-update.ts:91
if (existsSync(candidate)) return candidate - 执行外部命令来自配置/变量src/host/plugin-update.ts:95
const probe = spawnSync(WINDOWS ? 'where' : 'which', ['dsh'], { encoding: 'utf8', windowsHide: true }) - 执行外部命令来自配置/变量src/host/plugin-update.ts:119
child = spawn(command, ['plugin', '--profile', 'web', 'update', PLUGIN_NAME], { - 写入本地文件src/host/series-store.ts:109
await rename(storePath, backup).catch(() => undefined) - 读取本地文件src/host/series-store.ts:121
text = await readFile(storePath, 'utf8') - 写入本地文件src/host/series-store.ts:168
await mkdir(dirname(path), { recursive: true }) - 写入本地文件src/host/series-store.ts:170
await writeFile(tmp, serialized, 'utf8') - 写入本地文件src/host/series-store.ts:171
await rename(tmp, path) - 读取本地文件src/host/series.ts:282
projects = readdirSync(root) - 读取本地文件src/host/series.ts:290
names = readdirSync(projectDir) - 读取本地文件src/host/series.ts:302
stat = statSync(candidate.path) - 读取本地文件src/host/update.ts:117
const text = readFileSync(url, 'utf8') - 读取本地文件src/host/update.ts:127
const pkg = JSON.parse(readFileSync('package.json', 'utf8')) as { name?: unknown; version?: unknown } - 发起网络请求src/host/update.ts:172
const res = await fetch(REGISTRY_URL, {
扫描于 2026/11/1(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-client-ui-primitives@deepseek-ai/dsh-home-paths@deepseek-ai/dsh-invariants@deepseek-ai/dsh-settings@deepseek-ai/schemastery@deepseek-ai/dsh-api-remotes@deepseek-ai/dsh-client-runtime@deepseek-ai/dsh-client-ui-settings@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-cordis-client-runner给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 多账号余额查询
- 实时token费用统计
- 中英双语界面
余额与费用查询插件,支持多账号查询,实时token实时统计,中英双语,界面交互直观、开箱即用
README
由 DeepSeek 最新模型翻译生成dsh-get-balance
DeepSeek Harness(dsh)余额与费用查询插件:
- 多账号查询:一次枚举全部 DeepSeek 服务商(pi-ai 路由 / 官方路由 / 附加 Key),同一账号自动合并为一行,各账号余额一目了然;
- 实时统计:会话内 token 用量实时统计,按用量实时估算费用,价格档在线可配(模型 × 高峰/空闲时段);
- 中英双语:界面文案自动跟随宿主语言;
- 简单易用:统一弹框(余额 / 费用 / 价格设置)+ 侧边栏入口 + 会话头部实时按钮,交互直观、开箱即用。
dsh-get-balance
English · 界面预览
功能总览
| 功能 | 入口 | 说明 |
| 余额查询 | 弹框 · 余额 Tab | 每个 API Key 行展示「今日消耗 ≈xx CNY \| 余额 xx CNY」(数字绿色,消耗按该 key 的路由从费用统计匹配,无用量为 ≈0.00);枚举全部 DeepSeek 服务商(llm-pi-ai 深链条目 / 官方 llm-deepseek 路由 / 附加 Key),经宿主 credentials 解析 key 调用官方 /user/balance;每行独立展示余额状态或失败原因。
展开完整文档(README 剩余 1 节)
dsh-get-balance
DeepSeek Harness(dsh)余额与费用查询插件:
- 多账号查询:一次枚举全部 DeepSeek 服务商(pi-ai 路由 / 官方路由 / 附加 Key),同一账号自动合并为一行,各账号余额一目了然;
- 实时统计:会话内 token 用量实时统计,按用量实时估算费用,价格档在线可配(模型 × 高峰/空闲时段);
- 中英双语:界面文案自动跟随宿主语言;
- 简单易用:统一弹框(余额 / 费用 / 价格设置)+ 侧边栏入口 + 会话头部实时按钮,交互直观、开箱即用。
dsh-get-balance
English · 界面预览
功能总览
| 功能 | 入口 | 说明 |
| 余额查询 | 弹框 · 余额 Tab | 每个 API Key 行展示「今日消耗 ≈xx CNY \| 余额 xx CNY」(数字绿色,消耗按该 key 的路由从费用统计匹配,无用量为 ≈0.00);枚举全部 DeepSeek 服务商(llm-pi-ai 深链条目 / 官方 llm-deepseek 路由 / 附加 Key),经宿主 credentials 解析 key 调用官方 /user/balance;每行独立展示余额状态或失败原因。同一账号折叠为一行:多个路由解析到同一 API key(如 pi-ai 路由名为 deepseek 派生凭据引用 DEEPSEEK_API_KEY,与官方 llm-deepseek 默认引用撞名)时只显示一行,行上以 chip 标注每个共享该 key 的路由(悬停提示「与 xx 共用同一 API Key」),余额按唯一 key 只查询一次,同一账号不会以不同名称重复展示 |
| 费用估算 | 弹框 · 费用 Tab | 表格展示:列为 token / 分类 / 输入(未命中)/ 输入(缓存命中)/ 输出 / 命中率 / 预估费用;每个 API Key 一组、token 列合并四行(最近一次提问 / 本会话 / 今日·本项目 / 今日·全部),首组为合计;数字 K/M/B/T/P 缩写(token 不区分官方与否,一律统计;费用仅官方 Key(api.deepseek.com)计算,非官方标注「不计费」)。与余额 Tab 对齐:已配置 provider 无论有无用量都逐组列出(未用量/未配置凭据者显示 0 用量、金额 —)。多 provider 严格分账:token 统计与金额预估按会话事件归属到各自 provider(分组),组内标注来源 chip(pi-ai 路由 / 官方路由)+ 官方/非官方 chip(别名路由按 baseURL 域名判定),互不混合;最近一次提问按每个样本自身模型匹配价格档 |
| 价格设置 | 弹框 · 价格 Tab | 二级平台 tab(当前仅 DeepSeek,后续扩展其他平台定价);DeepSeek 页为官方价格表式排版;模型 × 高峰/空闲双时段单价;时段窗口 + 时区滑块 + 周六日半价开关(勾选后周六/周日整天按空闲单价计费)可配置;旧配置自动迁移为官方 V4 三档 |
| 会话头部按钮 | 会话头部 utilities | 实时「当前会话 xxM \| ≈¥xx」(token 紧凑缩写与金额均为绿色;数字变化为上下轮播动画);点击即刷新;会话任务完成(宿主 running 回落)后自动刷新。会话中途可能切换 provider:按钮为合并统计,点击弹出气泡弹框逐 provider 列出(如 ds-self 268K \| ≈¥0.41),非官方行金额位显示「不计费」 |
| 侧边栏入口 | footer.action | 「余额」按钮:余额靠右对齐(货币符号前缀、数字绿色、数字变化为上下轮播动画),多账号以 \| 分隔逐段显示(每段对应一个服务商/账号),取不到余额的账号显示红色 --(悬停提示原因);时段收敛为小圆点(高峰红 / 空闲绿),悬停气泡提示完整信息「当前为高峰时段 全价计费」/「当前为空闲时段 半价计费」(价词着色:全价红 / 半价绿) |
| 定时更新 | 弹框右上「定时更新」 | 按设定秒数自动刷新余额与费用;配置弹框(启动/停止互斥、输入框禁用);间隔持久化 |
| 附加 API Key | 弹框 · 余额 Tab 底部 | 手动添加不在 providers 配置中的 key,脱敏回显,持久化到 $DSH_HOME/dsh-get-balance.json |
| 入口显隐 | 宿主设置 · 余额分区页 / 弹框 · 价格 Tab 顶部 | 「在菜单中显示」滑动开关(默认开启,localStorage key dsh-get-balance.show-in-menu):关闭后侧边栏入口按钮渲染为 null(不占位、不再轮询余额);两处开关同一偏好源,改一处另一处即时同步;入口关闭后仍可从宿主「设置 → 余额」分区页打开插件弹框 |
计费与判定口径
| 项 | 规则 |
| 官方判定 | 会话 request/context 的 provider → 宿主设置中 baseURL → 域名 == api.deepseek.com(尾斜杠/大小写归一;api.deepseek.com.xx.com 等伪装域名判为非官方) |
| 计费 | 仅官方请求:四桶 × 单价 ÷ 1e6(每百万 tokens),按事件发生时刻匹配高峰/空闲单价 |
| 统计 | 所有服务商/模型的 token 均统计数量;非官方按服务商逐条四桶展示、互不合并 |
| 时段 | 默认北京 9:00–12:00、14:00–18:00 为高峰,其余为空闲;空闲 = 高峰 × 0.5;开启「周六日半价」后周六/周日整天视为空闲 |
| 迁移 | 旧版扁平单价与旧内置默认档首次读取自动升级为官方 V4 三档 |
交互刷新路径
| 触发 | 效果 |
| 点击会话头部按钮 | 当前会话费用刷新一次 |
| 会话任务完成 | 监听宿主会话快照:每次 AI 请求完成(快照新增 assistant 消息,非流式逐 token)即刷新——头部按钮 token 与预估费用立即重算;仅当该请求走 DeepSeek 官方接口(api.deepseek.com)时 footer 余额才同步强制刷新(绕过 60s 缓存),非官方接口的请求不发起余额查询;一轮含多次请求时逐次更新 |
| 点击弹框【刷新】 | 余额刷新(绕过 60s 缓存) |
| 点击弹框【定时更新】 | 打开配置弹框,按设定秒数周期自动刷新(弹框与头部按钮均生效) |
结构
├── src/host/.ts # 宿主半边:index.ts(入口)、providers.ts(服务商枚举、 │ # 官方域判定)、balance.ts、cost.ts(折叠 + 今日扫描 + │ # 峰谷定价 + 官方过滤)、ops.ts(op 分发)、 │ # config-file.ts(插件配置文件读写 + 旧 settings 迁移)、 │ # fence.ts、types.ts ├── src/client/ # 浏览器半边:plugin.tsx(slots 注册 + 定时器)、 │ # BalanceModal.tsx(三 tab 弹框)、HeaderButton.tsx │ # (会话头部按钮)、FooterButton.tsx(footer 入口)、 │ # PluginSettingsPage.tsx(宿主设置分区页)、 │ # prefs.ts(本地偏好)、rpc.ts、store.ts、 │ # i18n.ts、styles.ts、logo.ts ├── lib/index.js # 宿主半边产物(tsdown,ESM),提交 git 以支持 git 安装 ├── lib/client.js # 浏览器半边产物(__ModuleLoader__ 工厂),提交 git ├── lib/types/ # 类型声明(tsc -b 生成) ├── scripts/ # verify-client.mjs(模拟宿主 seed 校验) ├── tsdown.config.ts # tsdown 构建配置(宿主半边 + 客户端 banner 包装) ├── tsconfig.json # solution:引用 tsconfig.host.json / tsconfig.client.json ├── cordis.patch.yml # Bundle patch:按包名引用插件行 ├── package.json # dsh.bundle + dsh.client(web) manifest + peerDependencies ├── README.md # English(默认) └── README.zh-CN.md # 本文件(中文)
安装
已发布:npm / tarball / GitHub
dsh plugin --profile web add dsh-get-balance
dsh plugin --profile web add ./dsh-get-balance-0.1.0.tgz
dsh plugin --profile web add github:you/dsh-get-balance#<sha>
dsh --profile web --dump-config # 检查插件层
dsh --profile web # 启动
插件无需静态配置;附加 key、价格档与定时间隔均在弹框内编辑并持久化到 $DSH_HOME/dsh-get-balance.json。
插件配置文件
- 位置:$DSH_HOME/dsh-get-balance.json(与 settings.yaml 同目录)。
- 内容(读取时各字段均可缺省,非法值回退默认):
{
"version": 1,
"extraKeys": [ { "id": "k1", "label": "主账号", "apiKey": "sk-..." } ],
"prices": {
"tiers": [
{ "id": "deepseek-v4-flash", "name": "deepseek-v4-flash", "currency": "CNY",
"match": "deepseek-v4-flash",
"peak": { "input": 2.0, "cacheRead": 0.04, "cacheWrite": 0, "output": 8.0 },
"offPeak": { "input": 1.0, "cacheRead": 0.02, "cacheWrite": 0, "output": 4.0 } }
],
"timezoneOffsetMinutes": 480,
"peakWindows": [ { "start": "09:00", "end": "12:00" }, { "start": "14:00", "end": "18:00" } ],
"weekendOffPeak": false
},
"autoRefreshSeconds": 0
}
- 每次查询现读文件、保存时原子写入(临时文件 + rename),外部手改立即生效 (无需重启);文件损坏时自动改名备份为 dsh-get-balance.json.bak-<时间戳> 并回退默认值。
- 旧版本写入宿主 settings.yaml 的 dsh-balance 段数据会在首次运行时自动迁移到该文件,之后不再读写宿主默认设置。
发布
构建工具链为 tsc + tsdown(无 vite):tsc -b 类型检查并生成声明文件, tsdown(Rolldown 内核)打包宿主半边(lib/index.js,ESM)与浏览器半边(lib/client.js,单文件 CJS __ModuleLoader__ 工厂)。依赖管理使用 pnpm 10:
pnpm install # 按 pnpm-lock.yaml 安装
pnpm run build # 清理 lib → tsc -b(类型 + 声明)→ tsdown(双面产物)
pnpm run verify # 模拟宿主模块表校验 lib/client.js(可选)
pnpm publish # 或 pnpm pack / git push origin main(lib/ 已提交,git 安装免构建)
自动发布(GitHub Actions)
推送 v tag(pnpm run release 自动 bump patch 版本、重建产物并打 tag)触发 .github/workflows/publish.yml:
- release job:Setup Node → pnpm install --frozen-lockfile → pnpm run check → pnpm run build → pnpm pack → 创建 GitHub Release;
- publish-npm job:发布到 npm —— 需要仓库 secret NPM_TOKEN。
开发
要求:Node ≥ 26 + pnpm 10(package.json 的 packageManager 字段锁定版本)。
pnpm install # devDependencies:typescript、tsdown、@types/react、@deepseek-ai/ 类型包等
pnpm run check # 全树 TypeScript 类型检查(tsc -b)
pnpm run build # 改完源码后重建双面产物(tsc -b && tsdown)
pnpm run verify # 模拟宿主 seed 表校验 lib/client.js 可加载
本地接入 dsh 实例(插件仓库目录):
cd dsh-get-balance
dsh plugin --profile web add ./
宿主以原生 Node ESM 加载 index.js,因此 @deepseek-ai/schemastery、 @deepseek-ai/dsh-tools、@deepseek-ai/dsh-settings、 @deepseek-ai/dsh-home-paths 必须可从插件目录解析(node_modules 已被 gitignore),在插件目录内执行 pnpm install 即可。宿主半边(src/host/)改动需重启 dsh 生效;浏览器半边(src/client/)改动刷新页面即可。
- 宿主半边位于 src/host/;浏览器半边位于 src/client/;
- lib/client.js 的 window.__ModuleLoader__.load 工厂包装由 tsdown 的 banner/intro/footer 选项生成;外部依赖(react 等)保持 external,运行时经宿主模块表(seed)解析。
实现说明
- 浏览器 ↔ 宿主通信:HTTP 路由 /dsh-balance/api(POST JSON,宿主 webServer + 信任围栏),兜底 ctx.remote.commands.execute;错误携带 code,客户端本地化。
- 凭据解析:credentials 服务按请求懒取(不捕获于 apply 时),规避宿主服务晚启动导致的「未配置凭据」;providers op 返回 credentialsPresent 与每条 keySource(env / file / project-env / user-env)诊断信息。
- 计费公式:(uncachedInput × p_input + cacheRead × p_cacheRead + cacheWrite × p_cacheWrite + output × p_output) / 1e6,单价为每百万 tokens,按事件发生时刻匹配高峰/空闲单价。
- 官方过滤:request/context 的 provider → 宿主设置中的 baseURL → 域名 == api.deepseek.com;非官方 token 仅计数(逐服务商四桶),不参与金额。
- 今日聚合:dshHomePath('sessions')/<projectKey>/<sessionId>/session.jsonl(.zstd); zstd 经 node:zlib 的 zstdDecompressSync 逐帧解码。
- peer 依赖(@deepseek-ai/cordis、dsh-tools、schemastery、dsh-settings、 dsh-commands、dsh-session、dsh-api-remotes、client runtime / ui-slots / ui-settings / cordis-client-runner、react)由宿主在安装时解析。
- 不修改官方 deepseek-harness 项目;全部功能使用既有插槽(sidebar.footer.action、settings.section、shell.overlay、 conversation.session.header.utilities)与 HTTP / 命令通道。
- 样式隔离:注入的样式表除一条刻意保留的例外,全部限定在 .dshb- 作用域内 ——
:where(div:has(> [data-slot="sidebar.footer.action"] > .dshb-footer-group)){flex-direction:column}
用于把宿主 footer 容器从默认 flex 横排改为纵向堆叠(否则多个插件入口会被挤在一行)。
它只可能命中「容器内已存在本插件入口」的那一层,且外层 :where() 把优先级压到 0,宿主随时可覆盖。动画名统一 dshb- 前缀,style 标签带 data-plugin-css="dsh-get-balance/settings.css" 标记;没有其它全局选择器,不写 :root/body/,也不修改 body 行内样式。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
jsoncode/dsh-get-balance
多账号余额与 token 费用实时统计
相关插件 · 模型接入
API 中继安全审计toby-bridges/api-relay-audit
面向 AI API 中转与 LLM 代理的本地安全审计。
★ 897已汉化DSH
69.4
免费搜索插件DDDMUC/dsh-free-search
DeepSeek Harness 免费搜索插件 —— 无需 API key,零成本,多引擎可切换。 一个给…
★ 761已汉化DSH
68.7
免费联网搜索liustack/modsearch
在官方 App 里模型能联网,切到 API 就不能了。ModSearch 把联网补回来:网页搜索、X…
★ 863已汉化DSH
68.5
OpenCode 免费模型FishBottle7/opencode2dsh
在 DSHDeepSeek Harness里原生使用 OpenCode Zen 的免费匿名模型。
★ 379已汉化DSH
67.8
AI 模型网关tingly-dev/tingly-box
Tingly Box Web UI 演示
★ 373已汉化DSH
67.4
WorkBuddy 账号池XDTrees/dsh-xdpool
把你能白嫖的模型额度接进 DSH 同一个池:WorkBuddy 多账号自动容错、十三家扫码登录、76…
★ 359已汉化DSH
67.1