kelingfeng9/dshcj--packages-dsh-token-cost ↗★ 0

dsh-token-cost

Live DeepSeek token usage and CNY cost panel for the DSH Web chat header

Package
dsh-token-cost
Compatibility
Unverified
Version
0.1.0
License
MIT
Last updated
Nov 4, 2026

Other repositories with this package name

Install

This plugin has no verified bundle, or compatibility checks failed. Read the repository notes first. Read the full README ↗

DSH 插件:Token 用量费用 + 实时思考视图

两个面向 DeepSeek Harness Web 客户端(0.2.x,桌面版内置的 Web UI)的插件。它们都是纯客户端 UI 插件,宿主侧只有一个空的 apply(),用来让 Loader 拥有插件条目并把客户端 bundle 注入 window.__DSH_BOOT__。

公开索引: · 落地页:

插件作用入口
dsh-plugin-token-cost实时 Token 计量、按模块拆分、按 DeepSeek 官方 API 定价动态计算人民币费用会话标题栏 ¥0.0401
dsh-plugin-live-think实时思考工作视图、逐步回放、英文思考自动翻译成中文会话标题栏 思考 2

1. dsh-plugin-token-cost

标题栏的胶囊按钮显示当前会话的估算费用,生成中会带绿色脉冲点;点击打开右侧面板。

  • 账户余额:标题栏同时显示 余额 ¥12.34;面板顶部显示账户余额(充值钱包 + 赠送钱包)、更新时间和刷新按钮。通过宿主 ctx.remote.account.getBalance 读取平台账户,页面加载、面板打开后每 30 秒、以及每轮结束时刷新。
  • Token 计费桶:缓存未命中输入、缓存命中输入、缓存写入、输出,四项互不重叠。
  • 实时生成:正在流式生成时,用已到达的文本估算输出 token 与新增费用,并明确标注“预计新增”;provider 的 usage 到达后立即以真实值替换。
  • 上下文构成:系统提示 / 工具定义 / 对话消息的启发式估算条形图,另有窗口占用。
  • 按轮次统计:每轮的输入、输出与费用,当前轮以 ≈ 标记估算值。
  • 价格表:内置 Flash 与 Pro 的高峰/空闲价,可展开查看。

计价规则

价格来自 DeepSeek API 官方“模型 & 价格”页(人民币 / 百万 tokens,2026-11 抓取):

模型输入·缓存命中输入·缓存未命中输出
DeepSeek-V4.1-Flash-10170.02(空闲)/ 0.04(高峰)1 / 24 / 8
DeepSeek-V4-Pro-08130.15 / 0.304.5 / 9.013.5 / 27.0
  • 高峰时段:北京时间周一至周五 09:00–12:00、14:00–18:00;其余时间与周末为半价。
  • 面板按请求事件时间自动判断高峰/空闲。点击价格胶囊可在 自动 → 高峰 → 空闲 之间切换,用于中国法定节假日(插件不内置节假日表)。
  • 缓存写入没有单独价格,按缓存未命中计价。
  • 输出 token 已包含推理 token;若 provider 上报了 reasoningTokens,会在“输出”磁贴下单独显示。

数据来源

  • tokenUsage、contextBreakdown、contextPressure 三个 session projection;
  • 账户余额来自宿主 account Remote(ctx.remote.account.getBalance),浏览器只提交客户端版本、语言和时区偏移,不接触凭据;
  • Chat target 中每个 assistant-step 的 usage(按 turn/step、模型路由、事件时间);
  • 实时阶段用 assistant-step.blocks 中已到达的文本按中英字符混合比例估算。

2. dsh-plugin-live-think

