← 返回条目

DeepSeek-Balance-Whale-Widget · 使用说明

中文版:依据官方 README 翻译整理,保留原有结构与命令

DSH 小鲸鱼记账挂件(DeepSeek Balance Whale Widget)

DeepSeek Harness(DSH)Web 界面右下角的常驻挂件:小鲸鱼气泡图 + DeepSeek API 余额 + 今日已用 + 每轮对话消耗,并且泡泡内容可以完全自定义(点击序列、模块化排版、并列加权出泡、随机语句/随机图片)。标准 DSH bundle 插件,dsh plugin 一键安装,无需任何会话令牌。

⚠️ Codex 版小鲸鱼已迁至独立仓库 → (已安装用户无需重装;详见下方「两条分支怎么选」)

两条分支怎么选

本仓库现在只维护一条产品线(main,同一个包同时支持 DSH Web 与官方桌面客户端)。按你要挂在哪里选:

你要挂在哪用哪条分支安装方式
DSH Web 界面右下角(就是这个 README 描述的插件)main(默认分支)dsh plugin --profile web add dsh-whale-widget(推荐,装 npm 已发布版);也可以从本仓库装 dsh plugin --profile web add github:MeteorNOX/DeepSeek-Balance-Whale-Widget,但那样装的是 main 当前状态、不跟随已发布版本
官方桌面客户端(Electron)右下角main(同一个包)⚠️ 不能用 --profile web(桌面端读的是 desktop profile,CLI 也拒绝 --profile desktop)—— 在桌面端会话里让 DSH 自己装,见下方「官方桌面端(Electron 客户端)请先看这一节」
Codex 桌面应用(跟随 Codex 窗口、无独立网页)⚠️ 已迁出本仓库新仓库 · 最新版下载 · 已安装用户无需重装Codex 版迁移公告:本次迁移保留了开发历史、历代版本与作者贡献,并清理了旧图片中的非必要元数据(贡献者致谢见文末「致谢」)。后续更新、问题反馈与版本发布都在新仓库;反馈问题时请注明版本、系统和复现步骤,勿上传密钥、完整配置或未脱敏日志。

⚠️ 两条线互不兼容:Codex 版不能用 dsh plugin … add 装进 DSH 网页,本仓库的插件也不能在 Codex 桌面里运行。

⚠️ 安装方式二选一、别混用(npm 名 / github:)—— 它们是同一个包名,先后安装会并存冲突;已经是 github: 装的,要换 npm 名请先 dsh plugin --profile web remove dsh-whale-widget。

特性

记账与显示

交互

泡泡系统(核心)

提醒

音效 / 角色 / 图片

自定义 API(多厂商余额 / 额度)

除内置的 DeepSeek 余额外,可在「小鲸鱼记账 → 模型」里添加任意厂商;每个模型独立配置余额预警 / 今日预算 / 额度:

说明:并非所有厂商都提供「用 API key 查余额」的接口。硅基流动的余额接口已被官方下线(2026-08-11 更新公告:/user/info 自 2026-08-14 起停止服务,「后续将适时提供替代 API」,截至发版仍未见替代接口),火山方舟的余额 / 用量与阿里云百炼 / 百度千帆 / 腾讯混元一样属于各家云平台 AK/SK 签名的 OpenAPI,OpenAI / Anthropic / Gemini / xAI / Groq / Mistral / Together / Fireworks / DeepInfra / Cerebras 则根本没有公开的余额查询接口 —— 这些模板统一是「无余额接口 + 探活验证 key」,今日已用按会话事件估算。厂商的订阅额度接口(智谱 / Kimi Coding / MiniMax Coding / OpenCode Go)只对订阅套餐账号有效:Token 资源包账号调用智谱接口会返回「当前用户不存在coding plan」,这种情况请用上面的「额度(订阅 / 资源包)」自动统计。
模板只提供默认值:选完模板后可以随意改写接口地址与字段路径;留空的字段会继续沿用模板默认值(不会因为留空而失效)。

Codex 模式(本地会话统计)

