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): 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; }