🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

多厂商费用账本 uruana33/dsh-cost-meter

DeepSeek Harness
uruana3373 天前有提交已提供中文文档扫描:含敏感能力

实时统计各厂商 Token 用量并生成本地费用账本

29/100
综合分
2
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/9/18 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查未通过:缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add uruana33/dsh-cost-meter
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · market
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
数据截至 2026/09/25·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/05·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 73 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安装兼容性检查需源码安装

缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包mymeter(未发布到 npm,仅可源码安装)
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✗入口文件缺少入口声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/9/23 11:36:38

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件
查看扫描证据(共 157 处,展示前 64 条)
  • 写入本地文件
    packages/host/src/append-ledger.ts:143
    mkdirSync(dirname(filePath), { recursive: true });
  • 读取本地文件
    packages/host/src/append-ledger.ts:305
    if (existsSync(filePath)) {
  • 读取本地文件
    packages/host/src/append-ledger.ts:308
    raw = JSON.parse(readFileSync(filePath, "utf8")) as unknown;
  • 读取本地文件
    packages/host/src/append-ledger.ts:343
    const legacy = legacyFilePath && existsSync(legacyFilePath)
  • 读取本地文件
    packages/host/src/append-ledger.ts:371
    if (legacyFilePath !== undefined || !existsSync(filePath)) return;
  • 读取本地文件
    packages/host/src/append-ledger.ts:374
    if (existsSync(backupPath)) {
  • 读取本地文件
    packages/host/src/append-ledger.ts:427
    return lstatSync(left).isSymbolicLink() && isSameExistingFile(left, right);
  • 删除本地文件
    packages/host/src/append-ledger.ts:553
    rmSync(filePath, { force: true });
  • 写入本地文件
    packages/host/src/append-ledger.ts:734
    truncateSync(manifest.logFile, offset);
  • 写入本地文件
    packages/host/src/append-ledger.ts:767
    writeFileSync(descriptor, serialized);
  • 写入本地文件
    packages/host/src/append-ledger.ts:897
    mkdirSync(dirname(filePath), { recursive: true });
  • 写入本地文件
    packages/host/src/append-ledger.ts:904
    writeFileSync(descriptor, contents);
  • 写入本地文件
    packages/host/src/append-ledger.ts:922
    mkdirSync(dirname(filePath), { recursive: true });
  • 删除本地文件
    packages/host/src/append-ledger.ts:932
    rmSync(tmpPath, { force: true });
  • 删除本地文件
    packages/host/src/append-ledger.ts:939
    if (existsSync(tmpPath)) rmSync(tmpPath, { force: true });
  • 删除本地文件
    packages/host/src/append-ledger.ts:968
    rmSync(tmpPath, { force: true });
  • 删除本地文件
    packages/host/src/append-ledger.ts:975
    if (existsSync(tmpPath)) rmSync(tmpPath, { force: true });
  • 删除本地文件
    packages/host/src/append-ledger.ts:1014
    if (existsSync(filePath) && statSync(filePath).isFile()) rmSync(filePath, { force: true });
  • 读取本地文件
    packages/host/src/ledger-format.ts:59
    if (lstatSync(ledgerPath).isSymbolicLink()) {
  • 读取本地文件
    packages/host/src/ledger-format.ts:96
    if (!existsSync(ledgerPath)) {
  • 读取本地文件
    packages/host/src/ledger-format.ts:107
    raw = JSON.parse(readFileSync(canonicalLedgerPath, "utf8")) as unknown;
  • 读取本地文件
    packages/host/src/ledger-format.ts:134
    if (!existsSync(canonicalLedgerPath)) return hasAdjacentGenerationFiles(canonicalLedgerPath);
  • 读取本地文件
    packages/host/src/ledger-format.ts:138
    raw = JSON.parse(readFileSync(canonicalLedgerPath, "utf8")) as unknown;
  • 读取本地文件
    packages/host/src/ledger-format.ts:150
    return lstatSync(ledgerPath).isSymbolicLink();
  • 写入本地文件
    packages/host/src/ledger.ts:172
    mkdirSync(dirname(filePath), { recursive: true });
  • 读取本地文件
    packages/host/src/ledger.ts:225
    const stat = statSync(filePath);
  • 读取本地文件
    packages/host/src/ledger.ts:291
    if (!existsSync(filePath)) {
  • 读取本地文件
    packages/host/src/ledger.ts:298
    contents = readFileSync(filePath, "utf8");
  • 读取本地文件
    packages/host/src/ledger.ts:509
    if (!existsSync(filePath)) {
  • 写入本地文件
    packages/host/src/ledger.ts:515
    renameSync(filePath, quarantinePath);
  • 写入本地文件
    packages/host/src/ledger.ts:528
    writeFileSync(descriptor, contents);
  • 写入本地文件
    packages/host/src/ledger.ts:532
    renameSync(tmpPath, filePath);
  • 读取本地文件
    packages/host/src/ledger.ts:537
    if (existsSync(tmpPath)) {
  • 删除本地文件
    packages/host/src/ledger.ts:538
    rmSync(tmpPath, { force: true });
  • 读取本地文件
    packages/host/src/recovery-checkpoint.ts:45
    if (!existsSync(filePath)) {
  • 读取本地文件
    packages/host/src/recovery-checkpoint.ts:48
    return createLedgerFingerprintFromContents(filePath, readFileSync(filePath, "utf8"));
  • 读取本地文件
    packages/host/src/recovery-checkpoint.ts:84
    if (!existsSync(filePath)) {
  • 读取本地文件
    packages/host/src/recovery-checkpoint.ts:90
    raw = JSON.parse(readFileSync(filePath, "utf8")) as unknown;
  • 写入本地文件
    packages/host/src/recovery-checkpoint.ts:134
    mkdirSync(dirname(filePath), { recursive: true });
  • 读取本地文件
    packages/host/src/recovery-checkpoint.ts:163
    if (!existsSync(filePath)) {
  • 写入本地文件
    packages/host/src/recovery-checkpoint.ts:169
    renameSync(filePath, quarantinePath);
  • 写入本地文件
    packages/host/src/recovery-checkpoint.ts:181
    writeFileSync(descriptor, contents);
  • 写入本地文件
    packages/host/src/recovery-checkpoint.ts:185
    renameSync(tmpPath, filePath);
  • 读取本地文件
    packages/host/src/recovery-checkpoint.ts:189
    if (existsSync(tmpPath)) {
  • 删除本地文件
    packages/host/src/recovery-checkpoint.ts:190
    rmSync(tmpPath, { force: true });
  • 读取本地文件
    packages/plugin/lib/index.js:2385
    if (!existsSync(filePath)) {
  • 读取本地文件
    packages/plugin/lib/index.js:2388
    return createLedgerFingerprintFromContents(filePath, readFileSync(filePath, "utf8"));
  • 读取本地文件
    packages/plugin/lib/index.js:2414
    if (!existsSync(filePath)) {
  • 读取本地文件
    packages/plugin/lib/index.js:2419
    raw = JSON.parse(readFileSync(filePath, "utf8"));
  • 写入本地文件
    packages/plugin/lib/index.js:2453
    mkdirSync(dirname(filePath), { recursive: true });
  • 读取本地文件
    packages/plugin/lib/index.js:2478
    if (!existsSync(filePath)) {
  • 写入本地文件
    packages/plugin/lib/index.js:2483
    renameSync(filePath, quarantinePath);
  • 写入本地文件
    packages/plugin/lib/index.js:2494
    writeFileSync(descriptor2, contents);
  • 写入本地文件
    packages/plugin/lib/index.js:2498
    renameSync(tmpPath, filePath);
  • 读取本地文件
    packages/plugin/lib/index.js:2502
    if (existsSync(tmpPath)) {
  • 删除本地文件
    packages/plugin/lib/index.js:2503
    rmSync(tmpPath, { force: true });
  • 写入本地文件
    packages/plugin/lib/index.js:2639
    mkdirSync2(dirname2(filePath), { recursive: true });
  • 写入本地文件
    packages/plugin/lib/index.js:2915
    renameSync2(filePath, quarantinePath);
  • 删除本地文件
    packages/plugin/lib/index.js:2936
    rmSync2(tmpPath, { force: true });
  • 删除本地文件
    packages/plugin/lib/index.js:3601
    rmSync3(filePath, { force: true });
  • 删除本地文件
    packages/plugin/lib/index.js:3909
    rmSync3(tmpPath, { force: true });
  • 删除本地文件
    packages/plugin/lib/index.js:3919
    if (existsSync3(tmpPath)) rmSync3(tmpPath, { force: true });
  • 删除本地文件
    packages/plugin/lib/index.js:3941
    rmSync3(tmpPath, { force: true });
  • 读取本地文件
    packages/plugin/src/self-update.ts:206
    return async () => JSON.parse(await readFile(packageJsonUrl, "utf8")) as MyMeterPackageManifest;
扫描于 2026/11/5(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 统计各厂商Token用量
  • 生成本地费用账本
  • 服务商感知成本计量

面向 DeepSeek Harness 的服务商感知 LLM 成本计量与本地账本

README

由 DeepSeek 最新模型翻译生成
dsh-cost-meter Node.js Status License: MIT dsh-cost-meter 是面向 dsh / DeepSeek Harness 的多厂商 LLM Token 费用仪表插件。它把本机观察到的请求用量转换为可追溯的本地账本,并在 dsh Web profile 中提供实时小票、会话账单和用量分析。 [!WARNING] 这是本地观测、估算和回放工具,不是 DeepSeek、OpenAI、Anthropic、xAI 或其他厂商的官方账单。流式阶段会先估算,收到 provider usage 后再校正;实际扣费、发票和账户余额请以厂商控制台为准。 当前版本 当前发布包为 @mymeter/dsh-cost-meter@0.2.2。近期版本的重点是: - 全局用量概览支持今日、最近 7 天和最近 30 天,显示费用、Token、请求数、计价覆盖率和主要模型。 - Token计费 页面统一会话、费用树和趋势/异常视图;趋势图按模型着色并提供范围切换,账本可导出为 JSON/CSV。 - DeepSeek 价格快照新增 deepseek-v4-flash-vision-exp,图片 Token 沿用 provider usage,并继续按北京时间峰谷价格计费。 - 账本默认使用 JSON;可显式选择 append 格式。
展开完整文档(README 剩余 1 节)
dsh-cost-meter

Node.js
Status
License: MIT

dsh-cost-meter 是面向 dsh / DeepSeek Harness 的多厂商 LLM Token 费用仪表插件。它把本机观察到的请求用量转换为可追溯的本地账本,并在 dsh Web profile 中提供实时小票、会话账单和用量分析。

[!WARNING]
这是本地观测、估算和回放工具,不是 DeepSeek、OpenAI、Anthropic、xAI 或其他厂商的官方账单。流式阶段会先估算,收到 provider usage 后再校正;实际扣费、发票和账户余额请以厂商控制台为准。

当前版本

当前发布包为 @mymeter/dsh-cost-meter@0.2.2。近期版本的重点是:

- 全局用量概览支持今日、最近 7 天和最近 30 天,显示费用、Token、请求数、计价覆盖率和主要模型。
- Token计费 页面统一会话、费用树和趋势/异常视图;趋势图按模型着色并提供范围切换,账本可导出为 JSON/CSV。
- DeepSeek 价格快照新增 deepseek-v4-flash-vision-exp,图片 Token 沿用 provider usage,并继续按北京时间峰谷价格计费。
- 账本默认使用 JSON;可显式选择 append 格式。余额刷新失败时保留最近一次可用结果并显示状态。

完整变更见 CHANGELOG,价格快照和覆盖范围见价格目录文档。

快速开始

从 npm 安装(推荐)

dsh plugin --profile web add @mymeter/dsh-cost-meter

从源码验证或开发

npm ci
npm run build
npm run pack:plugin
npm run verify:package
dsh plugin --profile web add ./mymeter-dsh-cost-meter-0.2.2.tgz

重新加载对应的 dsh Web profile 后,打开一个会话即可使用。运行环境要求 Node.js ^22.19.0 || >=24.0.0,以及启用 Web bundle 的 dsh profile。

完整安装、配置、更新、卸载和排错流程见安装与使用。

使用路径

运行中的请求

对话页右上角的 Token 小浮窗会显示当前请求的 Token 和费用。流式输出期间金额是临时估算;最终 assistant/message.usage 到达后,同一请求会被校正为已结算事件。小浮窗点击后可进入完整的 Token计费 页面。

会话账单

会话详情按阶段和轮次展示:

- 输入 Token(无缓存)、输入 Token(缓存)、输出 Token,以及包含在输出费用中的推理 Token;
- 当前请求、已结算金额、估算金额、失败/未知状态和模型价格版本;
- 预算阈值、缓存命中节省、DeepSeek 当前峰谷时段和下一次切换倒计时;
- 多币种原币金额。需要人民币折算时,可手动查询 USD/CNY 汇率,折算只影响展示,不改写账本。

全局会话与分析

全局 Token计费 页面使用统一的视图 Tab:

| 视图 | 内容 |
| 会话 | 搜索、排序、状态筛选和会话累计;可进入任意会话详情 |
| 费用树 | 按父子 Agent 展示自身费用、子树费用和异常关系 |
| 趋势/异常 | 今日/7 天/30 天用量概览、费用趋势、主要模型、计价覆盖率和本地异常提示 |

趋势范围为今日按小时、7 天或 30 天按自然日;多模型柱状图按模型着色并提供图例。分析和费用树通过按需 Remote 加载,不会塞进每次轻量快照。页面还可以下载安全字段 allowlist 内的 JSON/CSV 账本,不包含提示词、回复正文、工具内容或 API Key。

界面与演示

以下素材来自 dsh Web profile,余额、会话、Token 和金额均为模拟数据,不代表实际账户或厂商账单。

Token 计费页

Token 计费页:DeepSeek 会话费用与 Token 分桶

没有可用 usage 或无法匹配价格时,页面会明确显示估算、未知或不可用状态,不会用 ¥0.000 冒充精确费用。

Token 计费页:不适用或待核对的计费状态

对话页与 Token 小浮窗

对话页中的 Token 计费小浮窗

视频文件位于 docs/assets,可直接播放:

- 深色主题下的小浮窗基础交互(约 15 秒)
- 浅色主题下的小浮窗生成过程(约 23 秒)

计费与价格

Token 口径

- 计费事件按 (sessionId, turnId, stepId, attemptId) 去重;最终 usage 会替换同一次请求的流式估算,而不是与估算相加。
- 推理 Token 是输出 Token 的子集,展示出来便于核对,但不会重复收费。
- 没有最终 usage 时,流式文本、推理和工具增量只能用于输出 Token 的临时估算;输入缓存分桶要等 provider usage 才能补齐。
- 订阅、Code Plan、代理、云平台和 gateway route 没有独立单价时,按能唯一识别的底层厂商 API 价格做等价估算,不代表套餐实际扣费。

DeepSeek 官方快照

当前版本为 deepseek-official-pricing-2026-08-21,单价为每百万 Token 的人民币价格。高峰时段为北京时间 09:00-12:00、14:00-18:00,其余为闲时。
| 模型 | 高峰:命中 / 未命中 / 输出 | 闲时:命中 / 未命中 / 输出 |
| deepseek-v4-flash | ¥0.10 / ¥3.00 / ¥9.00 | ¥0.05 / ¥1.50 / ¥4.50 |
| deepseek-v4-flash-vision-exp | ¥0.10 / ¥3.00 / ¥9.00 | ¥0.05 / ¥1.50 / ¥4.50 |
| deepseek-v4-pro | ¥0.30 / ¥9.00 / ¥27.00 | ¥0.15 / ¥4.50 / ¥13.50 |

视觉模型的图片由 DeepSeek 换算成输入 Token;本项目直接使用 provider 返回的 Token 用量,不在插件内重复估算图片 Token。

已登记厂商

价格目录包含 DeepSeek、xAI、OpenAI、Anthropic、Google Gemini、Moonshot/Kimi、MiniMax、Mistral、Groq、Together、Fireworks 和 Cerebras。海外目录保留 USD 原币,并使用版本化汇率生成兼容的人民币金额;实时汇率只在用户手动查询时用于展示折算。

route alias(例如 openai-codex、kimi-coding、google-vertex、azure-openai-responses)会映射到底层公开 API 目录。无法唯一归属或尚未登记价格的模型会显示未知/不可用,不会套用 DeepSeek 价格。

本地数据与边界

- 发布包默认将账本写入 $DSH_HOME/mymeter/ledger.json,格式默认为 json;可在 dsh profile 配置中显式使用 ledgerFormat: append。
- JSON 与 append 都只允许一个 dsh 进程写入同一个 ledgerPath。切换格式时会保留 legacy/恢复/隔离文件,备份或清理时应将相邻文件作为一组处理。
- API Key、账本文件和余额请求只在 Host 侧;Client/Remote 只接收脱敏 DTO。prompt、completion、消息正文和工具参数不会进入账本或导出文件。
- 当前生产余额 adapter 只支持 DeepSeek 官方 /user/balance;余额不可用不影响本地费用账本。
- 价格目录随插件发布,不会自动联网热更新。仓库中的签名清单、HTTPS 下载和 SHA-256 校验目前只是库级能力,生产插件尚未接线。

文档导航

- 安装与使用:安装、首次验证、配置、凭据、更新、卸载、备份清理和排错。
- 计费口径:估算与结算、Token 分桶、峰谷价格、币种和目录解析。
- 价格目录来源与覆盖范围:厂商价格快照、route alias 和未知模型处理。
- 数据与隐私:本地数据、凭据边界、网络请求、删除方式和自更新权限。
- 常见问题:金额差异、余额、历史账本、账本格式和安装问题。
- 架构与实现:模块边界、事件流、账本、Remote 和构建发布。
- CHANGELOG:版本变更和验证记录。
- English README:英文首页。

状态与限制

当前版本已通过插件构建、类型检查、测试、包校验、tarball 消费者检查,以及隔离 dsh profile 的安装/Web/卸载/重装验收。仍需注意:

- 尚未使用真实 DeepSeek API Key 完成生产 usage/金额对账,也尚未用真实账户核对余额数值。
- 全局分析和导出依赖当前 dsh 版本提供对应 Remote 能力;旧版本会显示不可用。
- 多宽度自动化视觉回归、完整键盘路径和无障碍回归仍需补齐。

社区与许可证

欢迎通过 issue 或 PR 补充厂商价格、余额 adapter、真实对账结果、视觉/无障碍回归和文档示例。提交价格或余额能力变更时,请附上官方来源、快照日期和测试覆盖。

- 贡献指南
- 支持指南
- 安全策略
- 社区行为准则

dsh-cost-meter 采用 MIT License 发布。
预览分享卡片长什么样 ↓uruana33/dsh-cost-meter
分享 · DeepSeek Harness Hub
uruana33/dsh-cost-meter

实时统计各厂商 Token 用量并生成本地费用账本

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部