dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
Multi-provider (11) quota & balance glass card for the DSH sidebar footer — local fork of dsh-musage with SiliconFlow/Tavily/ZenMux/MiMo/Claude support
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 / deepseek-account | 余额(¥ / $) | 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 自动写入 ref CLAUDE_SESSION_KEY(官方 OAuth 用量端点,插件自动带
Anthropic-Beta: oauth-2025-04-20 与 claude-code UA)。手动方式:从 claude.ai
取 sessionKey cookie 值存入 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 三家(网页登录态凭据,普通用户无法手工提取):
为什么可以放心:
~/.dsh/musage-login/:登录态被保留(Cookie 过期后重登通常免输密码),
与你的日常浏览器完全隔离,可随时整个删除;conversation.input.right(composer 内联)→ sidebar.footer.action
(左下角侧边栏 footer,"移动访问"按钮上方,order -100)uiSession 服务的 current binding(主视图会话)——见 v1.3.0windowsHide: true
(dsh-subprocess-local/lib/runner-launch: windowsHide: platform === "win32")——
本意是隐藏控制台窗口,但 Windows 的启动显示状态继承让 GUI 子进程(Edge)的
首个窗口以隐藏状态创建(实测 IsWindowVisible=false,恢复需 ShowWindow(SW_SHOW)):
窗口自出现起在屏幕上与任务栏中都不可见——CDP 仍可连接、页面正常渲染
(区别于历史已修的两个独立问题:MiMo SPA 白屏 v1.6.1、「被主窗盖住」v1.6.2);
Page.bringToFront 只能改焦点、不能恢复显示;
经该 runner 链执行的 ShowWindow 实测也修不动(同机对照:直接 spawn 的
PowerShell 可修复且稳定保持)。node:child_process,显式 windowsHide: false)
——绕开 runner 链的隐藏继承,窗口从创建起正常显示(同机 A/B 实证:同参数、
唯一变量 windowsHide → true 隐藏 / false 可见);环境不允许
node:child_process 时回退 ctx.subprocess,并保留一次 ShowWindow(SW_SHOW)
修复作为回退路径兜底(会话 15s 时单次复查;脚本输出含 stuck 统计——调用被
静默拒绝时可见)。修复过程写 musage-window-fix.log(profile 目录内)便于排查。
仅 Windows 涉及(windowsHide 为 Windows 平台语义),其余平台全链不变。parseWindowVisibilityReport 纯函数用例(报告 / stuck 解析 / 旧格式兼容);
session-orchestration 经 __login.setNodeChildProcessForTests 注入 headless 包装,
direct spawn 路径保持真实浏览器覆盖。deepseek-account,
模型 DeepSeek-V41-Flash / V4-Pro)此前不在别名表内 → 卡片显示「未选中支持的 provider」。
实测该账号的充值余额即 api.deepseek.com/user/balance(与 DEEPSEEK_API_KEY 同账户同端点,
whale 组件的「DeepSeek 余额」走的就是这条链路:keyRef: DEEPSEEK_API_KEY + 同端点),
已把它并入 deepseek 别名组 —— 选中 Account 模型时卡片显示同一份余额。deepseek-account / modlens-deepseek-account → deepseek)。credentials.unset 公开 API;含 xiaomi 的兜底 refs),
不影响你自配的 API Key;清除后卡片立即回到「🔑 点击卡片登录」引导,
可重新走一遍一键登录(便于验证登录流程)。进行中的登录会话会被一并取消。POST /musage/login?action=logout&provider=<p>(与 start/cancel 同路由同鉴权,
仅同源回环可调)。parseLoginRequest(logout) + 客户端 canLogoutFor 用例。login?redirect=/?returnTo=… —— 用户登录成功后,账号域只把浏览器带到 /security
(账号中心),平台域 platform.stepfun.com 的 Oasis-Token 永远不会刷新,
探针恒 401 → 卡片永远拿不到 Step Plan Credit / 账户总览(实机现象:窗口停在账号中心、
卡片「已检测到凭证但尚未生效」空转)。account.stepfun.com/login?redirect=<平台页>&source_app=platform-cn
—— 登录成功后账号域按 redirect 把浏览器送回平台页并完成平台域 token 签发;
via.returnUrl(跨域换票 / 自愈的导航目标)同步改为该登录页(旧 returnTo 实测不触发换票)。returnTo 参数);stepfun 配置用例同步更新。left=158/top=0/520x760、hasFocus=false。修复:CDP 连接建立后调用
Page.bringToFront 把登录窗口带到前台(实测 hasFocus: false → true)。isAuthFailureMessage 用例(含 HTTP 4010 不误判)。console/balance
—— 该页是 SPA 空壳,服务端不重定向,要等客户端 JS 包加载执行后才跳小米账号 SSO,
期间 约 8-10 秒纯白无内容(弱网 / JS 失败则一直白屏)。实机反馈
「点击卡片打开网页是白屏」即此。platform.xiaomimimo.com/api/v1/genLoginUrl?currentPath=%2Fconsole%2Fbalance
—— 服务端直接 302 到小米账号 SSO:1s 内进入登录页、3-4s 表单就绪,
完全绕开 SPA 白屏期(同机探针对比:旧 URL 白屏 ~8-10s → 新 URL 无白屏)。
登录后回跳与 cookie 落域不变(callback/followup 与旧路径完全一致)。classifyLoginPage 纯函数用例 + MiMo loginUrl 回归用例。dsh/index.js):登录助手新增 StepFun(登录页 account.stepfun.com;
成功判定 = Connect-JSON QueryAccountBalance 试调自证,认证 = 整段 cookie +
从 cookie 提取的 Oasis-Token / Oasis-Webid 请求头——2026-10-01 逆向自官网
bundle 并经未认证 401 探针实证);curlFetch 扩展 POST / 自定义头 / body 支持
(新增 oasis 鉴权型);StepFun 余额响应附加 display.oasis
(credit / voucherPlan / voucher 等账户总览字段,失败静默不阻塞余额)。dsh/client.js):StepFun 卡片渲染 🧾 账户总览行(Plan/Credit/赠送);
缺数据时渲染「🔑 点击卡片登录读取 Step Plan Credit」引导;
canLoginAssistFor 语义调整为以 host 附着为唯一事实源(StepFun 成功态也可给登录入口)。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 据此给出登录入口)。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。dsh/index.js):新增 siliconflow / tavily / zenmux / xiaomi / claude
五家 PROVIDERS 条目与解析器(schema 对齐 Musage
同名实现);curlFetch 增加 cookie(整段 Cookie header)与 claude
(sessionKey + beta header + UA)两种鉴权形态。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)。用 scoped
ctx.inject(["uiSession"], …) 等服务就绪后注册,服务缺失时卡片占位不崩。
(root 作用域拿当前会话的另一条通道:useSessions + retainedBy.mainView 推导——
官方 layout 包 DocumentTitle 同款模式;详见 dsh/client.js 头注释第 5 条。)[data-slot="sidebar.footer.action"] 垂直 flex 列覆盖(卡片在按钮上方)。stepfun provider,走 GET https://api.stepfun.com/v1/accounts,
展示按量余额(CNY,含现金 / 代金券细分),复用 STEPFUN_API_KEY。step_plan/v1 下 usages/usage/quota/credits/subscription/balance
与 /v1/credits、/v1/subscription 全部 404)。卡片附一行"Step Plan Credit 用量仅官网可查"。dsh-musage 依赖为 github:Thedeergod666/dsh-musage(无版本锁定),
市场更新会覆盖二次开发。方案:改为独立本地包 dsh-musage-card,file: 安装;
registry 不存在该包名,永远不被覆盖。cordis insert id 用 musage-card(防与官方 musage 冲突)。dsh plugin --profile web add -w dsh-musage-card;或dsh-plugin 收录,市场自动同步);或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>"。pnpm install。注意:与官方
dsh-musage同时挂载会出现重复卡片(insert id 不同:musage-cardvsmusage),二选一即可。
dsh/client.js)改完刷新页面(F5)即可;host 半边
(dsh/index.js)改完需重启 DSH。pnpm 对 file: 依赖是复制安装——改源码后需在
profile 目录 pnpm install(或直接同步改 node_modules 里的副本)。node --test(全量自动发现;其中 cdp-integration 需要本机 Edge/Chrome,
无浏览器时自动 skip)。window.__ModuleLoader__.load + factory),
无构建步骤;dsh/index.js 侧为 ESM,__parsers / __login 导出仅供测试。docs/开发说明.md(若从作者机器迁移,见其 D:\deepseek工作区\musage-plugin-dev\)src-tauri/src/providers/*.rsMIT(见 LICENSE)。