@ai-sdk/gateway 1.0.0-alpha.6

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 ADDED
@@ -0,0 +1,10 @@
1
+ # @ai-sdk/gateway
2
+
3
+ ## 1.0.0-alpha.6
4
+
5
+ ### Patch Changes
6
+
7
+ - 6c2c708: feat (providers/gateway): initial gateway provider
8
+ - Updated dependencies [0d2c085]
9
+ - @ai-sdk/provider@2.0.0-alpha.6
10
+ - @ai-sdk/provider-utils@3.0.0-alpha.6
package/LICENSE ADDED
@@ -0,0 +1,13 @@
1
+ Copyright 2023 Vercel, Inc.
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
package/README.md ADDED
@@ -0,0 +1,36 @@
1
+ # AI SDK - Gateway Provider
2
+
3
+ The Gateway provider for the [AI SDK](https://ai-sdk.dev/docs) allows the use of a wide variety of AI models and providers.
4
+
5
+ ## Setup
6
+
7
+ The Gateway provider is available in the `@ai-sdk/gateway` module. You can install it with
8
+
9
+ ```bash
10
+ npm i @ai-sdk/gateway
11
+ ```
12
+
13
+ ## Provider Instance
14
+
15
+ You can import the default provider instance `gateway` from `@ai-sdk/gateway`:
16
+
17
+ ```ts
18
+ import { gateway } from '@ai-sdk/gateway';
19
+ ```
20
+
21
+ ## Example
22
+
23
+ ```ts
24
+ import { gateway } from '@ai-sdk/gateway';
25
+ import { generateText } from 'ai';
26
+
27
+ const { text } = await generateText({
28
+ model: gateway('xai/grok-3-beta'),
29
+ prompt:
30
+ 'Tell me about the history of the San Francisco Mission-style burrito.',
31
+ });
32
+ ```
33
+
34
+ ## Documentation
35
+
36
+ Please check out the [AI SDK documentation](https://ai-sdk.dev/docs) for more information.
@@ -0,0 +1,67 @@
1
+ import { LanguageModelV2, ProviderV2 } from '@ai-sdk/provider';
2
+ import { FetchFunction } from '@ai-sdk/provider-utils';
3
+
4
+ type GatewayModelId = 'anthropic/claude-3.5-haiku' | 'anthropic/claude-3.7-sonnet' | 'anthropic/claude-3.7-sonnet-reasoning' | 'anthropic/claude-4-opus-20250514' | 'anthropic/claude-4-sonnet-20250514' | 'anthropic/claude-v3-haiku' | 'anthropic/claude-v3-opus' | 'anthropic/claude-v3.5-sonnet' | 'bedrock/amazon.nova-lite-v1:0' | 'bedrock/amazon.nova-micro-v1:0' | 'bedrock/amazon.nova-pro-v1:0' | 'bedrock/claude-3-5-haiku-20241022' | 'bedrock/claude-3-5-sonnet-20240620-v1' | 'bedrock/claude-3-5-sonnet-20241022-v2' | 'bedrock/claude-3-7-sonnet-20250219' | 'bedrock/claude-3-haiku-20240307-v1' | 'bedrock/claude-4-opus-20250514-v1' | 'bedrock/claude-4-sonnet-20250514-v1' | 'bedrock/deepseek.r1-v1' | 'bedrock/meta.llama3-1-70b-instruct-v1' | 'bedrock/meta.llama3-1-8b-instruct-v1' | 'bedrock/meta.llama3-2-11b-instruct-v1' | 'bedrock/meta.llama3-2-1b-instruct-v1' | 'bedrock/meta.llama3-2-3b-instruct-v1' | 'bedrock/meta.llama3-2-90b-instruct-v1' | 'bedrock/meta.llama3-3-70b-instruct-v1' | 'bedrock/meta.llama4-maverick-17b-instruct-v1' | 'bedrock/meta.llama4-scout-17b-instruct-v1' | 'cerebras/deepseek-r1-distill-llama-70b' | 'cerebras/llama-3.3-70b' | 'cerebras/llama-4-scout-17b-16e-instruct' | 'cerebras/llama3.1-8b' | 'cerebras/qwen-3-32b' | 'cohere/command-a' | 'cohere/command-r' | 'cohere/command-r-plus' | 'deepinfra/llama-4-maverick-17b-128e-instruct-fp8' | 'deepinfra/llama-4-scout-17b-16e-instruct' | 'deepinfra/qwen3-14b' | 'deepinfra/qwen3-235b-a22b' | 'deepinfra/qwen3-30b-a3b' | 'deepinfra/qwen3-32b' | 'deepseek/chat' | 'deepseek/deepseek-r1' | 'fireworks/firefunction-v1' | 'fireworks/mixtral-8x22b-instruct' | 'fireworks/mixtral-8x7b-instruct' | 'fireworks/qwen3-235b-a22b' | 'fireworks/qwq-32b' | 'groq/deepseek-r1-distill-llama-70b' | 'groq/gemma2-9b-it' | 'groq/llama-3-70b-instruct' | 'groq/llama-3-8b-instruct' | 'groq/llama-3.1-8b' | 'groq/llama-3.2-1b' | 'groq/llama-3.3-70b-versatile' | 'groq/llama-4-scout-17b-16e-instruct' | 'groq/mistral-saba-24b' | 'groq/qwen-qwq-32b' | 'inception/mercury-coder-small' | 'mistral/codestral-2501' | 'mistral/ministral-3b-latest' | 'mistral/ministral-8b-latest' | 'mistral/mistral-large' | 'mistral/mistral-small' | 'mistral/mistral-small-2503' | 'mistral/pixtral-12b-2409' | 'mistral/pixtral-large-latest' | 'openai/gpt-3.5-turbo' | 'openai/gpt-3.5-turbo-instruct' | 'openai/gpt-4-turbo' | 'openai/gpt-4.1' | 'openai/gpt-4.1-mini' | 'openai/gpt-4.1-nano' | 'openai/gpt-4o' | 'openai/gpt-4o-mini' | 'openai/o3' | 'openai/o3-mini' | 'openai/o4-mini' | 'perplexity/sonar' | 'perplexity/sonar-pro' | 'perplexity/sonar-reasoning' | 'perplexity/sonar-reasoning-pro' | 'vertex/claude-3-5-haiku-20241022' | 'vertex/claude-3-5-sonnet-20240620' | 'vertex/claude-3-5-sonnet-v2-20241022' | 'vertex/claude-3-7-sonnet-20250219' | 'vertex/claude-3-haiku-20240307' | 'vertex/claude-3-opus-20240229' | 'vertex/claude-4-opus-20250514' | 'vertex/claude-4-sonnet-20250514' | 'vertex/gemini-2.0-flash-001' | 'vertex/gemini-2.0-flash-lite-001' | 'vertex/llama-4-maverick-17b-128e-instruct-maas' | 'vertex/llama-4-scout-17b-16e-instruct-maas' | 'xai/grok-2-1212' | 'xai/grok-2-vision-1212' | 'xai/grok-3-beta' | 'xai/grok-3-fast-beta' | 'xai/grok-3-mini-beta' | 'xai/grok-3-mini-fast-beta' | (string & {});
5
+
6
+ interface GatewayLanguageModelEntry {
7
+ /**
8
+ * The model id used by the remote provider in model settings and for specifying the
9
+ * intended model for text generation.
10
+ */
11
+ id: string;
12
+ /**
13
+ * The display name of the model for presentation in user-facing contexts.
14
+ */
15
+ name: string;
16
+ /**
17
+ * Additional AI SDK language model specifications for the model.
18
+ */
19
+ specification: GatewayLanguageModelSpecification;
20
+ }
21
+ type GatewayLanguageModelSpecification = Pick<LanguageModelV2, 'specificationVersion' | 'provider' | 'modelId'>;
22
+
23
+ interface GatewayFetchMetadataResponse {
24
+ models: GatewayLanguageModelEntry[];
25
+ }
26
+
27
+ interface GatewayProvider extends ProviderV2 {
28
+ (modelId: GatewayModelId): LanguageModelV2;
29
+ /**
30
+ Creates a model for text generation.
31
+ */
32
+ languageModel(modelId: GatewayModelId): LanguageModelV2;
33
+ /**
34
+ Returns available providers and models for use with the remote provider.
35
+ */
36
+ getAvailableModels(): Promise<GatewayFetchMetadataResponse>;
37
+ }
38
+ interface GatewayProviderSettings {
39
+ /**
40
+ The base URL prefix for API calls. Defaults to `https://ai-gateway.vercel.sh/v1/ai`.
41
+ */
42
+ baseURL?: string;
43
+ /**
44
+ API key that is being sent using the `Authorization` header.
45
+ */
46
+ apiKey?: string;
47
+ /**
48
+ Custom headers to include in the requests.
49
+ */
50
+ headers?: Record<string, string>;
51
+ /**
52
+ Custom fetch implementation. You can use it as a middleware to intercept requests,
53
+ or to provide a custom fetch implementation for e.g. testing.
54
+ */
55
+ fetch?: FetchFunction;
56
+ /**
57
+ How frequently to refresh the metadata cache in milliseconds.
58
+ */
59
+ metadataCacheRefreshMillis?: number;
60
+ }
61
+ /**
62
+ Create a remote provider instance.
63
+ */
64
+ declare function createGatewayProvider(options?: GatewayProviderSettings): GatewayProvider;
65
+ declare const gateway: GatewayProvider;
66
+
67
+ export { type GatewayLanguageModelEntry, type GatewayLanguageModelSpecification, type GatewayModelId, type GatewayProvider, type GatewayProviderSettings, createGatewayProvider, gateway };
@@ -0,0 +1,67 @@
1
+ import { LanguageModelV2, ProviderV2 } from '@ai-sdk/provider';
2
+ import { FetchFunction } from '@ai-sdk/provider-utils';
3
+
4
+ type GatewayModelId = 'anthropic/claude-3.5-haiku' | 'anthropic/claude-3.7-sonnet' | 'anthropic/claude-3.7-sonnet-reasoning' | 'anthropic/claude-4-opus-20250514' | 'anthropic/claude-4-sonnet-20250514' | 'anthropic/claude-v3-haiku' | 'anthropic/claude-v3-opus' | 'anthropic/claude-v3.5-sonnet' | 'bedrock/amazon.nova-lite-v1:0' | 'bedrock/amazon.nova-micro-v1:0' | 'bedrock/amazon.nova-pro-v1:0' | 'bedrock/claude-3-5-haiku-20241022' | 'bedrock/claude-3-5-sonnet-20240620-v1' | 'bedrock/claude-3-5-sonnet-20241022-v2' | 'bedrock/claude-3-7-sonnet-20250219' | 'bedrock/claude-3-haiku-20240307-v1' | 'bedrock/claude-4-opus-20250514-v1' | 'bedrock/claude-4-sonnet-20250514-v1' | 'bedrock/deepseek.r1-v1' | 'bedrock/meta.llama3-1-70b-instruct-v1' | 'bedrock/meta.llama3-1-8b-instruct-v1' | 'bedrock/meta.llama3-2-11b-instruct-v1' | 'bedrock/meta.llama3-2-1b-instruct-v1' | 'bedrock/meta.llama3-2-3b-instruct-v1' | 'bedrock/meta.llama3-2-90b-instruct-v1' | 'bedrock/meta.llama3-3-70b-instruct-v1' | 'bedrock/meta.llama4-maverick-17b-instruct-v1' | 'bedrock/meta.llama4-scout-17b-instruct-v1' | 'cerebras/deepseek-r1-distill-llama-70b' | 'cerebras/llama-3.3-70b' | 'cerebras/llama-4-scout-17b-16e-instruct' | 'cerebras/llama3.1-8b' | 'cerebras/qwen-3-32b' | 'cohere/command-a' | 'cohere/command-r' | 'cohere/command-r-plus' | 'deepinfra/llama-4-maverick-17b-128e-instruct-fp8' | 'deepinfra/llama-4-scout-17b-16e-instruct' | 'deepinfra/qwen3-14b' | 'deepinfra/qwen3-235b-a22b' | 'deepinfra/qwen3-30b-a3b' | 'deepinfra/qwen3-32b' | 'deepseek/chat' | 'deepseek/deepseek-r1' | 'fireworks/firefunction-v1' | 'fireworks/mixtral-8x22b-instruct' | 'fireworks/mixtral-8x7b-instruct' | 'fireworks/qwen3-235b-a22b' | 'fireworks/qwq-32b' | 'groq/deepseek-r1-distill-llama-70b' | 'groq/gemma2-9b-it' | 'groq/llama-3-70b-instruct' | 'groq/llama-3-8b-instruct' | 'groq/llama-3.1-8b' | 'groq/llama-3.2-1b' | 'groq/llama-3.3-70b-versatile' | 'groq/llama-4-scout-17b-16e-instruct' | 'groq/mistral-saba-24b' | 'groq/qwen-qwq-32b' | 'inception/mercury-coder-small' | 'mistral/codestral-2501' | 'mistral/ministral-3b-latest' | 'mistral/ministral-8b-latest' | 'mistral/mistral-large' | 'mistral/mistral-small' | 'mistral/mistral-small-2503' | 'mistral/pixtral-12b-2409' | 'mistral/pixtral-large-latest' | 'openai/gpt-3.5-turbo' | 'openai/gpt-3.5-turbo-instruct' | 'openai/gpt-4-turbo' | 'openai/gpt-4.1' | 'openai/gpt-4.1-mini' | 'openai/gpt-4.1-nano' | 'openai/gpt-4o' | 'openai/gpt-4o-mini' | 'openai/o3' | 'openai/o3-mini' | 'openai/o4-mini' | 'perplexity/sonar' | 'perplexity/sonar-pro' | 'perplexity/sonar-reasoning' | 'perplexity/sonar-reasoning-pro' | 'vertex/claude-3-5-haiku-20241022' | 'vertex/claude-3-5-sonnet-20240620' | 'vertex/claude-3-5-sonnet-v2-20241022' | 'vertex/claude-3-7-sonnet-20250219' | 'vertex/claude-3-haiku-20240307' | 'vertex/claude-3-opus-20240229' | 'vertex/claude-4-opus-20250514' | 'vertex/claude-4-sonnet-20250514' | 'vertex/gemini-2.0-flash-001' | 'vertex/gemini-2.0-flash-lite-001' | 'vertex/llama-4-maverick-17b-128e-instruct-maas' | 'vertex/llama-4-scout-17b-16e-instruct-maas' | 'xai/grok-2-1212' | 'xai/grok-2-vision-1212' | 'xai/grok-3-beta' | 'xai/grok-3-fast-beta' | 'xai/grok-3-mini-beta' | 'xai/grok-3-mini-fast-beta' | (string & {});
5
+
6
+ interface GatewayLanguageModelEntry {
7
+ /**
8
+ * The model id used by the remote provider in model settings and for specifying the
9
+ * intended model for text generation.
10
+ */
11
+ id: string;
12
+ /**
13
+ * The display name of the model for presentation in user-facing contexts.
14
+ */
15
+ name: string;
16
+ /**
17
+ * Additional AI SDK language model specifications for the model.
18
+ */
19
+ specification: GatewayLanguageModelSpecification;
20
+ }
21
+ type GatewayLanguageModelSpecification = Pick<LanguageModelV2, 'specificationVersion' | 'provider' | 'modelId'>;
22
+
23
+ interface GatewayFetchMetadataResponse {
24
+ models: GatewayLanguageModelEntry[];
25
+ }
26
+
27
+ interface GatewayProvider extends ProviderV2 {
28
+ (modelId: GatewayModelId): LanguageModelV2;
29
+ /**
30
+ Creates a model for text generation.
31
+ */
32
+ languageModel(modelId: GatewayModelId): LanguageModelV2;
33
+ /**
34
+ Returns available providers and models for use with the remote provider.
35
+ */
36
+ getAvailableModels(): Promise<GatewayFetchMetadataResponse>;
37
+ }
38
+ interface GatewayProviderSettings {
39
+ /**
40
+ The base URL prefix for API calls. Defaults to `https://ai-gateway.vercel.sh/v1/ai`.
41
+ */
42
+ baseURL?: string;
43
+ /**
44
+ API key that is being sent using the `Authorization` header.
45
+ */
46
+ apiKey?: string;
47
+ /**
48
+ Custom headers to include in the requests.
49
+ */
50
+ headers?: Record<string, string>;
51
+ /**
52
+ Custom fetch implementation. You can use it as a middleware to intercept requests,
53
+ or to provide a custom fetch implementation for e.g. testing.
54
+ */
55
+ fetch?: FetchFunction;
56
+ /**
57
+ How frequently to refresh the metadata cache in milliseconds.
58
+ */
59
+ metadataCacheRefreshMillis?: number;
60
+ }
61
+ /**
62
+ Create a remote provider instance.
63
+ */
64
+ declare function createGatewayProvider(options?: GatewayProviderSettings): GatewayProvider;
65
+ declare const gateway: GatewayProvider;
66
+
67
+ export { type GatewayLanguageModelEntry, type GatewayLanguageModelSpecification, type GatewayModelId, type GatewayProvider, type GatewayProviderSettings, createGatewayProvider, gateway };
package/dist/index.js ADDED
@@ -0,0 +1,310 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ createGatewayProvider: () => createGatewayProvider,
24
+ gateway: () => gateway
25
+ });
26
+ module.exports = __toCommonJS(src_exports);
27
+
28
+ // src/gateway-provider.ts
29
+ var import_provider = require("@ai-sdk/provider");
30
+ var import_provider_utils3 = require("@ai-sdk/provider-utils");
31
+ var import_provider_utils4 = require("@ai-sdk/provider-utils");
32
+
33
+ // src/gateway-language-model.ts
34
+ var import_provider_utils = require("@ai-sdk/provider-utils");
35
+ var import_zod = require("zod");
36
+ var GatewayLanguageModel = class {
37
+ constructor(modelId, config) {
38
+ this.modelId = modelId;
39
+ this.config = config;
40
+ this.specificationVersion = "v2";
41
+ this.supportedUrls = { "*/*": [/.*/] };
42
+ }
43
+ get provider() {
44
+ return this.config.provider;
45
+ }
46
+ async doGenerate(options) {
47
+ const { abortSignal, ...body } = options;
48
+ const {
49
+ responseHeaders,
50
+ value: responseBody,
51
+ rawValue: rawResponse
52
+ } = await (0, import_provider_utils.postJsonToApi)({
53
+ url: this.getUrl(),
54
+ headers: (0, import_provider_utils.combineHeaders)(
55
+ await (0, import_provider_utils.resolve)(this.config.headers()),
56
+ options.headers,
57
+ this.getModelConfigHeaders(this.modelId, false),
58
+ this.config.o11yHeaders
59
+ ),
60
+ body: this.maybeEncodeFileParts(body),
61
+ successfulResponseHandler: (0, import_provider_utils.createJsonResponseHandler)(import_zod.z.any()),
62
+ failedResponseHandler: (0, import_provider_utils.createJsonErrorResponseHandler)({
63
+ errorSchema: import_zod.z.any(),
64
+ errorToMessage: (data) => data
65
+ }),
66
+ ...abortSignal && { abortSignal },
67
+ fetch: this.config.fetch
68
+ });
69
+ return {
70
+ ...responseBody,
71
+ request: { body },
72
+ response: { headers: responseHeaders, body: rawResponse },
73
+ warnings: []
74
+ };
75
+ }
76
+ async doStream(options) {
77
+ const { abortSignal, ...body } = options;
78
+ const { value: response, responseHeaders } = await (0, import_provider_utils.postJsonToApi)({
79
+ url: this.getUrl(),
80
+ headers: (0, import_provider_utils.combineHeaders)(
81
+ await (0, import_provider_utils.resolve)(this.config.headers()),
82
+ options.headers,
83
+ this.getModelConfigHeaders(this.modelId, true),
84
+ this.config.o11yHeaders
85
+ ),
86
+ body: this.maybeEncodeFileParts(body),
87
+ successfulResponseHandler: (0, import_provider_utils.createEventSourceResponseHandler)(import_zod.z.any()),
88
+ failedResponseHandler: (0, import_provider_utils.createJsonErrorResponseHandler)({
89
+ errorSchema: import_zod.z.any(),
90
+ errorToMessage: (data) => data
91
+ }),
92
+ ...abortSignal && { abortSignal },
93
+ fetch: this.config.fetch
94
+ });
95
+ return {
96
+ stream: response.pipeThrough(
97
+ new TransformStream({
98
+ transform(chunk, controller) {
99
+ if (chunk.success) {
100
+ controller.enqueue(chunk.value);
101
+ } else {
102
+ controller.error(
103
+ chunk.error
104
+ );
105
+ }
106
+ }
107
+ })
108
+ ),
109
+ request: { body },
110
+ response: { headers: responseHeaders }
111
+ };
112
+ }
113
+ isFilePart(part) {
114
+ return part && typeof part === "object" && "type" in part && part.type === "file";
115
+ }
116
+ /**
117
+ * Encodes image parts in the prompt to base64. Mutates the passed options
118
+ * instance directly to avoid copying the image data.
119
+ * @param options - The options to encode.
120
+ * @returns The options with the image parts encoded.
121
+ */
122
+ maybeEncodeFileParts(options) {
123
+ for (const message of options.prompt) {
124
+ for (const part of message.content) {
125
+ if (this.isFilePart(part)) {
126
+ const filePart = part;
127
+ if (filePart.data instanceof Uint8Array) {
128
+ const buffer = Uint8Array.from(filePart.data);
129
+ const base64Data = Buffer.from(buffer).toString("base64");
130
+ filePart.data = new URL(
131
+ `data:${filePart.mediaType || "application/octet-stream"};base64,${base64Data}`
132
+ );
133
+ }
134
+ }
135
+ }
136
+ }
137
+ return options;
138
+ }
139
+ getUrl() {
140
+ return `${this.config.baseURL}/language-model`;
141
+ }
142
+ getModelConfigHeaders(modelId, streaming) {
143
+ return {
144
+ "ai-language-model-specification-version": "2",
145
+ "ai-language-model-id": modelId,
146
+ "ai-language-model-streaming": String(streaming)
147
+ };
148
+ }
149
+ };
150
+
151
+ // src/get-vercel-oidc-token.ts
152
+ async function getVercelOidcToken() {
153
+ var _a, _b;
154
+ const token = (_b = (_a = getContext().headers) == null ? void 0 : _a["x-vercel-oidc-token"]) != null ? _b : process.env.VERCEL_OIDC_TOKEN;
155
+ if (!token) {
156
+ throw new Error(
157
+ `The 'x-vercel-oidc-token' header is missing from the request. Do you have the OIDC option enabled in the Vercel project settings?`
158
+ );
159
+ }
160
+ return token;
161
+ }
162
+ var SYMBOL_FOR_REQ_CONTEXT = Symbol.for("@vercel/request-context");
163
+ function getContext() {
164
+ var _a, _b, _c;
165
+ const fromSymbol = globalThis;
166
+ return (_c = (_b = (_a = fromSymbol[SYMBOL_FOR_REQ_CONTEXT]) == null ? void 0 : _a.get) == null ? void 0 : _b.call(_a)) != null ? _c : {};
167
+ }
168
+
169
+ // src/gateway-fetch-metadata.ts
170
+ var import_provider_utils2 = require("@ai-sdk/provider-utils");
171
+ var import_zod2 = require("zod");
172
+ var GatewayFetchMetadata = class {
173
+ constructor(config) {
174
+ this.config = config;
175
+ }
176
+ async getAvailableModels() {
177
+ const { value } = await (0, import_provider_utils2.getFromApi)({
178
+ url: `${this.config.baseURL}/config`,
179
+ headers: await (0, import_provider_utils2.resolve)(this.config.headers()),
180
+ successfulResponseHandler: (0, import_provider_utils2.createJsonResponseHandler)(
181
+ gatewayFetchMetadataSchema
182
+ ),
183
+ failedResponseHandler: (0, import_provider_utils2.createJsonErrorResponseHandler)({
184
+ errorSchema: import_zod2.z.any(),
185
+ errorToMessage: (data) => data
186
+ }),
187
+ fetch: this.config.fetch
188
+ });
189
+ return value;
190
+ }
191
+ };
192
+ var gatewayLanguageModelSpecificationSchema = import_zod2.z.object({
193
+ specificationVersion: import_zod2.z.literal("v2"),
194
+ provider: import_zod2.z.string(),
195
+ modelId: import_zod2.z.string()
196
+ });
197
+ var gatewayLanguageModelEntrySchema = import_zod2.z.object({
198
+ id: import_zod2.z.string(),
199
+ name: import_zod2.z.string(),
200
+ specification: gatewayLanguageModelSpecificationSchema
201
+ });
202
+ var gatewayFetchMetadataSchema = import_zod2.z.object({
203
+ models: import_zod2.z.array(gatewayLanguageModelEntrySchema)
204
+ });
205
+
206
+ // src/gateway-provider.ts
207
+ var AI_GATEWAY_PROTOCOL_VERSION = "0.0.1";
208
+ async function getGatewayAuthToken(options) {
209
+ var _a;
210
+ try {
211
+ return (_a = (0, import_provider_utils3.loadOptionalSetting)({
212
+ settingValue: options.apiKey,
213
+ environmentVariableName: "AI_GATEWAY_API_KEY"
214
+ })) != null ? _a : await getVercelOidcToken();
215
+ } catch (error) {
216
+ if (error instanceof Error && error.message.includes("'x-vercel-oidc-token' header is missing")) {
217
+ const enhancedError = new Error(
218
+ `Failed to get Vercel OIDC token for AI Gateway access.
219
+ The token is expected to be provided via the 'VERCEL_OIDC_TOKEN' environment variable. It expires every 12 hours.
220
+ - make sure your Vercel project settings have OIDC enabled
221
+ - if you're running locally with 'vercel dev' the token is automatically obtained and refreshed for you
222
+ - if you're running locally with your own dev server script you can fetch/update the token by running 'vercel env pull'
223
+ - in production or preview the token is automatically obtained and refreshed for you`
224
+ );
225
+ enhancedError.cause = error;
226
+ throw enhancedError;
227
+ }
228
+ throw error;
229
+ }
230
+ }
231
+ function createGatewayProvider(options = {}) {
232
+ var _a, _b;
233
+ let pendingMetadata = null;
234
+ let metadataCache = null;
235
+ const cacheRefreshMillis = (_a = options.metadataCacheRefreshMillis) != null ? _a : 1e3 * 60 * 5;
236
+ let lastFetchTime = 0;
237
+ const baseURL = (_b = (0, import_provider_utils4.withoutTrailingSlash)(options.baseURL)) != null ? _b : "https://ai-gateway.vercel.sh/v1/ai";
238
+ const getHeaders = async () => {
239
+ return {
240
+ Authorization: `Bearer ${await getGatewayAuthToken(options)}`,
241
+ "ai-gateway-protocol-version": AI_GATEWAY_PROTOCOL_VERSION,
242
+ ...options.headers
243
+ };
244
+ };
245
+ const createLanguageModel = (modelId) => {
246
+ const deploymentId = (0, import_provider_utils3.loadOptionalSetting)({
247
+ settingValue: void 0,
248
+ environmentVariableName: "DEPLOYMENT_ID"
249
+ });
250
+ const environment = (0, import_provider_utils3.loadOptionalSetting)({
251
+ settingValue: void 0,
252
+ environmentVariableName: "VERCEL_ENV"
253
+ });
254
+ const region = (0, import_provider_utils3.loadOptionalSetting)({
255
+ settingValue: void 0,
256
+ environmentVariableName: "VERCEL_REGION"
257
+ });
258
+ return new GatewayLanguageModel(modelId, {
259
+ provider: "gateway",
260
+ baseURL,
261
+ headers: getHeaders,
262
+ fetch: options.fetch,
263
+ o11yHeaders: {
264
+ ...deploymentId && { "ai-o11y-deployment-id": deploymentId },
265
+ ...environment && { "ai-o11y-environment": environment },
266
+ ...region && { "ai-o11y-region": region }
267
+ }
268
+ });
269
+ };
270
+ const getAvailableModels = async () => {
271
+ var _a2, _b2, _c;
272
+ const now = (_c = (_b2 = (_a2 = options._internal) == null ? void 0 : _a2.currentDate) == null ? void 0 : _b2.call(_a2).getTime()) != null ? _c : Date.now();
273
+ if (!pendingMetadata || now - lastFetchTime > cacheRefreshMillis) {
274
+ lastFetchTime = now;
275
+ pendingMetadata = new GatewayFetchMetadata({
276
+ baseURL,
277
+ headers: getHeaders,
278
+ fetch: options.fetch
279
+ }).getAvailableModels().then((metadata) => {
280
+ metadataCache = metadata;
281
+ return metadata;
282
+ });
283
+ }
284
+ return metadataCache ? Promise.resolve(metadataCache) : pendingMetadata;
285
+ };
286
+ const provider = function(modelId) {
287
+ if (new.target) {
288
+ throw new Error(
289
+ "The Gateway Provider model function cannot be called with the new keyword."
290
+ );
291
+ }
292
+ return createLanguageModel(modelId);
293
+ };
294
+ provider.getAvailableModels = getAvailableModels;
295
+ provider.imageModel = (modelId) => {
296
+ throw new import_provider.NoSuchModelError({ modelId, modelType: "imageModel" });
297
+ };
298
+ provider.languageModel = createLanguageModel;
299
+ provider.textEmbeddingModel = (modelId) => {
300
+ throw new import_provider.NoSuchModelError({ modelId, modelType: "textEmbeddingModel" });
301
+ };
302
+ return provider;
303
+ }
304
+ var gateway = createGatewayProvider();
305
+ // Annotate the CommonJS export names for ESM import in node:
306
+ 0 && (module.exports = {
307
+ createGatewayProvider,
308
+ gateway
309
+ });
310
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/gateway-provider.ts","../src/gateway-language-model.ts","../src/get-vercel-oidc-token.ts","../src/gateway-fetch-metadata.ts"],"sourcesContent":["export type { GatewayModelId } from './gateway-language-model-settings';\nexport type {\n GatewayLanguageModelEntry,\n GatewayLanguageModelSpecification,\n} from './gateway-model-entry';\nexport { createGatewayProvider, gateway } from './gateway-provider';\nexport type {\n GatewayProvider,\n GatewayProviderSettings,\n} from './gateway-provider';\n","import type { LanguageModelV2, ProviderV2 } from '@ai-sdk/provider';\nimport { NoSuchModelError } from '@ai-sdk/provider';\nimport { loadOptionalSetting } from '@ai-sdk/provider-utils';\nimport {\n type FetchFunction,\n withoutTrailingSlash,\n} from '@ai-sdk/provider-utils';\nimport { GatewayLanguageModel } from './gateway-language-model';\nimport type { GatewayModelId } from './gateway-language-model-settings';\nimport { getVercelOidcToken } from './get-vercel-oidc-token';\nimport {\n GatewayFetchMetadata,\n type GatewayFetchMetadataResponse,\n} from './gateway-fetch-metadata';\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 try {\n return (\n loadOptionalSetting({\n settingValue: options.apiKey,\n environmentVariableName: 'AI_GATEWAY_API_KEY',\n }) ?? (await getVercelOidcToken())\n );\n } catch (error: unknown) {\n if (\n error instanceof Error &&\n error.message.includes(\"'x-vercel-oidc-token' header is missing\")\n ) {\n // The missing vercel oidc token error has an obtuse message that doesn't\n // provide much context about what to do for an AI Gateway user, so we\n // intervene to provide more guidance and then rethrow.\n const enhancedError = new Error(\n `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 );\n (enhancedError as Error & { cause: unknown }).cause = error;\n throw enhancedError;\n }\n throw error;\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: '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: {\n ...(deploymentId && { 'ai-o11y-deployment-id': deploymentId }),\n ...(environment && { 'ai-o11y-environment': environment }),\n ...(region && { 'ai-o11y-region': region }),\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 }\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 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} from '@ai-sdk/provider-utils';\nimport { z } from 'zod';\nimport type { GatewayConfig } from './gateway-config';\nimport type { GatewayModelId } from './gateway-language-model-settings';\nimport type { GatewayLanguageModelSpecification } from './gateway-model-entry';\n\ntype GatewayChatConfig = GatewayConfig & {\n provider: string;\n o11yHeaders: 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 {\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 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 }\n\n async doStream(\n options: Parameters<LanguageModelV2['doStream']>[0],\n ): Promise<Awaited<ReturnType<LanguageModelV2['doStream']>>> {\n const { abortSignal, ...body } = options;\n\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 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 controller.enqueue(chunk.value);\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 }\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","export 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 Error(\n `The 'x-vercel-oidc-token' header is missing from the request. Do you have the OIDC option enabled in the Vercel project settings?`,\n );\n }\n\n return token;\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","import {\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n getFromApi,\n resolve,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod';\nimport type { GatewayConfig } from './gateway-config';\nimport type { GatewayLanguageModelEntry } from './gateway-model-entry';\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 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 as GatewayFetchMetadataResponse;\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"],"mappings":"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","names":["import_provider_utils","import_provider_utils","import_zod","_a","_b"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,296 @@
1
+ // src/gateway-provider.ts
2
+ import { NoSuchModelError } from "@ai-sdk/provider";
3
+ import { loadOptionalSetting } from "@ai-sdk/provider-utils";
4
+ import {
5
+ withoutTrailingSlash
6
+ } from "@ai-sdk/provider-utils";
7
+
8
+ // src/gateway-language-model.ts
9
+ import {
10
+ combineHeaders,
11
+ createEventSourceResponseHandler,
12
+ createJsonErrorResponseHandler,
13
+ createJsonResponseHandler,
14
+ postJsonToApi,
15
+ resolve
16
+ } from "@ai-sdk/provider-utils";
17
+ import { z } from "zod";
18
+ var GatewayLanguageModel = class {
19
+ constructor(modelId, config) {
20
+ this.modelId = modelId;
21
+ this.config = config;
22
+ this.specificationVersion = "v2";
23
+ this.supportedUrls = { "*/*": [/.*/] };
24
+ }
25
+ get provider() {
26
+ return this.config.provider;
27
+ }
28
+ async doGenerate(options) {
29
+ const { abortSignal, ...body } = options;
30
+ const {
31
+ responseHeaders,
32
+ value: responseBody,
33
+ rawValue: rawResponse
34
+ } = await postJsonToApi({
35
+ url: this.getUrl(),
36
+ headers: combineHeaders(
37
+ await resolve(this.config.headers()),
38
+ options.headers,
39
+ this.getModelConfigHeaders(this.modelId, false),
40
+ this.config.o11yHeaders
41
+ ),
42
+ body: this.maybeEncodeFileParts(body),
43
+ successfulResponseHandler: createJsonResponseHandler(z.any()),
44
+ failedResponseHandler: createJsonErrorResponseHandler({
45
+ errorSchema: z.any(),
46
+ errorToMessage: (data) => data
47
+ }),
48
+ ...abortSignal && { abortSignal },
49
+ fetch: this.config.fetch
50
+ });
51
+ return {
52
+ ...responseBody,
53
+ request: { body },
54
+ response: { headers: responseHeaders, body: rawResponse },
55
+ warnings: []
56
+ };
57
+ }
58
+ async doStream(options) {
59
+ const { abortSignal, ...body } = options;
60
+ const { value: response, responseHeaders } = await postJsonToApi({
61
+ url: this.getUrl(),
62
+ headers: combineHeaders(
63
+ await resolve(this.config.headers()),
64
+ options.headers,
65
+ this.getModelConfigHeaders(this.modelId, true),
66
+ this.config.o11yHeaders
67
+ ),
68
+ body: this.maybeEncodeFileParts(body),
69
+ successfulResponseHandler: createEventSourceResponseHandler(z.any()),
70
+ failedResponseHandler: createJsonErrorResponseHandler({
71
+ errorSchema: z.any(),
72
+ errorToMessage: (data) => data
73
+ }),
74
+ ...abortSignal && { abortSignal },
75
+ fetch: this.config.fetch
76
+ });
77
+ return {
78
+ stream: response.pipeThrough(
79
+ new TransformStream({
80
+ transform(chunk, controller) {
81
+ if (chunk.success) {
82
+ controller.enqueue(chunk.value);
83
+ } else {
84
+ controller.error(
85
+ chunk.error
86
+ );
87
+ }
88
+ }
89
+ })
90
+ ),
91
+ request: { body },
92
+ response: { headers: responseHeaders }
93
+ };
94
+ }
95
+ isFilePart(part) {
96
+ return part && typeof part === "object" && "type" in part && part.type === "file";
97
+ }
98
+ /**
99
+ * Encodes image parts in the prompt to base64. Mutates the passed options
100
+ * instance directly to avoid copying the image data.
101
+ * @param options - The options to encode.
102
+ * @returns The options with the image parts encoded.
103
+ */
104
+ maybeEncodeFileParts(options) {
105
+ for (const message of options.prompt) {
106
+ for (const part of message.content) {
107
+ if (this.isFilePart(part)) {
108
+ const filePart = part;
109
+ if (filePart.data instanceof Uint8Array) {
110
+ const buffer = Uint8Array.from(filePart.data);
111
+ const base64Data = Buffer.from(buffer).toString("base64");
112
+ filePart.data = new URL(
113
+ `data:${filePart.mediaType || "application/octet-stream"};base64,${base64Data}`
114
+ );
115
+ }
116
+ }
117
+ }
118
+ }
119
+ return options;
120
+ }
121
+ getUrl() {
122
+ return `${this.config.baseURL}/language-model`;
123
+ }
124
+ getModelConfigHeaders(modelId, streaming) {
125
+ return {
126
+ "ai-language-model-specification-version": "2",
127
+ "ai-language-model-id": modelId,
128
+ "ai-language-model-streaming": String(streaming)
129
+ };
130
+ }
131
+ };
132
+
133
+ // src/get-vercel-oidc-token.ts
134
+ async function getVercelOidcToken() {
135
+ var _a, _b;
136
+ const token = (_b = (_a = getContext().headers) == null ? void 0 : _a["x-vercel-oidc-token"]) != null ? _b : process.env.VERCEL_OIDC_TOKEN;
137
+ if (!token) {
138
+ throw new Error(
139
+ `The 'x-vercel-oidc-token' header is missing from the request. Do you have the OIDC option enabled in the Vercel project settings?`
140
+ );
141
+ }
142
+ return token;
143
+ }
144
+ var SYMBOL_FOR_REQ_CONTEXT = Symbol.for("@vercel/request-context");
145
+ function getContext() {
146
+ var _a, _b, _c;
147
+ const fromSymbol = globalThis;
148
+ return (_c = (_b = (_a = fromSymbol[SYMBOL_FOR_REQ_CONTEXT]) == null ? void 0 : _a.get) == null ? void 0 : _b.call(_a)) != null ? _c : {};
149
+ }
150
+
151
+ // src/gateway-fetch-metadata.ts
152
+ import {
153
+ createJsonErrorResponseHandler as createJsonErrorResponseHandler2,
154
+ createJsonResponseHandler as createJsonResponseHandler2,
155
+ getFromApi,
156
+ resolve as resolve2
157
+ } from "@ai-sdk/provider-utils";
158
+ import { z as z2 } from "zod";
159
+ var GatewayFetchMetadata = class {
160
+ constructor(config) {
161
+ this.config = config;
162
+ }
163
+ async getAvailableModels() {
164
+ const { value } = await getFromApi({
165
+ url: `${this.config.baseURL}/config`,
166
+ headers: await resolve2(this.config.headers()),
167
+ successfulResponseHandler: createJsonResponseHandler2(
168
+ gatewayFetchMetadataSchema
169
+ ),
170
+ failedResponseHandler: createJsonErrorResponseHandler2({
171
+ errorSchema: z2.any(),
172
+ errorToMessage: (data) => data
173
+ }),
174
+ fetch: this.config.fetch
175
+ });
176
+ return value;
177
+ }
178
+ };
179
+ var gatewayLanguageModelSpecificationSchema = z2.object({
180
+ specificationVersion: z2.literal("v2"),
181
+ provider: z2.string(),
182
+ modelId: z2.string()
183
+ });
184
+ var gatewayLanguageModelEntrySchema = z2.object({
185
+ id: z2.string(),
186
+ name: z2.string(),
187
+ specification: gatewayLanguageModelSpecificationSchema
188
+ });
189
+ var gatewayFetchMetadataSchema = z2.object({
190
+ models: z2.array(gatewayLanguageModelEntrySchema)
191
+ });
192
+
193
+ // src/gateway-provider.ts
194
+ var AI_GATEWAY_PROTOCOL_VERSION = "0.0.1";
195
+ async function getGatewayAuthToken(options) {
196
+ var _a;
197
+ try {
198
+ return (_a = loadOptionalSetting({
199
+ settingValue: options.apiKey,
200
+ environmentVariableName: "AI_GATEWAY_API_KEY"
201
+ })) != null ? _a : await getVercelOidcToken();
202
+ } catch (error) {
203
+ if (error instanceof Error && error.message.includes("'x-vercel-oidc-token' header is missing")) {
204
+ const enhancedError = new Error(
205
+ `Failed to get Vercel OIDC token for AI Gateway access.
206
+ The token is expected to be provided via the 'VERCEL_OIDC_TOKEN' environment variable. It expires every 12 hours.
207
+ - make sure your Vercel project settings have OIDC enabled
208
+ - if you're running locally with 'vercel dev' the token is automatically obtained and refreshed for you
209
+ - if you're running locally with your own dev server script you can fetch/update the token by running 'vercel env pull'
210
+ - in production or preview the token is automatically obtained and refreshed for you`
211
+ );
212
+ enhancedError.cause = error;
213
+ throw enhancedError;
214
+ }
215
+ throw error;
216
+ }
217
+ }
218
+ function createGatewayProvider(options = {}) {
219
+ var _a, _b;
220
+ let pendingMetadata = null;
221
+ let metadataCache = null;
222
+ const cacheRefreshMillis = (_a = options.metadataCacheRefreshMillis) != null ? _a : 1e3 * 60 * 5;
223
+ let lastFetchTime = 0;
224
+ const baseURL = (_b = withoutTrailingSlash(options.baseURL)) != null ? _b : "https://ai-gateway.vercel.sh/v1/ai";
225
+ const getHeaders = async () => {
226
+ return {
227
+ Authorization: `Bearer ${await getGatewayAuthToken(options)}`,
228
+ "ai-gateway-protocol-version": AI_GATEWAY_PROTOCOL_VERSION,
229
+ ...options.headers
230
+ };
231
+ };
232
+ const createLanguageModel = (modelId) => {
233
+ const deploymentId = loadOptionalSetting({
234
+ settingValue: void 0,
235
+ environmentVariableName: "DEPLOYMENT_ID"
236
+ });
237
+ const environment = loadOptionalSetting({
238
+ settingValue: void 0,
239
+ environmentVariableName: "VERCEL_ENV"
240
+ });
241
+ const region = loadOptionalSetting({
242
+ settingValue: void 0,
243
+ environmentVariableName: "VERCEL_REGION"
244
+ });
245
+ return new GatewayLanguageModel(modelId, {
246
+ provider: "gateway",
247
+ baseURL,
248
+ headers: getHeaders,
249
+ fetch: options.fetch,
250
+ o11yHeaders: {
251
+ ...deploymentId && { "ai-o11y-deployment-id": deploymentId },
252
+ ...environment && { "ai-o11y-environment": environment },
253
+ ...region && { "ai-o11y-region": region }
254
+ }
255
+ });
256
+ };
257
+ const getAvailableModels = async () => {
258
+ var _a2, _b2, _c;
259
+ const now = (_c = (_b2 = (_a2 = options._internal) == null ? void 0 : _a2.currentDate) == null ? void 0 : _b2.call(_a2).getTime()) != null ? _c : Date.now();
260
+ if (!pendingMetadata || now - lastFetchTime > cacheRefreshMillis) {
261
+ lastFetchTime = now;
262
+ pendingMetadata = new GatewayFetchMetadata({
263
+ baseURL,
264
+ headers: getHeaders,
265
+ fetch: options.fetch
266
+ }).getAvailableModels().then((metadata) => {
267
+ metadataCache = metadata;
268
+ return metadata;
269
+ });
270
+ }
271
+ return metadataCache ? Promise.resolve(metadataCache) : pendingMetadata;
272
+ };
273
+ const provider = function(modelId) {
274
+ if (new.target) {
275
+ throw new Error(
276
+ "The Gateway Provider model function cannot be called with the new keyword."
277
+ );
278
+ }
279
+ return createLanguageModel(modelId);
280
+ };
281
+ provider.getAvailableModels = getAvailableModels;
282
+ provider.imageModel = (modelId) => {
283
+ throw new NoSuchModelError({ modelId, modelType: "imageModel" });
284
+ };
285
+ provider.languageModel = createLanguageModel;
286
+ provider.textEmbeddingModel = (modelId) => {
287
+ throw new NoSuchModelError({ modelId, modelType: "textEmbeddingModel" });
288
+ };
289
+ return provider;
290
+ }
291
+ var gateway = createGatewayProvider();
292
+ export {
293
+ createGatewayProvider,
294
+ gateway
295
+ };
296
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/gateway-provider.ts","../src/gateway-language-model.ts","../src/get-vercel-oidc-token.ts","../src/gateway-fetch-metadata.ts"],"sourcesContent":["import type { LanguageModelV2, ProviderV2 } from '@ai-sdk/provider';\nimport { NoSuchModelError } from '@ai-sdk/provider';\nimport { loadOptionalSetting } from '@ai-sdk/provider-utils';\nimport {\n type FetchFunction,\n withoutTrailingSlash,\n} from '@ai-sdk/provider-utils';\nimport { GatewayLanguageModel } from './gateway-language-model';\nimport type { GatewayModelId } from './gateway-language-model-settings';\nimport { getVercelOidcToken } from './get-vercel-oidc-token';\nimport {\n GatewayFetchMetadata,\n type GatewayFetchMetadataResponse,\n} from './gateway-fetch-metadata';\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 try {\n return (\n loadOptionalSetting({\n settingValue: options.apiKey,\n environmentVariableName: 'AI_GATEWAY_API_KEY',\n }) ?? (await getVercelOidcToken())\n );\n } catch (error: unknown) {\n if (\n error instanceof Error &&\n error.message.includes(\"'x-vercel-oidc-token' header is missing\")\n ) {\n // The missing vercel oidc token error has an obtuse message that doesn't\n // provide much context about what to do for an AI Gateway user, so we\n // intervene to provide more guidance and then rethrow.\n const enhancedError = new Error(\n `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 );\n (enhancedError as Error & { cause: unknown }).cause = error;\n throw enhancedError;\n }\n throw error;\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: '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: {\n ...(deploymentId && { 'ai-o11y-deployment-id': deploymentId }),\n ...(environment && { 'ai-o11y-environment': environment }),\n ...(region && { 'ai-o11y-region': region }),\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 }\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 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} from '@ai-sdk/provider-utils';\nimport { z } from 'zod';\nimport type { GatewayConfig } from './gateway-config';\nimport type { GatewayModelId } from './gateway-language-model-settings';\nimport type { GatewayLanguageModelSpecification } from './gateway-model-entry';\n\ntype GatewayChatConfig = GatewayConfig & {\n provider: string;\n o11yHeaders: 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 {\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 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 }\n\n async doStream(\n options: Parameters<LanguageModelV2['doStream']>[0],\n ): Promise<Awaited<ReturnType<LanguageModelV2['doStream']>>> {\n const { abortSignal, ...body } = options;\n\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 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 controller.enqueue(chunk.value);\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 }\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","export 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 Error(\n `The 'x-vercel-oidc-token' header is missing from the request. Do you have the OIDC option enabled in the Vercel project settings?`,\n );\n }\n\n return token;\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","import {\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n getFromApi,\n resolve,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod';\nimport type { GatewayConfig } from './gateway-config';\nimport type { GatewayLanguageModelEntry } from './gateway-model-entry';\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 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 as GatewayFetchMetadataResponse;\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"],"mappings":"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","names":["createJsonErrorResponseHandler","createJsonResponseHandler","resolve","z","_a","_b"]}
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "@ai-sdk/gateway",
3
+ "private": false,
4
+ "version": "1.0.0-alpha.6",
5
+ "license": "Apache-2.0",
6
+ "sideEffects": false,
7
+ "main": "./dist/index.js",
8
+ "module": "./dist/index.mjs",
9
+ "types": "./dist/index.d.ts",
10
+ "files": [
11
+ "dist/**/*",
12
+ "CHANGELOG.md"
13
+ ],
14
+ "exports": {
15
+ "./package.json": "./package.json",
16
+ ".": {
17
+ "types": "./dist/index.d.ts",
18
+ "import": "./dist/index.mjs",
19
+ "require": "./dist/index.js"
20
+ }
21
+ },
22
+ "dependencies": {
23
+ "@ai-sdk/provider": "2.0.0-alpha.6",
24
+ "@ai-sdk/provider-utils": "3.0.0-alpha.6"
25
+ },
26
+ "devDependencies": {
27
+ "@types/node": "18.15.11",
28
+ "tsup": "^8",
29
+ "typescript": "5.8.3",
30
+ "zod": "3.24.4",
31
+ "@vercel/ai-tsconfig": "0.0.0"
32
+ },
33
+ "peerDependencies": {
34
+ "zod": "^3.24.0"
35
+ },
36
+ "engines": {
37
+ "node": ">=18"
38
+ },
39
+ "publishConfig": {
40
+ "access": "public"
41
+ },
42
+ "homepage": "https://ai-sdk.dev/docs",
43
+ "repository": {
44
+ "type": "git",
45
+ "url": "git+https://github.com/vercel/ai.git"
46
+ },
47
+ "bugs": {
48
+ "url": "https://github.com/vercel/ai/issues"
49
+ },
50
+ "keywords": [
51
+ "ai"
52
+ ],
53
+ "scripts": {
54
+ "build": "pnpm clean && tsup --tsconfig tsconfig.build.json",
55
+ "build:watch": "pnpm clean && tsup --watch",
56
+ "clean": "rm -rf dist *.tsbuildinfo",
57
+ "lint": "eslint \"./**/*.ts*\"",
58
+ "type-check": "tsc --build",
59
+ "prettier-check": "prettier --check \"./**/*.ts*\"",
60
+ "test": "pnpm test:node && pnpm test:edge",
61
+ "test:update": "pnpm test:node -u",
62
+ "test:watch": "vitest --config vitest.node.config.js",
63
+ "test:edge": "vitest --config vitest.edge.config.js --run",
64
+ "test:node": "vitest --config vitest.node.config.js --run"
65
+ }
66
+ }