mirror of
https://github.com/openclaw/openclaw.git
synced 2026-06-06 05:51:15 +08:00
82 lines
2.2 KiB
TypeScript
82 lines
2.2 KiB
TypeScript
/**
|
|
* Builds runtime model catalog entries from stored Cloudflare AI Gateway auth
|
|
* profiles.
|
|
*/
|
|
import {
|
|
coerceSecretRef,
|
|
resolveNonEnvSecretRefApiKeyMarker,
|
|
} from "openclaw/plugin-sdk/provider-auth";
|
|
import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
import {
|
|
buildCloudflareAiGatewayModelDefinition,
|
|
resolveCloudflareAiGatewayBaseUrl,
|
|
} from "./models.js";
|
|
|
|
type CloudflareAiGatewayCredential =
|
|
| {
|
|
type?: string;
|
|
keyRef?: unknown;
|
|
key?: unknown;
|
|
metadata?: {
|
|
accountId?: unknown;
|
|
gatewayId?: unknown;
|
|
};
|
|
}
|
|
| undefined;
|
|
|
|
function resolveCloudflareAiGatewayApiKey(cred: CloudflareAiGatewayCredential): string | undefined {
|
|
if (!cred || cred.type !== "api_key") {
|
|
return undefined;
|
|
}
|
|
|
|
const keyRef = coerceSecretRef(cred.keyRef);
|
|
const keyRefId = normalizeOptionalString(keyRef?.id);
|
|
if (keyRef && keyRefId) {
|
|
return keyRef.source === "env" ? keyRefId : resolveNonEnvSecretRefApiKeyMarker(keyRef.source);
|
|
}
|
|
return normalizeOptionalString(cred.key);
|
|
}
|
|
|
|
function resolveCloudflareAiGatewayMetadata(cred: CloudflareAiGatewayCredential): {
|
|
accountId?: string;
|
|
gatewayId?: string;
|
|
} {
|
|
if (!cred || cred.type !== "api_key") {
|
|
return {};
|
|
}
|
|
return {
|
|
accountId: normalizeOptionalString(cred.metadata?.accountId),
|
|
gatewayId: normalizeOptionalString(cred.metadata?.gatewayId),
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Returns a provider catalog entry when credentials and Gateway metadata are
|
|
* complete enough to construct an Anthropic-compatible base URL.
|
|
*/
|
|
export function buildCloudflareAiGatewayCatalogProvider(params: {
|
|
credential: CloudflareAiGatewayCredential;
|
|
envApiKey?: string;
|
|
}) {
|
|
const apiKey =
|
|
normalizeOptionalString(params.envApiKey) ??
|
|
resolveCloudflareAiGatewayApiKey(params.credential);
|
|
if (!apiKey) {
|
|
return null;
|
|
}
|
|
const { accountId, gatewayId } = resolveCloudflareAiGatewayMetadata(params.credential);
|
|
if (!accountId || !gatewayId) {
|
|
return null;
|
|
}
|
|
const baseUrl = resolveCloudflareAiGatewayBaseUrl({ accountId, gatewayId });
|
|
if (!baseUrl) {
|
|
return null;
|
|
}
|
|
return {
|
|
baseUrl,
|
|
api: "anthropic-messages" as const,
|
|
apiKey,
|
|
models: [buildCloudflareAiGatewayModelDefinition()],
|
|
};
|
|
}
|