ℹ️ 先分清楚:这一节说的是本插件读取本机 Codex 会话日志的能力(属于 main,就是把 Codex 当数据源),
与「Codex 版小鲸鱼」挂件(跟随 Codex 窗口的那个端口)是两回事 —— 后者已迁出本仓库,见「两条分支怎么选」里的「Codex 版迁移公告」。
⚠️ 限制:Codex 支持目前只是部分接口适配,本挂件不能安装到 Codex 里(它是 DSH Web 插件,Codex 仅作为数据来源被读取);订阅窗口没有真实订阅样本可验证,遇异常欢迎反馈。

挂件可以直接读本机 Codex 的会话日志统计 token 用量 —— 因此不限于 DSH 内部,你在 Codex CLI / 桌面版里跑的消耗也能看到。

目录结构

dsh-whale-widget/
├── package.json              # DSH bundle 插件元数据(dsh.bundle.patch 指向 cordis.patch.yml;顶层 icon 指向 icon.png)
├── icon.png                  # 插件列表图标(256×256 PNG,含透明;宿主读成 data URL 塞进 meta.icon,必须是正方形)
├── README.md                 # 本文件
├── cordis.patch.yml          # 插件挂载声明
├── lib/
│   ├── index.js              # 宿主侧插件本体(路由 + 记账 + 音效/图片/角色服务)
│   └── accounting.mjs        # 记账内核(定点金额运算 + 余额观测/校正账本)
├── assets/
│   ├── whale-widget.js       # 前端挂件本体(由宿主按 mtime 热读取)
│   ├── DSH2.png              # README 顶部展示图
│   ├── DSniang1.png          # 小鲸鱼本体(cut-out,气泡由代码绘制)
│   ├── DSniang02.png         # 备用整图(兼容旧版手动安装路径)
│   ├── rua.gif               # 随机台词/撒娇动图(可选)
│   ├── Ya1.mp3 / Ya2.mp3     # 预置音效「小黄鸭」按压 / 松开
│   ├── D1.mp3 / D2.mp3       # 预置音效「音效1」按压 / 松开
│   ├── minecraft-exp-orb.wav # 任务结束音内置默认音效(Minecraft·经验球)
│   ├── task-end-a.wav        # 任务结束音内置预设(A)
│   ├── bubble-petpet.gif     # 内置泡泡图:petpet
│   └── bubble-money1.gif     # 内置泡泡图:money1(余额预警默认内容的配图)
└── whale-widget-prompt.md    # 完整规格/维护提示词(面向二次开发)

运行时数据(都放在 $DSH_HOME,默认 ~/.dsh;用环境变量 DSH_HOME 可以改到别处):

文件 / 目录用途
.dshw-size.json挂件外观与开关(缩放、音量、音效组、峰值样式、吸附相关等)
.dshw-usage.json记账账本 + 按日余额观测/校正摘要 + 用量设置(任务结束音、余额预警、今日预算、每轮消耗提示内容,以及 events:按压 / 每轮消耗 / 提问 / 授权四个事件的音效选择、独立音量、冒泡配置;每轮消耗的自动关闭秒数存在 .dshw-size.json 的 turnCostCloseMs)
.dshw-usage.json.before-recharge-fix.bak旧格式账本备份(0.3.1 首次写入旧账本前自动创建;已存在则不覆盖)
.dshw-turn.json每轮消耗的 seq(避免热重载后前端把新轮次当旧轮次)
.dshw-bubble.json自定义泡泡配置(点击序列 + 模块库 + 点按角色推进队列开关)
.dshw-api.json自定义 API 模型注册表(厂商 / 凭据名 / 接口字段 / 自定义单价 / 额度与用量累计;不含密钥)
.dshw-usage-archive.json账本归档(超过保留期的逐轮明细与逐日汇总;明细 90 天/2 万条、逐日 365 天)
.dshw-codex.jsonCodex 本地会话统计缓存(按天/模型聚合 + 文件偏移;不含任何凭据)
whale-roles/自定义角色图 + roles.json 索引
whale-audio/音频片段 .wav + audio.json 索引(音效组/片段)
whale-bubble-imgs/泡泡图库图片 + bubble-imgs.json 索引

