From f21368057bd98ad1cb6ad34b3a45b810f5f9e401 Mon Sep 17 00:00:00 2001 From: chanx <1243304602@qq.com> Date: Mon, 13 Jul 2026 15:20:01 +0800 Subject: [PATCH] fix(setting-model): fix instance display and api_key loss after auto-save (#16853) --- web/src/hooks/use-llm-request.tsx | 13 +++++++++++++ .../pages/user-setting/setting-model/index.tsx | 11 ++++++++--- .../instance-card/components/saved-mode-card.tsx | 3 ++- .../setting-model/instance-card/hooks.tsx | 6 +++++- .../instance-card/models-section/hooks.ts | 16 ++++++++++++++-- .../instance-card/models-section/index.tsx | 2 ++ .../instance-card/models-section/interface.ts | 9 +++++++++ .../instance-card/verify-button.tsx | 14 ++++++-------- .../field-config/generic-api-key-config.ts | 2 +- .../field-config/local-llm-configs.ts | 2 +- .../field-config/provider-config-map.ts | 12 ++++++------ 11 files changed, 67 insertions(+), 23 deletions(-) diff --git a/web/src/hooks/use-llm-request.tsx b/web/src/hooks/use-llm-request.tsx index 6e841691ba..3b3e6fef40 100644 --- a/web/src/hooks/use-llm-request.tsx +++ b/web/src/hooks/use-llm-request.tsx @@ -281,6 +281,19 @@ export const useAddProviderInstance = () => { true, ); if (data.code === 0 && !params.verify) { + // Invalidate `addedProviders` so `has_instance` flips to `true` + // for providers that just gained their first instance. Without + // this, the parent page keeps `providerQueryName === ''` (the + // `has_instance` gate in index.tsx) and the `providerInstances` + // query stays disabled, so the newly-saved instance never + // appears. `exact: true` avoids cascading into every + // providerInstances / instanceModels query (they share the + // `['AddedProviders', ...]` prefix) - the dedicated invalidation + // below handles those. + queryClient.invalidateQueries({ + queryKey: LlmKeys.addedProviders(), + exact: true, + }); queryClient.invalidateQueries({ queryKey: LlmKeys.providerInstances(params.llm_factory), }); diff --git a/web/src/pages/user-setting/setting-model/index.tsx b/web/src/pages/user-setting/setting-model/index.tsx index 7d81c4701f..476fe5985b 100644 --- a/web/src/pages/user-setting/setting-model/index.tsx +++ b/web/src/pages/user-setting/setting-model/index.tsx @@ -19,6 +19,7 @@ import { useTranslate } from '@/hooks/common-hooks'; import { LlmKeys, useAddProviderInstance, + useFetchAddedProviders, useFetchProviderInstances, } from '@/hooks/use-llm-request'; import { IProviderInstance } from '@/interfaces/database/llm'; @@ -61,9 +62,13 @@ const SettingModelV2: FC = () => { // for the current selection. Reset on every selection change. const cancelledRef = useRef(false); - // Always re-fetch when the selection changes. Passing an empty string - // disables the query. - const providerQueryName = selection === 'default' ? '' : selection; + const { data: addedProviders } = useFetchAddedProviders(); + const providerQueryName = useMemo(() => { + if (selection === 'default') return ''; + return addedProviders.some((p) => p.name === selection && p.has_instance) + ? selection + : ''; + }, [selection, addedProviders]); const { data: instances, loading: instancesLoading } = useFetchProviderInstances(providerQueryName); const queryClient = useQueryClient(); diff --git a/web/src/pages/user-setting/setting-model/instance-card/components/saved-mode-card.tsx b/web/src/pages/user-setting/setting-model/instance-card/components/saved-mode-card.tsx index d9c65566db..584cea44eb 100644 --- a/web/src/pages/user-setting/setting-model/instance-card/components/saved-mode-card.tsx +++ b/web/src/pages/user-setting/setting-model/instance-card/components/saved-mode-card.tsx @@ -63,7 +63,7 @@ export function SavedModeCard({
)}
- {verifyResult && verifyResult.isValid !== null && ( + {verifyResult && verifyResult.isValid === false && verifyResult.logs && (
- {verifyResult.logs && ( -
- {replaceText(verifyResult.logs)} -
- )} +
+ {replaceText(verifyResult.logs)} +
)} diff --git a/web/src/pages/user-setting/setting-model/provider-schema/field-config/generic-api-key-config.ts b/web/src/pages/user-setting/setting-model/provider-schema/field-config/generic-api-key-config.ts index fe767efbb9..6bffd9c71f 100644 --- a/web/src/pages/user-setting/setting-model/provider-schema/field-config/generic-api-key-config.ts +++ b/web/src/pages/user-setting/setting-model/provider-schema/field-config/generic-api-key-config.ts @@ -37,7 +37,7 @@ export const GenericApiKeyConfig: ProviderConfig = { { name: 'api_key', label: 'apiKey', - type: FormFieldType.Text, + type: FormFieldType.Password, required: true, placeholder: 'apiKeyMessage', validation: { message: 'apiKeyMessage' }, diff --git a/web/src/pages/user-setting/setting-model/provider-schema/field-config/local-llm-configs.ts b/web/src/pages/user-setting/setting-model/provider-schema/field-config/local-llm-configs.ts index 7e88677743..c098f8214a 100644 --- a/web/src/pages/user-setting/setting-model/provider-schema/field-config/local-llm-configs.ts +++ b/web/src/pages/user-setting/setting-model/provider-schema/field-config/local-llm-configs.ts @@ -216,7 +216,7 @@ function buildLocalConfig( { name: 'api_key', label: 'apiKey', - type: FormFieldType.Text, + type: FormFieldType.Password, required: false, placeholder: 'apiKeyMessage', shouldRender: 'hideWhenInstanceExists', diff --git a/web/src/pages/user-setting/setting-model/provider-schema/field-config/provider-config-map.ts b/web/src/pages/user-setting/setting-model/provider-schema/field-config/provider-config-map.ts index 4106080cd5..6fe2817280 100644 --- a/web/src/pages/user-setting/setting-model/provider-schema/field-config/provider-config-map.ts +++ b/web/src/pages/user-setting/setting-model/provider-schema/field-config/provider-config-map.ts @@ -50,7 +50,7 @@ export const ProviderConfigMap: Record = { { name: 'api_key', label: 'apiKey', - type: FormFieldType.Text, + type: FormFieldType.Password, required: false, placeholder: 'apiKeyMessage', shouldRender: 'hideWhenInstanceExists', @@ -99,7 +99,7 @@ export const ProviderConfigMap: Record = { { name: 'api_key', label: 'addArkApiKey', - type: FormFieldType.Text, + type: FormFieldType.Password, required: true, placeholder: 'ArkApiKeyMessage', shouldRender: 'hideWhenInstanceExists', @@ -153,7 +153,7 @@ export const ProviderConfigMap: Record = { { name: 'google_service_account_key', label: 'addGoogleServiceAccountKey', - type: FormFieldType.Text, + type: FormFieldType.Password, required: true, placeholder: 'GoogleServiceAccountKeyMessage', shouldRender: 'hideWhenInstanceExists', @@ -246,7 +246,7 @@ export const ProviderConfigMap: Record = { { name: 'spark_api_password', label: 'addSparkAPIPassword', - type: FormFieldType.Text, + type: FormFieldType.Password, required: true, placeholder: 'SparkAPIPasswordMessage', shouldRender: 'hideWhenInstanceExists', @@ -429,7 +429,7 @@ export const ProviderConfigMap: Record = { { name: 'opendataloader_api_key', label: 'apiKey', - type: FormFieldType.Text, + type: FormFieldType.Password, required: false, placeholder: 'apiKeyPlaceholder', }, @@ -491,7 +491,7 @@ export const ProviderConfigMap: Record = { { name: 'paddleocr_access_token', label: 'paddleocrAccessToken', - type: FormFieldType.Text, + type: FormFieldType.Password, required: false, placeholder: 'paddleocrAccessTokenPlaceholder', validation: { message: 'paddleocrAccessTokenMessage' },