import type { SelectedModel } from "@/types"; import type { ProviderModel } from "@/lib/providers/types"; export function toSelectedModel(model: ProviderModel): SelectedModel { return { provider: model.provider, modelId: model.id, displayName: model.name, capabilities: model.capabilities, metadata: model.metadata, }; } function hasValue(value: unknown): boolean { return value !== undefined && value !== null && value !== ""; } function selectedModelIdentifiers(model: SelectedModel | undefined): Set { const identifiers = new Set(); if (!model) return identifiers; for (const value of [ model.modelId, model.displayName, model.metadata?.aiModelId, model.metadata?.aiModelCode, model.metadata?.aiModelCodeAlias, ]) { if (hasValue(value)) { identifiers.add(String(value)); } } return identifiers; } function providerModelMatchesSelectedModel(model: ProviderModel, selected: SelectedModel | undefined): boolean { if (!selected || model.provider !== selected.provider) return false; const identifiers = selectedModelIdentifiers(selected); if (identifiers.size === 0) return false; return [ model.id, model.name, model.metadata?.aiModelId, model.metadata?.aiModelCode, model.metadata?.aiModelCodeAlias, ].some((value) => hasValue(value) && identifiers.has(String(value))); } export function shouldUpdateSelectedModelFromProviderModel( current: SelectedModel | undefined, model: ProviderModel ): boolean { if (!current) return true; if (current.provider !== model.provider || current.modelId !== model.id) return true; if (model.provider !== "popiserver") return false; const currentMetadata = current.metadata ?? {}; const nextMetadata = model.metadata ?? {}; return ["billingMethod", "aiModelId", "type", "subType", "aiModelCode", "aiModelCodeAlias"].some( (key) => !hasValue(currentMetadata[key]) && hasValue(nextMetadata[key]) ); } export function chooseModelFromList( models: ProviderModel[], preferred?: SelectedModel ): SelectedModel | null { const model = models.find((item) => providerModelMatchesSelectedModel(item, preferred)) ?? models.find((item) => item.metadata?.isDefault === 1) ?? models[0]; return model ? toSelectedModel(model) : null; }