diff --git a/web/app/components/header/account-setting/model-provider-page/model-selector/popup.tsx b/web/app/components/header/account-setting/model-provider-page/model-selector/popup.tsx
index 6dbeb555da..962174c311 100644
--- a/web/app/components/header/account-setting/model-provider-page/model-selector/popup.tsx
+++ b/web/app/components/header/account-setting/model-provider-page/model-selector/popup.tsx
@@ -137,11 +137,11 @@ const Popup: FC
= ({
}).filter(model => model.models.length > 0)
if (defaultModel?.provider) {
- const selectedIndex = filtered.findIndex(m => m.provider === defaultModel.provider)
- if (selectedIndex > 0) {
- const [selected] = filtered.splice(selectedIndex, 1)
- filtered.unshift(selected)
- }
+ filtered.sort((a, b) => {
+ const aSelected = a.provider === defaultModel.provider ? 0 : 1
+ const bSelected = b.provider === defaultModel.provider ? 0 : 1
+ return aSelected - bSelected
+ })
}
return filtered
diff --git a/web/app/components/header/account-setting/model-provider-page/provider-added-card/use-change-provider-priority.ts b/web/app/components/header/account-setting/model-provider-page/provider-added-card/use-change-provider-priority.ts
index 10b2c5ed6e..9762f47d74 100644
--- a/web/app/components/header/account-setting/model-provider-page/provider-added-card/use-change-provider-priority.ts
+++ b/web/app/components/header/account-setting/model-provider-page/provider-added-card/use-change-provider-priority.ts
@@ -6,12 +6,12 @@ import { consoleQuery } from '@/service/client'
import { ConfigurationMethodEnum } from '../declarations'
import { useUpdateModelList, useUpdateModelProviders } from '../hooks'
-export function useChangeProviderPriority(provider: ModelProvider) {
+export function useChangeProviderPriority(provider: ModelProvider | undefined) {
const { t } = useTranslation()
const queryClient = useQueryClient()
const updateModelList = useUpdateModelList()
const updateModelProviders = useUpdateModelProviders()
- const providerName = provider.provider
+ const providerName = provider?.provider ?? ''
const modelProviderModelListQueryKey = consoleQuery.modelProviders.models.queryKey({
input: {
@@ -31,9 +31,9 @@ export function useChangeProviderPriority(provider: ModelProvider) {
refetchType: 'none',
})
updateModelProviders()
- provider.configurate_methods.forEach((method) => {
+ provider?.configurate_methods.forEach((method) => {
if (method === ConfigurationMethodEnum.predefinedModel)
- provider.supported_model_types.forEach(modelType => updateModelList(modelType))
+ provider?.supported_model_types.forEach(modelType => updateModelList(modelType))
})
},
onError: () => {
diff --git a/web/app/components/header/account-setting/model-provider-page/provider-added-card/use-credential-panel-state.spec.ts b/web/app/components/header/account-setting/model-provider-page/provider-added-card/use-credential-panel-state.spec.ts
index c8aa4c2a0a..7ab55e9616 100644
--- a/web/app/components/header/account-setting/model-provider-page/provider-added-card/use-credential-panel-state.spec.ts
+++ b/web/app/components/header/account-setting/model-provider-page/provider-added-card/use-credential-panel-state.spec.ts
@@ -183,6 +183,18 @@ describe('useCredentialPanelState', () => {
})
})
+ // Undefined provider
+ describe('Undefined provider', () => {
+ it('should return safe defaults when provider is undefined', () => {
+ const { result } = renderHook(() => useCredentialPanelState(undefined))
+
+ expect(result.current.priority).toBe('apiKeyOnly')
+ expect(result.current.supportsCredits).toBe(false)
+ expect(result.current.hasCredentials).toBe(false)
+ expect(result.current.credentialName).toBeUndefined()
+ })
+ })
+
// Derived metadata
describe('Derived metadata', () => {
it('should show priority switcher when credits supported and custom config active', () => {
diff --git a/web/app/components/header/account-setting/model-provider-page/provider-added-card/use-credential-panel-state.ts b/web/app/components/header/account-setting/model-provider-page/provider-added-card/use-credential-panel-state.ts
index 4d0f351c6c..16558a0019 100644
--- a/web/app/components/header/account-setting/model-provider-page/provider-added-card/use-credential-panel-state.ts
+++ b/web/app/components/header/account-setting/model-provider-page/provider-added-card/use-credential-panel-state.ts
@@ -70,7 +70,7 @@ function deriveVariant(
return 'api-required-add'
}
-export function useCredentialPanelState(provider: ModelProvider): CredentialPanelState {
+export function useCredentialPanelState(provider: ModelProvider | undefined): CredentialPanelState {
const { isExhausted, credits } = useTrialCredits()
const {
hasCredential,
@@ -78,10 +78,10 @@ export function useCredentialPanelState(provider: ModelProvider): CredentialPane
current_credential_name,
} = useCredentialStatus(provider)
- const systemConfig = provider.system_configuration
- const preferredType = provider.preferred_provider_type
+ const systemConfig = provider?.system_configuration
+ const preferredType = provider?.preferred_provider_type
- const supportsCredits = systemConfig.enabled && IS_CLOUD_EDITION
+ const supportsCredits = !!systemConfig?.enabled && IS_CLOUD_EDITION
const priority: UsagePriority = !supportsCredits
? 'apiKeyOnly'