dsh-musage 的二次开发版 —— 挂在 DSH 侧边栏底部("移动访问"按钮上方) 的多 provider
用量/余额玻璃卡片:跟随当前会话选中的模型自动切换,剩余量进度条(5h 流动绿 / 7d 流动彩 / 长周期额度紫)。
发布到 npm 与 dsh-plugin 插件市场(见「安装」),也支持 file: 本地挂载(开发调试)。
| Provider(DSH route id 变体) | 显示 | 端点 | 凭据 |
|---|---|---|---|
minimax / minimax-cn / minimax-en |
5h / 7d 双窗口 | api.minimaxi.com/v1/api/openplatform/coding_plan/remains |
MINIMAX_CN_API_KEY 等 |
deepseek / deepseek-official |
余额(¥ / $) | api.deepseek.com/user/balance |
DEEPSEEK_API_KEY |
kimi / kimi-coding |
5h / 7d 双窗口 | api.kimi.com/coding/v1/usages |
KIMI_CODING_API_KEY |
zhipu / zai-coding-cn |
5h / 7d 双窗口 | open.bigmodel.cn/api/monitor/usage/quota/limit |
ZAI_CODING_CN_API_KEY |
openrouter |
余额($) | openrouter.ai/api/v1/credits |
OPENROUTER_API_KEY |
stepfun / stepfun-plan |
余额(¥,现金/券细分)+ 账户总览 | api.stepfun.com/v1/accounts / /api/…Dashboard/QueryAccountBalance |
STEPFUN_API_KEY;Step Plan / Credit 走网页登录态(可一键登录,见下) |
siliconflow / siliconflow-cn |
余额(¥,充值/总额细分) | api.siliconflow.cn/v1/user/info |
SILICONFLOW_API_KEY |
tavily |
已用 / 总量 credits + 明细 | api.tavily.com/usage |
TAVILY_API_KEY |
zenmux |
PAYG 余额($,充值/奖励细分) | zenmux.ai/api/v1/management/payg/balance |
ZENMUX_MANAGEMENT_API_KEY(sk-mg-v1-) |
xiaomi-token-plan-{ams,cn,sgp} / xiaomi / mimo … |
月总额 / 补偿 两行(套餐已并入月总额) | platform.xiaomimimo.com/api/v1/tokenPlan/usage |
浏览器 Cookie(key 实测被 401,自动退 Cookie;可一键登录,见下) |
claude / anthropic / claude-code |
5h / 7d 双窗口 | api.anthropic.com/api/oauth/usage |
sessionKey Cookie(可一键登录,见下) |
modlens-<provider>视觉包装路由会自动剥壳后映射到上游 provider。
-
API Key 类(前 9 家):复用 DSH 模型设置里已配的 provider key (DSH 规范:
<PROVIDER 大写去特殊字符>_API_KEY),无需重复填写。 -
小米 MiMo:需要浏览器登录态 Cookie(2026-10 实机:Token Plan API key 走 Bearer 会被 dashboard 端点 401 + loginUrl 拒绝;若命中了 key,插件会自动退 Cookie 重试一次)。 推荐用「一键登录」(见下节)——卡片失败态点击即自动打开官方登录页,完成后 Cookie 自动写入
XIAOMI_MIMO_COOKIE。手动方式:登录platform.xiaomimimo.com→ F12 → Network → 任一/api/v1/tokenPlan/*请求 → 复制完整 Cookie header 值存入 ref。 -
Claude:推荐用「一键登录」——点击卡片自动打开
claude.ai登录页,完成后sessionKey自动写入 refCLAUDE_SESSION_KEY(官方 OAuth 用量端点,插件自动带Anthropic-Beta: oauth-2025-04-20与claude-codeUA)。手动方式:从claude.ai取sessionKeycookie 值存入 ref。 -
Cookie 的存入方式(MiMo 兜底、Claude 必需):编辑
~/.dsh/.credentials.yaml追加一行 即可 —— DSH 凭据存储会观察外部编辑并热生效(不需要重启;值请用引号包裹):# ~/.dsh/.credentials.yaml(示例;与现有内容合并,勿覆盖) XIAOMI_MIMO_COOKIE: "api-platform_serviceToken=...; userId=...; api-platform_slh=...; api-platform_ph=..." CLAUDE_SESSION_KEY: "sk-ant-sid01-..."
-
Cookie 会过期(Claude 约 8 小时、MiMo 随登出失效):卡片显示 ⚠ 时重新复制一次即可。
对 小米 MiMo、Claude、StepFun 三家(网页登录态凭据,普通用户无法手工提取):
- 卡片显示 ⚠ / 🔑 / 「点击卡片登录读取」时 点击卡片;
- 插件弹出专用浏览器窗口(本机 Edge/Chrome),停在官方登录页;
- 你在窗口里正常登录(账号密码直接提交给官方站点,插件不接触);
- 登录完成 → 窗口自动关闭 → 卡片自动显示用量。无需 F12、无需复制、无需编辑文件。
为什么可以放心:
- 窗口是真实浏览器 + 真实官网页面(保留地址栏,可自行核对域名);
- 专用 profile 存在
~/.dsh/musage-login/:登录态被保留(Cookie 过期后重登通常免输密码), 与你的日常浏览器完全隔离,可随时整个删除; - 插件只在登录完成后经浏览器调试协议读取该站点的 Cookie,只写入 DSH 凭据库 (打开的是独立调试端口、仅回环地址,随会话结束关闭);
- 登录中直接关闭浏览器窗口 = 取消;30 分钟未完成自动收尾;
- 环境不支持时(未装 Edge/Chrome、企业策略禁用调试)卡片会提示失败原因, 仍可按上面的手动方式配置。
- 注册点:
conversation.input.right(composer 内联)→sidebar.footer.action(左下角侧边栏 footer,"移动访问"按钮上方,order -100) - 卡片化:半透明玻璃材质(backdrop-filter blur + 高光描边),明暗主题通用
- 剩余量倒数显示:已用% → 剩余% = 100 − 已用%(数值与进度条填充均为剩余量)
- 流动进度条:5h 流动绿、7d 流动彩、补偿/通用行流动橙(prefers-reduced-motion 自动停用)
- 会话来源:订阅
uiSession服务的 current binding(主视图会话)——见 v1.3.0 - 点击卡片立即刷新(60s 定时刷新保留)
- 登录助手(v1.5.0):小米 / Claude 失败态点击卡片 → 专用浏览器登录 → 自动写入凭据
- host 半边已扩展为 11 家(上游 5 家)
- Host(
dsh/index.js):登录助手新增 StepFun(登录页account.stepfun.com; 成功判定 = Connect-JSONQueryAccountBalance试调自证,认证 = 整段 cookie + 从 cookie 提取的Oasis-Token/Oasis-Webid请求头——2026-10-01 逆向自官网 bundle 并经未认证 401 探针实证);curlFetch扩展 POST / 自定义头 / body 支持 (新增oasis鉴权型);StepFun 余额响应附加display.oasis(credit / voucherPlan / voucher 等账户总览字段,失败静默不阻塞余额)。 - Client(
dsh/client.js):StepFun 卡片渲染 🧾 账户总览行(Plan/Credit/赠送); 缺数据时渲染「🔑 点击卡片登录读取 Step Plan Credit」引导;canLoginAssistFor语义调整为以 host 附着为唯一事实源(StepFun 成功态也可给登录入口)。 - 测试:95 用例 —— 新增 pickCookieValue / parseStepfunOasis / stepfun 配置纯函数 用例、StepFun 接口在线契约探测(端点漂移报警)、stepfun 卡片渲染仿真 4 用例。
- Host(
dsh/index.js):新增登录助手——CDP(DevTools 协议)客户端 (DevToolsActivePort 发现 / WebSocket 问答 /Network.getCookies读含 HttpOnly /Browser.close优雅关闭);登录会话单例(Cookie 轮询 → 试调用量 API 自证 →credentials.set原子写入 → 优雅关窗 → 缓存失效);新路由POST /musage/login(action=start|cancel)与GET /musage/login/status;失败响应附loginAssist标记 (client 据此给出登录入口)。 - Client(
dsh/client.js):失败态卡片显示「🔑 需要 XX 登录 · 点击卡片自动获取」; 登录中/刚成功过渡态文案;登录完成后自动刷新用量。点击分发与文案选择收在三个纯函数 (decideCardClick/canLoginAssistFor/loginNoteFor),可直接单测。 - 测试:
node --test(全量自动发现,82 用例)——新增 login-assist 30 用例 (纯函数:cookie 拼接/提取、marker 判定、浏览器探测、请求解析)、cdp-integration 2 用例(真实 headless 浏览器全链路:读 HttpOnly cookie 与 Browser.close)、 session-orchestration 4 用例(mock ctx + 真实浏览器驱动生产路由的会话编排: start/取消/关窗/dispose 清理;含同 profile 二次会话回归)、client-login 12 用例 (交互决策)。浏览器类用例无浏览器时自动 skip。
- Host(
dsh/index.js):新增siliconflow/tavily/zenmux/xiaomi/claude五家 PROVIDERS 条目与解析器(schema 对齐 Musage 同名实现);curlFetch增加cookie(整段 Cookie header)与claude(sessionKey + beta header + UA)两种鉴权形态。 - Client(
dsh/client.js):新增各家 route 别名与标签;新增通用百分比行pctRows渲染(MiMo 的 套餐/补偿/月总额 三行);余额行标签可定制(Tavily 显示"用量")。 - 测试:新增
tests/parsers.test.mjs(node:test,21 用例——5 家新 provider 的 正常/缺失/业务错误路径 + 既有家回归)。node --test tests/parsers.test.mjs。
- 注册点:
conversation.input.right→ 回归sidebar.footer.action(root 作用域, "移动访问"按钮上方,order -100)。v1.2.19 曾在 sidebar 上误判"root 拿不到当前会话" (只翻了 sessions store 快照找current字段)而把卡片临时挪到输入框旁——位置不对。 - 会话来源:
uiSession服务的 current binding(dsh-client-ui-session的UiSession.publishMain:优先保持上一次有效选择,否则取retainedBy.mainView>0的主视图会话;无会话时props.sessionId为 undefined)。用 scopedctx.inject(["uiSession"], …)等服务就绪后注册,服务缺失时卡片占位不崩。 (root 作用域拿当前会话的另一条通道:useSessions+retainedBy.mainView推导—— 官方 layout 包DocumentTitle同款模式;详见dsh/client.js头注释第 5 条。) - CSS:恢复
[data-slot="sidebar.footer.action"]垂直 flex 列覆盖(卡片在按钮上方)。
- Host:新增
stepfunprovider,走GET https://api.stepfun.com/v1/accounts, 展示按量余额(CNY,含现金 / 代金券细分),复用STEPFUN_API_KEY。 - 已知边界:Step Plan(Token Plan)的 Credit 用量没有 API-Key 认证的查询端点
(实测 2026-09-22:
step_plan/v1下usages/usage/quota/credits/subscription/balance与/v1/credits、/v1/subscription全部 404)。卡片附一行"Step Plan Credit 用量仅官网可查"。
- 背景:profile 中官方
dsh-musage依赖为github:Thedeergod666/dsh-musage(无版本锁定), 市场更新会覆盖二次开发。方案:改为独立本地包dsh-musage-card,file:安装; registry 不存在该包名,永远不被覆盖。cordis insert id 用musage-card(防与官方musage冲突)。
- npm 安装:
dsh plugin --profile web add -w dsh-musage-card;或 - 在 DSH 设置 → 插件 的「插件市场」搜索 dsh-musage-card 一键安装(GitHub topic
dsh-plugin收录,市场自动同步);或 - 让 agent 执行
market_install。
安装后重启 DSH。
- 把
dsh-musage-card目录放到任意位置(见下方 profile 依赖写法)。 - 编辑
~/.dsh/profiles/desktop/package.json:dsh.profile.bundles数组加入"dsh-musage-card";dependencies加入"dsh-musage-card": "file:<绝对路径,如 D:/dsh-plugins/dsh-musage-card>"。
- 在 profile 目录执行
pnpm install。 - 重启 DSH(host 半边)或刷新页面(client 半边)。
注意:与官方
dsh-musage同时挂载会出现重复卡片(insert id 不同:musage-cardvsmusage),二选一即可。
- 生效方式:client 半边(
dsh/client.js)改完刷新页面(F5)即可;host 半边 (dsh/index.js)改完需重启 DSH。pnpm 对file:依赖是复制安装——改源码后需在 profile 目录pnpm install(或直接同步改node_modules里的副本)。 - 测试:
node --test(全量自动发现;其中 cdp-integration 需要本机 Edge/Chrome, 无浏览器时自动 skip)。 - host 形态:手写懒加载 bundle 协议(
window.__ModuleLoader__.load+ factory), 无构建步骤;dsh/index.js侧为 ESM,__parsers/__login导出仅供测试。
- GitHub:https://github.com/Lin-Dongg/dsh-musage-card
- 开发说明 / 迭代记录:
docs/开发说明.md(若从作者机器迁移,见其D:\deepseek工作区\musage-plugin-dev\) - 数据 schemas 参考:Musage 的
src-tauri/src/providers/*.rs
MIT(见 LICENSE)。