From ec3be471087c30994b1aeb66fc9c845e01ca8ae7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98=E9=98=BF=E6=B1=9F=28Relakkes?= =?UTF-8?q?=29?= Date: Thu, 16 Apr 2026 19:45:02 +0800 Subject: [PATCH] =?UTF-8?q?fix(desktop):=20provider=20=E6=BF=80=E6=B4=BB?= =?UTF-8?q?=E5=90=8E=E8=81=94=E5=8A=A8=E9=87=8D=E7=BD=AE=E8=81=8A=E5=A4=A9?= =?UTF-8?q?=E9=A1=B5=20currentModel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 切换模型供应商后聊天页底部选择器仍显示上一个 model, 要手动点一下才切过去。 根因: settings.json 的 model 字段 (explicit current model) 不会在 activateProvider/activateOfficial 时被清除, 但新 provider 的模型列表里 往往没这个旧 id, ModelSelector 就卡在"显示旧名字 + radio 不选中"的状态。 providerStore.activateProvider 成功后主动 setModel(provider.models.main) + settingsStore.fetchAll() 刷新 availableModels / currentModel。 activateOfficial 对应重置到 'claude-opus-4-6' (与后端 DEFAULT_MODEL 一致)。 Co-Authored-By: Claude Opus 4.6 (1M context) --- desktop/src/stores/providerStore.ts | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/desktop/src/stores/providerStore.ts b/desktop/src/stores/providerStore.ts index fb02d73a..e81d9e46 100644 --- a/desktop/src/stores/providerStore.ts +++ b/desktop/src/stores/providerStore.ts @@ -2,6 +2,7 @@ import { create } from 'zustand' import { providersApi } from '../api/providers' +import { useSettingsStore } from './settingsStore' import type { SavedProvider, CreateProviderInput, @@ -10,6 +11,11 @@ import type { ProviderTestResult, } from '../types/provider' +// 与后端 src/server/api/models.ts 的 DEFAULT_MODEL 保持一致: +// 切回"官方"时把聊天页的 currentModel 重置到这个,避免残留第三方 provider +// 的 model id 在官方模型列表里找不到、ModelSelector 显示但不选中的状态。 +const OFFICIAL_DEFAULT_MODEL_ID = 'claude-opus-4-6' + type ProviderStore = { providers: SavedProvider[] activeId: string | null @@ -62,11 +68,25 @@ export const useProviderStore = create((set, get) => ({ activateProvider: async (id) => { await providersApi.activate(id) await get().fetchProviders() + // 联动聊天页:把 currentModel 重置到新 provider 的 main model。 + // 不这么做的话,用户在切换前手动选过的 model id (写进了 settings.json 的 + // `model` 字段) 会继续被后端当作 explicit 返回,但新 provider 的模型列表 + // 里没这个 id, ModelSelector 会卡在"显示旧名字 + radio 不选中"。 + const provider = get().providers.find((p) => p.id === id) + if (provider) { + const settings = useSettingsStore.getState() + await settings.setModel(provider.models.main) + await settings.fetchAll() + } }, activateOfficial: async () => { await providersApi.activateOfficial() await get().fetchProviders() + // 切回官方时同样重置 currentModel,避免残留第三方 model id。 + const settings = useSettingsStore.getState() + await settings.setModel(OFFICIAL_DEFAULT_MODEL_ID) + await settings.fetchAll() }, testProvider: async (id, overrides?) => {