import { DEFAULT_MODELS } from "../constant"; import { LLMModel } from "../client/api"; const customProvider = (modelName: string) => ({ id: modelName, providerName: "", providerType: "custom", }); export function collectModelTable( models: readonly LLMModel[], customModels: string, ) { const modelTable: Record< string, { available: boolean; name: string; displayName: string; provider?: LLMModel["provider"]; // Marked as optional isDefault?: boolean; } > = {}; // default models models.forEach((m) => { modelTable[m.name] = { ...m, displayName: m.name, // 'provider' is copied over if it exists }; }); // server custom models customModels .split(",") .filter((v) => !!v && v.length > 0) .forEach((m) => { const available = !m.startsWith("-"); const nameConfig = m.startsWith("+") || m.startsWith("-") ? m.slice(1) : m; const [name, displayName] = nameConfig.split("="); // enable or disable all models if (name === "all") { Object.values(modelTable).forEach( (model) => (model.available = available), ); } else { modelTable[name] = { name, displayName: displayName || name, available, provider: modelTable[name]?.provider ?? customProvider(name), // Use optional chaining }; } }); return modelTable; } export function collectModelTableWithDefaultModel( models: readonly LLMModel[], customModels: string, defaultModel: string, ) { let modelTable = collectModelTable(models, customModels); if (defaultModel && defaultModel !== "") { modelTable[defaultModel] = { ...modelTable[defaultModel], name: defaultModel, available: true, isDefault: true, }; } return modelTable; } /** * Generate full model table. */ export function collectModels( models: readonly LLMModel[], customModels: string, ) { const modelTable = collectModelTable(models, customModels); const allModels = Object.values(modelTable); return allModels; } export function collectModelsWithDefaultModel( models: readonly LLMModel[], customModels: string, defaultModel: string, ) { const modelTable = collectModelTableWithDefaultModel( models, customModels, defaultModel, ); const allModels = Object.values(modelTable); return allModels; } export function isModelAvailableInServer(customModels, modelName) { const modelTable = collectModelTable(DEFAULT_MODELS, customModels); return modelTable[modelName ?? ""].available === false; }