DeepSeek Harness Hub
← 返回列表

Lostlanterns/dsh-token-price

DeepSeek Harnessspec-screened在 GitHub 查看 ↗
未验证

DeepSeek HarnessDSH浏览器插件:在输入框下方常驻显示上下文剩余 token、当前所选模型及其官方…

尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/9/19 · 已提供中文文档

DeepSeek Harness 插件:在编辑器下方实时显示剩余上下文计量、官方模型定价和每会话成本。

综合分
30.7
GitHub 分
30.7
用户评分
★ Stars
1
周下载量
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add Lostlanterns/dsh-token-price
该插件未发布到 npm,走 GitHub 源安装(pnpm 若拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑)
数据截至 2026/9/20(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

dsh-token-price

DeepSeek Harness(DSH)浏览器插件:在输入框下方常驻显示上下文剩余 token、当前所选模型及其官方 API 牌价,以及本会话费用估算。

一次点击展开明细:面板是绝对定位的悬浮层,向上覆盖在对话区之上,不会把输入框顶起来,
带位移/缩放/透明度过渡动画;展开后点击面板以外的任何地方即收起。
牌价自动跟随官方价格页(Host 半边取数,失败退回内置表并标注原因)。
上下文与用量数据全部来自会话投影,不额外发起 RPC,不缓存业务数据。

界面上的样子

常驻在输入框下方(conversation.composer.dock,排在官方统计胶囊之后):

◔ 剩余 976K / 1M(2.4%) · deepseek-flash · 入 ¥2 · 缓存 ¥0.04 · 出 ¥8 /M(高峰) · 本会话 ≈ ¥0.0412

点击这一行,明细面板悬浮在按钮上方,覆盖住对话区(不挤占布局):

┌──────────────────────────────────────────────────────────────┐
│ 模型            deepseek · deepseek-flash(DeepSeek-V4.1-Flash)│
│ 上下文占用      已用 24.3K / 1M · 剩余 975.7K(2.4%)           │
│ ████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  │
│ 本会话累计用量   未缓存输入 12.1K · 缓存命中 96K · 缓存写入 0 · 输出 3.4K │
│ 费用估算        合计 ¥0.0412                                   │
│  明细          未缓存 ¥0.0242 · 缓存写入 ¥0 · 缓存命中 ¥0.0038 · 输出 ¥0.0136 │
│ 当前单价        高峰时段:缓存命中 ¥0.04/M · 缓存未命中 ¥2/M · 输出 ¥8/M │
│ 价格取 DeepSeek 官方 API 牌价(元 / 百万 tokens)……            │
└──────────────────────────────────────────────────────────────┘

占用率 ≥ 70% 转黄、≥ 90% 转红,环形图标与进度条同步。

快速开始

方式 A:动态 Cordis 插件(推荐,本仓库已实测)

不需要安装任何东西,在当前 DSH 会话里就能跑起来:

1. 把 dynamic/cordis-define.json 的内容作为参数交给动态插件工具(等价于把
dynamic/token-price.client.js 全文放进 code.client),先 define;
2. 对返回的 pluginId / packageId 执行 run;
3. 这是客户端 Package,需要你在 Run 卡片上点一次「允许」;
4. 授权后输入框下方即出现这一行。

动态插件是进程内的:DSH 重启后消失,重新 define + run 即可。

方式 B:npm 包形态(持久化安装)

package/ 是一个遵循 DSH 客户端插件约定的包骨架:

package/
├── package.json      # main + exports["./client"] + dsh.client 声明
├── lib/index.js      # 节点半边(空 apply)
└── lib/client.js     # 浏览器半边,__ModuleLoader__ 包装产物

DSH 的客户端模块系统会扫描宿主 Loader 的条目里声明了 dsh.client 的包,
把 exports["./client"] 指向的产物作为浏览器插件装载。因此持久化安装需要:

1. 把 package/ 放到你的部署能解析到的位置(例如某次 npm install 的依赖里);
2. 在你的宿主 composition(或你自建的 agent preset)里把它加为一行 Loader 条目。

⚠️ 这两种挂载位置都与具体部署有关,本仓库没有对这一路径做端到端验证;
方式 A 是已验证可用的。如果你在方式 B 上踩到坑,欢迎开 issue。

实现要点:悬浮、配色与左对齐

面板挂在 .dsh-tpw-float 上:position: absolute + bottom: calc(100% + 8px),
以 dock 根节点(position: relative)为锚点向上展开,因此完全脱离文档流——
展开时对话内容不会被挤动,输入框也不会位移。

- 配色:底色直接用输入框卡片的 var(--dsw-specific-input-major),描边色与投影也用同一套
(--dsw-elevation-stroke-color + --dsw-elevation-soft),所以它和输入框是同一张面。
- 对齐与居中:四个信息胶囊包在一个 shrink-wrap 的 .dsh-tpw-cluster 里,外层行用
justify-content: center 把它居中;悬浮层是这个 cluster 的子节点,于是 left: 0
就等于第一个胶囊(也就是按钮)的左缘——居中与左对齐同时成立,不需要任何测量。
面板宽度取 max(100%, 420px)(100% = cluster 宽度 = 四个胶囊总宽),
天然被输入框宽度兜住,不会溢出;--dsh-tpw-inset 则统一了行两侧留白与视口兜底。
- 层级:z-index: 30,足以压过对话区;容器链(composer stack / composer seat)均为
overflow: visible,不会被裁切。
- 高度:max-height: min(60vh, 420px) 并内部滚动,面板永远够不到视口顶部。
- 动画:面板常驻挂载,靠 opacity / transform / visibility 过渡进出场,
收起时 pointer-events: none + aria-hidden="true"。
- 点击外部关闭:展开时挂载一张 position: fixed; inset: 0 的全视口透明遮罩(z-index: 1,
低于悬浮层的 30),由它的 onClick 收起面板。点面板内部碰不到遮罩,所以不需要停止冒泡。
之所以用遮罩而不是全局监听:动态沙箱只暴露 ctx / React / host / styles / console,
没有 document,挂不了 document 级监听;而遮罩本身就是本插件 Fiber 里的一个节点。

数据从哪来

| 显示项 | 来源 | 说明 |
| --- | --- | --- |
| 上下文已用 / 窗口 / 剩余 | contextPressure 投影 | projectedTokens ?? pressureTokens 与 contextWindow;由 provider 上报的 usage 锚定 |
| 本会话累计四类 token | tokenUsage 投影 | uncachedInputTokens / cacheReadTokens / cacheWriteTokens / outputTokens,四桶互斥 |
| 当前模型 | modelSelection 投影 | 取 next ?? lastUsed 的 provider / model / reasoningEffort |

三个投影都通过 Slot 标准 props 里的 useProjection 读取,没有 Host RPC、
没有 JSON.stringify 实时对象、也没有跨调用缓存。

UI 只用主题 CSS 变量(--dsw-alias-)着色,跟随明暗主题;样式通过
styles.insert(css) 注入并挂在本插件 Fiber 上,停止插件即回收。

牌价是唯一走网络的部分,由 Host 半边单独负责(见下一节)。

牌价自动同步

官方牌价不需要手动改代码:Host 半边会去官方「模型 & 价格」页取数。

插件启动 / 每 30 分钟 / 点面板里的「刷新」
│  host.call('pricing', { force? })
▼
Host:6 小时缓存 → ctx.get('web').fetch(官方页面) → 解析表格 → 返回 JSON
▼
Client:优先用同步到的牌价,失败则回退到内置表,并在面板标注来源与同步时间

- 取数位置:Host(ctx.get('web').fetch)。客户端沙箱没有 fetch,也是为什么必须有 Host 半边。
- 缓存:同一 Package 内缓存 6 小时,并发调用合并成一次请求(pending)。
- 轮询:客户端每 30 分钟问一次;因为 Host 有 6 小时缓存,绝大多数时候只是读缓存,不会反复打官方页面。
- 手动刷新:面板底部有「刷新」按钮,强制绕过缓存。
- 解析失败即退回:官方页面改版导致表格认不出来时,解析器返回 null,
Host 回 { ok:false, error:'unrecognised pricing table' },客户端继续用内置兜底表,
面板如实写明「内置牌价 · 同步失败:…」——宁可显示旧价并标注,也不猜出一张错价表。
- 可验证:npm run check:pricing 会把 dynamic/plugin.host.js 当普通代码跑一遍,
用 Node 的 fetch 顶替 DSH 的 web 服务,在真实官方页面上核对解析结果、缓存、
强制刷新,以及「页面被换掉时是否优雅退化」。

⚠️ 这不是推送通知。DeepSeek 没有公开的牌价变更 webhook/RSS,
所以「自动更新」的语义是主动拉取官方页面:启动时一次 + 每 30 分钟一次 + 手动刷新。

内置兜底牌价

单位:元 / 百万 tokens,[空闲时段, 高峰时段]。这份表只在同步失败时生效
(离线、官方页面改版、web 服务不可用)。

| 模型 | 缓存命中 | 缓存未命中 | 输出 |
| --- | --- | --- | --- |
| deepseek-flash(DeepSeek-V4.1-Flash) | ¥0.02 / ¥0.04 | ¥1 / ¥2 | ¥4 / ¥8 |
| deepseek-v4-pro(DeepSeek-V4-Pro-0813) | ¥0.15 / ¥0.30 | ¥4.5 / ¥9 | ¥13.5 / ¥27 |

- deepseek-v4-flash、deepseek-v4-flash-vision-exp 作为别名按 Flash 计价。这条来自页面脚注的
纯文字说明,没有机器可读形式,只能写死在 MODEL_ALIAS 里。
- 高峰期=北京时间周一至周五 9:00–12:00、14:00–18:00;法定节假日无法从运行时得知,按空闲价计。
- 缓存写入按「缓存未命中」价计费。
- 未收录的模型只在价格位置显示「牌价未收录」,token 部分照常显示。
- 来源:DeepSeek 模型 & 价格。

自定义

| 想改什么 | 改哪里 |
| --- | --- |
| 内置兜底牌价 / 新模型 | PRICE_TABLE、MODEL_ALIAS |
| 同步地址 | dynamic/plugin.host.js 的 PRICING_URL |
| 缓存时长 / 轮询间隔 | CACHE_MS(Host)、SYNC_INTERVAL_MS(Client) |
| 显示位置 | apply() 末尾 slots.inject(...) 的 Slot 名,例如换成 conversation.session.header.utilities |
| 排序 | slots.register 的 order(当前 20,排在官方 stats 之后) |
| 单元格 id | id(当前 dyn-token-price;重用官方 id 会顶掉官方那一格) |
| 配色 | CSS 里的 --dsw-alias- 变量与回退值 |
| 动画时长/曲线 | .dsh-tpw-panel 的 transition/transform |
| 悬浮层宽度、与按钮的间距 | .dsh-tpw-float 的 width、bottom |

改完 dynamic/token-price.client.js 后运行:

node scripts/build.mjs
会重新生成 dynamic/cordis-define.json(host + client 两半)与 package/lib/client.js,
并对三者做语法校验。两个源文件都是唯一真源,产物逐字内嵌它们,不存在版本漂移。

npm run verify         # 产物体检:真源一致性、host/client 握手、无裸全局
npm run check:pricing  # 在真实官方页面上跑通 Host 半边的取数/解析/缓存/退化

已知限制

- 依赖 DSH 的 token-meter 投影。若某个 assembly 没装这套投影,插件仍会显示模型与价格,token 部分显示「上下文 —」。
- 上下文数字要等本会话首次模型响应之后才有值(投影由 provider 上报的 usage 锚定)。
- 费用是按 token 数估算,不是账单;缓存命中/未命中由 provider 上报的 usage 决定。
- 牌价自动同步靠轮询官方文档页,不是推送:官方没有公开的牌价变更通知。
页面改版会导致解析失败,此时退回内置表并在面板标注原因。
- 内置兜底表只覆盖 DeepSeek 人民币牌价;其他厂商的模型会显示「牌价未收录」。
- 持久化构建(package/)里没有 Package 私有 RPC,host.call 被替身为「不支持」,
因此自动同步只在动态插件形态下可用;持久化形态使用内置兜底表并在面板如实标注。

目录结构

.
├── dynamic/
│   ├── token-price.client.js   # 真源:客户端半边(可直接 paste 进 cordis_define)
│   ├── plugin.host.js          # 真源:Host 半边(取官方牌价 + 解析表格)
│   └── cordis-define.json      # 生成物:cordis_define 的完整参数(host + client)
├── package/
│   ├── package.json            # npm 形态清单(dsh.client 声明)
│   └── lib/
│       ├── index.js            # 节点半边(空 apply)
│       └── client.js           # 生成物:浏览器半边
└── scripts/
├── build.mjs               # 生成产物 + 语法校验
├── verify.mjs              # 产物体检
├── check-pricing.mjs       # 用真实官方页面验证 Host 半边
└── publish.ps1             # 一键 git init + gh repo create + push

贡献者

见 CONTRIBUTORS.md。

- Lostlanterns —— 需求、方向与验收标准
- DeepSeek Harness Agent(deepseek-flash)—— 实现与验证
(无 GitHub 账号,故不会出现在 GitHub 的贡献者图表中)

许可

MIT

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

💬 加入 DPharness 群聊

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

点击加入 QQ 群
DPharness 群聊二维码,手机 QQ 扫码进群
扫码进群