Skip to content

fix(settings): 修复 WebUI 刷新模型列表按钮变灰及误报未填 Key - #463

Merged
su-fen merged 1 commit into
mainfrom
fix/webui-provider-models-refresh
Aug 13, 2026
Merged

fix(settings): 修复 WebUI 刷新模型列表按钮变灰及误报未填 Key#463
su-fen merged 1 commit into
mainfrom
fix/webui-provider-models-refresh

Conversation

@su-fen

@su-fen su-fen commented Aug 13, 2026

Copy link
Copy Markdown
Member

Closes #462

问题

WebUI 编辑已保存供应商时,「刷新模型列表」按钮变灰无法点击;部分路径下点击报「请先填写 Base URL 和 API Key」,但两者均已填写。

根因

WebUI 的密钥打码契约(redact_provider_credentials)决定浏览器端已存供应商的 apiKey 恒为空串、只有 apiKeyConfigured: true。而旧的 canFetchModels 按钮守卫与 handleRefresh 前置校验都要求密钥非空,在 WebUI 编辑已存供应商的形态下必然失败。

方案

协议ProviderModelsRequest 新增 provider_id(6)、optional bool is_full_url(7)。

桌面端(gateway_bridge.rs):请求 api_key 为空且带 provider_id 时,resolve_stored_provider_models_config 从本地库解出已存密钥/baseUrl/modelsUrl/useSystemProxy 发起请求——密钥全程不回传浏览器;且该分支忽略请求中的草稿 URL,只用已存配置,从根上杜绝"改个地址把已存密钥骗到任意服务器"的外泄面。

前端(ProvidersSection.tsx):

  • 新增 canReuseStoredApiKey 守卫:仅 WebUI + 密钥打码显示 + 草稿 baseUrl/modelsUrl/useSystemProxy 与已存配置完全一致时,允许空密钥点刷新(与桌面端兜底互为双层防线);用户改了任一字段则仍要求重新输入密钥
  • 刷新按钮只在请求进行中禁用,删除 canFetchModels
  • 错误文案更新为「请先填写 Base URL(或模型列表地址)和 API Key」

顺带补齐:WebUI 链路此前一直不传 isFullUrl(完整端点模式),模型列表端点推导会出错。现在完整端点的推导下沉到 Rust normalize_provider_full_url(与前端 deriveModelsBaseUrlFromFullUrl 逻辑镜像:优先截到 /v1/,否则去掉末段);请求未带该字段时沿用已存配置的 isFullUrl

精简:提取 parse_http_url 合并 provider_models.rs 三处逐字重复的 URL scheme/host/凭据校验。

测试

  • Rust:provider_models + gateway_bridge 相关 11 个单测通过(含新增:已存配置解析、类型不匹配拒绝、full-url 模式覆盖、嵌套 /v1/ 推导);cargo check 通过
  • Go:go build ./... 通过(pb.go 再生成)
  • GUI 前端 1664 测试全过;WebUI 566 测试全过(含新增 provider-model-refresh-button.test.mjs 锁定按钮禁用条件与复用守卫结构)
  • check:ui-boundaries 通过;biome 对触及文件无新增告警

安全考量

  • 已存密钥只在桌面端本地解出并使用,永不进入 WebSocket 回包
  • 空密钥复用要求草稿与已存配置一致(前端守卫)+ 桌面端忽略草稿 URL(服务端兜底),双层防密钥外泄
  • isFullUrl 有意不参与前端一致性比对:它只影响同一 host 上的路径推导,不改变密钥去向(有守卫测试锁定该决策)

WebUI 已保存供应商的 apiKey 恒为打码空串(密钥不下发浏览器),旧
canFetchModels 守卫与 handleRefresh 前置校验要求密钥非空,导致按钮
变灰、点击误报「请先填写 Base URL 和 API Key」。

- ProviderModelsRequest 新增 provider_id 与 optional is_full_url;
  空 api_key + provider_id 时桌面端从本地库复用已存密钥发起请求,
  密钥不回传浏览器,且该分支忽略草稿 URL 只用已存配置(防外泄)
- 前端 canReuseStoredApiKey 守卫:仅打码显示且草稿 baseUrl/
  modelsUrl/useSystemProxy 与已存配置一致时允许空密钥刷新
- 刷新按钮仅在请求进行中禁用,canFetchModels 删除
- 补齐 WebUI 链路缺失的 isFullUrl 语义:完整端点模式的模型列表
  地址推导下沉到 Rust normalize_provider_full_url(与前端
  deriveModelsBaseUrlFromFullUrl 镜像),未带时沿用已存 isFullUrl
- 提取 parse_http_url 合并 provider_models.rs 三处重复 URL 校验

Closes #462
@StackCairn
StackCairn marked this pull request as draft August 13, 2026 15:00
@github-actions

Copy link
Copy Markdown
Contributor

PR governance checks failed — this PR has been converted to draft.

  • UI change without screenshots: this PR modifies frontend code. Please add before/after screenshots or a recording under "Screenshots / preview" in the PR body.

Fix the items above, then click Ready for review to re-run the checks.

@su-fen su-fen added the governance-exempt Skip PR governance checks label Aug 13, 2026
@su-fen
su-fen marked this pull request as ready for review August 13, 2026 15:01
@su-fen
su-fen merged commit 3ba60f8 into main Aug 13, 2026
8 of 9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

governance-exempt Skip PR governance checks

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] WebUI 供应商设置「刷新模型列表」按钮变灰,已填 Base URL 和 API Key 仍提示先填写

1 participant