import { normalizeProviderId } from "../agents/provider-id.js"; 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) => normalizeProviderId(entry.provider) === normalizeProviderId(params.providerId) && 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 providerId = normalizeProviderId(params.providerId); const apiKey = params.ctx.resolveProviderApiKey(providerId).apiKey; if (!apiKey) { return null; } const explicitProvider = params.allowExplicitBaseUrl && params.ctx.config.models?.providers ? Object.entries(params.ctx.config.models.providers).find( ([configuredProviderId]) => normalizeProviderId(configuredProviderId) === providerId, )?.[1] : 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(normalizeProviderId(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 }]), ), }; }