ai-gateway-provider
Version:
AI Gateway Provider for AI-SDK
1 lines • 18.6 kB
Source Map (JSON)
{"version":3,"sources":["../src/providers.ts","../src/auth.ts","../src/index.ts"],"sourcesContent":["export const providers = [\n\t{\n\t\tname: \"openai\",\n\t\tregex: /^https:\\/\\/api\\.openai\\.com\\//,\n\t\ttransformEndpoint: (url: string) => url.replace(/^https:\\/\\/api\\.openai\\.com\\//, \"\"),\n\t},\n\t{\n\t\tname: \"deepseek\",\n\t\tregex: /^https:\\/\\/api\\.deepseek\\.com\\//,\n\t\ttransformEndpoint: (url: string) => url.replace(/^https:\\/\\/api\\.deepseek\\.com\\//, \"\"),\n\t},\n\t{\n\t\tname: \"anthropic\",\n\t\tregex: /^https:\\/\\/api\\.anthropic\\.com\\//,\n\t\ttransformEndpoint: (url: string) => url.replace(/^https:\\/\\/api\\.anthropic\\.com\\//, \"\"),\n\t\theaderKey: \"x-api-key\",\n\t},\n\t{\n\t\tname: \"google-ai-studio\",\n\t\tregex: /^https:\\/\\/generativelanguage\\.googleapis\\.com\\//,\n\t\theaderKey: \"x-goog-api-key\",\n\t\ttransformEndpoint: (url: string) =>\n\t\t\turl.replace(/^https:\\/\\/generativelanguage\\.googleapis\\.com\\//, \"\"),\n\t},\n\t{\n\t\tname: \"grok\",\n\t\tregex: /^https:\\/\\/api\\.x\\.ai\\//,\n\t\ttransformEndpoint: (url: string) => url.replace(/^https:\\/\\/api\\.x\\.ai\\//, \"\"),\n\t},\n\t{\n\t\tname: \"mistral\",\n\t\tregex: /^https:\\/\\/api\\.mistral\\.ai\\//,\n\t\ttransformEndpoint: (url: string) => url.replace(/^https:\\/\\/api\\.mistral\\.ai\\//, \"\"),\n\t},\n\t{\n\t\tname: \"perplexity-ai\",\n\t\tregex: /^https:\\/\\/api\\.perplexity\\.ai\\//,\n\t\ttransformEndpoint: (url: string) => url.replace(/^https:\\/\\/api\\.perplexity\\.ai\\//, \"\"),\n\t},\n\t{\n\t\tname: \"replicate\",\n\t\tregex: /^https:\\/\\/api\\.replicate\\.com\\//,\n\t\ttransformEndpoint: (url: string) => url.replace(/^https:\\/\\/api\\.replicate\\.com\\//, \"\"),\n\t},\n\t{\n\t\tname: \"groq\",\n\t\tregex: /^https:\\/\\/api\\.groq\\.com\\/openai\\/v1\\//,\n\t\ttransformEndpoint: (url: string) =>\n\t\t\turl.replace(/^https:\\/\\/api\\.groq\\.com\\/openai\\/v1\\//, \"\"),\n\t},\n\t{\n\t\tname: \"azure-openai\",\n\t\tregex: /^https:\\/\\/(?<resource>[^.]+)\\.openai\\.azure\\.com\\/openai\\/deployments\\/(?<deployment>[^/]+)\\/(?<rest>.*)$/,\n\t\ttransformEndpoint: (url: string) => {\n\t\t\tconst match = url.match(\n\t\t\t\t/^https:\\/\\/(?<resource>[^.]+)\\.openai\\.azure\\.com\\/openai\\/deployments\\/(?<deployment>[^/]+)\\/(?<rest>.*)$/,\n\t\t\t);\n\t\t\tif (!match || !match.groups) return url;\n\t\t\tconst { resource, deployment, rest } = match.groups;\n\t\t\tif (!resource || !deployment || !rest) {\n\t\t\t\tthrow new Error(\"Failed to parse Azure OpenAI endpoint URL.\");\n\t\t\t}\n\t\t\treturn `${resource}/${deployment}/${rest}`;\n\t\t},\n\t\theaderKey: \"api-key\",\n\t},\n];\n","export const CF_TEMP_TOKEN = 'CF_TEMP_TOKEN';\n\n\ntype HasApiKey = { apiKey: string };\n\nexport function authWrapper<\n Func extends (config?: HasApiKey) => any\n>(\n func: Func\n): (\n config: Parameters<Func>[0],\n) => ReturnType<Func> {\n return (config) => {\n if(!config) {\n return func({ apiKey: CF_TEMP_TOKEN });\n }\n if(config.apiKey === undefined) {\n config.apiKey = CF_TEMP_TOKEN;\n }\n return func(config);\n };\n}","import type { LanguageModelV2 } from \"@ai-sdk/provider\";\nimport type { FetchFunction } from \"@ai-sdk/provider-utils\";\nimport { providers } from \"./providers\";\nimport { CF_TEMP_TOKEN } from \"./auth\";\n\nexport class AiGatewayInternalFetchError extends Error { }\n\nexport class AiGatewayDoesNotExist extends Error { }\n\nexport class AiGatewayUnauthorizedError extends Error { }\n\nasync function streamToObject(stream: ReadableStream) {\n\tconst response = new Response(stream);\n\treturn await response.json();\n}\n\ntype InternalLanguageModelV2 = LanguageModelV2 & {\n\tconfig?: { fetch?: FetchFunction | undefined };\n};\n\nexport class AiGatewayChatLanguageModel implements LanguageModelV2 {\n\treadonly specificationVersion = \"v2\";\n\treadonly defaultObjectGenerationMode = \"json\";\n\n\treadonly supportedUrls: Record<string, RegExp[]> | PromiseLike<Record<string, RegExp[]>> = {\n\t\t// No URLS are supported for this language model\n\t};\n\n\treadonly models: InternalLanguageModelV2[];\n\treadonly config: AiGatewaySettings;\n\n\tget modelId(): string {\n\t\tif (!this.models[0]) {\n\t\t\tthrow new Error(\"models cannot be empty array\");\n\t\t}\n\n\t\treturn this.models[0].modelId;\n\t}\n\n\tget provider(): string {\n\t\tif (!this.models[0]) {\n\t\t\tthrow new Error(\"models cannot be empty array\");\n\t\t}\n\n\t\treturn this.models[0].provider;\n\t}\n\n\tconstructor(models: LanguageModelV2[], config: AiGatewaySettings) {\n\t\tthis.models = models;\n\t\tthis.config = config;\n\t}\n\n\tasync processModelRequest<\n\t\tT extends LanguageModelV2[\"doStream\"] | LanguageModelV2[\"doGenerate\"],\n\t>(\n\t\toptions: Parameters<T>[0],\n\t\tmodelMethod: \"doStream\" | \"doGenerate\",\n\t): Promise<Awaited<ReturnType<T>>> {\n\t\tconst requests: { url: string; request: Request; modelProvider: string }[] = [];\n\n\t\t// Model configuration and request collection\n\t\tfor (const model of this.models) {\n\t\t\tif (!model.config || !Object.keys(model.config).includes(\"fetch\")) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Sorry, but provider \"${model.provider}\" is currently not supported, please open a issue in the github repo!`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tmodel.config.fetch = (url, request) => {\n\t\t\t\trequests.push({\n\t\t\t\t\tmodelProvider: model.provider,\n\t\t\t\t\trequest: request as Request,\n\t\t\t\t\turl: url as string,\n\t\t\t\t});\n\t\t\t\tthrow new AiGatewayInternalFetchError(\"Stopping provider execution...\");\n\t\t\t};\n\n\t\t\ttry {\n\t\t\t\tawait model[modelMethod](options);\n\t\t\t} catch (e) {\n\t\t\t\tif (!(e instanceof AiGatewayInternalFetchError)) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\n\n\t\t// Process requests\n\t\tconst body = await Promise.all(\n\t\t\trequests.map(async (req) => {\n\t\t\t\tlet providerConfig = null;\n\t\t\t\tfor (const provider of providers) {\n\t\t\t\t\tif (provider.regex.test(req.url)) {\n\t\t\t\t\t\tproviderConfig = provider;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!providerConfig) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Sorry, but provider \"${req.modelProvider}\" is currently not supported, please open a issue in the github repo!`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (!req.request.body) {\n\t\t\t\t\tthrow new Error(\"Ai Gateway provider received an unexpected empty body\");\n\t\t\t\t}\n\n\t\t\t\t// For AI Gateway BYOK / unified billing requests\n\t\t\t\t// delete the fake injected CF_TEMP_TOKEN\n\n\t\t\t\tconst authHeader = providerConfig.headerKey ?? 'authorization';\n\t\t\t\tconst authValue = 'get' in req.request.headers ? req.request.headers.get(authHeader) : req.request.headers[authHeader];\n\t\t\t\tif (authValue?.indexOf(CF_TEMP_TOKEN) !== -1) {\n\t\t\t\t\tif (\"delete\" in req.request.headers) {\n\t\t\t\t\t\treq.request.headers.delete(authHeader);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdelete req.request.headers[authHeader];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\n\t\t\t\treturn {\n\t\t\t\t\tendpoint: providerConfig.transformEndpoint(req.url),\n\t\t\t\t\theaders: req.request.headers,\n\t\t\t\t\tprovider: providerConfig.name,\n\t\t\t\t\tquery: await streamToObject(req.request.body),\n\t\t\t\t};\n\t\t\t}),\n\t\t);\n\n\t\t// Handle response\n\t\tconst headers = parseAiGatewayOptions(this.config.options ?? {});\n\t\tlet resp: Response;\n\n\t\tif (\"binding\" in this.config) {\n\t\t\tconst updatedBody = body.map((obj) => ({\n\t\t\t\t...obj,\n\t\t\t\theaders: {\n\t\t\t\t\t...(obj.headers ?? {}),\n\t\t\t\t\t...Object.fromEntries(headers.entries()),\n\t\t\t\t},\n\t\t\t}));\n\t\t\tresp = await this.config.binding.run(updatedBody);\n\t\t} else {\n\t\t\theaders.set(\"Content-Type\", \"application/json\");\n\t\t\theaders.set(\"cf-aig-authorization\", `Bearer ${this.config.apiKey}`);\n\t\t\tresp = await fetch(\n\t\t\t\t`https://gateway.ai.cloudflare.com/v1/${this.config.accountId}/${this.config.gateway}`,\n\t\t\t\t{\n\t\t\t\t\tbody: JSON.stringify(body),\n\t\t\t\t\theaders: headers,\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\t// Error handling\n\t\tif (resp.status === 400) {\n\t\t\tconst cloneResp = resp.clone();\n\t\t\tconst result: {\n\t\t\t\tsuccess?: boolean;\n\t\t\t\terror?: { code: number; message: string }[];\n\t\t\t} = await cloneResp.json();\n\t\t\tif (\n\t\t\t\tresult.success === false &&\n\t\t\t\tresult.error &&\n\t\t\t\tresult.error.length > 0 &&\n\t\t\t\tresult.error[0]?.code === 2001\n\t\t\t) {\n\t\t\t\tthrow new AiGatewayDoesNotExist(\"This AI gateway does not exist\");\n\t\t\t}\n\t\t} else if (resp.status === 401) {\n\t\t\tconst cloneResp = resp.clone();\n\t\t\tconst result: {\n\t\t\t\tsuccess?: boolean;\n\t\t\t\terror?: { code: number; message: string }[];\n\t\t\t} = await cloneResp.json();\n\t\t\tif (\n\t\t\t\tresult.success === false &&\n\t\t\t\tresult.error &&\n\t\t\t\tresult.error.length > 0 &&\n\t\t\t\tresult.error[0]?.code === 2009\n\t\t\t) {\n\t\t\t\tthrow new AiGatewayUnauthorizedError(\n\t\t\t\t\t\"Your AI Gateway has authentication active, but you didn't provide a valid apiKey\",\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst step = Number.parseInt(resp.headers.get(\"cf-aig-step\") ?? \"0\", 10);\n\t\tif (!this.models[step]) {\n\t\t\tthrow new Error(\"Unexpected AI Gateway Error\");\n\t\t}\n\n\t\tthis.models[step].config = {\n\t\t\t...this.models[step].config,\n\t\t\tfetch: (_url, _req) => resp as unknown as Promise<Response>,\n\t\t};\n\n\t\treturn this.models[step][modelMethod](options) as Promise<Awaited<ReturnType<T>>>;\n\t}\n\n\tasync doStream(\n\t\toptions: Parameters<LanguageModelV2[\"doStream\"]>[0],\n\t): Promise<Awaited<ReturnType<LanguageModelV2[\"doStream\"]>>> {\n\t\treturn this.processModelRequest<LanguageModelV2[\"doStream\"]>(options, \"doStream\");\n\t}\n\n\tasync doGenerate(\n\t\toptions: Parameters<LanguageModelV2[\"doGenerate\"]>[0],\n\t): Promise<Awaited<ReturnType<LanguageModelV2[\"doGenerate\"]>>> {\n\t\treturn this.processModelRequest<LanguageModelV2[\"doGenerate\"]>(options, \"doGenerate\");\n\t}\n}\n\nexport interface AiGateway {\n\t(models: LanguageModelV2 | LanguageModelV2[]): LanguageModelV2;\n\n\tchat(models: LanguageModelV2 | LanguageModelV2[]): LanguageModelV2;\n}\n\nexport type AiGatewayReties = {\n\tmaxAttempts?: 1 | 2 | 3 | 4 | 5;\n\tretryDelayMs?: number;\n\tbackoff?: \"constant\" | \"linear\" | \"exponential\";\n};\nexport type AiGatewayOptions = {\n\tcacheKey?: string;\n\tcacheTtl?: number;\n\tskipCache?: boolean;\n\tmetadata?: Record<string, number | string | boolean | null | bigint>;\n\tcollectLog?: boolean;\n\teventId?: string;\n\trequestTimeoutMs?: number;\n\tretries?: AiGatewayReties;\n};\nexport type AiGatewayAPISettings = {\n\tgateway: string;\n\taccountId: string;\n\tapiKey?: string;\n\toptions?: AiGatewayOptions;\n};\nexport type AiGatewayBindingSettings = {\n\tbinding: {\n\t\trun(data: unknown): Promise<Response>;\n\t};\n\toptions?: AiGatewayOptions;\n};\nexport type AiGatewaySettings = AiGatewayAPISettings | AiGatewayBindingSettings;\n\nexport function createAiGateway(options: AiGatewaySettings): AiGateway {\n\tconst createChatModel = (models: LanguageModelV2 | LanguageModelV2[]) => {\n\t\treturn new AiGatewayChatLanguageModel(Array.isArray(models) ? models : [models], options);\n\t};\n\n\tconst provider = (models: LanguageModelV2 | LanguageModelV2[]) => createChatModel(models);\n\n\tprovider.chat = createChatModel;\n\n\treturn provider;\n}\n\nexport function parseAiGatewayOptions(options: AiGatewayOptions): Headers {\n\tconst headers = new Headers();\n\n\tif (options.skipCache === true) {\n\t\theaders.set(\"cf-skip-cache\", \"true\");\n\t}\n\n\tif (options.cacheTtl) {\n\t\theaders.set(\"cf-cache-ttl\", options.cacheTtl.toString());\n\t}\n\n\tif (options.metadata) {\n\t\theaders.set(\"cf-aig-metadata\", JSON.stringify(options.metadata));\n\t}\n\n\tif (options.cacheKey) {\n\t\theaders.set(\"cf-aig-cache-key\", options.cacheKey);\n\t}\n\n\tif (options.collectLog !== undefined) {\n\t\theaders.set(\"cf-aig-collect-log\", options.collectLog === true ? \"true\" : \"false\");\n\t}\n\n\tif (options.eventId !== undefined) {\n\t\theaders.set(\"cf-aig-event-id\", options.eventId);\n\t}\n\n\tif (options.requestTimeoutMs !== undefined) {\n\t\theaders.set(\"cf-aig-request-timeout\", options.requestTimeoutMs.toString());\n\t}\n\n\tif (options.retries !== undefined) {\n\t\tif (options.retries.maxAttempts !== undefined) {\n\t\t\theaders.set(\"cf-aig-max-attempts\", options.retries.maxAttempts.toString());\n\t\t}\n\t\tif (options.retries.retryDelayMs !== undefined) {\n\t\t\theaders.set(\"cf-aig-retry-delay\", options.retries.retryDelayMs.toString());\n\t\t}\n\t\tif (options.retries.backoff !== undefined) {\n\t\t\theaders.set(\"cf-aig-backoff\", options.retries.backoff);\n\t\t}\n\t}\n\n\treturn headers;\n}\n"],"mappings":"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","names":[]}