@ai-sdk/gateway 1.0.0-beta.1 → 1.0.0-beta.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +72 -0
- package/dist/index.d.mts +32 -29
- package/dist/index.d.ts +32 -29
- package/dist/index.js +158 -59
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +150 -51
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -5
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/gateway-provider.ts","../src/errors/as-gateway-error.ts","../src/errors/create-gateway-error.ts","../src/errors/gateway-error.ts","../src/errors/gateway-authentication-error.ts","../src/errors/gateway-invalid-request-error.ts","../src/errors/gateway-rate-limit-error.ts","../src/errors/gateway-model-not-found-error.ts","../src/errors/gateway-internal-server-error.ts","../src/errors/gateway-response-error.ts","../src/errors/extract-api-call-response.ts","../src/gateway-fetch-metadata.ts","../src/gateway-language-model.ts","../src/vercel-environment.ts"],"sourcesContent":["export type { GatewayModelId } from './gateway-language-model-settings';\nexport type {\n GatewayLanguageModelEntry,\n GatewayLanguageModelSpecification,\n} from './gateway-model-entry';\nexport {\n createGatewayProvider,\n createGatewayProvider as createGateway,\n gateway,\n} from './gateway-provider';\nexport type {\n GatewayProvider,\n GatewayProviderSettings,\n} from './gateway-provider';\nexport {\n GatewayError,\n GatewayAuthenticationError,\n GatewayInvalidRequestError,\n GatewayRateLimitError,\n GatewayModelNotFoundError,\n GatewayInternalServerError,\n GatewayResponseError,\n} from './errors';\nexport type { GatewayErrorResponse } from './errors';\n","import type { LanguageModelV2, ProviderV2 } from '@ai-sdk/provider';\nimport { NoSuchModelError } from '@ai-sdk/provider';\nimport {\n loadOptionalSetting,\n withoutTrailingSlash,\n} from '@ai-sdk/provider-utils';\nimport { type FetchFunction } from '@ai-sdk/provider-utils';\nimport { asGatewayError } from './errors';\nimport {\n GatewayFetchMetadata,\n type GatewayFetchMetadataResponse,\n} from './gateway-fetch-metadata';\nimport { GatewayLanguageModel } from './gateway-language-model';\nimport type { GatewayModelId } from './gateway-language-model-settings';\nimport { getVercelOidcToken, getVercelRequestId } from './vercel-environment';\n\nexport interface GatewayProvider extends ProviderV2 {\n (modelId: GatewayModelId): LanguageModelV2;\n\n /**\nCreates a model for text generation.\n*/\n languageModel(modelId: GatewayModelId): LanguageModelV2;\n\n /**\nReturns available providers and models for use with the remote provider.\n */\n getAvailableModels(): Promise<GatewayFetchMetadataResponse>;\n}\n\nexport interface GatewayProviderSettings {\n /**\nThe base URL prefix for API calls. Defaults to `https://ai-gateway.vercel.sh/v1/ai`.\n */\n baseURL?: string;\n\n /**\nAPI key that is being sent using the `Authorization` header.\n */\n apiKey?: string;\n\n /**\nCustom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\nCustom fetch implementation. You can use it as a middleware to intercept requests,\nor to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n\n /**\nHow frequently to refresh the metadata cache in milliseconds.\n */\n metadataCacheRefreshMillis?: number;\n\n /**\n * @internal For testing purposes only\n */\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nconst AI_GATEWAY_PROTOCOL_VERSION = '0.0.1';\n\nexport async function getGatewayAuthToken(options: GatewayProviderSettings) {\n return (\n loadOptionalSetting({\n settingValue: options.apiKey,\n environmentVariableName: 'AI_GATEWAY_API_KEY',\n }) ?? (await getVercelOidcToken())\n );\n}\n\n/**\nCreate a remote provider instance.\n */\nexport function createGatewayProvider(\n options: GatewayProviderSettings = {},\n): GatewayProvider {\n let pendingMetadata: Promise<GatewayFetchMetadataResponse> | null = null;\n let metadataCache: GatewayFetchMetadataResponse | null = null;\n const cacheRefreshMillis =\n options.metadataCacheRefreshMillis ?? 1000 * 60 * 5;\n let lastFetchTime = 0;\n\n const baseURL =\n withoutTrailingSlash(options.baseURL) ??\n 'https://ai-gateway.vercel.sh/v1/ai';\n\n const getHeaders = async () => {\n return {\n Authorization: `Bearer ${await getGatewayAuthToken(options)}`,\n 'ai-gateway-protocol-version': AI_GATEWAY_PROTOCOL_VERSION,\n ...options.headers,\n };\n };\n\n const createLanguageModel = (modelId: GatewayModelId) => {\n const deploymentId = loadOptionalSetting({\n settingValue: undefined,\n environmentVariableName: 'VERCEL_DEPLOYMENT_ID',\n });\n const environment = loadOptionalSetting({\n settingValue: undefined,\n environmentVariableName: 'VERCEL_ENV',\n });\n const region = loadOptionalSetting({\n settingValue: undefined,\n environmentVariableName: 'VERCEL_REGION',\n });\n return new GatewayLanguageModel(modelId, {\n provider: 'gateway',\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n o11yHeaders: async () => {\n const requestId = await getVercelRequestId();\n return {\n ...(deploymentId && { 'ai-o11y-deployment-id': deploymentId }),\n ...(environment && { 'ai-o11y-environment': environment }),\n ...(region && { 'ai-o11y-region': region }),\n ...(requestId && { 'ai-o11y-request-id': requestId }),\n };\n },\n });\n };\n\n const getAvailableModels = async () => {\n const now = options._internal?.currentDate?.().getTime() ?? Date.now();\n if (!pendingMetadata || now - lastFetchTime > cacheRefreshMillis) {\n lastFetchTime = now;\n pendingMetadata = new GatewayFetchMetadata({\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n })\n .getAvailableModels()\n .then(metadata => {\n metadataCache = metadata;\n return metadata;\n })\n .catch((error: unknown) => {\n throw asGatewayError(error);\n });\n }\n\n return metadataCache ? Promise.resolve(metadataCache) : pendingMetadata;\n };\n\n const provider = function (modelId: GatewayModelId) {\n if (new.target) {\n throw new Error(\n 'The Gateway Provider model function cannot be called with the new keyword.',\n );\n }\n\n return createLanguageModel(modelId);\n };\n\n provider.getAvailableModels = getAvailableModels;\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n provider.languageModel = createLanguageModel;\n provider.textEmbeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'textEmbeddingModel' });\n };\n\n return provider;\n}\n\nexport const gateway = createGatewayProvider();\n","import { APICallError } from '@ai-sdk/provider';\nimport { extractApiCallResponse, GatewayError } from '.';\nimport { createGatewayErrorFromResponse } from './create-gateway-error';\n\nexport function asGatewayError(error: unknown) {\n if (GatewayError.isInstance(error)) {\n return error;\n }\n\n if (APICallError.isInstance(error)) {\n return createGatewayErrorFromResponse({\n response: extractApiCallResponse(error),\n statusCode: error.statusCode ?? 500,\n defaultMessage: 'Gateway request failed',\n cause: error,\n });\n }\n\n return createGatewayErrorFromResponse({\n response: {},\n statusCode: 500,\n defaultMessage:\n error instanceof Error\n ? `Gateway request failed: ${error.message}`\n : 'Unknown Gateway error',\n cause: error,\n });\n}\n","import { z } from 'zod';\nimport type { GatewayError } from './gateway-error';\nimport { GatewayAuthenticationError } from './gateway-authentication-error';\nimport { GatewayInvalidRequestError } from './gateway-invalid-request-error';\nimport { GatewayRateLimitError } from './gateway-rate-limit-error';\nimport {\n GatewayModelNotFoundError,\n modelNotFoundParamSchema,\n} from './gateway-model-not-found-error';\nimport { GatewayInternalServerError } from './gateway-internal-server-error';\nimport { GatewayResponseError } from './gateway-response-error';\n\nexport function createGatewayErrorFromResponse({\n response,\n statusCode,\n defaultMessage = 'Gateway request failed',\n cause,\n}: {\n response: unknown;\n statusCode: number;\n defaultMessage?: string;\n cause?: unknown;\n}): GatewayError {\n const parseResult = gatewayErrorResponseSchema.safeParse(response);\n if (!parseResult.success) {\n return new GatewayResponseError({\n message: `Invalid error response format: ${defaultMessage}`,\n statusCode,\n response,\n validationError: parseResult.error,\n cause,\n });\n }\n\n const validatedResponse: GatewayErrorResponse = parseResult.data;\n const errorType = validatedResponse.error.type;\n const message = validatedResponse.error.message;\n\n switch (errorType) {\n case 'authentication_error':\n return new GatewayAuthenticationError({ message, statusCode, cause });\n case 'invalid_request_error':\n return new GatewayInvalidRequestError({ message, statusCode, cause });\n case 'rate_limit_exceeded':\n return new GatewayRateLimitError({ message, statusCode, cause });\n case 'model_not_found': {\n const modelResult = modelNotFoundParamSchema.safeParse(\n validatedResponse.error.param,\n );\n return new GatewayModelNotFoundError({\n message,\n statusCode,\n modelId: modelResult.success ? modelResult.data.modelId : undefined,\n cause,\n });\n }\n case 'internal_server_error':\n return new GatewayInternalServerError({ message, statusCode, cause });\n default:\n return new GatewayInternalServerError({ message, statusCode, cause });\n }\n}\n\nconst gatewayErrorResponseSchema = z.object({\n error: z.object({\n message: z.string(),\n type: z.string().nullish(),\n param: z.unknown().nullish(),\n code: z.union([z.string(), z.number()]).nullish(),\n }),\n});\n\nexport type GatewayErrorResponse = z.infer<typeof gatewayErrorResponseSchema>;\n","const marker = 'vercel.ai.gateway.error';\nconst symbol = Symbol.for(marker);\n\nexport abstract class GatewayError extends Error {\n private readonly [symbol] = true; // used in isInstance\n\n abstract readonly name: string;\n abstract readonly type: string;\n readonly statusCode: number;\n readonly cause?: unknown;\n\n constructor({\n message,\n statusCode = 500,\n cause,\n }: {\n message: string;\n statusCode?: number;\n cause?: unknown;\n }) {\n super(message);\n this.statusCode = statusCode;\n this.cause = cause;\n }\n\n /**\n * Checks if the given error is a Gateway Error.\n * @param {unknown} error - The error to check.\n * @returns {boolean} True if the error is a Gateway Error, false otherwise.\n */\n static isInstance(error: unknown): error is GatewayError {\n return GatewayError.hasMarker(error);\n }\n\n static hasMarker(error: unknown): error is GatewayError {\n return (\n typeof error === 'object' &&\n error !== null &&\n symbol in error &&\n (error as any)[symbol] === true\n );\n }\n}\n","import { GatewayError } from './gateway-error';\n\nconst name = 'GatewayAuthenticationError';\nconst marker = `vercel.ai.gateway.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * Authentication failed - invalid API key or OIDC token\n */\nexport class GatewayAuthenticationError extends GatewayError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly name = name;\n readonly type = 'authentication_error';\n\n constructor({\n message = 'Authentication failed',\n statusCode = 401,\n cause,\n }: {\n message?: string;\n statusCode?: number;\n cause?: unknown;\n } = {}) {\n super({ message, statusCode, cause });\n }\n\n static isInstance(error: unknown): error is GatewayAuthenticationError {\n return GatewayError.hasMarker(error) && symbol in error;\n }\n}\n","import { GatewayError } from './gateway-error';\n\nconst name = 'GatewayInvalidRequestError';\nconst marker = `vercel.ai.gateway.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * Invalid request - missing headers, malformed data, etc.\n */\nexport class GatewayInvalidRequestError extends GatewayError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly name = name;\n readonly type = 'invalid_request_error';\n\n constructor({\n message = 'Invalid request',\n statusCode = 400,\n cause,\n }: {\n message?: string;\n statusCode?: number;\n cause?: unknown;\n } = {}) {\n super({ message, statusCode, cause });\n }\n\n static isInstance(error: unknown): error is GatewayInvalidRequestError {\n return GatewayError.hasMarker(error) && symbol in error;\n }\n}\n","import { GatewayError } from './gateway-error';\n\nconst name = 'GatewayRateLimitError';\nconst marker = `vercel.ai.gateway.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * Rate limit exceeded.\n */\nexport class GatewayRateLimitError extends GatewayError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly name = name;\n readonly type = 'rate_limit_exceeded';\n\n constructor({\n message = 'Rate limit exceeded',\n statusCode = 429,\n cause,\n }: {\n message?: string;\n statusCode?: number;\n cause?: unknown;\n } = {}) {\n super({ message, statusCode, cause });\n }\n\n static isInstance(error: unknown): error is GatewayRateLimitError {\n return GatewayError.hasMarker(error) && symbol in error;\n }\n}\n","import { z } from 'zod';\nimport { GatewayError } from './gateway-error';\n\nconst name = 'GatewayModelNotFoundError';\nconst marker = `vercel.ai.gateway.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport const modelNotFoundParamSchema = z.object({\n modelId: z.string(),\n});\n\n/**\n * Model not found or not available\n */\nexport class GatewayModelNotFoundError extends GatewayError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly name = name;\n readonly type = 'model_not_found';\n readonly modelId?: string;\n\n constructor({\n message = 'Model not found',\n statusCode = 404,\n modelId,\n cause,\n }: {\n message?: string;\n statusCode?: number;\n modelId?: string;\n cause?: unknown;\n } = {}) {\n super({ message, statusCode, cause });\n this.modelId = modelId;\n }\n\n static isInstance(error: unknown): error is GatewayModelNotFoundError {\n return GatewayError.hasMarker(error) && symbol in error;\n }\n}\n","import { GatewayError } from './gateway-error';\n\nconst name = 'GatewayInternalServerError';\nconst marker = `vercel.ai.gateway.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * Internal server error from the Gateway\n */\nexport class GatewayInternalServerError extends GatewayError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly name = name;\n readonly type = 'internal_server_error';\n\n constructor({\n message = 'Internal server error',\n statusCode = 500,\n cause,\n }: {\n message?: string;\n statusCode?: number;\n cause?: unknown;\n } = {}) {\n super({ message, statusCode, cause });\n }\n\n static isInstance(error: unknown): error is GatewayInternalServerError {\n return GatewayError.hasMarker(error) && symbol in error;\n }\n}\n","import { GatewayError } from './gateway-error';\nimport type { ZodError } from 'zod';\n\nconst name = 'GatewayResponseError';\nconst marker = `vercel.ai.gateway.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * Gateway response parsing error\n */\nexport class GatewayResponseError extends GatewayError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly name = name;\n readonly type = 'response_error';\n readonly response?: unknown;\n readonly validationError?: ZodError;\n\n constructor({\n message = 'Invalid response from Gateway',\n statusCode = 502,\n response,\n validationError,\n cause,\n }: {\n message?: string;\n statusCode?: number;\n response?: unknown;\n validationError?: ZodError;\n cause?: unknown;\n } = {}) {\n super({ message, statusCode, cause });\n this.response = response;\n this.validationError = validationError;\n }\n\n static isInstance(error: unknown): error is GatewayResponseError {\n return GatewayError.hasMarker(error) && symbol in error;\n }\n}\n","import type { APICallError } from '@ai-sdk/provider';\n\nexport function extractApiCallResponse(error: APICallError): unknown {\n if (error.data !== undefined) {\n return error.data;\n }\n if (error.responseBody != null) {\n try {\n return JSON.parse(error.responseBody);\n } catch {\n return error.responseBody;\n }\n }\n return {};\n}\n","import {\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n getFromApi,\n resolve,\n} from '@ai-sdk/provider-utils';\nimport { asGatewayError } from './errors';\nimport type { GatewayConfig } from './gateway-config';\nimport type { GatewayLanguageModelEntry } from './gateway-model-entry';\nimport { z } from 'zod';\n\ntype GatewayFetchMetadataConfig = GatewayConfig;\n\nexport interface GatewayFetchMetadataResponse {\n models: GatewayLanguageModelEntry[];\n}\n\nexport class GatewayFetchMetadata {\n constructor(private readonly config: GatewayFetchMetadataConfig) {}\n\n async getAvailableModels(): Promise<GatewayFetchMetadataResponse> {\n try {\n const { value } = await getFromApi({\n url: `${this.config.baseURL}/config`,\n headers: await resolve(this.config.headers()),\n successfulResponseHandler: createJsonResponseHandler(\n gatewayFetchMetadataSchema,\n ),\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: z.any(),\n errorToMessage: data => data,\n }),\n fetch: this.config.fetch,\n });\n\n return value;\n } catch (error) {\n throw asGatewayError(error);\n }\n }\n}\n\nconst gatewayLanguageModelSpecificationSchema = z.object({\n specificationVersion: z.literal('v2'),\n provider: z.string(),\n modelId: z.string(),\n});\n\nconst gatewayLanguageModelEntrySchema = z.object({\n id: z.string(),\n name: z.string(),\n specification: gatewayLanguageModelSpecificationSchema,\n});\n\nconst gatewayFetchMetadataSchema = z.object({\n models: z.array(gatewayLanguageModelEntrySchema),\n});\n","import type {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n LanguageModelV2FilePart,\n LanguageModelV2StreamPart,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n postJsonToApi,\n resolve,\n type ParseResult,\n type Resolvable,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod';\nimport type { GatewayConfig } from './gateway-config';\nimport type { GatewayModelId } from './gateway-language-model-settings';\nimport { asGatewayError } from './errors';\n\ntype GatewayChatConfig = GatewayConfig & {\n provider: string;\n o11yHeaders: Resolvable<Record<string, string>>;\n};\n\nexport class GatewayLanguageModel implements LanguageModelV2 {\n readonly specificationVersion = 'v2';\n readonly supportedUrls = { '*/*': [/.*/] };\n\n constructor(\n readonly modelId: GatewayModelId,\n private readonly config: GatewayChatConfig,\n ) {}\n\n get provider(): string {\n return this.config.provider;\n }\n\n async doGenerate(\n options: Parameters<LanguageModelV2['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<LanguageModelV2['doGenerate']>>> {\n const { abortSignal, ...body } = options;\n try {\n const {\n responseHeaders,\n value: responseBody,\n rawValue: rawResponse,\n } = await postJsonToApi({\n url: this.getUrl(),\n headers: combineHeaders(\n await resolve(this.config.headers()),\n options.headers,\n this.getModelConfigHeaders(this.modelId, false),\n await resolve(this.config.o11yHeaders),\n ),\n body: this.maybeEncodeFileParts(body),\n successfulResponseHandler: createJsonResponseHandler(z.any()),\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: z.any(),\n errorToMessage: data => data,\n }),\n ...(abortSignal && { abortSignal }),\n fetch: this.config.fetch,\n });\n\n return {\n ...responseBody,\n request: { body },\n response: { headers: responseHeaders, body: rawResponse },\n warnings: [],\n };\n } catch (error) {\n throw asGatewayError(error);\n }\n }\n\n async doStream(\n options: Parameters<LanguageModelV2['doStream']>[0],\n ): Promise<Awaited<ReturnType<LanguageModelV2['doStream']>>> {\n const { abortSignal, ...body } = options;\n\n try {\n const { value: response, responseHeaders } = await postJsonToApi({\n url: this.getUrl(),\n headers: combineHeaders(\n await resolve(this.config.headers()),\n options.headers,\n this.getModelConfigHeaders(this.modelId, true),\n await resolve(this.config.o11yHeaders),\n ),\n body: this.maybeEncodeFileParts(body),\n successfulResponseHandler: createEventSourceResponseHandler(z.any()),\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: z.any(),\n errorToMessage: data => data,\n }),\n ...(abortSignal && { abortSignal }),\n fetch: this.config.fetch,\n });\n\n return {\n stream: response.pipeThrough(\n new TransformStream<\n ParseResult<LanguageModelV2StreamPart>,\n LanguageModelV2StreamPart\n >({\n transform(chunk, controller) {\n if (chunk.success) {\n const streamPart = chunk.value;\n\n // Handle raw chunks: if this is a raw chunk from the gateway API,\n // only emit it if includeRawChunks is true\n if (streamPart.type === 'raw' && !options.includeRawChunks) {\n return; // Skip raw chunks if not requested\n }\n\n controller.enqueue(streamPart);\n } else {\n controller.error(\n (chunk as { success: false; error: unknown }).error,\n );\n }\n },\n }),\n ),\n request: { body },\n response: { headers: responseHeaders },\n };\n } catch (error) {\n throw asGatewayError(error);\n }\n }\n\n private isFilePart(part: unknown) {\n return (\n part && typeof part === 'object' && 'type' in part && part.type === 'file'\n );\n }\n\n /**\n * Encodes image parts in the prompt to base64. Mutates the passed options\n * instance directly to avoid copying the image data.\n * @param options - The options to encode.\n * @returns The options with the image parts encoded.\n */\n private maybeEncodeFileParts(options: LanguageModelV2CallOptions) {\n for (const message of options.prompt) {\n for (const part of message.content) {\n if (this.isFilePart(part)) {\n const filePart = part as LanguageModelV2FilePart;\n // If the image part is a URL it will get cleanly converted to a string.\n // If it's a binary image attachment we convert it to a data url.\n // In either case, server-side we should only ever see URLs as strings.\n if (filePart.data instanceof Uint8Array) {\n const buffer = Uint8Array.from(filePart.data);\n const base64Data = Buffer.from(buffer).toString('base64');\n filePart.data = new URL(\n `data:${filePart.mediaType || 'application/octet-stream'};base64,${base64Data}`,\n );\n }\n }\n }\n }\n return options;\n }\n\n private getUrl() {\n return `${this.config.baseURL}/language-model`;\n }\n\n private getModelConfigHeaders(modelId: string, streaming: boolean) {\n return {\n 'ai-language-model-specification-version': '2',\n 'ai-language-model-id': modelId,\n 'ai-language-model-streaming': String(streaming),\n };\n }\n}\n","import { GatewayAuthenticationError } from './errors';\n\nexport async function getVercelOidcToken(): Promise<string> {\n const token =\n getContext().headers?.['x-vercel-oidc-token'] ??\n process.env.VERCEL_OIDC_TOKEN;\n\n if (!token) {\n throw new GatewayAuthenticationError({\n message: `Failed to get Vercel OIDC token for AI Gateway access.\nThe token is expected to be provided via the 'VERCEL_OIDC_TOKEN' environment variable. It expires every 12 hours.\n- make sure your Vercel project settings have OIDC enabled\n- if you're running locally with 'vercel dev' the token is automatically obtained and refreshed for you\n- if you're running locally with your own dev server script you can fetch/update the token by running 'vercel env pull'\n- in production or preview the token is automatically obtained and refreshed for you`,\n statusCode: 401,\n });\n }\n\n return token;\n}\n\nexport async function getVercelRequestId(): Promise<string | undefined> {\n return getContext().headers?.['x-vercel-id'];\n}\n\ntype Context = {\n headers?: Record<string, string>;\n};\n\nconst SYMBOL_FOR_REQ_CONTEXT = Symbol.for('@vercel/request-context');\n\nfunction getContext(): Context {\n const fromSymbol: typeof globalThis & {\n [SYMBOL_FOR_REQ_CONTEXT]?: { get?: () => Context };\n } = globalThis;\n return fromSymbol[SYMBOL_FOR_REQ_CONTEXT]?.get?.() ?? {};\n}\n"],"mappings":"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","names":["import_provider","import_provider_utils","import_zod","marker","symbol","_a","_b","name","marker","symbol","_a","_b","name","marker","symbol","_a","_b","name","marker","symbol","_a","_b","name","marker","symbol","_a","_b","name","marker","symbol","_a","_b","_a","import_zod","import_provider_utils","import_zod","_a","_b","_a","_b"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/gateway-provider.ts","../src/errors/as-gateway-error.ts","../src/errors/create-gateway-error.ts","../src/errors/gateway-error.ts","../src/errors/gateway-authentication-error.ts","../src/errors/gateway-invalid-request-error.ts","../src/errors/gateway-rate-limit-error.ts","../src/errors/gateway-model-not-found-error.ts","../src/errors/gateway-internal-server-error.ts","../src/errors/gateway-response-error.ts","../src/errors/extract-api-call-response.ts","../src/errors/parse-auth-method.ts","../src/gateway-fetch-metadata.ts","../src/gateway-language-model.ts","../src/vercel-environment.ts"],"sourcesContent":["export type { GatewayModelId } from './gateway-language-model-settings';\nexport type {\n GatewayLanguageModelEntry,\n GatewayLanguageModelSpecification,\n} from './gateway-model-entry';\nexport {\n createGatewayProvider,\n createGatewayProvider as createGateway,\n gateway,\n} from './gateway-provider';\nexport type {\n GatewayProvider,\n GatewayProviderSettings,\n} from './gateway-provider';\nexport {\n GatewayError,\n GatewayAuthenticationError,\n GatewayInvalidRequestError,\n GatewayRateLimitError,\n GatewayModelNotFoundError,\n GatewayInternalServerError,\n GatewayResponseError,\n} from './errors';\nexport type { GatewayErrorResponse } from './errors';\n","import type { LanguageModelV2, ProviderV2 } from '@ai-sdk/provider';\nimport { NoSuchModelError } from '@ai-sdk/provider';\nimport {\n loadOptionalSetting,\n withoutTrailingSlash,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { asGatewayError, GatewayAuthenticationError } from './errors';\nimport {\n GATEWAY_AUTH_METHOD_HEADER,\n parseAuthMethod,\n} from './errors/parse-auth-method';\nimport {\n GatewayFetchMetadata,\n type GatewayFetchMetadataResponse,\n} from './gateway-fetch-metadata';\nimport { GatewayLanguageModel } from './gateway-language-model';\nimport type { GatewayModelId } from './gateway-language-model-settings';\nimport { getVercelOidcToken, getVercelRequestId } from './vercel-environment';\n\nexport interface GatewayProvider extends ProviderV2 {\n (modelId: GatewayModelId): LanguageModelV2;\n\n /**\nCreates a model for text generation.\n*/\n languageModel(modelId: GatewayModelId): LanguageModelV2;\n\n /**\nReturns available providers and models for use with the remote provider.\n */\n getAvailableModels(): Promise<GatewayFetchMetadataResponse>;\n}\n\nexport interface GatewayProviderSettings {\n /**\nThe base URL prefix for API calls. Defaults to `https://ai-gateway.vercel.sh/v1/ai`.\n */\n baseURL?: string;\n\n /**\nAPI key that is being sent using the `Authorization` header.\n */\n apiKey?: string;\n\n /**\nCustom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\nCustom fetch implementation. You can use it as a middleware to intercept requests,\nor to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n\n /**\nHow frequently to refresh the metadata cache in milliseconds.\n */\n metadataCacheRefreshMillis?: number;\n\n /**\n * @internal For testing purposes only\n */\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nconst AI_GATEWAY_PROTOCOL_VERSION = '0.0.1';\n\n/**\nCreate a remote provider instance.\n */\nexport function createGatewayProvider(\n options: GatewayProviderSettings = {},\n): GatewayProvider {\n let pendingMetadata: Promise<GatewayFetchMetadataResponse> | null = null;\n let metadataCache: GatewayFetchMetadataResponse | null = null;\n const cacheRefreshMillis =\n options.metadataCacheRefreshMillis ?? 1000 * 60 * 5;\n let lastFetchTime = 0;\n\n const baseURL =\n withoutTrailingSlash(options.baseURL) ??\n 'https://ai-gateway.vercel.sh/v1/ai';\n\n const getHeaders = async () => {\n const auth = await getGatewayAuthToken(options);\n if (auth) {\n return {\n Authorization: `Bearer ${auth.token}`,\n 'ai-gateway-protocol-version': AI_GATEWAY_PROTOCOL_VERSION,\n [GATEWAY_AUTH_METHOD_HEADER]: auth.authMethod,\n ...options.headers,\n };\n }\n\n throw GatewayAuthenticationError.createContextualError({\n apiKeyProvided: false,\n oidcTokenProvided: false,\n statusCode: 401,\n });\n };\n\n const createLanguageModel = (modelId: GatewayModelId) => {\n const deploymentId = loadOptionalSetting({\n settingValue: undefined,\n environmentVariableName: 'VERCEL_DEPLOYMENT_ID',\n });\n const environment = loadOptionalSetting({\n settingValue: undefined,\n environmentVariableName: 'VERCEL_ENV',\n });\n const region = loadOptionalSetting({\n settingValue: undefined,\n environmentVariableName: 'VERCEL_REGION',\n });\n\n return new GatewayLanguageModel(modelId, {\n provider: 'gateway',\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n o11yHeaders: async () => {\n const requestId = await getVercelRequestId();\n return {\n ...(deploymentId && { 'ai-o11y-deployment-id': deploymentId }),\n ...(environment && { 'ai-o11y-environment': environment }),\n ...(region && { 'ai-o11y-region': region }),\n ...(requestId && { 'ai-o11y-request-id': requestId }),\n };\n },\n });\n };\n\n const getAvailableModels = async () => {\n const now = options._internal?.currentDate?.().getTime() ?? Date.now();\n if (!pendingMetadata || now - lastFetchTime > cacheRefreshMillis) {\n lastFetchTime = now;\n\n pendingMetadata = new GatewayFetchMetadata({\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n })\n .getAvailableModels()\n .then(metadata => {\n metadataCache = metadata;\n return metadata;\n })\n .catch(async (error: unknown) => {\n throw asGatewayError(error, parseAuthMethod(await getHeaders()));\n });\n }\n\n return metadataCache ? Promise.resolve(metadataCache) : pendingMetadata;\n };\n\n const provider = function (modelId: GatewayModelId) {\n if (new.target) {\n throw new Error(\n 'The Gateway Provider model function cannot be called with the new keyword.',\n );\n }\n\n return createLanguageModel(modelId);\n };\n\n provider.getAvailableModels = getAvailableModels;\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n provider.languageModel = createLanguageModel;\n provider.textEmbeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'textEmbeddingModel' });\n };\n\n return provider;\n}\n\nexport const gateway = createGatewayProvider();\n\nexport async function getGatewayAuthToken(\n options: GatewayProviderSettings,\n): Promise<{\n token: string;\n authMethod: 'api-key' | 'oidc';\n} | null> {\n const apiKey = loadOptionalSetting({\n settingValue: options.apiKey,\n environmentVariableName: 'AI_GATEWAY_API_KEY',\n });\n\n if (apiKey) {\n return {\n token: apiKey,\n authMethod: 'api-key',\n };\n }\n\n try {\n const oidcToken = await getVercelOidcToken();\n return {\n token: oidcToken,\n authMethod: 'oidc',\n };\n } catch (error) {\n return null;\n }\n}\n","import { APICallError } from '@ai-sdk/provider';\nimport { extractApiCallResponse, GatewayError } from '.';\nimport { createGatewayErrorFromResponse } from './create-gateway-error';\n\nexport function asGatewayError(\n error: unknown,\n authMethod?: 'api-key' | 'oidc',\n) {\n if (GatewayError.isInstance(error)) {\n return error;\n }\n\n if (APICallError.isInstance(error)) {\n return createGatewayErrorFromResponse({\n response: extractApiCallResponse(error),\n statusCode: error.statusCode ?? 500,\n defaultMessage: 'Gateway request failed',\n cause: error,\n authMethod,\n });\n }\n\n return createGatewayErrorFromResponse({\n response: {},\n statusCode: 500,\n defaultMessage:\n error instanceof Error\n ? `Gateway request failed: ${error.message}`\n : 'Unknown Gateway error',\n cause: error,\n authMethod,\n });\n}\n","import { z } from 'zod/v4';\nimport type { GatewayError } from './gateway-error';\nimport { GatewayAuthenticationError } from './gateway-authentication-error';\nimport { GatewayInvalidRequestError } from './gateway-invalid-request-error';\nimport { GatewayRateLimitError } from './gateway-rate-limit-error';\nimport {\n GatewayModelNotFoundError,\n modelNotFoundParamSchema,\n} from './gateway-model-not-found-error';\nimport { GatewayInternalServerError } from './gateway-internal-server-error';\nimport { GatewayResponseError } from './gateway-response-error';\n\nexport function createGatewayErrorFromResponse({\n response,\n statusCode,\n defaultMessage = 'Gateway request failed',\n cause,\n authMethod,\n}: {\n response: unknown;\n statusCode: number;\n defaultMessage?: string;\n cause?: unknown;\n authMethod?: 'api-key' | 'oidc';\n}): GatewayError {\n const parseResult = gatewayErrorResponseSchema.safeParse(response);\n if (!parseResult.success) {\n return new GatewayResponseError({\n message: `Invalid error response format: ${defaultMessage}`,\n statusCode,\n response,\n validationError: parseResult.error,\n cause,\n });\n }\n\n const validatedResponse: GatewayErrorResponse = parseResult.data;\n const errorType = validatedResponse.error.type;\n const message = validatedResponse.error.message;\n\n switch (errorType) {\n case 'authentication_error':\n return GatewayAuthenticationError.createContextualError({\n apiKeyProvided: authMethod === 'api-key',\n oidcTokenProvided: authMethod === 'oidc',\n statusCode,\n cause,\n });\n case 'invalid_request_error':\n return new GatewayInvalidRequestError({ message, statusCode, cause });\n case 'rate_limit_exceeded':\n return new GatewayRateLimitError({ message, statusCode, cause });\n case 'model_not_found': {\n const modelResult = modelNotFoundParamSchema.safeParse(\n validatedResponse.error.param,\n );\n return new GatewayModelNotFoundError({\n message,\n statusCode,\n modelId: modelResult.success ? modelResult.data.modelId : undefined,\n cause,\n });\n }\n case 'internal_server_error':\n return new GatewayInternalServerError({ message, statusCode, cause });\n default:\n return new GatewayInternalServerError({ message, statusCode, cause });\n }\n}\n\nconst gatewayErrorResponseSchema = z.object({\n error: z.object({\n message: z.string(),\n type: z.string().nullish(),\n param: z.unknown().nullish(),\n code: z.union([z.string(), z.number()]).nullish(),\n }),\n});\n\nexport type GatewayErrorResponse = z.infer<typeof gatewayErrorResponseSchema>;\n","const marker = 'vercel.ai.gateway.error';\nconst symbol = Symbol.for(marker);\n\nexport abstract class GatewayError extends Error {\n private readonly [symbol] = true; // used in isInstance\n\n abstract readonly name: string;\n abstract readonly type: string;\n readonly statusCode: number;\n readonly cause?: unknown;\n\n constructor({\n message,\n statusCode = 500,\n cause,\n }: {\n message: string;\n statusCode?: number;\n cause?: unknown;\n }) {\n super(message);\n this.statusCode = statusCode;\n this.cause = cause;\n }\n\n /**\n * Checks if the given error is a Gateway Error.\n * @param {unknown} error - The error to check.\n * @returns {boolean} True if the error is a Gateway Error, false otherwise.\n */\n static isInstance(error: unknown): error is GatewayError {\n return GatewayError.hasMarker(error);\n }\n\n static hasMarker(error: unknown): error is GatewayError {\n return (\n typeof error === 'object' &&\n error !== null &&\n symbol in error &&\n (error as any)[symbol] === true\n );\n }\n}\n","import { GatewayError } from './gateway-error';\n\nconst name = 'GatewayAuthenticationError';\nconst marker = `vercel.ai.gateway.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * Authentication failed - invalid API key or OIDC token\n */\nexport class GatewayAuthenticationError extends GatewayError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly name = name;\n readonly type = 'authentication_error';\n\n constructor({\n message = 'Authentication failed',\n statusCode = 401,\n cause,\n }: {\n message?: string;\n statusCode?: number;\n cause?: unknown;\n } = {}) {\n super({ message, statusCode, cause });\n }\n\n static isInstance(error: unknown): error is GatewayAuthenticationError {\n return GatewayError.hasMarker(error) && symbol in error;\n }\n\n /**\n * Creates a contextual error message when authentication fails\n */\n static createContextualError({\n apiKeyProvided,\n oidcTokenProvided,\n message = 'Authentication failed',\n statusCode = 401,\n cause,\n }: {\n apiKeyProvided: boolean;\n oidcTokenProvided: boolean;\n message?: string;\n statusCode?: number;\n cause?: unknown;\n }): GatewayAuthenticationError {\n let contextualMessage: string;\n\n if (apiKeyProvided) {\n contextualMessage = `AI Gateway authentication failed: Invalid API key provided.\n\nThe token is expected to be provided via the 'apiKey' option or 'AI_GATEWAY_API_KEY' environment variable.`;\n } else if (oidcTokenProvided) {\n contextualMessage = `AI Gateway authentication failed: Invalid OIDC token provided.\n\nThe token is expected to be provided via the 'VERCEL_OIDC_TOKEN' environment variable. It expires every 12 hours.\n- make sure your Vercel project settings have OIDC enabled\n- if running locally with 'vercel dev', the token is automatically obtained and refreshed\n- if running locally with your own dev server, run 'vercel env pull' to fetch the token\n- in production/preview, the token is automatically obtained and refreshed\n\nAlternative: Provide an API key via 'apiKey' option or 'AI_GATEWAY_API_KEY' environment variable.`;\n } else {\n contextualMessage = `AI Gateway authentication failed: No authentication provided.\n\nProvide either an API key or OIDC token.\n\nAPI key instructions:\n\nThe token is expected to be provided via the 'apiKey' option or 'AI_GATEWAY_API_KEY' environment variable.\n\nOIDC token instructions:\n\nThe token is expected to be provided via the 'VERCEL_OIDC_TOKEN' environment variable. It expires every 12 hours.\n- make sure your Vercel project settings have OIDC enabled\n- if running locally with 'vercel dev', the token is automatically obtained and refreshed\n- if running locally with your own dev server, run 'vercel env pull' to fetch the token\n- in production/preview, the token is automatically obtained and refreshed`;\n }\n\n return new GatewayAuthenticationError({\n message: contextualMessage,\n statusCode,\n cause,\n });\n }\n}\n","import { GatewayError } from './gateway-error';\n\nconst name = 'GatewayInvalidRequestError';\nconst marker = `vercel.ai.gateway.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * Invalid request - missing headers, malformed data, etc.\n */\nexport class GatewayInvalidRequestError extends GatewayError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly name = name;\n readonly type = 'invalid_request_error';\n\n constructor({\n message = 'Invalid request',\n statusCode = 400,\n cause,\n }: {\n message?: string;\n statusCode?: number;\n cause?: unknown;\n } = {}) {\n super({ message, statusCode, cause });\n }\n\n static isInstance(error: unknown): error is GatewayInvalidRequestError {\n return GatewayError.hasMarker(error) && symbol in error;\n }\n}\n","import { GatewayError } from './gateway-error';\n\nconst name = 'GatewayRateLimitError';\nconst marker = `vercel.ai.gateway.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * Rate limit exceeded.\n */\nexport class GatewayRateLimitError extends GatewayError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly name = name;\n readonly type = 'rate_limit_exceeded';\n\n constructor({\n message = 'Rate limit exceeded',\n statusCode = 429,\n cause,\n }: {\n message?: string;\n statusCode?: number;\n cause?: unknown;\n } = {}) {\n super({ message, statusCode, cause });\n }\n\n static isInstance(error: unknown): error is GatewayRateLimitError {\n return GatewayError.hasMarker(error) && symbol in error;\n }\n}\n","import { z } from 'zod/v4';\nimport { GatewayError } from './gateway-error';\n\nconst name = 'GatewayModelNotFoundError';\nconst marker = `vercel.ai.gateway.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport const modelNotFoundParamSchema = z.object({\n modelId: z.string(),\n});\n\n/**\n * Model not found or not available\n */\nexport class GatewayModelNotFoundError extends GatewayError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly name = name;\n readonly type = 'model_not_found';\n readonly modelId?: string;\n\n constructor({\n message = 'Model not found',\n statusCode = 404,\n modelId,\n cause,\n }: {\n message?: string;\n statusCode?: number;\n modelId?: string;\n cause?: unknown;\n } = {}) {\n super({ message, statusCode, cause });\n this.modelId = modelId;\n }\n\n static isInstance(error: unknown): error is GatewayModelNotFoundError {\n return GatewayError.hasMarker(error) && symbol in error;\n }\n}\n","import { GatewayError } from './gateway-error';\n\nconst name = 'GatewayInternalServerError';\nconst marker = `vercel.ai.gateway.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * Internal server error from the Gateway\n */\nexport class GatewayInternalServerError extends GatewayError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly name = name;\n readonly type = 'internal_server_error';\n\n constructor({\n message = 'Internal server error',\n statusCode = 500,\n cause,\n }: {\n message?: string;\n statusCode?: number;\n cause?: unknown;\n } = {}) {\n super({ message, statusCode, cause });\n }\n\n static isInstance(error: unknown): error is GatewayInternalServerError {\n return GatewayError.hasMarker(error) && symbol in error;\n }\n}\n","import { GatewayError } from './gateway-error';\nimport type { ZodError } from 'zod/v4';\n\nconst name = 'GatewayResponseError';\nconst marker = `vercel.ai.gateway.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * Gateway response parsing error\n */\nexport class GatewayResponseError extends GatewayError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly name = name;\n readonly type = 'response_error';\n readonly response?: unknown;\n readonly validationError?: ZodError;\n\n constructor({\n message = 'Invalid response from Gateway',\n statusCode = 502,\n response,\n validationError,\n cause,\n }: {\n message?: string;\n statusCode?: number;\n response?: unknown;\n validationError?: ZodError;\n cause?: unknown;\n } = {}) {\n super({ message, statusCode, cause });\n this.response = response;\n this.validationError = validationError;\n }\n\n static isInstance(error: unknown): error is GatewayResponseError {\n return GatewayError.hasMarker(error) && symbol in error;\n }\n}\n","import type { APICallError } from '@ai-sdk/provider';\n\nexport function extractApiCallResponse(error: APICallError): unknown {\n if (error.data !== undefined) {\n return error.data;\n }\n if (error.responseBody != null) {\n try {\n return JSON.parse(error.responseBody);\n } catch {\n return error.responseBody;\n }\n }\n return {};\n}\n","import { z } from 'zod/v4';\n\nexport const GATEWAY_AUTH_METHOD_HEADER = 'ai-gateway-auth-method' as const;\n\nexport function parseAuthMethod(headers: Record<string, string | undefined>) {\n const result = gatewayAuthMethodSchema.safeParse(\n headers[GATEWAY_AUTH_METHOD_HEADER],\n );\n return result.success ? result.data : undefined;\n}\n\nconst gatewayAuthMethodSchema = z.union([\n z.literal('api-key'),\n z.literal('oidc'),\n]);\n","import {\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n getFromApi,\n resolve,\n} from '@ai-sdk/provider-utils';\nimport { asGatewayError } from './errors';\nimport type { GatewayConfig } from './gateway-config';\nimport type { GatewayLanguageModelEntry } from './gateway-model-entry';\nimport { z } from 'zod/v4';\n\ntype GatewayFetchMetadataConfig = GatewayConfig;\n\nexport interface GatewayFetchMetadataResponse {\n models: GatewayLanguageModelEntry[];\n}\n\nexport class GatewayFetchMetadata {\n constructor(private readonly config: GatewayFetchMetadataConfig) {}\n\n async getAvailableModels(): Promise<GatewayFetchMetadataResponse> {\n try {\n const { value } = await getFromApi({\n url: `${this.config.baseURL}/config`,\n headers: await resolve(this.config.headers()),\n successfulResponseHandler: createJsonResponseHandler(\n gatewayFetchMetadataSchema,\n ),\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: z.any(),\n errorToMessage: data => data,\n }),\n fetch: this.config.fetch,\n });\n\n return value;\n } catch (error) {\n throw asGatewayError(error);\n }\n }\n}\n\nconst gatewayLanguageModelSpecificationSchema = z.object({\n specificationVersion: z.literal('v2'),\n provider: z.string(),\n modelId: z.string(),\n});\n\nconst gatewayLanguageModelPricingSchema = z.object({\n input: z.string(),\n output: z.string(),\n});\n\nconst gatewayLanguageModelEntrySchema = z.object({\n id: z.string(),\n name: z.string(),\n description: z.string().nullish(),\n pricing: gatewayLanguageModelPricingSchema.nullish(),\n specification: gatewayLanguageModelSpecificationSchema,\n});\n\nconst gatewayFetchMetadataSchema = z.object({\n models: z.array(gatewayLanguageModelEntrySchema),\n});\n","import type {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n LanguageModelV2FilePart,\n LanguageModelV2StreamPart,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n postJsonToApi,\n resolve,\n type ParseResult,\n type Resolvable,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport type { GatewayConfig } from './gateway-config';\nimport type { GatewayModelId } from './gateway-language-model-settings';\nimport { asGatewayError } from './errors';\nimport { parseAuthMethod } from './errors/parse-auth-method';\n\ntype GatewayChatConfig = GatewayConfig & {\n provider: string;\n o11yHeaders: Resolvable<Record<string, string>>;\n};\n\nexport class GatewayLanguageModel implements LanguageModelV2 {\n readonly specificationVersion = 'v2';\n readonly supportedUrls = { '*/*': [/.*/] };\n\n constructor(\n readonly modelId: GatewayModelId,\n private readonly config: GatewayChatConfig,\n ) {}\n\n get provider(): string {\n return this.config.provider;\n }\n\n async doGenerate(\n options: Parameters<LanguageModelV2['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<LanguageModelV2['doGenerate']>>> {\n const { abortSignal, ...body } = options;\n const resolvedHeaders = await resolve(this.config.headers());\n try {\n const {\n responseHeaders,\n value: responseBody,\n rawValue: rawResponse,\n } = await postJsonToApi({\n url: this.getUrl(),\n headers: combineHeaders(\n resolvedHeaders,\n options.headers,\n this.getModelConfigHeaders(this.modelId, false),\n await resolve(this.config.o11yHeaders),\n ),\n body: this.maybeEncodeFileParts(body),\n successfulResponseHandler: createJsonResponseHandler(z.any()),\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: z.any(),\n errorToMessage: data => data,\n }),\n ...(abortSignal && { abortSignal }),\n fetch: this.config.fetch,\n });\n\n return {\n ...responseBody,\n request: { body },\n response: { headers: responseHeaders, body: rawResponse },\n warnings: [],\n };\n } catch (error) {\n throw asGatewayError(error, parseAuthMethod(resolvedHeaders));\n }\n }\n\n async doStream(\n options: Parameters<LanguageModelV2['doStream']>[0],\n ): Promise<Awaited<ReturnType<LanguageModelV2['doStream']>>> {\n const { abortSignal, ...body } = options;\n const resolvedHeaders = await resolve(this.config.headers());\n try {\n const { value: response, responseHeaders } = await postJsonToApi({\n url: this.getUrl(),\n headers: combineHeaders(\n resolvedHeaders,\n options.headers,\n this.getModelConfigHeaders(this.modelId, true),\n await resolve(this.config.o11yHeaders),\n ),\n body: this.maybeEncodeFileParts(body),\n successfulResponseHandler: createEventSourceResponseHandler(z.any()),\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: z.any(),\n errorToMessage: data => data,\n }),\n ...(abortSignal && { abortSignal }),\n fetch: this.config.fetch,\n });\n\n return {\n stream: response.pipeThrough(\n new TransformStream<\n ParseResult<LanguageModelV2StreamPart>,\n LanguageModelV2StreamPart\n >({\n transform(chunk, controller) {\n if (chunk.success) {\n const streamPart = chunk.value;\n\n // Handle raw chunks: if this is a raw chunk from the gateway API,\n // only emit it if includeRawChunks is true\n if (streamPart.type === 'raw' && !options.includeRawChunks) {\n return; // Skip raw chunks if not requested\n }\n\n if (\n streamPart.type === 'response-metadata' &&\n streamPart.timestamp &&\n typeof streamPart.timestamp === 'string'\n ) {\n streamPart.timestamp = new Date(streamPart.timestamp);\n }\n\n controller.enqueue(streamPart);\n } else {\n controller.error(\n (chunk as { success: false; error: unknown }).error,\n );\n }\n },\n }),\n ),\n request: { body },\n response: { headers: responseHeaders },\n };\n } catch (error) {\n throw asGatewayError(error, parseAuthMethod(resolvedHeaders));\n }\n }\n\n private isFilePart(part: unknown) {\n return (\n part && typeof part === 'object' && 'type' in part && part.type === 'file'\n );\n }\n\n /**\n * Encodes file parts in the prompt to base64. Mutates the passed options\n * instance directly to avoid copying the file data.\n * @param options - The options to encode.\n * @returns The options with the file parts encoded.\n */\n private maybeEncodeFileParts(options: LanguageModelV2CallOptions) {\n for (const message of options.prompt) {\n for (const part of message.content) {\n if (this.isFilePart(part)) {\n const filePart = part as LanguageModelV2FilePart;\n // If the file part is a URL it will get cleanly converted to a string.\n // If it's a binary file attachment we convert it to a data url.\n // In either case, server-side we should only ever see URLs as strings.\n if (filePart.data instanceof Uint8Array) {\n const buffer = Uint8Array.from(filePart.data);\n const base64Data = Buffer.from(buffer).toString('base64');\n filePart.data = new URL(\n `data:${filePart.mediaType || 'application/octet-stream'};base64,${base64Data}`,\n );\n }\n }\n }\n }\n return options;\n }\n\n private getUrl() {\n return `${this.config.baseURL}/language-model`;\n }\n\n private getModelConfigHeaders(modelId: string, streaming: boolean) {\n return {\n 'ai-language-model-specification-version': '2',\n 'ai-language-model-id': modelId,\n 'ai-language-model-streaming': String(streaming),\n };\n }\n}\n","import { GatewayAuthenticationError } from './errors';\n\nexport async function getVercelOidcToken(): Promise<string> {\n const token =\n getContext().headers?.['x-vercel-oidc-token'] ??\n process.env.VERCEL_OIDC_TOKEN;\n\n if (!token) {\n throw new GatewayAuthenticationError({\n message: 'OIDC token not available',\n statusCode: 401,\n });\n }\n\n return token;\n}\n\nexport async function getVercelRequestId(): Promise<string | undefined> {\n return getContext().headers?.['x-vercel-id'];\n}\n\ntype Context = {\n headers?: Record<string, string>;\n};\n\nconst SYMBOL_FOR_REQ_CONTEXT = Symbol.for('@vercel/request-context');\n\nfunction getContext(): Context {\n const fromSymbol: typeof globalThis & {\n [SYMBOL_FOR_REQ_CONTEXT]?: { get?: () => Context };\n } = globalThis;\n return fromSymbol[SYMBOL_FOR_REQ_CONTEXT]?.get?.() ?? {};\n}\n"],"mappings":"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","names":["import_provider","import_provider_utils","import_v4","marker","symbol","_a","_b","name","marker","symbol","_a","_b","name","marker","symbol","_a","_b","name","marker","symbol","_a","_b","name","marker","symbol","_a","_b","name","marker","symbol","_a","_b","_a","import_v4","import_v4","import_provider_utils","import_v4","_a","_b","_a","_b"]}
|
package/dist/index.mjs
CHANGED
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
import { APICallError } from "@ai-sdk/provider";
|
|
10
10
|
|
|
11
11
|
// src/errors/create-gateway-error.ts
|
|
12
|
-
import { z as z2 } from "zod";
|
|
12
|
+
import { z as z2 } from "zod/v4";
|
|
13
13
|
|
|
14
14
|
// src/errors/gateway-error.ts
|
|
15
15
|
var marker = "vercel.ai.gateway.error";
|
|
@@ -44,7 +44,7 @@ var name = "GatewayAuthenticationError";
|
|
|
44
44
|
var marker2 = `vercel.ai.gateway.error.${name}`;
|
|
45
45
|
var symbol2 = Symbol.for(marker2);
|
|
46
46
|
var _a2, _b2;
|
|
47
|
-
var GatewayAuthenticationError = class extends (_b2 = GatewayError, _a2 = symbol2, _b2) {
|
|
47
|
+
var GatewayAuthenticationError = class _GatewayAuthenticationError extends (_b2 = GatewayError, _a2 = symbol2, _b2) {
|
|
48
48
|
constructor({
|
|
49
49
|
message = "Authentication failed",
|
|
50
50
|
statusCode = 401,
|
|
@@ -59,6 +59,54 @@ var GatewayAuthenticationError = class extends (_b2 = GatewayError, _a2 = symbol
|
|
|
59
59
|
static isInstance(error) {
|
|
60
60
|
return GatewayError.hasMarker(error) && symbol2 in error;
|
|
61
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Creates a contextual error message when authentication fails
|
|
64
|
+
*/
|
|
65
|
+
static createContextualError({
|
|
66
|
+
apiKeyProvided,
|
|
67
|
+
oidcTokenProvided,
|
|
68
|
+
message = "Authentication failed",
|
|
69
|
+
statusCode = 401,
|
|
70
|
+
cause
|
|
71
|
+
}) {
|
|
72
|
+
let contextualMessage;
|
|
73
|
+
if (apiKeyProvided) {
|
|
74
|
+
contextualMessage = `AI Gateway authentication failed: Invalid API key provided.
|
|
75
|
+
|
|
76
|
+
The token is expected to be provided via the 'apiKey' option or 'AI_GATEWAY_API_KEY' environment variable.`;
|
|
77
|
+
} else if (oidcTokenProvided) {
|
|
78
|
+
contextualMessage = `AI Gateway authentication failed: Invalid OIDC token provided.
|
|
79
|
+
|
|
80
|
+
The token is expected to be provided via the 'VERCEL_OIDC_TOKEN' environment variable. It expires every 12 hours.
|
|
81
|
+
- make sure your Vercel project settings have OIDC enabled
|
|
82
|
+
- if running locally with 'vercel dev', the token is automatically obtained and refreshed
|
|
83
|
+
- if running locally with your own dev server, run 'vercel env pull' to fetch the token
|
|
84
|
+
- in production/preview, the token is automatically obtained and refreshed
|
|
85
|
+
|
|
86
|
+
Alternative: Provide an API key via 'apiKey' option or 'AI_GATEWAY_API_KEY' environment variable.`;
|
|
87
|
+
} else {
|
|
88
|
+
contextualMessage = `AI Gateway authentication failed: No authentication provided.
|
|
89
|
+
|
|
90
|
+
Provide either an API key or OIDC token.
|
|
91
|
+
|
|
92
|
+
API key instructions:
|
|
93
|
+
|
|
94
|
+
The token is expected to be provided via the 'apiKey' option or 'AI_GATEWAY_API_KEY' environment variable.
|
|
95
|
+
|
|
96
|
+
OIDC token instructions:
|
|
97
|
+
|
|
98
|
+
The token is expected to be provided via the 'VERCEL_OIDC_TOKEN' environment variable. It expires every 12 hours.
|
|
99
|
+
- make sure your Vercel project settings have OIDC enabled
|
|
100
|
+
- if running locally with 'vercel dev', the token is automatically obtained and refreshed
|
|
101
|
+
- if running locally with your own dev server, run 'vercel env pull' to fetch the token
|
|
102
|
+
- in production/preview, the token is automatically obtained and refreshed`;
|
|
103
|
+
}
|
|
104
|
+
return new _GatewayAuthenticationError({
|
|
105
|
+
message: contextualMessage,
|
|
106
|
+
statusCode,
|
|
107
|
+
cause
|
|
108
|
+
});
|
|
109
|
+
}
|
|
62
110
|
};
|
|
63
111
|
|
|
64
112
|
// src/errors/gateway-invalid-request-error.ts
|
|
@@ -106,7 +154,7 @@ var GatewayRateLimitError = class extends (_b4 = GatewayError, _a4 = symbol4, _b
|
|
|
106
154
|
};
|
|
107
155
|
|
|
108
156
|
// src/errors/gateway-model-not-found-error.ts
|
|
109
|
-
import { z } from "zod";
|
|
157
|
+
import { z } from "zod/v4";
|
|
110
158
|
var name4 = "GatewayModelNotFoundError";
|
|
111
159
|
var marker5 = `vercel.ai.gateway.error.${name4}`;
|
|
112
160
|
var symbol5 = Symbol.for(marker5);
|
|
@@ -186,7 +234,8 @@ function createGatewayErrorFromResponse({
|
|
|
186
234
|
response,
|
|
187
235
|
statusCode,
|
|
188
236
|
defaultMessage = "Gateway request failed",
|
|
189
|
-
cause
|
|
237
|
+
cause,
|
|
238
|
+
authMethod
|
|
190
239
|
}) {
|
|
191
240
|
const parseResult = gatewayErrorResponseSchema.safeParse(response);
|
|
192
241
|
if (!parseResult.success) {
|
|
@@ -203,7 +252,12 @@ function createGatewayErrorFromResponse({
|
|
|
203
252
|
const message = validatedResponse.error.message;
|
|
204
253
|
switch (errorType) {
|
|
205
254
|
case "authentication_error":
|
|
206
|
-
return
|
|
255
|
+
return GatewayAuthenticationError.createContextualError({
|
|
256
|
+
apiKeyProvided: authMethod === "api-key",
|
|
257
|
+
oidcTokenProvided: authMethod === "oidc",
|
|
258
|
+
statusCode,
|
|
259
|
+
cause
|
|
260
|
+
});
|
|
207
261
|
case "invalid_request_error":
|
|
208
262
|
return new GatewayInvalidRequestError({ message, statusCode, cause });
|
|
209
263
|
case "rate_limit_exceeded":
|
|
@@ -235,7 +289,7 @@ var gatewayErrorResponseSchema = z2.object({
|
|
|
235
289
|
});
|
|
236
290
|
|
|
237
291
|
// src/errors/as-gateway-error.ts
|
|
238
|
-
function asGatewayError(error) {
|
|
292
|
+
function asGatewayError(error, authMethod) {
|
|
239
293
|
var _a8;
|
|
240
294
|
if (GatewayError.isInstance(error)) {
|
|
241
295
|
return error;
|
|
@@ -245,14 +299,16 @@ function asGatewayError(error) {
|
|
|
245
299
|
response: extractApiCallResponse(error),
|
|
246
300
|
statusCode: (_a8 = error.statusCode) != null ? _a8 : 500,
|
|
247
301
|
defaultMessage: "Gateway request failed",
|
|
248
|
-
cause: error
|
|
302
|
+
cause: error,
|
|
303
|
+
authMethod
|
|
249
304
|
});
|
|
250
305
|
}
|
|
251
306
|
return createGatewayErrorFromResponse({
|
|
252
307
|
response: {},
|
|
253
308
|
statusCode: 500,
|
|
254
309
|
defaultMessage: error instanceof Error ? `Gateway request failed: ${error.message}` : "Unknown Gateway error",
|
|
255
|
-
cause: error
|
|
310
|
+
cause: error,
|
|
311
|
+
authMethod
|
|
256
312
|
});
|
|
257
313
|
}
|
|
258
314
|
|
|
@@ -271,6 +327,20 @@ function extractApiCallResponse(error) {
|
|
|
271
327
|
return {};
|
|
272
328
|
}
|
|
273
329
|
|
|
330
|
+
// src/errors/parse-auth-method.ts
|
|
331
|
+
import { z as z3 } from "zod/v4";
|
|
332
|
+
var GATEWAY_AUTH_METHOD_HEADER = "ai-gateway-auth-method";
|
|
333
|
+
function parseAuthMethod(headers) {
|
|
334
|
+
const result = gatewayAuthMethodSchema.safeParse(
|
|
335
|
+
headers[GATEWAY_AUTH_METHOD_HEADER]
|
|
336
|
+
);
|
|
337
|
+
return result.success ? result.data : void 0;
|
|
338
|
+
}
|
|
339
|
+
var gatewayAuthMethodSchema = z3.union([
|
|
340
|
+
z3.literal("api-key"),
|
|
341
|
+
z3.literal("oidc")
|
|
342
|
+
]);
|
|
343
|
+
|
|
274
344
|
// src/gateway-fetch-metadata.ts
|
|
275
345
|
import {
|
|
276
346
|
createJsonErrorResponseHandler,
|
|
@@ -278,7 +348,7 @@ import {
|
|
|
278
348
|
getFromApi,
|
|
279
349
|
resolve
|
|
280
350
|
} from "@ai-sdk/provider-utils";
|
|
281
|
-
import { z as
|
|
351
|
+
import { z as z4 } from "zod/v4";
|
|
282
352
|
var GatewayFetchMetadata = class {
|
|
283
353
|
constructor(config) {
|
|
284
354
|
this.config = config;
|
|
@@ -292,7 +362,7 @@ var GatewayFetchMetadata = class {
|
|
|
292
362
|
gatewayFetchMetadataSchema
|
|
293
363
|
),
|
|
294
364
|
failedResponseHandler: createJsonErrorResponseHandler({
|
|
295
|
-
errorSchema:
|
|
365
|
+
errorSchema: z4.any(),
|
|
296
366
|
errorToMessage: (data) => data
|
|
297
367
|
}),
|
|
298
368
|
fetch: this.config.fetch
|
|
@@ -303,18 +373,24 @@ var GatewayFetchMetadata = class {
|
|
|
303
373
|
}
|
|
304
374
|
}
|
|
305
375
|
};
|
|
306
|
-
var gatewayLanguageModelSpecificationSchema =
|
|
307
|
-
specificationVersion:
|
|
308
|
-
provider:
|
|
309
|
-
modelId:
|
|
376
|
+
var gatewayLanguageModelSpecificationSchema = z4.object({
|
|
377
|
+
specificationVersion: z4.literal("v2"),
|
|
378
|
+
provider: z4.string(),
|
|
379
|
+
modelId: z4.string()
|
|
380
|
+
});
|
|
381
|
+
var gatewayLanguageModelPricingSchema = z4.object({
|
|
382
|
+
input: z4.string(),
|
|
383
|
+
output: z4.string()
|
|
310
384
|
});
|
|
311
|
-
var gatewayLanguageModelEntrySchema =
|
|
312
|
-
id:
|
|
313
|
-
name:
|
|
385
|
+
var gatewayLanguageModelEntrySchema = z4.object({
|
|
386
|
+
id: z4.string(),
|
|
387
|
+
name: z4.string(),
|
|
388
|
+
description: z4.string().nullish(),
|
|
389
|
+
pricing: gatewayLanguageModelPricingSchema.nullish(),
|
|
314
390
|
specification: gatewayLanguageModelSpecificationSchema
|
|
315
391
|
});
|
|
316
|
-
var gatewayFetchMetadataSchema =
|
|
317
|
-
models:
|
|
392
|
+
var gatewayFetchMetadataSchema = z4.object({
|
|
393
|
+
models: z4.array(gatewayLanguageModelEntrySchema)
|
|
318
394
|
});
|
|
319
395
|
|
|
320
396
|
// src/gateway-language-model.ts
|
|
@@ -326,7 +402,7 @@ import {
|
|
|
326
402
|
postJsonToApi,
|
|
327
403
|
resolve as resolve2
|
|
328
404
|
} from "@ai-sdk/provider-utils";
|
|
329
|
-
import { z as
|
|
405
|
+
import { z as z5 } from "zod/v4";
|
|
330
406
|
var GatewayLanguageModel = class {
|
|
331
407
|
constructor(modelId, config) {
|
|
332
408
|
this.modelId = modelId;
|
|
@@ -339,6 +415,7 @@ var GatewayLanguageModel = class {
|
|
|
339
415
|
}
|
|
340
416
|
async doGenerate(options) {
|
|
341
417
|
const { abortSignal, ...body } = options;
|
|
418
|
+
const resolvedHeaders = await resolve2(this.config.headers());
|
|
342
419
|
try {
|
|
343
420
|
const {
|
|
344
421
|
responseHeaders,
|
|
@@ -347,15 +424,15 @@ var GatewayLanguageModel = class {
|
|
|
347
424
|
} = await postJsonToApi({
|
|
348
425
|
url: this.getUrl(),
|
|
349
426
|
headers: combineHeaders(
|
|
350
|
-
|
|
427
|
+
resolvedHeaders,
|
|
351
428
|
options.headers,
|
|
352
429
|
this.getModelConfigHeaders(this.modelId, false),
|
|
353
430
|
await resolve2(this.config.o11yHeaders)
|
|
354
431
|
),
|
|
355
432
|
body: this.maybeEncodeFileParts(body),
|
|
356
|
-
successfulResponseHandler: createJsonResponseHandler2(
|
|
433
|
+
successfulResponseHandler: createJsonResponseHandler2(z5.any()),
|
|
357
434
|
failedResponseHandler: createJsonErrorResponseHandler2({
|
|
358
|
-
errorSchema:
|
|
435
|
+
errorSchema: z5.any(),
|
|
359
436
|
errorToMessage: (data) => data
|
|
360
437
|
}),
|
|
361
438
|
...abortSignal && { abortSignal },
|
|
@@ -368,24 +445,25 @@ var GatewayLanguageModel = class {
|
|
|
368
445
|
warnings: []
|
|
369
446
|
};
|
|
370
447
|
} catch (error) {
|
|
371
|
-
throw asGatewayError(error);
|
|
448
|
+
throw asGatewayError(error, parseAuthMethod(resolvedHeaders));
|
|
372
449
|
}
|
|
373
450
|
}
|
|
374
451
|
async doStream(options) {
|
|
375
452
|
const { abortSignal, ...body } = options;
|
|
453
|
+
const resolvedHeaders = await resolve2(this.config.headers());
|
|
376
454
|
try {
|
|
377
455
|
const { value: response, responseHeaders } = await postJsonToApi({
|
|
378
456
|
url: this.getUrl(),
|
|
379
457
|
headers: combineHeaders(
|
|
380
|
-
|
|
458
|
+
resolvedHeaders,
|
|
381
459
|
options.headers,
|
|
382
460
|
this.getModelConfigHeaders(this.modelId, true),
|
|
383
461
|
await resolve2(this.config.o11yHeaders)
|
|
384
462
|
),
|
|
385
463
|
body: this.maybeEncodeFileParts(body),
|
|
386
|
-
successfulResponseHandler: createEventSourceResponseHandler(
|
|
464
|
+
successfulResponseHandler: createEventSourceResponseHandler(z5.any()),
|
|
387
465
|
failedResponseHandler: createJsonErrorResponseHandler2({
|
|
388
|
-
errorSchema:
|
|
466
|
+
errorSchema: z5.any(),
|
|
389
467
|
errorToMessage: (data) => data
|
|
390
468
|
}),
|
|
391
469
|
...abortSignal && { abortSignal },
|
|
@@ -400,6 +478,9 @@ var GatewayLanguageModel = class {
|
|
|
400
478
|
if (streamPart.type === "raw" && !options.includeRawChunks) {
|
|
401
479
|
return;
|
|
402
480
|
}
|
|
481
|
+
if (streamPart.type === "response-metadata" && streamPart.timestamp && typeof streamPart.timestamp === "string") {
|
|
482
|
+
streamPart.timestamp = new Date(streamPart.timestamp);
|
|
483
|
+
}
|
|
403
484
|
controller.enqueue(streamPart);
|
|
404
485
|
} else {
|
|
405
486
|
controller.error(
|
|
@@ -413,17 +494,17 @@ var GatewayLanguageModel = class {
|
|
|
413
494
|
response: { headers: responseHeaders }
|
|
414
495
|
};
|
|
415
496
|
} catch (error) {
|
|
416
|
-
throw asGatewayError(error);
|
|
497
|
+
throw asGatewayError(error, parseAuthMethod(resolvedHeaders));
|
|
417
498
|
}
|
|
418
499
|
}
|
|
419
500
|
isFilePart(part) {
|
|
420
501
|
return part && typeof part === "object" && "type" in part && part.type === "file";
|
|
421
502
|
}
|
|
422
503
|
/**
|
|
423
|
-
* Encodes
|
|
424
|
-
* instance directly to avoid copying the
|
|
504
|
+
* Encodes file parts in the prompt to base64. Mutates the passed options
|
|
505
|
+
* instance directly to avoid copying the file data.
|
|
425
506
|
* @param options - The options to encode.
|
|
426
|
-
* @returns The options with the
|
|
507
|
+
* @returns The options with the file parts encoded.
|
|
427
508
|
*/
|
|
428
509
|
maybeEncodeFileParts(options) {
|
|
429
510
|
for (const message of options.prompt) {
|
|
@@ -460,12 +541,7 @@ async function getVercelOidcToken() {
|
|
|
460
541
|
const token = (_b8 = (_a8 = getContext().headers) == null ? void 0 : _a8["x-vercel-oidc-token"]) != null ? _b8 : process.env.VERCEL_OIDC_TOKEN;
|
|
461
542
|
if (!token) {
|
|
462
543
|
throw new GatewayAuthenticationError({
|
|
463
|
-
message:
|
|
464
|
-
The token is expected to be provided via the 'VERCEL_OIDC_TOKEN' environment variable. It expires every 12 hours.
|
|
465
|
-
- make sure your Vercel project settings have OIDC enabled
|
|
466
|
-
- if you're running locally with 'vercel dev' the token is automatically obtained and refreshed for you
|
|
467
|
-
- if you're running locally with your own dev server script you can fetch/update the token by running 'vercel env pull'
|
|
468
|
-
- in production or preview the token is automatically obtained and refreshed for you`,
|
|
544
|
+
message: "OIDC token not available",
|
|
469
545
|
statusCode: 401
|
|
470
546
|
});
|
|
471
547
|
}
|
|
@@ -484,13 +560,6 @@ function getContext() {
|
|
|
484
560
|
|
|
485
561
|
// src/gateway-provider.ts
|
|
486
562
|
var AI_GATEWAY_PROTOCOL_VERSION = "0.0.1";
|
|
487
|
-
async function getGatewayAuthToken(options) {
|
|
488
|
-
var _a8;
|
|
489
|
-
return (_a8 = loadOptionalSetting({
|
|
490
|
-
settingValue: options.apiKey,
|
|
491
|
-
environmentVariableName: "AI_GATEWAY_API_KEY"
|
|
492
|
-
})) != null ? _a8 : await getVercelOidcToken();
|
|
493
|
-
}
|
|
494
563
|
function createGatewayProvider(options = {}) {
|
|
495
564
|
var _a8, _b8;
|
|
496
565
|
let pendingMetadata = null;
|
|
@@ -499,11 +568,20 @@ function createGatewayProvider(options = {}) {
|
|
|
499
568
|
let lastFetchTime = 0;
|
|
500
569
|
const baseURL = (_b8 = withoutTrailingSlash(options.baseURL)) != null ? _b8 : "https://ai-gateway.vercel.sh/v1/ai";
|
|
501
570
|
const getHeaders = async () => {
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
571
|
+
const auth = await getGatewayAuthToken(options);
|
|
572
|
+
if (auth) {
|
|
573
|
+
return {
|
|
574
|
+
Authorization: `Bearer ${auth.token}`,
|
|
575
|
+
"ai-gateway-protocol-version": AI_GATEWAY_PROTOCOL_VERSION,
|
|
576
|
+
[GATEWAY_AUTH_METHOD_HEADER]: auth.authMethod,
|
|
577
|
+
...options.headers
|
|
578
|
+
};
|
|
579
|
+
}
|
|
580
|
+
throw GatewayAuthenticationError.createContextualError({
|
|
581
|
+
apiKeyProvided: false,
|
|
582
|
+
oidcTokenProvided: false,
|
|
583
|
+
statusCode: 401
|
|
584
|
+
});
|
|
507
585
|
};
|
|
508
586
|
const createLanguageModel = (modelId) => {
|
|
509
587
|
const deploymentId = loadOptionalSetting({
|
|
@@ -546,8 +624,8 @@ function createGatewayProvider(options = {}) {
|
|
|
546
624
|
}).getAvailableModels().then((metadata) => {
|
|
547
625
|
metadataCache = metadata;
|
|
548
626
|
return metadata;
|
|
549
|
-
}).catch((error) => {
|
|
550
|
-
throw asGatewayError(error);
|
|
627
|
+
}).catch(async (error) => {
|
|
628
|
+
throw asGatewayError(error, parseAuthMethod(await getHeaders()));
|
|
551
629
|
});
|
|
552
630
|
}
|
|
553
631
|
return metadataCache ? Promise.resolve(metadataCache) : pendingMetadata;
|
|
@@ -571,6 +649,27 @@ function createGatewayProvider(options = {}) {
|
|
|
571
649
|
return provider;
|
|
572
650
|
}
|
|
573
651
|
var gateway = createGatewayProvider();
|
|
652
|
+
async function getGatewayAuthToken(options) {
|
|
653
|
+
const apiKey = loadOptionalSetting({
|
|
654
|
+
settingValue: options.apiKey,
|
|
655
|
+
environmentVariableName: "AI_GATEWAY_API_KEY"
|
|
656
|
+
});
|
|
657
|
+
if (apiKey) {
|
|
658
|
+
return {
|
|
659
|
+
token: apiKey,
|
|
660
|
+
authMethod: "api-key"
|
|
661
|
+
};
|
|
662
|
+
}
|
|
663
|
+
try {
|
|
664
|
+
const oidcToken = await getVercelOidcToken();
|
|
665
|
+
return {
|
|
666
|
+
token: oidcToken,
|
|
667
|
+
authMethod: "oidc"
|
|
668
|
+
};
|
|
669
|
+
} catch (error) {
|
|
670
|
+
return null;
|
|
671
|
+
}
|
|
672
|
+
}
|
|
574
673
|
export {
|
|
575
674
|
GatewayAuthenticationError,
|
|
576
675
|
GatewayError,
|