36 lines
1.5 KiB
TypeScript
36 lines
1.5 KiB
TypeScript
import type { Api, Model } from "../types.ts";
|
|
|
|
/** Workers AI direct endpoint. */
|
|
export const CLOUDFLARE_WORKERS_AI_BASE_URL =
|
|
"https://api.cloudflare.com/client/v4/accounts/{CLOUDFLARE_ACCOUNT_ID}/ai/v1";
|
|
|
|
/** AI Gateway Unified API. https://developers.cloudflare.com/ai-gateway/usage/unified-api/ */
|
|
export const CLOUDFLARE_AI_GATEWAY_COMPAT_BASE_URL =
|
|
"https://gateway.ai.cloudflare.com/v1/{CLOUDFLARE_ACCOUNT_ID}/{CLOUDFLARE_GATEWAY_ID}/compat";
|
|
|
|
/** AI Gateway → OpenAI passthrough. Used until /compat supports /v1/responses. */
|
|
export const CLOUDFLARE_AI_GATEWAY_OPENAI_BASE_URL =
|
|
"https://gateway.ai.cloudflare.com/v1/{CLOUDFLARE_ACCOUNT_ID}/{CLOUDFLARE_GATEWAY_ID}/openai";
|
|
|
|
/** AI Gateway → Anthropic passthrough. */
|
|
export const CLOUDFLARE_AI_GATEWAY_ANTHROPIC_BASE_URL =
|
|
"https://gateway.ai.cloudflare.com/v1/{CLOUDFLARE_ACCOUNT_ID}/{CLOUDFLARE_GATEWAY_ID}/anthropic";
|
|
|
|
export function isCloudflareProvider(provider: string): boolean {
|
|
return provider === "cloudflare-workers-ai" || provider === "cloudflare-ai-gateway";
|
|
}
|
|
|
|
/** Substitute `{VAR}` placeholders in a Cloudflare baseUrl from process.env. */
|
|
export function resolveCloudflareBaseUrl(model: Model<Api>): string {
|
|
const url = model.baseUrl;
|
|
if (!url.includes("{")) return url;
|
|
const baseUrl = url.replace(/\{([A-Z_][A-Z0-9_]*)\}/g, (_match, name: string) => {
|
|
const value = process.env[name];
|
|
if (!value) {
|
|
throw new Error(`${name} is required for provider ${model.provider} but is not set.`);
|
|
}
|
|
return value;
|
|
});
|
|
return baseUrl;
|
|
}
|