dsh-money
部署运维 活跃维护

dsh-money

yanhuifair/dsh-money

作为轻量级AI对话工具插件,可在对话或回复操作后实时展示对应API调用产生的费用明细,无需跳转后台查询,方便开发者随时把控模型调用成本。

0
Stars 标星
0
Forks 分支
0
Watchers 关注
0
Open Issues
TypeScript
主要语言
AGPL-3.0
开源协议
1.1 MB
仓库大小
1 个月前
最后推送
一键安装扩展 / 插件指令
dsh plugin --profile web add github:yanhuifair/dsh-money
git clone https://github.com/yanhuifair/dsh-money.git
git clone git@github.com:yanhuifair/dsh-money.git
README.md main

dsh-money

DeepSeek Harness 费用追踪插件 —— 实时显示账号余额、当前对话费用与每次回复费用,全部金额以金色(#f0c11d)标签(徽章)风格展示,估算费用带 ~ 符号。

License dsh npm pnpm

显示 DeepSeek Harness 账号余额、当前对话费用与每次回复费用
alt text

鼠标悬停能显示详细信息
alt text

插件形式加载
alt text

设置货币类型
alt text

功能

显示项 说明
账号剩余金额 调用 DeepSeek GET /user/balance 接口获取,60 秒缓存自动刷新,显示在侧边栏底部
当前对话费用 折叠会话日志中每条 assistant/message 的 token 用量,按官方价目表实时计价并求和
每次回复费用 逐条回复独立计价,以金色标签显示在回复按钮行右侧
工作区总费用 侧边栏每个工作区行显示其全部会话的费用总和

界面

  • 侧边栏底部余额余额 [¥ 110.00],位于设置按钮下方,金色徽章样式(背景只包裹文字),60 秒自动刷新
  • 侧边栏工作区行:每个工作区行右侧显示其总费用(如 ~¥ 8.72),悬停显示会话数与估算说明
  • 输入框下方统计行conversation.composer.dock):本对话 [~¥ 8.7188],金色徽章样式,30 秒自动刷新
  • 每条回复费用标签conversation.chat.assistant-actions):紧跟分支按钮右侧(时间戳保持最右),悬停显示模型与 token 明细(输入未命中 / 缓存命中 / 缓存写入 / 输出,全部带 token 单位)
  • 设置页 → General:可切换显示币种(自动跟随余额 / 人民币 ¥ / 美元 $)

显示约定

  • 金色:所有金钱文字统一金色 #f0c11d,圆角徽章(标签)风格
  • 估算符号:费用基于官方公开价目 × token 用量估算,统一加 ~ 前缀(如 ~¥ 0.0045);余额来自 API 为实际值,不加
  • ¥ 空格:人民币符号 ¥ 与数字之间带空格(如 ¥ 110.00);美元 $ 不带
  • 单位标注:token 数量统一带单位(1.2K token328 token);悬停明细中的费用行注明 (元,估算) / (美元,估算)

计价口径

基于 DeepSeek 官方价格页更新日期:2026-08,峰值价 = 空闲价 × 2):

模型 币种 缓存命中(空闲) 未命中(空闲) 输出(空闲)
deepseek-v4-flash ¥ / $ 0.05 / 0.007 1.5 / 0.22 4.5 / 0.66
deepseek-v4-pro ¥ / $ 0.15 / 0.022 4.5 / 0.66 13.5 / 1.98

价格来源DeepSeek 官方价格页(中文)/ Pricing 英文页

更新日期:2026-08(价格表在 packages/dsh-money/src/index.tsPRICES 常量中,官方调价时需同步更新并升级版本)。

单位:每百万 token。高峰时段 = 北京时间 9:00-12:00、14:00-18:00(即 UTC 01:00-04:00、06:00-10:00),价格翻倍。

账单口径:未命中输入(含 cache write)× miss 价 + 缓存命中 × hit 价 + 输出 × out 价。

⚠️ 费用为基于官方公开价目的估算值,不代表供应商最终账单。

计算流程

"本对话费用"、"每次回复费用"与"工作区费用"按以下 5 步计算:

  1. 读取会话日志:通过 sessionQuery.readSession(sessionId) 读取会话事件,只取 assistant/message 事件(每个事件 = 一次模型回复,含该次调用的 token 用量;工具调用、重试不会重复计数)
  2. 提取 token 用量:每个事件的 usage 为互斥计数——inputTokens(未命中输入)、cacheReadTokens(缓存命中)、outputTokens(输出,含思考)
  3. 逐条计价本次费用 = 未命中输入 × miss价 + 缓存命中 × hit价 + 输出 × out价(每百万 token,÷ 1,000,000)
  4. 峰谷判定:按该回复的时间戳判断——高峰时段(北京 9:00-12:00、14:00-18:00)三档价格全部 × 2
  5. 求和:会话内所有回复费用相加 = 本对话费用;同一工作区内所有会话费用相加 = 工作区总费用;单条即每次回复费用

