openclaw/src/plugins/provider-catalog.ts

70 lines
2.3 KiB
TypeScript

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<ModelProviderConfig>;
allowExplicitBaseUrl?: boolean;
}): Promise<ProviderCatalogResult> {
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<string, ModelProviderConfig>
| Promise<Record<string, ModelProviderConfig>>;
}): Promise<ProviderCatalogResult> {
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 }]),
),
};
}