安装

官方桌面端(Electron 客户端)请先看这一节 ⚠️

桌面端读的不是 web profile。 官方桌面客户端用的是 desktop profile(%USERPROFILE%\.dsh\profiles\desktop),而 dsh plugin 命令行按设计拒绝碰它:

error: profile "desktop" is managed exclusively by the Electron application

所以下面「方式 A~D」里的 --profile web 命令对桌面端不适用 —— 按它装完,插件落在 web profile 里,而桌面窗口读的是 desktop profile,一个字也读不到。表现就是「右下角什么都没有(连 ☰ 也没有)、控制台也不报错」。

桌面端的正确装法:明确使用当前宿主内置的 plugin_manager。

在桌面客户端的会话里可直接说:

请使用当前桌面端内置的 plugin_manager 安装 dsh-whale-widget。先核对当前 profile 和是否已有同名插件;已有安装时先报告来源与版本。按该工具支持的操作完成后,告诉我安装结果及是否需要重启。

plugin_manager 的作用域是当前 profile(桌面端为 desktop),由宿主使用其自带的包管理器完成安装与挂载登记。需要固定版本时,将安装规格改成 dsh-whale-widget@。这条说明用于减少安装前后的无关探索(#194);不需要自行构造认证 cookie、调用底层 RPC 或改写宿主管理的 profile 文件。工具不可用或操作不受支持时,先说明缺少哪项宿主能力,不绕过桌面端限制改用 --profile web。

首次安装与升级的生效方式(#162):

命令行侧的 dsh web 使用自己的 web profile:更新后重启宿主,再在浏览器按 Ctrl+F5。

装完怎么自检(两条分别对应宿主半区与客户端半区):

桌面端界面里看不到插件版本号时,可以看 %USERPROFILE%\.dsh\profiles\desktop\package.json 的 dsh.profile.bundles 和同目录的 pnpm-lock.yaml。

下面方式 A~D 都是 Web(dsh web) 的安装方式。

方式 A:已有本插件的完整资源包(本地目录 / 压缩包)(推荐)

适用于别人直接发给你一个 zip,或你手上已有一份解压好的插件目录(目录里应有 package.json、cordis.patch.yml、lib/、assets/、README.md)。

# 1) 若是 zip:先解压到一个固定、以后不会移动或删除的目录(不要放临时目录/下载目录)
#    例:D:\Plugins\dsh-whale-widget
#    要安装的是「包含 package.json 的那一层」,不要多套一层同名目录

# 2) 确认关键文件都在(缺 assets/ 会导致没图、没声)
Test-Path "D:\Plugins\dsh-whale-widget\package.json",
          "D:\Plugins\dsh-whale-widget\lib\index.js",
          "D:\Plugins\dsh-whale-widget\assets\whale-widget.js"

# 3) 如果之前从 GitHub / npm 装过同名插件,先卸载避免版本冲突
dsh plugin --profile web remove dsh-whale-widget

# 4) 用绝对路径安装(路径含空格要加引号)
dsh plugin --profile web add link:D:\Plugins\dsh-whale-widget

说明:

方式 B:直接从 GitHub 安装

无需本地克隆,一条命令安装:

dsh plugin --profile web add github:MeteorNOX/DeepSeek-Balance-Whale-Widget

说明:

  $env:http_proxy="http://:"; $env:https_proxy="http://:"; $env:all_proxy="socks5://:"; dsh plugin --profile web add github:MeteorNOX/DeepSeek-Balance-Whale-Widget

方式 C:本地安装(从当前仓库)

在仓库根目录(package.json 所在目录)执行:

dsh plugin --profile web add link:.

说明:

  dsh plugin --profile web add link:D:\你的路径\DeepSeek-Balance-Whale-Widget

方式 D:发布到 npm 后安装

dsh plugin --profile web add dsh-whale-widget

给 AI 的安装说明(Web 使用;桌面端使用上面的 plugin_manager 提示)

请帮我安装插件 dsh-whale-widget。可能的来源有两种:GitHub 仓库
MeteorNOX/DeepSeek-Balance-Whale-Widget,或者我本地已经有这个插件的「完整资源包」。

先确认运行形态:如果当前是官方桌面客户端,请使用宿主内置 plugin_manager,
不要执行下面的 Web 命令,也不要自行构造认证/RPC或修改 desktop profile。

以下步骤仅用于 dsh web:
1. 确认 DSH 安装器使用的 pnpm 可用;若提示找不到 pnpm,先报告安装器所用路径和版本,
   按该 DSH 版本的安装说明处理,不直接假定需要全局安装或重装插件。
2. 在 Web profile 安装(按我实际拿到的来源任选一种):

   【来源一:从 GitHub 安装】
     dsh plugin --profile web add github:MeteorNOX/DeepSeek-Balance-Whale-Widget
   或从本地 git 仓库链接安装:
     dsh plugin --profile web add link:
   (注意:仓库根目录就是插件包,不要写成 link:.\dsh-whale-widget 这种带子目录的路径)

   【来源二:我本地已有完整资源包(zip 或已解压目录)】
   先确认「完整资源包」长什么样:一个目录,里面应当有
     package.json、cordis.patch.yml、lib/index.js、
     assets/(含 whale-widget.js、DSniang1.png、Ya1.mp3、minecraft-exp-orb.wav、task-end-a.wav 等)、README.md
   然后按下面做:
   a) 如果给我的是 zip:先解压到一个**固定、以后不会移动或删除**的目录,例如
        D:\Plugins\dsh-whale-widget
      不要解压到临时目录/下载目录/会被清理的位置;也不要多套一层——
      要安装的是**包含 package.json 的那一层**,不是外面那个同名压缩包目录
   b) 检查文件完整性(任意一条 False 就先告诉我,不要继续装):
        Test-Path "\package.json"
        Test-Path "\lib\index.js"
        Test-Path "\assets\whale-widget.js"
      并确认 package.json 里 name 是 dsh-whale-widget、带 dsh.bundle.patch 字段
   c) 如果之前从 GitHub / npm 装过同名插件,先卸载避免版本冲突:
        dsh plugin --profile web remove dsh-whale-widget
   d) 用**绝对路径**安装(路径含空格要加引号):
        dsh plugin --profile web add link:
      link: 是软链安装:源目录改了立即生效,但安装后不能移动/重命名该目录;
      移动后必须重新执行一次 add。若想按拷贝安装可用:
        dsh plugin --profile web add file:
      (file: 以后源目录改动不会同步,需要重新 add)

3. 如果报 pnpm 阻止构建脚本(allowBuilds 相关),先确认被阻止的是哪个包。
   本插件没有安装/编译脚本;不要因此放行所有依赖的构建脚本,按具体报错处理。
4. 重启 dsh web,然后 F5 刷新浏览器

安装后验证:
- dsh --profile web --dump-config 应该能看到 dsh-whale-widget 在 bundles 里
- curl http://127.0.0.1:3080/dsh-whale/balance.json 应返回 200 JSON(含 totalBalance)
- curl http://127.0.0.1:3080/dsh-whale/widget.js 应返回 200 JS
- curl "http://127.0.0.1:3080/dsh-whale/audio-fragment.wav?id=exp_orb" 应返回 200 audio/wav
- curl "http://127.0.0.1:3080/dsh-whale/audio-fragment.wav?id=end_a" 也应返回 200 audio/wav
  (用来确认资源包里的内置音效已随包就位;若是 404 说明 assets/ 不完整)

另外请检查 DSH 凭据里是否配置了 DEEPSEEK_API_KEY(没有就提示用户配置;如果用户是用 DSH 账号登录的,较新 DSH 上不配 key 也能取余额,**别把"没 key"当成故障**)。

凭据(安装后必读)

余额有两种取数方式(API key 优先,两者互不干扰):

不需要 DEEPSEEK_PLATFORM_TOKEN。早期版本的"实时·令牌"模式已下线,今日已用统一由小鲸鱼记账(余额差 + 会话事件)计算,零令牌开箱即用。

