Repository navigation
Releases: 133563825as-ai/dsh-api-dashboard
Release list
v1.7.0 — 兼容适配、保存修复与新模型补录
1.7.0:兼容、更新保护与已验收设置修复
- 适配 DSH 0.2.0-rc.2;本轮实际验收为 Android DSHA Web、Node24。保留原0.1.x声明范围,但不宣称旧宿主或全部桌面系统都已完整实测。
- 手机、平板、电脑浏览器响应式布局;子代理可切换“输入框下胶囊”或“看板分区”,详情改为单击分行显示;模型品牌放在子代理上方。
- 修复设置保存/读取响应提前关闭:控制JSON保持原始字节发送。用户真机确认正常,157次设置/更新读写均200并正常结束;丢回复仅只读确认,不重放未知结果。
- 修复身体大小持久化竞态、挂件设置页预览、开关回弹、看板留白与深色残留;当前版本优先本地显示。
- 更新前显示摘要、适配对象和范围;正式频道只跟已发布Release,服务端复核兼容性/版本/下载包,未知或不兼容拒绝覆盖。
- 修复轮询卸载代际、慢响应体超时、冷缓存、fork今日重复计费;官方DeepSeek读取已配置凭据引用,不复制Key。
- 价格继续手动维护,未加入自动价格更新。新增GPT-6.1 Sol、GPT-6 Sol/Luna、Claude Opus/Sonnet/Haiku5.5标准档参考价(models.dev与LiteLLM一致,但本次未直接取得官方原文)。长上下文、快档、地域、Batch等不在基础条目完整覆盖。
- Gemini3.8 Flash已有;Gemini4 Argon已找到官方发布信息,但本次未取得可核实API单价,不填猜测价。Carbon和Nano Banana2.1的状态及计费限制见价格文档。
安装
Android DSHA推荐下载下方 dsh-api-dashboard-1.7.0.tgz,使用原生插件管理器导入后重启Web GUI。电脑Web profile可执行 dsh plugin --profile web add dsh-api-dashboard;手机裸npm安装的既有布局限制见README,不当作通用保证。
35个发布前测试脚本通过,新增真实HTTP 48次读写回归。保持零dependencies,无preinstall/install/postinstall/prepare生命周期脚本。
价格证据与范围:https://github.com/133563825as-ai/dsh-api-dashboard/blob/v1.7.0/docs/PRICING-20261010.md
市场收录与权限:https://github.com/133563825as-ai/dsh-api-dashboard/blob/v1.7.0/docs/MARKETPLACE.md
权限与边界
插件读取已有凭据、访问平台/自定义余额API、写本地状态,并能备份替换本插件目录进行自更新;不修改DSH官方组件或清除对话。市场收录不代表独立安全审计。自更新仍使用备份后覆盖机制,不宣称断电原子性。
v1.6.9
v1.6.9 — 数字输入框「旧数字删不掉」+「测试提醒说发送失败」的真因分诊(真机反馈两条)。
① 数字框必须先写新数字才能删掉旧的(维护者原话)。三个数字框(刷新间隔 / 今日花销 /
重复提醒间隔)都在 onChange 里当场夹取:Math.min(Math.max(Math.round(Number(e.target.value) || 0), 0), 168)
—— 而 Number("") === 0,用户把旧数字删空的那一瞬 state 就变成 0,受控 input 立刻把 0 写回、
光标被顶到末尾,旧数字根本删不掉。
→ 拆成两步:输入期只剔非数字字符并允许空串(numberDraft,空 = 你正在改),
数值夹取推迟到失焦/保存(settleNumber)。顺手堵掉一个静默后果:保存时空串走 Number(x) > 0 ? x : 0
会变成 0 = 关掉重复提醒(alertRepeatHours)与关掉今日花销提醒 —— 现在空串一律回落到字段默认值
(重复间隔 6 小时 / 刷新 5 秒 / 阈值 50、10),绝不静默关闭。
② 「发送测试提醒」显示发送失败 —— 桥上没毛病,是服务端还是旧版本。
真机实测(App 在前台):/app/notify → 200 {"result":"FOREGROUND_SKIP"}、/app/toast → 200 {"result":"OK"},
v1.6.8 的 deliverAlert 走前台转 App 内提示这条路可以成功。
但插件文件更新到 1.6.8 之后、dsh 还没重启时:客户端半身已经刷新成 1.6.8(有按钮、有间隔输入框),
服务端半身仍在跑旧进程 —— 旧进程里根本没有 /api-dashboard/alerts/test 这个路由,
POST 打空 → 客户端一律显示「发送失败」,人就被带偏到系统通知设置那边去了。
→ 现在把「接口没打到」(404 / 响应不是 JSON)与「真的投递失败」分开报:
前者提示「服务端仍是旧版本(重启 dsh 后这个按钮才可用)」,后者才让人去查通知权限。
回归钉子:新增 test/test-number-input.mjs(32 条)——
纯函数边界、删除动作的中间态、三处输入框的接线(onChange 不许再夹取、必须有 onBlur),
以及渲染级复现:真的把 SettingsModal 挂起来、拿到初值 6 的那个框、手动触发 onChange({value:""}),
断言交给 setState 的是空串而不是 0(旧实现在这一条上必红)。
test-alert-plan.mjs 新增 C12/C13(stale 分诊 + 中英字典成对)、C2 改为钉「保存的是规范化后的值」;
test-v141-fixes.mjs 的 C1 拆成三条(输入期不夹取 + 失焦夹取下限仍是 1 秒),1 秒下限这条红线未动。
v1.6.8
v1.6.8 — 余额告警「没反应」的四个真问题(真机反馈:铃铛一直不响 / 响了也看不到)。
① 前台被桥跳过,却记成「已发送」:DSHA App 在前台时 /app/notify 回的是
200 + {"result":"FOREGROUND_SKIP"}(桥主动跳过,避免打断你正在看的界面)—— 旧实现只看 HTTP 200,
于是把它也计入 sent,设置面板显示「通道可用 / 已送达」,而你屏幕上什么都没有。
真机那条 15:30 的余额告警就是这么"消失"的,排查时还被这个假成功带偏到系统通知设置方向。
→ 现在按响应体分类(classifyBridgeReply):前台跳过 → 自动改发 App 内提示(Toast),
三种结果分开计数(sent 进通知栏 / skipped 前台转内提示 / failed),面板如实展示。
② 错过一条就彻底安静:旧策略是「跨档只提醒一次」。新增**重复提醒间隔(小时)**设置
(默认 6 小时,0 = 关闭、回到旧行为;上限 168 小时)—— 余额停在预警档时按间隔再提醒,
文案会带上「(仍未处理,再次提醒)」。判定抽成纯函数 planAlert(跨档立即发 / 低档按间隔重复 / 回到正常不发)。
③ 重启就重新轰炸:告警状态(上次档位 + 上次提醒时刻)改为持久化(alertState),
于是「6 小时冷却」在重启后依然有效,不再每次重启都把低余额平台重发一遍。
④ 收不到时不知道该去哪开:新增 「发送测试提醒」按钮(POST /api-dashboard/alerts/test,
前台自动落到 App 内提示,前后台都能自测),并在设置面板写明引导 ——
系统设置 → 应用 → DSHA → 通知:打开「允许通知」;部分机型还要在「提醒方式 / 通知类别」里选一项
(如横幅与声音),否则系统会把通知静默丢掉(真机实测:只开总开关、没选提醒方式时,通知栏一条都收不到)。
回归钉子:新增 test/test-alert-plan.mjs(34 条:planAlert 行为 / 桥响应分类 /
间隔消毒 / 中英字典成对 / 服务端字段与路由);test-v146-fixes.mjs 里那两条「只在跨档告警」的旧钉子
按下线处理并换成新契约,test-v141-fixes.mjs 路由闸门计数 13 → 14。
v1.6.7
v1.6.7 — 「今日总结」把当前会话算了两遍(真机反馈:只开着一个会话、状态条显示 ~¥1.26,今日总结却是 ¥2.53 —— 正好翻倍)。
根因:collectTodayCost 的取数顺序是 ① 先算自己(add2(selfState))→ ② 遍历宿主常驻会话 sessions.list() → ③ 扫投影缓存目录里的冷会话。
而 SessionStore.list() 返回的是全部常驻会话,当前这个会话就在里面。② 里旧代码只把 id 记进 seen 却照样 add() ——
seen 实际只挡得住 ③(缓存路径),于是当前会话被算了两次,今日花销 = 本会话 × 2.000。
seen 与 add() 之间没有任何判断。
修法:② 里先 seen.has(id) 再 add(顺手挡掉列表里的重复条目);stateOf 抛异常/返回空则跳过;
另加一道兜底 —— 万一 state.sessionId 缺失(拿不到 id),按对象身份(st === selfState)认自己,同样不再翻倍。
已知边界:没有 id 时认不出「缓存目录里哪份是自己」,那一份仍会多计一次(夹具 C4 钉住了这个边界值)。
回归钉子:新增 test/test-today-cost.mjs(12 条,临时 DSH_HOME 夹具,绝不读本机私有文件)。
这个数字从 v1.6.2 引入起零测试覆盖(全仓只有一处调用点)。新测试在旧代码上 9 条红,
其中 C1 报 8.52 期望 7.26(那 1.26 的差就是被多算的当前会话)。
v1.6.5
v1.6.5 — 状态条窄屏溢出修复(真机反馈:右侧「本会话消耗」被挤出屏幕,只剩个 ~ 卡在屏幕边缘)。
症状:手机竖屏(390 / 360px)且状态条内容较长时,右端的本会话消耗被裁掉;同一位置相隔两秒的两张截图表现不一致。
根因:状态条整条是一枚 white-space:nowrap 的 inline-flex 胶囊 —— .dshadb_barrow 虽然写了 max-width:100%;min-width:0,但「包住胶囊的那层 span」与 .dshadb_bar 本体都是 min-width:auto,四段内容(平台名 / 金额 / 峰谷 / 本会话消耗)的 min-content 就是全部文本宽度,压不动。总宽超过 composer dock 后内容直接溢出 barwrap(width:fit-content;max-width:100%),再被 margin:auto 居中,溢出量左右均分,右半截落到屏幕外被物理裁切。同一插件的子代理行没有这个问题,因为 .dshadb_subs 有 overflow-x:auto + 渐隐 mask —— 两行待遇不对称,缺陷就藏在这个不对称里。
修法:让「包住胶囊的那层」与胶囊本体都允许收缩,平台名先截断(省略号),金额 / 消耗 / 峰谷标记保住不缩。桌面端状态条本就是 fit-content、平台名不会被压到,零视觉回归。
test-bar.mjs 五条断言一起钉住(那层可收缩 / 本体可收缩 / 平台名可截断 / 三项不缩 / 禁止给 .dshadb_barrow 加 overflow-x)—— 少一条就复发。
.dshadb_barrow 加 overflow-x:auto 图省事 —— 会命中手机壳 dsh-web-mobile 的「真·横向滚动容器让路」规则(AGENTS.md ①),状态条的点击 / 长按行为会跟着变。
origin/main 与本地在宽度相关规则上逐字相同,git log -S fit-content 全历史只命中 v1.4.1 一次且早已在远端 —— 该缺陷自 v1.4.x 起一直存在,只是第一次被真机窄屏 + 长文本喂出来。排查时别去 diff「上一版是不是丢了修复」,方向就是错的。
v1.6.4
v1.6.4 — 状态条与上方用量统计行的间距收紧(v1.6.3 的收尾微调)。
两行之间原本空一截(维护者截图反馈「中间那个空白间隔有点多」)。间距来自宿主 composer stack 的
--dsh-composer-stack-gap(实测 6px),但不动那个全局变量 —— 它会连带改变宿主自己的排版。
只把 .dshadb_barwrap 的上边距改成 -8px(净留 2px 呼吸)。
test-v141-fixes.mjs 的居中断言继续要求「左右 auto + 上边距只允许负值」,
免得以后有人把它改成正数、又把空白加回来。
AGENTS.md 早就记过这一条,本轮又撞了一次。
v1.6.3
v1.6.3 — 今日总结(跨会话) + 台词扩写 + 峰谷标记误显示修复。
今日总结(看板抽屉顶部新增一张卡):
- 投影新增
byDay日桶 —— 按事件发生日(北京时间, 与峰谷判定同一套口径)切分用量。
⚠️ 重试触发替换槽位时, 日桶必须同步回退, 否则同一笔会被算两次(与当初峰谷分相同一个坑)。 - 跨会话汇总: 常驻会话读内存投影、冷会话读投影缓存文件, 按 sessionId 去重 ——
于是「今天花了多少」是所有会话的合计, 不是只有当前这个对话。 - 卡片内容: 今日花销(按币种分组, 不做汇率折算合并)、今日 token 总量、模型占比。
⚠️ 占比按 token 数算, 不按金额 —— 一个会话可能同时产生 CNY 与 USD, 按金额算占比就得折算,
而那正是 v1.3.2 明令禁止的 ×7 误差来源; token 才是跨币种可比的量。 stateVersion4 → 5(日桶是新状态字段, 老用户升级后首次打开会重放一遍会话)。- 设置面板新增「今日花销提醒」阈值(默认 0 = 关闭, 不打扰存量用户)。超过阈值时大肥鱼弹一次
「老大,今天花销已经超过 ¥# 啦,再花要变成穷光蛋啦...」, 同一天只弹一次(localStorage 记日,
切前台重载 webview 后不复发)。
⚠️ 钉子: 挂件还没建好时不能打「今天已提示」的戳记 —— 否则首帧判定时挂件是 null、戳记却已写下, 那句提醒永远弹不出来。
台词: 权重从「峰谷独占 55%(40 比一堆 1~10)」改成「峰谷 2 : 其余各 1」——
峰谷约占 18%、其余每 9%, 不再是点十次有五次播报时段。新增白饭系列 4 句与两组原创台词(卖萌日常 / 吐槽烧 token)。
修复 ②(维护者实测截图): 中转站卡片显示 $100000000.00 还带绿灯「正常」 ——
根因是 openai-billing 分支拿 hard_limit_usd(OpenAI 的账户硬上限设置)当余额, 而"无限制"时
它恒为哨兵值 1e8。本机实测 mimo.ezlook.top 的 /v1/dashboard/billing/subscription 返回
soft_limit_usd / hard_limit_usd / system_hard_limit_usd 全是 100000000、一个余额字段都没有,
而它同站的 credit_grants 是 404、api/user/self 是 401 —— 即该站根本没有余额接口。
现在只认余额语义字段(total_available, 缺则 total_granted - total_used), 拿不到就返回 null,
让 auto 探测继续试下一个端点, 全试完如实显示「该平台未开放余额查询」。
回归钉子: test-balance-guards.mjs 的 O1~O6 —— 其中 O4 专门钉住「真实 0 余额仍是 0, 不能被当成解析失败」。
修复: 没有峰谷计价的模型(glm / claude 等)在状态条上也被挂上 ☀️/🌙 ——
旧判定只看了全局的 config.isPeak(恒真的时段布尔), 没看当前模型是否真的走 DeepSeek 峰谷表。
现在投影额外下发 peakValley, 状态条据此决定显示与否。
v1.6.1
v1.6.1 — 🪙 平台一键去充值 + 告警通道「可见降级」补完(issue #2 问题 3 的界面那一格)。
一键去充值(平台详情里新增按钮):
- 16 个预设平台各配一个开放平台 / 充值入口,点一下直接去充值;无余额接口的品牌(OpenAI / Claude /
Gemini / Qwen / MiMo / 豆包 / 混元)同样配了 —— 余额红着脸却找不到入口最难受。 - 手机版 DSHA 必须走宿主桥:GUI 跑在 webview 里,
window.open(..., '_blank')开不出系统浏览器。
现在客户端请服务端用 App 桥/app/open去开,桥不在(桌面 / 浏览器)时回退新标签页。
对照 2026-09-27 的同类插件调研:dsh-balance-monitor/dsh-llm-balance/dsh-quota
三家都没有这一步,一律裸window.open。 - 🔒 新端点
POST /api-dashboard/open只认平台键,不接受任意 URL —— 地址一律由服务端查预设表,
客户端传什么都不影响结果。否则这就是现成的开放重定向跳板(谁都能拿它当你机器上的"打开任意链接"用)。 - 地址证据分三级、逐条写在源码行尾:已核实 8 个(官方帮助页正文直链且实测可达)/
未核实 5 个(无官方直链,但实测路径被系统接受)/ 仅首页 3 个(拿不到充值路径就只给一级域名)。
没证据的平台留空、客户端不渲染按钮 —— 不给一个点了会 404 的入口。
告警通道「可见降级」(issue #2 问题 3 收尾):
- v1.5.0 只注册了
/api-dashboard/alerts,客户端一次都没引用 —— 端点有、用户看不见,等于没做。
现在设置面板基础页多一行「余额告警通知」,四档表态:App 桥可用 / 通知发不出去 / 检查中 / 尚未触发过。
拉取失败显示「检查中」而不是「不可用」—— 别把网络抖动说成功能坏了。 - 服务端补主动探测:以前通道要真发过一次告警才有结论,在那之前恒为
unknown,
等于用户最想知道的时候偏偏查不到。现在第一次被问到时读.bridge_token+ 只读GET /app/version,
不拿/app/notify去试通知(那会在用户手机上真弹一条来"测通知")。
探测只跑一次、2 秒超时、不污染sent/failed统计(那是告警统计,探测不是告警)。
v1.5.0
v1.5.0 — 🐋 大肥鱼挂件音效引擎重做 + 桌面/平板适配并入主线(原 preview/desktop 分支,10 个预览提交)—— 两件事合并为同一个正式版。
桌面 / 平板适配(原预览分支的成果):
- 三档形态:手机全宽 / 平板(768×1024)居中面板 / 桌面居中对话框;断点带
(pointer:fine)分支,
并用min-height兜底(平板全覆盖,手机横屏不误伤)。 - 桌面档面板 720px + 平台卡片两列;无障碍补
role="dialog"+aria-label,
但绝不加aria-modal(手机壳有 46 条以它为前缀的结构性 CSS 会重排我们的面板)。 - 宿主侧栏竖线抑制(宽屏触屏档),以及第三方验证报告逐条处理:键盘避让 / 断点悬崖 / 内联高度退场。
install.sh支持DSH_DASHBOARD_REF装指定分支;CI 增加预发行 tag 不发 npm 的短路保护
(这正是此前v1.5.0-desktop-preview.*的 CI 全绿却查不到 npm 版本的原因)。- 合并方式:两条线分叉于
v1.4.2,而preview/desktop缺主线后来做的 v1.4.5 口径修正 ——
所以没有直接 merge(那会把节假日/峰谷分相一起回退),改用三方合并(base = 分叉点)只吸收其净增量。
client.js与src/index.js均零冲突,主线改动逐项复核未被回退(CN_HOLIDAY_RANGES/phaseBuckets/
Web Audio / provider 白名单 / 告警桥全部在位),23 个测试文件全绿。
音效引擎重做(对齐上游 v0.3.8 / v0.3.10 的两轮打磨)。
旧实现是 new Audio(url) 走 media element + HTTP,有三个通病:① 注册进系统「正在播放」—— macOS 上弹 Touch Bar 播放条;
② 起播要等 play() 的 Promise 与解码,点按不跟手;③ 部分机器的网络层(下载管理器 / IDM 之类)会拦 media 请求 → 静默无声。
现在主路径换成 Web Audio:预取 + 预解码到 AudioBuffer,命中缓存时在 pointerdown 的同一个任务里 start();
松手音按 RELEASE_LEAD_MS = 40 排到「按压音结束前」起播。Web Audio 不可用、或还没解码完时回退 media element —— 不会没声。
音效组 2 → 4(后两组是现有两组的按下/松开交叉配对,不动任何素材),未知音效组名回落 duck,Content-Type 按实际文件推导。
PROVENANCE.md —— assets/** 不在 MIT 覆盖内、明确「不授予再许可」。
我们 v1.1.0 移植早于该日期(当时仓库 MIT 覆盖全部内容),既有素材无过失;但此后上游新增的素材一个都没引入
(DSH2.png / DSniang02.png / bubble-petpet.gif / minecraft-exp-orb.wav / task-end-a.wav 等),
音效组扩展靠重新组合已有音效实现。这条边界已钉进回归测试 test-v150-whale.mjs。
v1.4.5
v1.4.5 — 消耗估算口径三处修正 + 价格表按官方原文重核。
① 峰谷按「事件发生时刻」计价:旧实现只在出数那一刻用 Date.now(),等于把整段历史消耗都按「打开面板那一刻」的时段算 ——
谷时跑的 token 在峰时查看会被翻倍(DeepSeek 峰谷差恰好 2 倍,也是本插件的主力模型)。现在按每条事件自带的 time 分相累积,
峰/谷各按对应单价求和(状态结构版本 3 → 4;读不到分相的老缓存自动回落旧行为,不会崩也不会显示错数字)。
② 法定节假日全天算谷时:官方英文定价页明文 excluding Chinese public holidays ... in full,2026 年 7 个假期共 33 天,漏掉会整体高估一倍。
③ 缓存写入单独计价:官方 Anthropic 一律 = 输入价 ×125%(Opus 5 $6.25/$5、Sonnet 5 $2.50/$2、Haiku 4.5 $1.25/$1 逐项吻合)。
另外把「点设置抽搐」修到底(同日三次):打开设置不再同帧卸载看板(两块全屏遮罩一换一那一下);
再修两处余震 —— 设置面板与看板两层遮罩同为 35% 黑、叠加后背景会渐暗到 58%(下层已有遮罩时本层背景设透明);
以及面板「高度随内容」而更新检查结果是异步插入的约 23px(bottom 锚定 → 上边缘往上跳),现改为固定高度槽位。
价格表:DeepSeek / 智谱 / 阿里百炼 / MiniMax / 阶跃 / Kimi / OpenAI / Anthropic / Google Gemini / xAI Grok / 小米 MiMo 十一家已逐条对官方原文核对,补录 40+ 条
(GPT-6 Astra、Claude Fable 5.1、GLM-5.3-FlashX、MiniMax-M3、step-5-preview、qwen3.8-max-prime 等);
修正 gpt-5.6-sol 为官方现价 $5/$30(旧值记的是促销价,官方页已无促销标记)、qwen-plus/qwen-turbo 缓存读价(旧值 50% 无官方依据,官方规则为输入 ×10%)、
glm-4-flashx 键名错配(旧表把 FlashX 的价挂在 glm-4-flash 上,而 glm-4-flashx-250414 一直落到默认价);标注已下线模型(moonshot-v1 全系、kimi-k2.5、qwen2.5-72b-instruct)。
Gemini 与 xAI Grok 已取证补录(同日续做,魔法网络打通后官方页可达):
Gemini 官方页逐条核对 —— 修正 3 条被误标「无缓存折扣」的缓存读价(gemini-3.5-flash-lite 0.3→0.03、gemini-3.1-pro 2.0→0.20、gemini-3-flash-preview 0.025→0.05,官方口径一律 = 输入 ×10%,前两条旧值高估缓存读 10 倍),
补录 4 条此前无键的模型(gemini-3.5-flash $1.50/$9.00、gemini-3.1-flash-lite、gemini-2.5-flash-lite、gemini-omni-flash);gemini-2.0/1.5 系官方页已不列,标注「未取证、仅旧会话占位」。
Grok 整段补录 —— 此前表内没有任何 grok 键,全部落默认价($1/$2,缓存读 $0.1):grok-4.7/4.6 真价 $2/$6(输出少算 3 倍)、4.5、4.3、4.20 三变体、grok-build-0.1(别名 grok-code-fast-1)全部按官方 Text API 表入库,
并用官方页面内嵌机读数据 __XAI_PUBLIC_MODELS__ 交叉验证(us-central-1 集群为其 US 区域端点价 = 标准 ×1.1,未入库)。
MiMo V2.6 补录 —— 官方当日(2026-09-22)发布的 V2.6 系列此前无任何键,落默认价(¥7/¥14):mimo-v2.6-pro ¥3/¥6、mimo-v2.6-flash ¥1/¥2、mimo-v2.6-pro-ultraspeed ¥30/¥60,
按官方按量付费页入库(V2.6 与 V2.5 实时档同价);同时标注 mimo-v2.5/mimo-v2.5-pro 北京时间 2026-10-21 10:00 下线(官方下线公告,无系统替换模型)。