计算示例(deepseek-v4-flash 空闲时段,CNY):

usage: input 736 / cacheRead 492,928 / output 816
费用 = 736×¥1.5/M + 492,928×¥0.05/M + 816×¥4.5/M
     = ¥0.0294224(≈ ~¥ 0.0294)

余额:来自 GET /user/balance 接口,是实际值(不加 ~);费用为估算值(带 ~)。

安装

说明:本插件是标准 DSH 静态插件(host 半段为 TypertRemoteService + @Remote,client 半段为 __ModuleLoader__ bundle)。npm i dsh-money 安装后,在 profile 的 cordis.patch.yml 挂载一行、重启 DSH 即生效,重启不丢失、不依赖任何技能或动态定义。当前版本 1.1.6

前置条件

  • 已安装并运行 DSH(DeepSeek Harness)Web 端
  • DeepSeek API Key 已配置(见下文「配置」;未配置则余额显示 ,费用仍正常计算)

第一步:安装 npm 包

方式 A(推荐):DSH 官方插件命令(需先安装 pnpm,见下方提示)

dsh plugin --profile web add dsh-money

该命令在 web profile 目录内执行 pnpm add dsh-money,自动完成安装并写入 profile 依赖。--profile 换成你的 profile 名(Web 端默认 web)。

方式 B:在 profile 目录手动安装

cd ~/.dsh/profiles/web
npm i dsh-money          # 或 pnpm add dsh-money

两种方式等价,装到 profile 的 node_modules 后 DSH 即可解析。若你的 ~/.dsh/profiles/web/node_modules 目前是空的(依赖实际由 ~/.dsh/profiles/node_modules 提供),安装前先确认该目录存在(mkdir -p node_modules 即可,DSH 重启时会自动维护依赖链接)。

pnpm 安装dsh plugin 与 DSH profile 依赖管理使用 pnpm。安装 pnpm:npm i -g pnpm(或 corepack enable pnpm)。若不想装 pnpm,用「方式 B」的 npm i 亦可。

如果不知道 profile 目录,执行 echo $DSH_HOME(默认 ~/.dsh),profile 即 $DSH_HOME/profiles/<名字>/(Web 端通常是 web)。

第二步:挂载到 profile

编辑 profile 目录下的 cordis.patch.yml(如 ~/.dsh/profiles/web/cordis.patch.yml),在顶层数组中追加:

- insert:
    - id: money
      name: 'dsh-money'

若文件原本是空数组 [],直接替换为上面内容即可。id 可随意(唯一即可);name 必须是 dsh-money

第三步:重启 DSH

重启 DSH(关闭进程后重新启动,或触发 profile 重载)。重启后刷新浏览器页面,插件即生效。

验证安装成功

