DeepSeek Harness 插件

omdsh-usage

API spend at a glance for the DeepSeek Harness web GUI: this conversation, this project, and the account balance, beside the mode chip in Chat and Work and in the corner in Code(英文原文)

跳到安装方式

来源信息

GitHub 仓库
omdsh-plugins/omdsh-usage
最近更新
2026年8月20日
分类
界面增强
GitHub stars
0
载体类型
plugin
目录证据
上游声明已找到 dsh.bundle
证据路径
package.json#dsh.bundle
核对版本
0.1.0-rc.8
上游核对日期
2026-08-20

该证据由上游目录提供。本站没有安装、运行或安全审核这个插件。

安装

默认先复制一段 Prompt,让 Agent 读 GitHub 仓库和源码;需要自己装时再切到命令。

复制这段 Prompt,发给 DSH、Codex 或其他 Agent,让它先读 GitHub 仓库和源码。

请先不要安装或执行任何命令。阅读这个插件的 GitHub 仓库、README 和关键源码,然后用清楚、直接的方式回答以下问题,帮助我判断它是否适合我的需求:

1. 这个插件是什么,解决什么问题;
2. 适合哪些用户和典型使用场景;
3. 安装后如何使用,并给出一个最小使用示例;
4. 有哪些已知限制,以及隐私、安全、兼容性或维护风险;
5. 给出“推荐 / 有条件推荐 / 不推荐”的明确建议和理由。

请区分仓库明确说明、根据源码推断和未知信息。证据不足时请明确说明,不要猜测或照抄 README。

GitHub:https://github.com/omdsh-plugins/omdsh-usage
插件名:omdsh-usage
作者:omdsh-plugins

检查来源文件

安装前先看这个插件目录里的 README 和其他文件。

文件资源管理器4 个文件
README.zh.md来源说明 · 只读预览
README 语言

omdsh-usage

English | 中文

本次会话花了多少、这个项目一共花了多少、账户还剩多少 —— 三个数字,就放在 DeepSeek Harness 网页界面里 你本来就在看的那一行。

 Help   ⚙ Code mode   💬 0.023 ¥   📁 1.03 ¥   👛 964.15 ¥          Files  Terminal

ChatWork 模式下,读数在会话顶栏,就在 Chat Mode / Code mode 标签右边。Code 模式下整个会话列都变成了终端,没有顶栏可落脚,读数于是 挪到对面那个角上,正好在 Files 左边。(那一头的 FilesTerminalomdsh-sidepanel 的,不是 本插件的;把它们画在这里,是因为读数要退到它们的内侧。)

余额低于阈值(默认 10,按账户自己的货币计)时,三个图标一起变红;服务商报告 账户本身不可用时也一样变红,不管旁边那个数字是多少 —— 所以红色代表的是两件 事,而不是一件。高于阈值则完全不着色;余额压根读不出来也不算警报:没存密钥、 或者网络抖了一下,图标都保持本来的颜色,原因写在 tooltip 里。

它提供什么

界面从哪来
会话顶栏里那个三个数字的读数conversation.session.header.actions,ui-conversation 的操作行
没有东西画顶栏时,同一个读数落在框架的角上shell.overlay,ui-layout 公开的全框浮层
omdshUsage 这个按模型的 token 折叠sessionProjections.register —— 一个 projection unit,harness 每提交一个事件就驱动它一次并做 checkpoint
GET /omdsh-usage/summarywebServer,背后是和 /api 网关完全相同的浏览器信任检查
omdsh-usage 这个设置命名空间settings.register;插件中心要给本插件渲染配置页,靠的就是它

三个数字

读数含义
会话当前这个会话里所有模型调用的花费。
项目同样的口径,但把工作目录相同的所有会话加在一起。
余额服务商报告的账户余额,按服务商自己的货币。

鼠标悬停可以看到:这个数字背后的 token 数、其中有多少是空闲时段计费的以及 那部分花了多少、项目总额对应的是哪个目录、余额里有多少是赠送额度;数字缺失 时,也会说明原因。

本次会话花费 3.02¥,已计费 1.2M token(输入 1.2M,其中缓存命中 900k;输出 42k)。
其中 400k token 在空闲时段计费,这部分 1.01¥。

空闲时段那一句只在确实有内容时才出现:整段都在高峰时段跑的会话,和这个插件 从来没折叠过的会话,都只是少一句,而不是硬写一个两者都担不起的「0」。

单价,以及它是在哪个时段付的

harness 里没有任何价格,所以这个插件自己带了一份。随包附带的价格表是 DeepSeek 公开的高峰时段单价,2026-08-16 抄自 官方价格页