点击标题栏 思考 N 打开一个常驻右侧的思考工作视图,工作过程中可以一直开着。

  • 实时流:按 turn/step 展示推理块,正在生成的步骤带脉冲和光标,自动跟随到底部;向上滚动会暂停跟随,滚回底部恢复。
  • 英文自动翻译(默认开启):检测为英文的推理会按句子/段落切块(约 420 字符一块)调用 Google 翻译的公开 CORS 端点,中文逐块替换英文;Google 不可用时自动回退 MyMemory。未完成的尾部保持原文,翻译完成后整段变为中文。每张卡片可单独切回“看原文”,顶栏“中文 / 原文”可整体切换。
  • 只在可见时翻译:长会话里只翻译进入视口附近的卡片,避免一次打开上百个步骤时发起数百个请求;滚动到旧步骤会自动补译。
  • 内置思考行也翻译:聊天里 思考 … 折叠行展开后,正文同样自动译成中文,并在顶部提供“看原文 / 机翻 / 重试”。折叠时的一行预览仍保留模型原始英文(聊天行没有暴露摘要插槽),展开后即为中文。
  • 逐步回放:切到“回放”后从第一步开始逐字显示,可暂停/上一步/下一步/重播,1× / 2× / 4× 调速;回放使用中文译文(若已翻译)并保留原文入口。
  • 原文始终保留:翻译只影响面板显示,不写入会话、不改变模型上下文。

翻译与隐私

  • 翻译在浏览器里直接请求翻译端点,不需要 API Key,也没有经过 DSH 宿主的转发;按 Bing Edge → Google → MyMemory 的顺序回退,Bing 优先是因为它在国内网络通常可达,Google/MyMemory 作为备用。
  • 这意味着被判为英文的推理文本会发送给 Bing / Google / MyMemory 中实际可用的那个服务;涉及私有代码或敏感信息时,把顶栏切到“原文”即可停止该视图继续发起翻译请求。原文和模型上下文不受影响。
  • 结果按文本块缓存在页面内(最多 600 条),同一段不会重复请求;请求全局串行并限速约 190ms/次。
  • 机器翻译可能改变 Markdown、公式和代码格式,已知限制会显示“机翻”标记。

从公开索引安装(推荐)

  1. 打开 DSH 侧边栏 Plugins;
  2. 右上角 More(Experimental plugins)→ 开启 Custom plugin markets;
  3. 进入 Discover,添加 https://kelingfeng9.github.io/dshcj/index.json;
  4. 搜索 Token Cost / Live Think 并安装。

索引使用固定 commit 的 Git 源,不需要 npm;安装后 bundle 会自动插入自己的 Loader 行。如果之前装过同名的本地开发版,先执行下面的卸载,避免两套按钮。

本地开发安装(可选)

本地开发版使用内部名 dsh-token-cost / dsh-live-think,市场版是 dsh-plugin-token-cost / dsh-plugin-live-think,两者不要同时安装。

克隆仓库后,安装脚本会把两个包软链接进 profile 的 node_modules,并在 cordis.patch.yml 末尾追加一段带标记的 insert 配置:

cd dshcj
node tools/install.mjs --profile desktop

脚本会:

  1. 备份 ~/.dsh/profiles/ /cordis.patch.yml;
  2. 创建 node_modules/dsh-token-cost、node_modules/dsh-live-think 两个软链接;
  3. 替换自己上次写入的 # >>> dsh-local-plugins 块(幂等,可重复运行)。

安装后刷新页面即可。 DSH 会热重载 profile 的 cordis.patch.yml,客户端启动图会在下一次页面请求时重新生成;刷新后会话标题栏会出现 ¥… 和 思考 两个按钮。若你的版本没有监听 profile 补丁(刷新后仍不出现),再退出并重新打开 DeepSeek Harness。

卸载:

node tools/install.mjs --profile desktop --uninstall

发布到插件市场

DSH 没有官方商店;市场是自定义索引源。本仓库已经准备好发布结构:

node tools/build-publish.mjs      # dist/packages/dsh-plugin-*(可发布的 bundle)
MARKET_COMMIT= node tools/build-market-index.mjs # market/index.json + docs/index.json

公开索引默认使用 Git 源(固定 commit + 子目录),不需要 npm 账号;也可以改成 npm 源。