重启后应看到:

  • 左侧边栏最底部(设置按钮下方):金色 余额 ¥ xx.xx 徽章
  • 侧边栏每个工作区行右侧:该工作区总费用(如 ~¥ 8.72
  • 对话框输入框下方本对话 ~¥ xx.xx
  • 每条 AI 回复的操作按钮行右侧(分支按钮旁):该条回复费用

任一项出现即安装成功。若全无显示,见「故障排查」。

直接 clone 仓库(开发)

git clone https://github.com/yanhuifair/dsh-money.git
cd dsh-money
npm install
npm run build            # 生成 lib/(typert 产物 + client bundle)

使用

查看费用

位置 内容 刷新
侧边栏底部 账号余额(实际值,金色徽章) 60 秒自动
侧边栏工作区行 工作区全部会话费用总和(估算,~ 会话变化时
输入框下方 当前对话累计费用(估算,~ 30 秒自动
每条回复旁 该次回复费用(估算,~),紧跟分支按钮右侧 新回复时

查看明细

  • 悬停每条回复的费用标签:显示该次回复的模型名,以及输入(未命中 / 缓存命中 / 缓存写入)、输出 token 用量(带 token 单位)与费用(元/美元,估算
  • 悬停侧边栏工作区费用徽章:显示工作区名、总费用(估算)与会话数
  • 悬停侧边栏余额:提示「账号剩余金额(自动刷新)」

切换显示币种

设置页 → General → “费用显示货币”,可选:

  • 自动(跟随余额):余额为美元则按美元价目显示,否则按人民币(默认)
  • 人民币 ¥ / 美元 $:强制按对应价目表计算并显示

⚠️ 币种设置保存在 DSH host 进程内(进程级记忆),重启 DSH 后恢复为“自动”。

费用含义

  • 余额来自 DeepSeek GET /user/balance 接口,是实际值(不加 ~
  • 费用基于官方公开价目 × token 用量估算(带 ~),不代表最终账单;计价口径与算法见上文「计价口径」「计算流程」

更新

# 官方命令(推荐)
dsh plugin --profile web update dsh-money

# 或手动
cd ~/.dsh/profiles/web
npm update dsh-money    # 或 pnpm update dsh-money

然后重启 DSH(host 进程内的插件代码才会换新)。cordis.patch.yml 的挂载行无需改动。

pnpm 供应链策略提示:pnpm 默认启用 minimumReleaseAge(新版本发布后短时间内不安装,防供应链投毒)。若 dsh plugin update / pnpm update 提示「Already up to date」而 npm 上已有更新版本,属正常——等发布期过后再更新,或临时用 npm update dsh-money 绕过。

发布节奏见 npm 页面dsh-money 包内有完整的 lib/ 构建产物(host 半段、client bundle、typert 清单),npm update 后无需额外构建。

卸载

  1. 删除 profile 的 cordis.patch.yml 中的 - id: money 挂载行(或整段 insert)
  2. 重启 DSH
  3. (可选)移除依赖:dsh plugin --profile web remove dsh-money(或 cd ~/.dsh/profiles/web && npm remove dsh-money

故障排查

现象 处理
页面无任何费用显示 ① 确认已用 dsh plugin --profile web add dsh-money(或 profile 目录 npm i dsh-money)安装;② 确认 cordis.patch.yml 挂载行拼写正确(name: 'dsh-money');③ 确认已重启 DSH 并刷新页面
重启后找不到 dsh-money(启动报错) 包未装入 profile 的 node_modules——重新在 profile 目录执行安装命令;不要用仓库内手动 symlink 替代
余额显示 DeepSeek API Key 未配置或不可用,检查「配置」;费用计算不受影响
费用全为 0 / 无 ~ 会话尚无 assistant/message 事件(新会话无回复),发一条消息后自动出现
币种不对 设置页 → General → 费用显示货币;重启后恢复“自动”为正常行为
更新后没变化 重启 DSH 了吗?host 进程内的代码需要重启才换新
启动报错 result codec is not backed by a zod v4 schema 本地开发时 zod 版本必须为 v4(typert 生成器/loader 依赖 zod v4 的 _zod 标记)。确认根目录与 packages/dsh-money/package.json 均为 "zod": "^4.x",然后 npm install && npm run build 后重启 DSH
web boot 报 dsh-money: pending (waiting for service: remote.moneyCost) 旧版 client bundle 未挂载 moneyCost 远端命名空间(remote.<ns> 必须由插件显式 ctx.remote.$mount(TYPERT_REMOTE) 才会创建)。升级到 ≥1.1.3(构建走 esbuild 打包 client,自动挂载);若仍复现,确认 profile 里装的是新包并重启
启动报 cannot get property "remote.moneyCost" without inject client 侧 ctx.remote.moneyCost 属性访问依赖该命名空间被 inject 绑定到当前 fiber 的 store(cordis 机制)。≥1.1.4 已修复:$mount 后经 ctx.inject(['remote.moneyCost'], …) 动态注入再启动 UI。升级并重启
侧栏余额/工作区徽章不显示(dock 本对话与回复标签正常) workspacesAll/balance 是无参 remote 端点,client 传了空对象 {} 会报 expected 0 argument(s), got 1≥1.1.5 已修复。升级并重启
余额标签背景占满整行宽度 余额行作为 flex 容器子项被默认 align-items: stretch 拉满。≥1.1.6 已修复(align-self: flex-start)。升级并重启

配置

插件自动读取已有 DeepSeek 配置,无需单独配置:

  • API Keyctx.credentials 服务(默认引用 DEEPSEEK_API_KEY),也可通过设置 llm-deepseek.apiKeyEnv 覆盖
  • Base URL:默认 https://api.deepseek.com,可通过设置 llm-deepseek.baseURL 覆盖(兼容网关/代理)

显示币种:设置页 → General → “费用显示货币”(见「使用」章节)。

开发

git clone https://github.com/yanhuifair/dsh-money.git
cd dsh-money
npm install
npm run build            # 生成 packages/dsh-money/lib/(typert 产物 + client bundle)

插件源码结构(monorepo):

packages/dsh-money/
├── src/
│   ├── index.ts        # Host 半段:MoneyCostService(TypertRemoteService + @Remote)
│   ├── types.ts        # Remote 边界类型(公开导出)
│   ├── client.ts       # Client 半段类型入口
│   ├── client.entry.js # Client 打包入口(esbuild 聚合 TYPERT_REMOTE + UI)
│   └── client.static.cjs # Client UI 实现(slot 注册 + 侧栏 DOM 注入)
├── lib/                # 构建产物(typert.host.js / typert.remote-client.js / client.js / index.js)
└── package.json        # dsh.client 声明 + ./typert ./remote 导出

许可证

GNU Affero General Public License v3.0 © yanhuifair

AGPL-3.0 是强 copyleft 协议:你可以自由使用、修改与分发,但基于本插件的修改版本必须同样以 AGPL-3.0 开源,并保留版权声明。

微信打赏

真的很需要大家的支持和鼓励
alt text