File size: 2,501 Bytes
d04f74a | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | /** Shared projection of the live LLM registry into the browser model catalog. */
import type { Context } from '@deepseek-ai/cordis'
import type {
ModelCatalog,
ModelReasoning,
ModelSelection,
} from './types.ts'
/**
* Build the browser model catalog without requiring a Session.
* @param ctx - Host context carrying the live LLM registry.
* @param defaultSelection - deployment default used before a Session selects a model.
* @returns successful non-empty provider groups and isolated provider failures.
*/
export async function buildModelCatalog(
ctx: Context,
defaultSelection: ModelSelection = ctx.agentDefaultModel.currentSelection(),
): Promise<ModelCatalog> {
const providers = ctx.llm.listProviders()
const catalog = await Promise.all(providers.map(async (provider) => {
try {
const models = await ctx.llm.listModels(provider.id)
const entries = await Promise.all(models.map(async (model) => {
const resolved = await ctx.llm.resolveModelInfo(provider.id, model.id)
const reasoning: ModelReasoning | undefined = resolved.reasoning === undefined
? undefined
: {
efforts: resolved.reasoning.efforts.map(effort => ({
id: effort.id,
name: effort.name,
...(effort.description === undefined ? {} : { description: effort.description }),
})),
...(resolved.reasoning.defaultEffort === undefined
? {}
: { defaultEffort: resolved.reasoning.defaultEffort }),
}
return {
id: model.id,
name: model.name,
...(model.description === undefined ? {} : { description: model.description }),
...(reasoning === undefined ? {} : { reasoning }),
}
}))
return {
kind: 'group' as const,
group: { id: provider.id, name: provider.name, models: entries },
}
} catch (error) {
return {
kind: 'failure' as const,
failure: {
id: provider.id,
name: provider.name,
message: error instanceof Error ? error.message : String(error),
},
}
}
}))
return {
default: { ...defaultSelection },
routableProviders: providers.map(provider => provider.id),
groups: catalog.flatMap(item => item.kind === 'group' ? [item.group] : [])
.filter(group => group.models.length > 0),
failures: catalog.flatMap(item => item.kind === 'failure' ? [item.failure] : []),
}
}
|