安全边界(0.3.15 起,请务必一读)

插件会把凭据交给谁、以及谁能改这件事的规则:

  1. 凭据只会发往"该厂商内置模板里写死的端点"。

自定义模型里如果填了一个不在该厂商模板内的接口地址(或者模板地址里用 {base} 指向你自己填的地址),插件默认不会把凭据发过去,而是返回一条明确提示。

  1. 配置与凭据的改动只能来自本机(回环地址)。

所有写请求(保存模型、写/删凭据、改外观设置等)如果来源不是 127.0.0.1 / localhost / [::1],一律 403。

  1. 接口地址不允许携带用户名/密码(https://user:pass@host/),凭据名只允许字母、数字与下划线。

添加自定义模型时,还会按需用到各自厂商的凭据名(都可不配,用到哪个配哪个):

凭据名用途
OPENROUTER_API_KEYOpenRouter 余额(/api/v1/credits)
MOONSHOT_API_KEYKimi / Moonshot 大陆站余额(人民币)
MOONSHOT_INTL_API_KEYKimi / Moonshot 国际站余额(美元,独立账号体系)
SILICONFLOW_API_KEY硅基流动 /v1/models 探活
ARK_API_KEY火山方舟 /api/v3/models 探活
ZHIPU_API_KEY智谱(订阅额度接口 / Coding 端点)
OPENCODE_GO_API_KEYOpenCode Go 订阅额度(opencode.ai/zen/go/v1/usage,鉴权为 Authorization: Bearer )
CUSTOM_API_KEY自定义 HTTP / OpenAI 兼容中转站
⚠️ 自定义模型面板里的「凭据名」决定密钥写进哪个 ref。换厂商时请确认这一栏跟着模板变了,否则新密钥会写进上一家厂商的凭据名里(覆盖掉原来的 key)。v679 起新增模型会自动跟随模板。

卸载

dsh plugin --profile web remove dsh-whale-widget

从旧手动安装升级

如果你之前按旧方式手动安装过(复制 whale-balance.mjs + 改 cordis.patch.yml),先清理:

$web = "$env:USERPROFILE\.dsh\profiles\web"

Remove-Item "$web\whale-balance.mjs" -ErrorAction SilentlyContinue
Remove-Item "$web\whale-balance.cjs" -ErrorAction SilentlyContinue
Remove-Item "$web\DSniang1.png" -ErrorAction SilentlyContinue
Remove-Item "$web\DSniang02.png" -ErrorAction SilentlyContinue

然后编辑 $web\cordis.patch.yml,删除这段旧补丁:

- insert:
    - id: whale-balance-widget
      name: ./whale-balance.mjs?v=1

如果里面只有这段,直接改成:

[]

清理后再执行上面的安装命令。

验证

dsh --profile web --dump-config | Select-String -Pattern "whale"

curl http://127.0.0.1:3080/dsh-whale/balance.json
curl http://127.0.0.1:3080/dsh-whale/size.json
curl http://127.0.0.1:3080/dsh-whale/widget.js
curl http://127.0.0.1:3080/dsh-whale/image.png
curl http://127.0.0.1:3080/dsh-whale/audio.json
⚠️ 关于上面这些 curl:全部 26 个 /dsh-whale/* 路由都已接入 DSH 浏览器信任栅栏(connection.requestRejection)。
因此不带会话凭据的裸 curl 会返回 401(伪造 Host 头则是 403)—— 这是预期行为,不是接口坏了。
想验证接口是否存活,看返回 401/403 即说明路由已注册且栅栏在工作;在浏览器里访问同一条路径(带会话)才是 200。
另外自 0.3.15 起,写请求(POST/PUT/PATCH/DELETE)还必须是本机来源(Host 为 127.0.0.1/localhost/[::1]),否则 403 —— 详见上方「安全边界」。

常见问题

  DSHW_TRUSTED_HOSTS=dsh.example.com,10.0.0.5:3080 dsh web

内容取自仓库 README,未做删改性总结。命令与参数以原文为准。