元 / 百万 token缓存命中缓存未命中输出
deepseek-v4-flash0.103.009.00
deepseek-v4-pro0.309.0027.00

空闲时段是上面每一项的一半,而且一天里大部分时间都是空闲时段:高峰时段是 北京时间 9:00-12:00 与 14:00-18:00(UTC 01:00-04:00、06:00-10:00),24 小时里 只占 7 小时。不看时钟的读数,会把一个通宵的花费整整多算一倍 —— 所以折叠在计数 的当下就记下每条消息属于哪一档(事件自带的时间戳是这个信息最后存在的地方), 折扣则在计价时乘到那一份上。

不过公开价格终究是「上周的事实」:单价会变,网关会打折,而你的账单是这段代码 永远读不到的唯一权威。所以这些都可以由你重新声明,位置在 设置 → 插件 → 插件中心 → 用量。面板把这个命名空间渲染成表单;部署方想自己 声明的话,就往 profile 的 cordis.yml 里写同一个形状:

omdsh-usage:
  currency: CNY
  rates:
    default: 0.3/9/27           # 缓存命中/缓存未命中/输出,每百万 token,按高峰价
    deepseek-v4-flash: 0.1/3/9
    deepseek-v4-pro: 0.3/9/27
  offPeakDiscount: 0.5          # 空闲时段的 token 按上面单价的一半计费
  lowBalance: 10

所有字段都是热生效的:改完价格,几秒后的下一次轮询就用上了,不需要重启任何东西。

字段含义
currencyCNYUSD。两个花费数字用它显示,价格表也按它解读。余额始终显示服务商自己的货币。
rates一个模型一行,"<缓存命中>/<缓存未命中>/<输出>",每百万 token,按高峰价。default 一行用来给表里没列出的模型定价 —— 它默认取两个公开模型里贵的那个,因为给没人定过价的模型多算一点,是更安全的方向。键可以是裸模型 id,也可以是完整的 provider/model
offPeakDiscount空闲时段的 token 按上面单价的几折计费:0.5 是半价,1 表示一律按高峰价。改了它,历史会话会立刻按新价重算,因为哪些 token 属于空闲时段早就记下来了。
lowBalance低于这个数值,三个图标一起变红。
apiKeyEnv余额查询用哪一个已保存的凭据 —— 填的是凭据的名字,不是密钥。默认 DEEPSEEK_API_KEY
baseURL从哪里读余额。指向和模型请求相同的网关即可。

价格行写得不是三个非负数字,会在写入的那一刻就被拒绝,而不是先存下来、之后 每次用到都失败。

高峰时段本身不是配置项,折扣才是。归哪一档必须在折叠运行的当下就定下来 —— projection 会把状态 checkpoint 下来,而且永远不会回头重看任何事件 —— 所以 时段如果读配置,同一个会话的两份 checkpoint 就会因为写入时刻不同而互相矛盾。 折扣只在计价时相乘,交给人来填没有任何代价。

它是怎么做的

其实绝大部分账都不是这个插件算的。会话日志本来就在每条组装好的 assistant 消息 上记录了 provider 用量,harness 的 projection 机制本来就会折叠并落盘每个会话的 状态。所以:

  • 折叠是一个 projection unit。 omdshUsageprovider/model 累计整份持久

日志的计费 token,并在旁边记下其中有多少是空闲时段计费的。harness 每提交一个 事件就驱动它一次并做 checkpoint,所以这些数字不受分页、压缩、重启影响 —— 一个 会话里换过两个模型、又跨过两档,就按四种单价算,而不是混成一个平均价。

  • 「这个项目」就是 checkpoint 表。 每个会话的 checkpoint 都连同工作目录一起

存着,所以项目总额是读几 KB 的 JSON,而不是去解压一整个目录的会话日志。

  • 余额是一次 provider 调用,走凭据接口,缓存一分钟,所有打开的标签页共用。
  • 钱是在 host 侧算好的。 浏览器拿到的是可以直接格式化的数字,从来不是需要自

己乘一遍的单价 —— 于是算法只有一份实现,没刷新的页面也不会拿上周的价格显示 花费。

两个落脚点,都是 harness 已经发布的 slot:顶栏用 conversation.session.header.actions,顶栏不在时由 shell.overlay 上的替身 顶上。替身靠测量决定站哪个角:会话列里还有 session header,就站前角;会话列 已经被别的东西占了,就站后角,并且退到那个角上已有控件的内侧。

会有三件事让它挪窝,其中两件 resize observer 看不见:某个模式接管会话列时, 是把会话换成了别的东西,框还是那个框;而角上多出一个邻居时,「内侧」在 哪儿变了,却没有任何尺寸变过。这两件事都是各自渲染器公开的锚点上的 childList 变动 —— 一个是会话 slot 的,一个是浮层的 —— 所以盯的就是它们。

