import type { ModelProviderConfig } from "../config/types.js"; import type { ProviderCatalogContext, ProviderCatalogResult } from "./types.js"; export function findCatalogTemplate(params: { entries: ReadonlyArray<{ provider: string; id: string }>; providerId: string; templateIds: readonly string[]; }) { return params.templateIds .map((templateId) => params.entries.find( (entry) => entry.provider.toLowerCase() === params.providerId.toLowerCase() && entry.id.toLowerCase() === templateId.toLowerCase(), ), ) .find((entry) => entry !== undefined); } export async function buildSingleProviderApiKeyCatalog(params: { ctx: ProviderCatalogContext; providerId: string; buildProvider: () => ModelProviderConfig | Promise; allowExplicitBaseUrl?: boolean; }): Promise { const apiKey = params.ctx.resolveProviderApiKey(params.providerId).apiKey; if (!apiKey) { return null; } const explicitProvider = params.allowExplicitBaseUrl ? params.ctx.config.models?.providers?.[params.providerId] : undefined; const explicitBaseUrl = typeof explicitProvider?.baseUrl === "string" ? explicitProvider.baseUrl.trim() : ""; return { provider: { ...(await params.buildProvider()), ...(explicitBaseUrl ? { baseUrl: explicitBaseUrl } : {}), apiKey, }, }; } export async function buildPairedProviderApiKeyCatalog(params: { ctx: ProviderCatalogContext; providerId: string; buildProviders: () => | Record | Promise>; }): Promise { const apiKey = params.ctx.resolveProviderApiKey(params.providerId).apiKey; if (!apiKey) { return null; } const providers = await params.buildProviders(); return { providers: Object.fromEntries( Object.entries(providers).map(([id, provider]) => [id, { ...provider, apiKey }]), ), }; }