mirror of
https://github.com/openclaw/openclaw.git
synced 2026-04-15 19:21:08 +00:00
76 lines
2.0 KiB
TypeScript
76 lines
2.0 KiB
TypeScript
import {
|
|
coerceSecretRef,
|
|
resolveNonEnvSecretRefApiKeyMarker,
|
|
} from "openclaw/plugin-sdk/provider-auth";
|
|
import { normalizeOptionalString } from "openclaw/plugin-sdk/text-runtime";
|
|
import {
|
|
buildCloudflareAiGatewayModelDefinition,
|
|
resolveCloudflareAiGatewayBaseUrl,
|
|
} from "./models.js";
|
|
|
|
export type CloudflareAiGatewayCredential =
|
|
| {
|
|
type?: string;
|
|
keyRef?: unknown;
|
|
key?: unknown;
|
|
metadata?: {
|
|
accountId?: unknown;
|
|
gatewayId?: unknown;
|
|
};
|
|
}
|
|
| undefined;
|
|
|
|
export 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);
|
|
}
|
|
|
|
export 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),
|
|
};
|
|
}
|
|
|
|
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()],
|
|
};
|
|
}
|