openclaw/src/plugins/provider-catalog.ts

65 lines
1.9 KiB
TypeScript

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