少了别的东西时它怎么办

两半 inject 的服务 —— host 侧是 webServerwebRuntimesessionssessionProjections,页面侧是 slotssessionslocale —— 全是 harness 自己的,两个落脚点也都走 slots.inject。所以这个集合里没有任何插件是它的前提: 只装了它的 profile 照样能启动,读数也在。缺什么就说什么,而不是等下去。

  • 没有凭据存储,或者里面没有那个密钥。 两个花费数字不受影响;余额显示一横,

它的 tooltip 会说明是这两种情况里的哪一种。

  • 没有 session persistence 或 projection cache。 项目总额只涵盖这台 host 当前

打开的会话,而不是这个目录下跑过的每一个会话。

换成终端的是 Code 模式,后角就是为它准备的。没装它的时候顶栏一直都在,读数就 一直放在顶栏,替身只在会话还空着的时候顶一下。站哪个角本来就是量出来的 —— 这里没有任何一处去问谁装了什么。

安装

npx @omdsh-plugins/omdsh-plughub add omdsh-usage

这就是插件中心的安装器,只是 入口从按钮换成了 argv。它从这套集合的 registry 里解析出这个插件、从它的 GitHub 仓库装上,并把那条 pnpm 构建白名单写好 —— 裸的 dsh plugin add github:… 会把这一步留给你,而那条记录里带着 pnpm 解析出来的 commit,只能从报错里抄, 事先写不出来。

dsh plugin --profile web add @omdsh-plugins/omdsh-usage 现在还不是那条命令: 这个包不在 npm 上,pnpm 会回 ERR_PNPM_FETCH_404。同一次安装也可以是一个按钮 —— 只要 profile 里已经有插件中心,按钮就在设置 → 插件 → 插件中心里这个 插件的卡片上。

或者从本地检出装 —— 还没发布的构建就得这么来:

pnpm install && pnpm run build   # 本地路径安装不会跑 `prepare`,得先自己构建
dsh plugin --profile web add /path/to/omdsh-usage
dsh web

不需要别的。余额用的是 harness 本来就为模型请求保管的 DEEPSEEK_API_KEY,不用 再存一份密钥 —— 就算一个密钥都没存,两个花费数字照样能用,余额那一项会说明它 为什么空着。

卸载也走同一条路:

dsh plugin --profile web remove @omdsh-plugins/omdsh-usage

两半一起摘掉,顶栏那一行会把座位合拢。这个集合在任何方向上都不构成前提 —— 少了哪一个要付什么代价,见[少了别的东西时它怎么办](#少了别的东西时它怎么办)。

命令

pnpm install
pnpm run build
pnpm run typecheck
pnpm run test

提交的 manifest 固定指向已发布的 harness。要改成对着同级的 checkout 构建:

pnpm run harness:local ../../deepseek-harness   # 那个 checkout 需要先构建过
pnpm install
pnpm run harness:npm                            # 提交前务必执行 —— link: 是某一台机器的目录布局
pnpm run check:harness-pin

所有 spec 在裸 clone + 固定版本下都能跑:纯逻辑模块对 harness 只有 type-only 引用,需要 snapshot store 的那两个由外部传进去,而不是去 import 测试运行器根本 加载不了的浏览器 bundle。

已知限制

  • 比这个插件更老的会话没有按模型的折叠 —— 它们运行时还没有折叠这回事。这些

会话回落到 harness 自己的 tokenUsage projection,那里既不记模型也不记时钟, 于是按 default 一行、按高峰价定价 —— 两个方向上都取上界。数字里含估算时, tooltip 会说明。没有这个回落,项目总额会读成「你在这儿几乎没花钱」,那是更糟 的错误。

  • 被本插件旧版本折叠过的会话知道模型,但不知道档位。它已经落盘的 checkpoint

会保留而不是作废,里面的 token 一律按高峰价算,直到这个会话被重新打开 —— 那时 整份日志会重新折叠,档位就回来了。

  • 档位是按组装好的消息的时间戳判定的,也就是回复结束的时刻,而不是发出请求

的时刻。一个跨过北京时间 9:00 或 18:00 的回合会算到边界的另一侧;一个回合是 几分钟,而时段是几小时。

  • 冷会话最多滞后一个回合。 checkpoint 在 turn/end 落盘;屏幕上的这个会话是

活的,每次轮询都重新算。

  • 缓存写入按缓存未命中计价。 DeepSeek 就是这么算的,它的 adapter 也不上报单

独的桶;换成一个真的单独收费的 provider,这样算偏保守。