From 8c515f42dc7309e815efaa32dfbc7c88f87324bb Mon Sep 17 00:00:00 2001 From: KimiSwitch Dev Date: Wed, 8 Jul 2026 14:02:09 +0800 Subject: [PATCH] feat: switch provider cleans other custom providers and sets default model --- src/App.tsx | 45 +++++++++++++++++++++++++-------- src/components/ProviderList.tsx | 32 +++++++++++++---------- src/i18n/en.ts | 2 ++ src/i18n/zh.ts | 2 ++ 4 files changed, 56 insertions(+), 25 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 0e2434c..a015e31 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -191,17 +191,40 @@ export default function App() { updateConfig((cfg) => ({ ...cfg, default_model: alias })); }; - const handleToggleProviderEnabled = (name: string) => { + const handleSwitchProvider = (name: string) => { updateConfig((cfg) => { - const provider = cfg.providers[name]; - if (!provider) return cfg; - return { - ...cfg, - providers: { - ...cfg.providers, - [name]: { ...provider, enabled: !provider.enabled }, - }, - }; + const target = cfg.providers[name]; + if (!target) return cfg; + + const isKimiNative = (p: Provider) => p.managed === true; + + // Keep Kimi native (managed) providers and the selected provider only. + const providers: Record = {}; + for (const [key, p] of Object.entries(cfg.providers)) { + if (isKimiNative(p)) { + providers[key] = p; + } + } + providers[name] = { ...target, enabled: true }; + + // Drop models whose provider was removed. + const models: Record = {}; + for (const [key, m] of Object.entries(cfg.models)) { + if (providers[m.provider]) { + models[key] = m; + } + } + + // Set default model to the first model of the selected provider. + let default_model: string | null = null; + for (const [key, m] of Object.entries(models)) { + if (m.provider === name) { + default_model = key; + break; + } + } + + return { ...cfg, providers, models, default_model }; }); }; @@ -320,7 +343,7 @@ export default function App() { }} onDelete={handleDeleteProvider} onAdd={handleAddProvider} - onToggleEnabled={handleToggleProviderEnabled} + onSwitchProvider={handleSwitchProvider} /> ) : currentProvider ? ( void; onDelete: (name: string) => void; onAdd: () => void; - onToggleEnabled: (name: string) => void; + onSwitchProvider: (name: string) => void; } const PROVIDER_ICONS: Record = { @@ -53,7 +53,7 @@ export function ProviderList({ onEdit, onDelete, onAdd, - onToggleEnabled, + onSwitchProvider, }: ProviderListProps) { const { t } = useTranslation(); return ( @@ -92,15 +92,19 @@ export function ProviderList({ const defaultModelName = defaultModel ? models[defaultModel]?.display_name || defaultModel : null; - const enabled = provider.enabled !== false; + const isKimiNative = provider.managed === true; + const isActive = + !isKimiNative && + defaultModel !== null && + models[defaultModel]?.provider === provider.name; return (
onEdit(provider.name)} > @@ -117,9 +121,9 @@ export function ProviderList({

{provider.name}

- {!enabled && ( - - {t("disabled")} + {isActive && ( + + {t("inUse")} )} {provider.note && ( @@ -152,15 +156,15 @@ export function ProviderList({ type="button" onClick={(e) => { e.stopPropagation(); - onToggleEnabled(provider.name); + onSwitchProvider(provider.name); }} className={`px-3 py-1.5 text-sm rounded focus:ring-2 focus:outline-none ${ - enabled - ? "bg-blue-600 hover:bg-blue-700 text-white focus:ring-blue-500" - : "border border-[#2a2a2e] hover:bg-[#252529] text-gray-400 focus:ring-blue-500" + isActive + ? "bg-green-600 hover:bg-green-700 text-white focus:ring-green-500" + : "bg-blue-600 hover:bg-blue-700 text-white focus:ring-blue-500" }`} > - {enabled ? `▶ ${t("activated")}` : t("activate")} + {isActive ? t("inUse") : t("switchTo")}