Repository navigation
Releases: Ztyss/dsh-llm-provider
Release list
v0.2.7
修 DSH NEXT 把宿主打成 resources/app.asar 之后桥接整体失效的问题。
症状
启动日志:
[warn] llm bridge 不可用,退化为纯计费模式:Cannot find package
'@deepseek-ai/dsh-launch-environment' imported from
C:\Users\39244\.dsh\llm-provider-bridge\llm-bridge\lib\index.js
Config(设置表单)拿不到,pi-ai 桥接整座不可用。把「启用最新版 pi-ai」拨回 OFF 同样起不来。
根因
官方 @deepseek-ai/dsh-llm-pi-ai bundle、它依赖的 8 个 @deepseek-ai/* 包、以及 DSH 自带那份
pi-ai,现在全在归档里。桥接层给 bundle 的每个 bare specifier 挂一条目录链接(Windows junction),
目标就是 .../app.asar/node_modules/...。
目录链接的目标由内核的对象管理器解析,而内核不认识 asar(Electron 的 asar 覆盖层只对直接
路径生效)→ 每条链必然悬空,existsSync 直接 false。
宿主进程内探针实证:
import('file:///…app.asar/…/dsh-launch-environment/lib/index.js')正常,8 个包全部 OK;existsSync(junction → asar 内目录)= false;- 悬空 junction 下 import pi-ai 子路径直接
Cannot find package '@earendil-works/pi-ai'。
所以不是归档读不到,是链的问题。
修法
包目录落在 .asar 里就不挂链,把桥接副本里的 specifier 直接写成归档入口的 file:// URL。
宿主自己就是这么加载官方 bundle 的——同一条路径解析出同一个模块实例,不会出现
「一份代码两个 LlmError / cordis」。
四处必须一起改:
syncBridgeLinks:归档 specifier 改写;解不出入口的才退回挂链(错误形态与改动前一致);
旧版留下的悬空链摘掉。probePiAi归档感知:归档候选不建链,生成一份把 pi-ai specifier 写成归档 URL 的探针。
不这么做,探针会靠链田上那条健康链蒙对(探针目录就在 bridge 下面,往上正好撞见),
把不合格的候选判成通过。- 副本从真源重新推导,不在现有内容上打补丁:改写一旦把 specifier 换成 URL 就回不了裸名,
ON→OFF→ON 往返时补丁式改写会让副本一直留着上一轮的 pi-ai URL,静默用错版本。 - pi-ai 需求改读真源(
bridgeRequirements/loadBridge):读副本的话,被改写后一条
pi-ai specifier 都匹配不到,会退化成「需求为空 → 所有候选 unverified 直接放行」,体检名存实亡。
顺带修 entryTarget 的模式键分支:只认字符串值,而真包的 "./providers/*" 是条件对象,
整条模式键都会被跳过。
验证
- 新增
test/bridge-archive-links.mjs(41 条断言,进npm test链):归档边界与字符串判定、
归档 specifier 改写、悬空链摘除、真目录仍挂链、幂等、入口解不出退回挂链、
ON→OFF→ON 往返逐字一致、副本被改写后需求仍读得到、归档 / 真目录候选的probePiAi。 npm test:exit 0,607 条 ok 断言,0 FAIL,18 个测试文件全过。- 真机往返:拨 OFF →
llm bridge active on pi-ai 1.2.0(归档里 DSH 自带那份);
拨回 ON →llm bridge active on pi-ai 1.3.0(安全区下载档)。 - 真机落盘:ON 档 5 条 pi-ai 裸名 + 8 条
@deepseek-aiURL;OFF 档 5 条 pi-ai URL;
两档@deepseek-ai都是 8 条 URL;安全区无.probe-*残留。
影响
纯修复:无行为变更、无配置变更。升级后重启即生效(桥接副本按源哈希刷新,改写幂等)。
@ztyss/dsh-llm-provider v0.2.6
修复
- 「测试」连官方默认端点:路由没写 baseURL 时回退 pi-ai 工厂的官方默认端点(目录 id 才有,如 zai-coding-cn →
https://open.bigmodel.cn/api/coding/paas/v4);目录外 id 仍如实回报不硬猜。 - 「添加模型」表单报错原位替换:全部表单内校验(ID 空/重复/已在目录/数值非法)写进表单自己的消息槽,原位替换测试结果并带红字样式;不再掉到编辑器底部的小字行。
- 删除自定义模型后清单页幽灵行:保存时就地剪除该路由名下不在新清单里的声明系详情键(adapter/目录详情不动,裸 id 兜底键仅指向被删详情本体时一并清)。
- 新增/删除保存后的陈旧状态粘住:行集改草稿制渲染(没动过草稿每次渲染从当前数据重算),保存时三层本地状态(详情/目录/plan)乐观更新——重开清单立即正确,不必等宿主秒级慢刷新。
- 模型选择器徽标缺失:选择器每次展开重拉模型详情图——设置页新增的自定义模型立即带视觉/推理徽标与上下文标注。
测试与工程
- 新增 test/pi-ai-endpoint.mjs(19 断言)、test/declared-prune.mjs(14 断言)、race-reopen-probe / form-error-probe / ghost-row-probe / selector-badge-probe 四个 UI 探针;npm test 链 24 个测试文件。
- patch-condition 真实 loader 定位机器无关化(DSH_CHECKOUT → devDependencies 解析,不再写死机器路径)。
- ui-harness 基建升级:mini-react v3(卸载清扫对齐真 React 卸载语义)、stub 快照语义、__lpDebug 仪表门。
升级后需重启宿主生效。
v0.2.5
修复
- deepseek 基础路由 base 声明按内核分派:0.2.4 在 0.1.5 系宿主上 deepseek 卡片死掉(未配置 key / 查询失败 / 没有凭据名)——base 声明改为条件表达式,桥接接管(0.1.5 系)才提供完整路由,0.1.7+ 返回
{}维持官方 deepseek-account 决策。判定与llm-pi-ai行禁用条件共用同一探测骨架(读宿主@deepseek-ai/dsh版本号)。 - 账户行 baseUrl 如实透传:glm / deepseek / minimax / zenmux 适配器此前把账户行 baseUrl 降级成
URL.origin(剥掉路径),导出 YAML 的baseURL:行同样丢路径。 - 同名手填行取数目录版优先:宿主为 custom 路由自产声明模型详情(无 source),qualified 键先命中会让目录收录的行仍显示可编辑状态。
- pi-ai-safe-install 测试在短路径用户名(
ZHUTIA~1→%7E1)下 ENOENT。
新增
- 模型选择器 modlens 包装组显示上游同样额度:
modlens-<上游>/deepseek-modlens的 chip、输入框旁当前额度、/model面板按上游账户取数(dot 状态点与配色一并跟上游)。 - custom 路由编辑模型按 baseURL 映射 pi-ai 目录候选:id 不在目录里的自定义路由(多把 key 的 custom zai)按 API 地址精确匹配同端点目录 provider,目录模型全部进候选清单;同名行以目录版元数据为准,手填独有条目保留,勾选保存才落盘。
v0.2.4:供应商卡片告警统一——短标签 + hover 全文,不再平铺报错
v0.2.4:供应商卡片告警统一——短标签 + hover 全文,不再平铺报错
自 v0.2.3 起 12 个提交。主线是供应商卡片上「错误 / 告警」呈现的统一重构:卡片上只留短标签和数字,一切全文只在鼠标悬停时出现(本版五条用户批注逐条落地,每处都有离线断言或 CDP headless 探针取证,红→绿)。
查询失败:详情 hover 化
- 详细报错改为 hover「查询失败」出现:chip 的 title 挂完整报错原文(如「API key 有效,但该 workspace 没有订阅 OpenCode Go(HTTP 403)」),不拼前缀——hover 目标本身就是这四个字
- 展开卡底部的报错行移除:查询失败的 log 不再在展开体平铺;凭据体检结论是处置建议不是 log,另行走告警通道
- 错误卡不再自动展开:卡片默认恒收起,「有错就自己弹开」的行为删除;状态由红点 + 红色短句表达
告警全部 chip 化(统一处理)
- err / warn / note 三类一套机制:由
headlineChips统一产出短标签 chip——「查询失败」(红)/「凭据告警」(红,多 provider 共用一把 key 的体检结论)/「账户不可用」(橙,欠费、未订阅套餐等业务提示);原文一律挂 chip 的 title,hover 即全文 - 两处平铺槽位删除:收起态的整行红字(截断省略号)与展开体底部的告警行都不复存在——收起与展开看到的是同一行 chips,信息一份不丢、一处不重
- 色调语义:err/warn 红(#d9534f)、note 橙(#d9a300)——提醒不是失败
- 与余量 chips 共存:告警 chips 排在余量/余额 chips 之后,5h/7d/30d 数字仍是主角
状态 chip 的 hover 说明(新)
- 「未配置 key」:hover 显示「还没有配置这个 provider 的 API 密钥——展开卡片,在「API 密钥」行填入并保存后即可查用量」
- 「无适配器」:hover 显示「插件还没有适配这个 provider,暂时查不了用量」;给插件作者的开发提示(note)依旧不下发给普通用户
- 中英字典同步(zh:凭据告警/账户不可用;en:credential alert/account unavailable)
修复与工程
- lib 产物合并漂移修复:合并提交里的构建产物曾被 git 行级合并成「两边源码各一半」的杂交文件(已安装产物与源码不对应)——以合并后源码重建替换;此后每轮合并核对安装指纹 == 本地构建
- LICENSE / README:补本仓库版权行;版本链同步
npm test全链 exit 0(453 断言,含 build 冷跑)
测试取证
- errhover-probe(16 断言):失败卡 chip.title == 完整报错;收起/展开均无平铺;err 卡不出凭据/账户 chips;状态卡 hover 说明;?errCard / ?statCard 夹具
- collapsed-alert-probe(12 断言):三颗告警 chips 顺序与色调(红/红/橙逐字面量比对 computed color)、title 全文、旧红行槽位
.pv_pcAlert= 0、展开体零告警行、展开互斥与箭头居中回归 - client-smoke(+16 断言):告警 chips 顺序/去重/色调/与余量共存、unknown-provider 的 note 不出 chip、状态 chip tip
升级说明
- 覆盖安装即可(GitHub 直装跟随 main 分支);无数据迁移,安全区状态(开关偏好、
.cookies.yaml、vendor-status)不受影响 - 重启 DSH 后生效
v0.2.3:状态持久化迁安全区 + 统一 Cookie 存储 + 添加面板批注落地
v0.2.3:状态持久化迁安全区 + 统一 Cookie 存储 + 添加面板批注落地
自 v0.2.2 起 17 个提交。主线是把「会跟着插件包被重装抹掉的状态」全部搬进安全区($DSH_HOME/llm-provider-bridge/),外加添加供应商面板与提示语的三轮用户批注落地(每处都有离线断言或 CDP headless 探针取证,红→绿)。
状态持久化迁安全区(重装插件零丢失)
- 「启用最新版 pi-ai」开关偏好迁安全区:vendor 状态文件从插件包内
vendor/status.json迁至$DSH_HOME/llm-provider-bridge/vendor-status.json——此前每次重装/升级插件,开关都被重置回 OFF(包管理器会整棵重建插件目录)。包内过渡版文件在首次读取时自动并入安全区后移除 - 状态读写统一走安全区一条路:修复迁移过程中「写安全区、读包内」的分裂——开关拨 OFF 实际写成功了、状态路由却读包内残留弹回 ON,表现为「按钮失效」(bridge 导出
readVendorStatus(),状态路由与启动检查统一走它) - 实证:设 ON → 物理删除插件包目录 → 从 tarball 重建 → 偏好存活
统一 Cookie 存储 .cookies.yaml(新)
- 单文件、可扩展:
$DSH_HOME/llm-provider-bridge/.cookies.yaml(点前缀隐藏,对齐.credentials.yaml习惯;只认这一个文件),范式对齐 credentials(version+ 扁平键表);键 = 凭据 ref 名(如STEPFUN_CONSOLE_COOKIE),新 provider / 新 cookie 直接加键;通用模块adapters/cookie-store.ts(解析容错手改、坏行不炸查询) - 旧版单槽会话文件自动迁移:
stepfun-console-session.json首次读取并入新文件后移除 - 种子指纹去重(写盘收敛):条目记
seedSha(种子凭据指纹)——同一凭据的后续配额刷新命中指纹即用存储值,不再把静态凭据反复写回。此前一次配额刷新 = 两次写盘 + 一次白做的续期 RPC,.cookies.yaml每次刷新都变;现在只在「重贴 Cookie」与「续期轮换」两种真实变化时落盘 - 碎片种子守护:种子必须含
Oasis-Token段——凭据里只贴了Oasis-Webid一枚的碎片不会覆盖已轮换的好 jar - 全新机器首存:bridge 目录不存在时自动创建
添加供应商面板(三处批注)
- 按钮门槛:「发现模型」「查询配置」改为 API 密钥与 API 地址都填了才可点(此前各只查自己那格)
- 地址锁死修复:custom-gateway 的 API 地址首次输入后不再变只读——可填条件从「当前值为空」(一打字就锁)改为「所选预设不带 baseURL」,半截输入可续打
- 取消 = 清空并收起:表单回初始空值,模型勾选 / Cookie 草稿 / 下拉展开态一并归零;此前只收起不清空,旧输入留到下次打开
- 取证:新增
test/ui-harness/addpanel-probe.mjs(CDP headless 驱动真lib/client.js,13 条 DOM 断言 + 截图,红→绿)
提示语与开关结论
- 「查询配置」提示通用化:去掉「(含 step_plan 的走 Step Plan 点数)」括弧——该按钮对全部 provider 出现,提示不应带单家专属内容
- 拨 ON 清旧结论:OFF→ON 后,上一次拨 OFF 的同步结论(「已在使用 DSH 自带的 pi-ai」)不再残留——ON 的进行中/终态都走开关行右侧文字
测试与开发流程
- 存储测试物理隔离:
stepfun-billing改DSH_HOME一次性临时目录——此前「挪走-恢复」式隔离与运行中的宿主在真实 bridge 目录上竞争(实际污染过真.cookies.yaml一次,真数据经旧会话文件完好恢复);真目录 hash/mtime 零触碰实证 - 环境态解耦:
bridge-candidates/pi-ai-probe的候选档 key 契约断言显式传'dsh'——无参调用读线上偏好,开关 ON 时多出的safe-*档会把断言打红(时红时绿的根源);pi-ai-probe失败时打印实际 key 列表 - dev-merge 内容守恒免重复全量:合并后树与刚复测的分支树逐位一致即跳过主线重复全量(
git rev-parse <branch>^{tree}比对),每轮流程省一次完整测试 - 全新机器首存:bridge 目录不存在时自动创建(此前首存会 ENOENT)
npm test全链 exit 0(含 build 冷跑 5.5s)
升级说明
- 覆盖安装即可;pi-ai 开关偏好、已下载版本、StepFun 会话全部无损迁移(首次刷新时自动搬迁)
- 重启 DSH 后生效
v0.2.2:StepFun 计费双通道 + provider 页面两轮打磨
v0.2.2:StepFun 计费双通道 + provider 页面两轮打磨
自 v0.2.1 起 28 个提交。一条并行 agent 线做完了 StepFun 计费/额度查询,另一条把 provider 编辑页与「添加供应商」面板按用户批注逐条打磨(每处都有 CDP headless 探针取证,红→绿)。
新增:StepFun 计费适配器(双通道,按 API 地址自动选)
- 钱包通道:
GET /v1/accounts查余额,balance / 现金余额 / 赠金三行 CNY;401/403 显式报错 - Step Plan 通道(baseURL 含
step_plan):QueryStepPlanRateLimit查套餐点数 →credit_buckets逐个成窗口(总量/剩余/百分比/秒级重置时间)+ 五小时窗 + 每周窗;WAF 指纹拦 node fetch,改走 System32 curl +-o文件输出(stdio:'ignore'绕开 electron 沙禁的管道 EPERM) - 控制台 Cookie 自动续期:会话段 30 分钟过期时调 passport
RefreshToken,用 27 天长效段轮换Oasis-Token,会话持久化到安全区stepfun-console-session.json——长效段内免维护;Cookie 过期按网关错误体分类(expired / illegal / embezzled)给人读的提示,不再静默降级 - 查询入口通用化:
BillingAdapter契约加queryConfigNeeded(baseUrl),host 按适配器求值后随AccountStatus下发;需要额外配置的(step_plan)出「查询配置」+ Cookie 编辑器,不需要的(opencode-go / deepseek 等)点按提示「无需额外配置查询方式!」 - match 判据只认 baseURL 官方域名(
api.stepfun.com):provider id 可改名、不作判据;CONSOLE_COOKIE凭据名只跟随路由 ID(id 是配置键不可改,apiKeyEnv 用户可改会漂移)
StepFun 额度标签语义(用户批注纠正 + 兜底重做)
- 套餐点数窗口名带 bucket 类型后缀(
Step Plan 套餐点数(bucket monthly)):后缀里的 month 命中 30d 是正确语义——那个套餐就是月度 plan(用户明确"就是要显示 30d")。曾一度误加Step Plan → Step前缀特例,已收回 - 兜底档统一
Remaining:原先是text.slice(0,4)截原名四个字,只会产出Step/Openc/GLM这类既非档位也非来源的乱码 - 兜底档悬停只给「余量 x%」:不挂档位(会拼出
Remaining余量)、也不挂窗口原名(会把 bucket 后缀那串噪声带回来);已知档仍是「30d余量 40%」
provider 编辑页 / 添加供应商面板(每处附截图批注 → 取证 → 修复)
- 聚焦描边:输入框聚焦从「border 加深 + inset 1px 同色阴影」(视觉 2px)收敛为 1px 深色 border,与协议下拉展开态完全同款
- 值列统一灰:自绘下拉的值文本改用 label-secondary,与其它值列一致
- 按钮不再顶行尾:「查询配置」「保存」压掉
margin-left:auto紧贴各自输入框(曾试过用固定输入框宽度强行对齐两个按钮,结果把框撑得比别的行宽 60px,已撤) - 下拉弹层:协议弹层外观逐字段对齐「供应商筛选」下拉(border 同 token、投影换
elevation-prominent) - 选中项:品牌色 + 加粗之外补浅灰底 + 行尾官方同款对勾
- 供应商下拉箭头:▸/▾ 文本字形 → 官方 caretSvg,与协议下拉同一只
- 未选供应商时四项全锁:路由 ID / API 密钥 / API 地址 / 协议 一概不可填;不可填字段渲染成 span 而非 input(readOnly)——宿主的黄色 focus 环只在可聚焦元素上出现,span 压根聚焦不了(比压 outline 根治)
- 按钮置灰语义:「发现模型」没选供应商或密钥为空即灰;「查询配置」API 地址为空即灰——与该按钮实际所需的前提对齐,不等点完才告知
- 按钮就位与对齐:发现模型 → API 密钥旁、查询配置 → API 地址旁;「添加到列表」左对齐
- 协议文案人类可读:
providerApiLabel()→OpenAI Completions/Anthropic Messages,添加面板与 provider 编辑页一致,不再裸露 api 串 - 删「密钥存为 …」行;「控制台 Cookie」标签改「Cookie」(标签列 72px,原标题折两行)
- 修一个自己踩的坑:不可填字段换成 span 后,空 span 没有行盒,高度从 34px 塌成 14px(
.pv_field补min-height:20px内容盒下限,三种形态一律 34px)
pi-ai 桥接
- 待生效的那一版若正是本次检查真下载来的 → 说「已更新 x.y.z(重启生效)」;文件早有、只是没在跑(原地启用)→ 「已下载」——不再两种情况都念「无需下载」且不提重启
测试
npm test 全链 0 失败;新增 test/ui-harness/rowpolish-probe.mjs(CDP headless 驱动真 lib/client.js,44 条 computed style / 几何断言 + 全页截图取证,覆盖上述每一处批注,红→绿可复现);local-patches / client-smoke 同步补窗口标签与下拉文案断言。harness 补宿主设计 token 替身(否则无 fallback 的颜色属性退化成 inherit,颜色断言恒真)。
安装:dsh plugin --profile web add github:Ztyss/dsh-llm-provider(走 main 分支,需重启 dsh)
v0.2.1
v0.2.1:「启用最新版 pi-ai」开关
设置页(Provider → pi-ai 桥接)新增 「启用最新版 pi-ai」toggle:让 dsh 的官方 pi-ai 适配器跑在从 npm 下载的最新版 @earendil-works/pi-ai 上,替代 DSH 自带的 0.85.1——pi-ai 出新版本、支持新模型时不必等待 dsh 发版。
功能行为
- 拨 ON = 常驻意图:立即从 npm registry 拉
dist-tags.latest的@earendil-works/pi-ai(sha512 校验 → 内置 tar 解压 → npm install 依赖闭包 → 桥接 import 需求体检),落盘安全区~/.dsh/llm-provider-bridge/pi-ai/<版本>/(插件包可被整棵递归删,下载的几百 MB 不放包里);重启后桥接软链指向自有版。每次启动也会检查一次:本地无就绪副本即自动补下载,有副本也检查更新、有新版自动下(updateDecision跳过「最新版 ≤ 本地已就位」;60s 防抖仅防 crash-loop) - 拨 OFF:重启后回退 DSH 自带版,已下载文件保留,再拨 ON 零成本
- 待重启现场推导:
piAiNeedsRestart(偏好, 安全区已就位版本, 当前跑的那档)纯函数推导——latest+有就位版+没在跑它 → true;latest+安全区空 → false;dsh+正跑安全区版 → true;其余 false。/provider/status直接喂推导值,不再落盘写入 needsRestart 标志 - 版本行即真相,文案只在开关行说话:
x.y.z(DSH 自带 / npm 最新 / vendor)标明在用哪份;开关右侧只在有进行/待办时说话(正在下载 / 已下载 x.y.z(重启生效)/ 已下载 x.y.z(重启后回退官方)/ 已下载 x.y.z(无法启用)/ 已下载 x.y.z(未启用))——原地启用那一态也照实说「重启生效」;明细行退场,只留版本行与常驻的未过检验原因。i18n 补bridge.stateOffPending(zh/en),删死键bridge.lastCheckAt。下载中 2s 轮询 - 只保留最新一个自有版本:loadBridge 选中新版、切换完成后才清旧版(当前进程绝不踩待删目录);体检不过自动回退,开关永远有兜底
- 闸门明示:最新版不高于当前时不再白下,结论写 status.json 并显示
稳定性修复
- 下载态永不收尾:
execFile('tar')默认 stdio 管道在 dsh 的 electron 沙禁下 EPERM、promise 永不 settle → 子进程显式stdio:'ignore' - Windows 解压失败:外部 tar 被 Node 直起时路径解析失败 → 改为纯 Node 内置 tar 解析(
src/tar-gz.ts,零子进程,含 stripComponents/路径穿越防护) - 失败原因被吞:lastCheck 补齐 reason,界面不再把真实原因显示成「未下载」
- npm cache 不常驻:cache 改放 tmpdir、装完即删;启动兜底清理安全区遗留
测试
npm test 全链通过(新增 tar-gz 二进制级 fixture + 真实 tarball 端到端、preference 门控——推导函数八个局面、safe-install 闸门、client-smoke 原地启用/待回退态文案等 40+ 断言);host-safety(整包零链接)/ link-removal / host-integration(降级模式)回归通过。
安装:dsh plugin --profile web add github:Ztyss/dsh-llm-provider(走 main 分支,需重启 dsh)
v0.2.0
v0.2.0
自 v0.1.3 以来的 57 个提交:模型思考档位全链路、目录外模型行内编辑、发现模型清单化三大特性落地,外加一批推理链路 P0 修复与界面打磨。
✨ 新特性
- 思考档位(reasoningEfforts)全链路:勾选编辑器 / 添加表单可视化配置思考档位(off/minimal/low/medium/high/xhigh/max + 自定义线值),内置 deepseek、glm、kimi、claude、grok、qwen、gemini、gpt/o 系家族档位表,按模型 ID 前缀智能预填(ba580e4, 2f952fe)
- 目录外模型行内编辑:点击模型 ID 直接改显示名 / 上下文 / 最大输出 / 能力,草稿制经「保存」落盘,compat 等手写字段原样保留;面板带同款「测试」实连按钮(d4e4e25, e72c0fb)
- 发现模型:一键探测网关模型清单,表格化勾选添加;跨 provider 补全能力 / 上下文 / 最大输出元数据(8709ded, f681864)
- 添加模型智能默认:留空自动按「精确匹配官方参数 → 已知模型最小档 → 保守常数」三级策略取值(e5f28b7, f0f898e, 1277a7d, 12310f8)
- 编辑面互斥闭环:展开 provider 卡 / 添加面板 / 模型框互斥展开,添加成功自动收起(6b00119, 5de4077)
- API 密钥始终可改:输入新值直接写回原凭据名,去掉「凭据名」行(29af3b7)
- 协议下拉自绘弹层:白底 / 圆角 / 投影 / 选中品牌色高亮,与页面视觉统一;输入框聚焦边框加黑加粗、不再套外圈 outline(6046a79)
- 页面级后台刷新用量期间,卡片 ↻ 按钮同步旋转(a5e8a99)
- Custom Gateway 路由 ID 改为建议值形态(2259cf0)
- 模型清单编辑器交互改版:草稿制 + 「保存」一次性落盘、每行 ✕、「还原清单」(12310f8, 2ca6fe7, db83fc7, 8d73d22)
🐛 修复
- P0 推理链路
- 目录外声明模型的推理等级选择不再锁死(1adb13b)
- 裸
reasoning: true保存时自动补齐缺失的 reasoningEfforts 档位表——修复模型选择器报session/model-unavailable: does not support reasoning effort "high"(81bd6d7) - 声明条目的 reasoning:true 点亮清单页推理徽标(c7d2edd);行内编辑推理勾选态取生效值(8503085)
- host
- 探测被 HTTP 400 拒的网关退回清单校验——opencode-go 特例(de9d42c)
- 补交漏提交的宿主端实连实现,在线宿主不再跑旧的清单探测(b8627af)
- 发现模型:落盘携带元数据,上下文 / 最大输出 / 模态不再丢失(449f805);自定义网关添加被官方校验整体拒绝的问题(a2a4ab9)
- 目录外语义:✕ 与添加默认值只认 pi-ai 目录来源,declared / adapter 详情不算目录收录(849000b, 334be59)
- 即时性:编辑模型保存后能力列立即更新(99a417a);打开模型服务不再被用量快照阻塞(1557d23);行内编辑保存后本地立即同步(d840154)
- 视觉细节:桥接页闪空框 / 切页签闪黑(77a2483, 7988682);协议下拉展开态边框收回 1px、弹层与输入框严格等宽(89893b3);模型框折叠态「模型(N)」竖向居中(0923505);目录外模型不再渲染「声明」徽标、能力列加宽 132px、K/M 整除口径 65536→64K、video 不写 input(641f7ae);编辑面板 / 弹层 / 按钮行各处对齐与呼吸距(9f3efe1, 0e8b173, a38f593, 3db4f20, 786d7e2, 5f8b940, f9f5750, 1a00655, e3939f1, 19d127d, daec73f, 8d73d22);模型选择器面板上限 360→560px(038c35b);清单「已添加」计数与卡片头对齐(80dad59)
- provider 编辑:端点 / 协议 / 凭据名不允许清空(显示名留空沿用路由 ID)、/status 回传实值(2cc131c, 351b120);Custom Gateway 路由 ID 改不了 / 清空吞显示(4f5f5b9, d647307)
- 桥接:pi-ai 体检探针
.probe-*用完即拆,不再在用户 DSH 主目录堆积(153726e)
🧹 维护
- harness 的 client.js 运行时副本改为 gitignore 不再跟踪(2b00d62)
- 全量测试与 headless UI harness 持续护航;新增探针:自绘弹层几何对齐(左右边缘差 ≤0.6px)、展开态样式、思考档位保存载荷补齐、行内编辑面板预填展示等