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

dsh-token-cost

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

套件
dsh-token-cost
相容性
待驗證
版本
0.1.0
授權
MIT
最近更新
2026年11月4日

同名套件的其他儲存庫

安裝

此插件尚未提供可驗證的 bundle,或相容性檢查未通過。請先閱讀倉庫說明。 閱讀完整 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] 切换亮/暗色,不依赖固定的深色背景。