发布名是 dsh-plugin-token-cost / dsh-plugin-live-think(dsh-token-cost 在 npm 已被占用)。 把 docs/ 托管到 GitHub Pages,在 Plugins → Discover 添加索引 URL 即可。 完整步骤、npm 可选路径、Git 源和上架检查见 PUBLISHING.md。

市场安装的 bundle 会自动插入自己的 Loader 行;如果之前用 tools/install.mjs 装了本地版,先执行 node tools/install.mjs --profile desktop --uninstall,避免旧名和新名两套按钮同时出现。

目录

dsh-plugins/
├── packages/                         # 本地开发包(名字给本机 profile 用)
│   ├── dsh-token-cost/
│   └── dsh-live-think/
├── dist/packages/                    # 构建出的市场 bundle(发布名)
│   ├── dsh-plugin-token-cost/
│   └── dsh-plugin-live-think/
├── market/                           # format 1 索引 + 图标(托管的静态站点根)
├── tools/
│   ├── install.mjs                   # 本地幂等安装/卸载
│   ├── build-publish.mjs             # 源码 → 可发布 bundle
│   ├── build-market-index.mjs        # 生成 market/index.json
│   └── extract-runtime.js            # 从 app.asar 抽取 0.2.1 运行时,用于隔离验证
├── docs/                             # GitHub Pages 市场索引(index.json + icons)
├── PUBLISHING.md                     # 发布到 npm/Git + Discover 的完整步骤
└── LICENSE

本地验证

两个插件在独立的 0.2.1 Web profile 上做过端到端验证(真实账号、真实流式生成、真实 usage、真实翻译):

# 1. 从已安装的 app.asar 抽取同版本运行时(约 200MB)
node tools/extract-runtime.js ./.dsh-lab/runtime

# 2. 首次启动会创建 profile
cd ./.dsh-lab
DSH_HOME="$PWD/home" node runtime/dsh/node_modules/@deepseek-ai/dsh/lib/bin.js --profile web --port 6099

# 3. 把插件装进这个测试 profile(另一个终端)
cd dshcj
node tools/install.mjs --profile web --dsh-home ./.dsh-lab/home

已知限制

  • 费用是估算:官方账单以 DeepSeek 控制台为准;失败请求、重试和 provider 未上报的 usage 只能按残差估算。
  • 余额是平台账户钱包:使用 API Key 而非 DeepSeek 账号登录时,account Remote 不可用,面板会显示“API Key 模式,余额请在控制台查看”;余额刷新有最长约 30 秒的延迟,且可能落后于实际计费。
  • 节假日:没有内置中国法定节假日表,节假日请手动把价格胶囊切到“空闲”。
  • 推理 token:部分 provider 响应不带 reasoningTokens,此时“输出”磁贴显示“含推理与回答”。
  • 翻译依赖公共端点:Bing / Google / MyMemory 都可能限流或不可达;失败时会保留已翻译部分并显示“翻译失败 / 重试”,重试只补未完成的片段。折叠状态下的英文摘要无法翻译,因为聊天行没有暴露摘要插槽。
  • 回放只针对已进入窗口的步骤:极老的历史需要先在对话里向上加载。
  • 两个插件都是纯客户端:不新增模型工具、不写会话、不改变 KV cache;翻译是独立的浏览器请求。

实现要点

  • 客户端 bundle 采用 DSH 的懒 CJS 工厂格式(window.__ModuleLoader__.load({id, factory})),无需构建步骤,直接由宿主的 /plugins 路由提供。
  • 通过 ctx.slots.inject('conversation.session.header.actions', ...) 把按钮注册进 Chat 的会话标题栏;useChat / useSession / useProjection 是 slot 标准 kit 提供的响应式数据源。
  • 两个插件都声明了 exports.inject = ['slots', 'locale'],因此会等待槽位与词典服务就绪;槽位由 ui-conversation 声明,数据由 ui-chat 提供,卸载任一上游插件都不会让本插件崩溃(按钮不渲染)。
  • 样式使用 body[data-ds-dark-theme] 切换亮/暗色,不依赖固定的深色背景。