mirror of
https://github.com/sst/opencode.git
synced 2025-12-23 10:11:41 +00:00
fix: handle providers with no available models to prevent crashes
This commit is contained in:
parent
4c3336bbe7
commit
02b66b23e9
3 changed files with 33 additions and 6 deletions
|
|
@ -662,6 +662,7 @@ export namespace ACP {
|
|||
})
|
||||
const availableModels = entries.flatMap((provider) => {
|
||||
const models = Provider.sort(Object.values(provider.models))
|
||||
if (models.length === 0) return []
|
||||
return models.map((model) => ({
|
||||
modelId: `${provider.id}/${model.id}`,
|
||||
name: `${provider.name}/${model.name}`,
|
||||
|
|
|
|||
|
|
@ -529,14 +529,26 @@ export namespace Provider {
|
|||
function mergeProvider(providerID: string, provider: Partial<Info>) {
|
||||
const existing = providers[providerID]
|
||||
if (existing) {
|
||||
// @ts-expect-error
|
||||
providers[providerID] = mergeDeep(existing, provider)
|
||||
const merged = mergeDeep(existing, provider) as Info
|
||||
// Validate after merge - if no models, remove the provider entirely
|
||||
if (Object.keys(merged.models || {}).length === 0) {
|
||||
log.warn("Provider has no models after merge, removing", { providerID })
|
||||
delete providers[providerID]
|
||||
return
|
||||
}
|
||||
providers[providerID] = merged
|
||||
return
|
||||
}
|
||||
const match = database[providerID]
|
||||
if (!match) return
|
||||
// @ts-expect-error
|
||||
providers[providerID] = mergeDeep(match, provider)
|
||||
|
||||
const merged = mergeDeep(match, provider) as Info
|
||||
// Validate immediately after creation - if no models, don't add to providers
|
||||
if (Object.keys(merged.models || {}).length === 0) {
|
||||
log.warn("Provider has no models from database, skipping", { providerID })
|
||||
return
|
||||
}
|
||||
providers[providerID] = merged
|
||||
}
|
||||
|
||||
// extend database from config
|
||||
|
|
|
|||
|
|
@ -1481,7 +1481,14 @@ export namespace Server {
|
|||
const providers = await Provider.list().then((x) => mapValues(x, (item) => item))
|
||||
return c.json({
|
||||
providers: Object.values(providers),
|
||||
default: mapValues(providers, (item) => Provider.sort(Object.values(item.models))[0].id),
|
||||
default: mapValues(providers, (item) => {
|
||||
const sorted = Provider.sort(Object.values(item.models))
|
||||
if (sorted.length === 0) {
|
||||
log.error("Provider has no models available", { providerID: item.id })
|
||||
return null
|
||||
}
|
||||
return sorted[0].id
|
||||
}),
|
||||
})
|
||||
},
|
||||
)
|
||||
|
|
@ -1528,7 +1535,14 @@ export namespace Server {
|
|||
)
|
||||
return c.json({
|
||||
all: Object.values(providers),
|
||||
default: mapValues(providers, (item) => Provider.sort(Object.values(item.models))[0].id),
|
||||
default: mapValues(providers, (item) => {
|
||||
const sorted = Provider.sort(Object.values(item.models))
|
||||
if (sorted.length === 0) {
|
||||
log.error("Provider has no models available", { providerID: item.id })
|
||||
return null
|
||||
}
|
||||
return sorted[0].id
|
||||
}),
|
||||
connected: Object.keys(connected),
|
||||
})
|
||||
},
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue