Merge pull request #5791 from menloresearch/fix/fetch-models-from-custom-endpoint-crashes-app

fix: fetch models from custom provider causes app to crash
This commit is contained in:
Louis 2025-07-16 16:01:19 +07:00 committed by GitHub
commit b17c6f4eb6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 20 additions and 3 deletions

View File

@ -36,7 +36,16 @@ export const useModelProvider = create<ModelProviderState>()(
}, },
setProviders: (providers) => setProviders: (providers) =>
set((state) => { set((state) => {
const existingProviders = state.providers const existingProviders = state.providers.map((provider) => {
return {
...provider,
models: provider.models.filter(
(e) =>
('id' in e || 'model' in e) &&
typeof (e.id ?? e.model) === 'string'
),
}
})
// Ensure deletedModels is always an array // Ensure deletedModels is always an array
const currentDeletedModels = Array.isArray(state.deletedModels) const currentDeletedModels = Array.isArray(state.deletedModels)
? state.deletedModels ? state.deletedModels
@ -46,11 +55,17 @@ export const useModelProvider = create<ModelProviderState>()(
const existingProvider = existingProviders.find( const existingProvider = existingProviders.find(
(x) => x.provider === provider.provider (x) => x.provider === provider.provider
) )
const models = existingProvider?.models || [] const models = (existingProvider?.models || []).filter(
(e) =>
('id' in e || 'model' in e) &&
typeof (e.id ?? e.model) === 'string'
)
const mergedModels = [ const mergedModels = [
...models, ...models,
...(provider?.models ?? []).filter( ...(provider?.models ?? []).filter(
(e) => (e) =>
('id' in e || 'model' in e) &&
typeof (e.id ?? e.model) === 'string' &&
!models.some((m) => m.id === e.id) && !models.some((m) => m.id === e.id) &&
!currentDeletedModels.includes(e.id) !currentDeletedModels.includes(e.id)
), ),

View File

@ -210,7 +210,9 @@ export const fetchModelsFromProvider = async (
return data.data.map((model: { id: string }) => model.id).filter(Boolean) return data.data.map((model: { id: string }) => model.id).filter(Boolean)
} else if (Array.isArray(data)) { } else if (Array.isArray(data)) {
// Direct array format: ["model-id1", "model-id2", ...] // Direct array format: ["model-id1", "model-id2", ...]
return data.filter(Boolean) return data
.filter(Boolean)
.map((model) => ('id' in model ? model.id : model))
} else if (data.models && Array.isArray(data.models)) { } else if (data.models && Array.isArray(data.models)) {
// Alternative format: { models: [...] } // Alternative format: { models: [...] }
return data.models return data.models