import { deleteModelAlias, getModelAliases, getProviderNodeById, setModelAlias, } from "@/lib/localDb"; import { getProviderAlias, isAnthropicCompatibleProvider, isOpenAICompatibleProvider, } from "@/shared/constants/providers"; import { resolveManagedModelAlias } from "@/shared/utils/providerModelAliases"; function isCompatibleProvider(providerId: string): boolean { return isOpenAICompatibleProvider(providerId) || isAnthropicCompatibleProvider(providerId); } export function usesManagedAvailableModels(providerId: string): boolean { return providerId === "openrouter" || isCompatibleProvider(providerId); } function getProviderStoragePrefix(providerId: string): string { if (isCompatibleProvider(providerId)) return providerId; return getProviderAlias(providerId) || providerId; } async function getProviderDisplayPrefix(providerId: string): Promise { if (!isCompatibleProvider(providerId)) { return getProviderAlias(providerId) || providerId; } const providerNode = await getProviderNodeById(providerId); const prefix = providerNode?.prefix; return typeof prefix === "string" && prefix.trim().length > 0 ? prefix.trim() : providerId; } export async function syncManagedAvailableModelAliases(providerId: string, modelIds: string[]) { const storagePrefix = getProviderStoragePrefix(providerId); const displayPrefix = await getProviderDisplayPrefix(providerId); const existingAliasesRaw = await getModelAliases(); const workingAliases = Object.fromEntries( Object.entries(existingAliasesRaw).filter((entry): entry is [string, string] => { const [, value] = entry; return typeof value === "string"; }) ); const targetModelIds = Array.from( new Set( modelIds.map((modelId) => (typeof modelId === "string" ? modelId.trim() : "")).filter(Boolean) ) ); const targetFullModels = new Set(targetModelIds.map((modelId) => `${storagePrefix}/${modelId}`)); const removedAliases: string[] = []; for (const [alias, value] of Object.entries(workingAliases)) { if (!value.startsWith(`${storagePrefix}/`)) continue; if (targetFullModels.has(value)) continue; await deleteModelAlias(alias); delete workingAliases[alias]; removedAliases.push(alias); } const assignedAliases: string[] = []; for (const modelId of targetModelIds) { const fullModel = `${storagePrefix}/${modelId}`; const alias = resolveManagedModelAlias({ modelId, fullModel, providerDisplayAlias: displayPrefix, existingAliases: workingAliases, }); if (!alias) continue; if (workingAliases[alias] !== fullModel) { await setModelAlias(alias, fullModel); workingAliases[alias] = fullModel; } assignedAliases.push(alias); } return { assignedAliases, removedAliases, storagePrefix, }; }