@ai-sdk/gateway 4.0.0-beta.5 → 4.0.0-beta.51

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/dist/index.mjs DELETED
@@ -1,1539 +0,0 @@
1
- // src/gateway-provider.ts
2
- import {
3
- loadOptionalSetting,
4
- withoutTrailingSlash
5
- } from "@ai-sdk/provider-utils";
6
-
7
- // src/errors/as-gateway-error.ts
8
- import { APICallError } from "@ai-sdk/provider";
9
-
10
- // src/errors/create-gateway-error.ts
11
- import { z as z2 } from "zod/v4";
12
-
13
- // src/errors/gateway-error.ts
14
- var marker = "vercel.ai.gateway.error";
15
- var symbol = Symbol.for(marker);
16
- var _a, _b;
17
- var GatewayError = class _GatewayError extends (_b = Error, _a = symbol, _b) {
18
- constructor({
19
- message,
20
- statusCode = 500,
21
- cause,
22
- generationId
23
- }) {
24
- super(generationId ? `${message} [${generationId}]` : message);
25
- this[_a] = true;
26
- this.statusCode = statusCode;
27
- this.cause = cause;
28
- this.generationId = generationId;
29
- }
30
- /**
31
- * Checks if the given error is a Gateway Error.
32
- * @param {unknown} error - The error to check.
33
- * @returns {boolean} True if the error is a Gateway Error, false otherwise.
34
- */
35
- static isInstance(error) {
36
- return _GatewayError.hasMarker(error);
37
- }
38
- static hasMarker(error) {
39
- return typeof error === "object" && error !== null && symbol in error && error[symbol] === true;
40
- }
41
- };
42
-
43
- // src/errors/gateway-authentication-error.ts
44
- var name = "GatewayAuthenticationError";
45
- var marker2 = `vercel.ai.gateway.error.${name}`;
46
- var symbol2 = Symbol.for(marker2);
47
- var _a2, _b2;
48
- var GatewayAuthenticationError = class _GatewayAuthenticationError extends (_b2 = GatewayError, _a2 = symbol2, _b2) {
49
- constructor({
50
- message = "Authentication failed",
51
- statusCode = 401,
52
- cause,
53
- generationId
54
- } = {}) {
55
- super({ message, statusCode, cause, generationId });
56
- this[_a2] = true;
57
- // used in isInstance
58
- this.name = name;
59
- this.type = "authentication_error";
60
- }
61
- static isInstance(error) {
62
- return GatewayError.hasMarker(error) && symbol2 in error;
63
- }
64
- /**
65
- * Creates a contextual error message when authentication fails
66
- */
67
- static createContextualError({
68
- apiKeyProvided,
69
- oidcTokenProvided,
70
- message = "Authentication failed",
71
- statusCode = 401,
72
- cause,
73
- generationId
74
- }) {
75
- let contextualMessage;
76
- if (apiKeyProvided) {
77
- contextualMessage = `AI Gateway authentication failed: Invalid API key.
78
-
79
- Create a new API key: https://vercel.com/d?to=%2F%5Bteam%5D%2F%7E%2Fai%2Fapi-keys
80
-
81
- Provide via 'apiKey' option or 'AI_GATEWAY_API_KEY' environment variable.`;
82
- } else if (oidcTokenProvided) {
83
- contextualMessage = `AI Gateway authentication failed: Invalid OIDC token.
84
-
85
- Run 'npx vercel link' to link your project, then 'vc env pull' to fetch the token.
86
-
87
- Alternatively, use an API key: https://vercel.com/d?to=%2F%5Bteam%5D%2F%7E%2Fai%2Fapi-keys`;
88
- } else {
89
- contextualMessage = `AI Gateway authentication failed: No authentication provided.
90
-
91
- Option 1 - API key:
92
- Create an API key: https://vercel.com/d?to=%2F%5Bteam%5D%2F%7E%2Fai%2Fapi-keys
93
- Provide via 'apiKey' option or 'AI_GATEWAY_API_KEY' environment variable.
94
-
95
- Option 2 - OIDC token:
96
- Run 'npx vercel link' to link your project, then 'vc env pull' to fetch the token.`;
97
- }
98
- return new _GatewayAuthenticationError({
99
- message: contextualMessage,
100
- statusCode,
101
- cause,
102
- generationId
103
- });
104
- }
105
- };
106
-
107
- // src/errors/gateway-invalid-request-error.ts
108
- var name2 = "GatewayInvalidRequestError";
109
- var marker3 = `vercel.ai.gateway.error.${name2}`;
110
- var symbol3 = Symbol.for(marker3);
111
- var _a3, _b3;
112
- var GatewayInvalidRequestError = class extends (_b3 = GatewayError, _a3 = symbol3, _b3) {
113
- constructor({
114
- message = "Invalid request",
115
- statusCode = 400,
116
- cause,
117
- generationId
118
- } = {}) {
119
- super({ message, statusCode, cause, generationId });
120
- this[_a3] = true;
121
- // used in isInstance
122
- this.name = name2;
123
- this.type = "invalid_request_error";
124
- }
125
- static isInstance(error) {
126
- return GatewayError.hasMarker(error) && symbol3 in error;
127
- }
128
- };
129
-
130
- // src/errors/gateway-rate-limit-error.ts
131
- var name3 = "GatewayRateLimitError";
132
- var marker4 = `vercel.ai.gateway.error.${name3}`;
133
- var symbol4 = Symbol.for(marker4);
134
- var _a4, _b4;
135
- var GatewayRateLimitError = class extends (_b4 = GatewayError, _a4 = symbol4, _b4) {
136
- constructor({
137
- message = "Rate limit exceeded",
138
- statusCode = 429,
139
- cause,
140
- generationId
141
- } = {}) {
142
- super({ message, statusCode, cause, generationId });
143
- this[_a4] = true;
144
- // used in isInstance
145
- this.name = name3;
146
- this.type = "rate_limit_exceeded";
147
- }
148
- static isInstance(error) {
149
- return GatewayError.hasMarker(error) && symbol4 in error;
150
- }
151
- };
152
-
153
- // src/errors/gateway-model-not-found-error.ts
154
- import { z } from "zod/v4";
155
- import { lazySchema, zodSchema } from "@ai-sdk/provider-utils";
156
- var name4 = "GatewayModelNotFoundError";
157
- var marker5 = `vercel.ai.gateway.error.${name4}`;
158
- var symbol5 = Symbol.for(marker5);
159
- var modelNotFoundParamSchema = lazySchema(
160
- () => zodSchema(
161
- z.object({
162
- modelId: z.string()
163
- })
164
- )
165
- );
166
- var _a5, _b5;
167
- var GatewayModelNotFoundError = class extends (_b5 = GatewayError, _a5 = symbol5, _b5) {
168
- constructor({
169
- message = "Model not found",
170
- statusCode = 404,
171
- modelId,
172
- cause,
173
- generationId
174
- } = {}) {
175
- super({ message, statusCode, cause, generationId });
176
- this[_a5] = true;
177
- // used in isInstance
178
- this.name = name4;
179
- this.type = "model_not_found";
180
- this.modelId = modelId;
181
- }
182
- static isInstance(error) {
183
- return GatewayError.hasMarker(error) && symbol5 in error;
184
- }
185
- };
186
-
187
- // src/errors/gateway-internal-server-error.ts
188
- var name5 = "GatewayInternalServerError";
189
- var marker6 = `vercel.ai.gateway.error.${name5}`;
190
- var symbol6 = Symbol.for(marker6);
191
- var _a6, _b6;
192
- var GatewayInternalServerError = class extends (_b6 = GatewayError, _a6 = symbol6, _b6) {
193
- constructor({
194
- message = "Internal server error",
195
- statusCode = 500,
196
- cause,
197
- generationId
198
- } = {}) {
199
- super({ message, statusCode, cause, generationId });
200
- this[_a6] = true;
201
- // used in isInstance
202
- this.name = name5;
203
- this.type = "internal_server_error";
204
- }
205
- static isInstance(error) {
206
- return GatewayError.hasMarker(error) && symbol6 in error;
207
- }
208
- };
209
-
210
- // src/errors/gateway-response-error.ts
211
- var name6 = "GatewayResponseError";
212
- var marker7 = `vercel.ai.gateway.error.${name6}`;
213
- var symbol7 = Symbol.for(marker7);
214
- var _a7, _b7;
215
- var GatewayResponseError = class extends (_b7 = GatewayError, _a7 = symbol7, _b7) {
216
- constructor({
217
- message = "Invalid response from Gateway",
218
- statusCode = 502,
219
- response,
220
- validationError,
221
- cause,
222
- generationId
223
- } = {}) {
224
- super({ message, statusCode, cause, generationId });
225
- this[_a7] = true;
226
- // used in isInstance
227
- this.name = name6;
228
- this.type = "response_error";
229
- this.response = response;
230
- this.validationError = validationError;
231
- }
232
- static isInstance(error) {
233
- return GatewayError.hasMarker(error) && symbol7 in error;
234
- }
235
- };
236
-
237
- // src/errors/create-gateway-error.ts
238
- import {
239
- lazySchema as lazySchema2,
240
- safeValidateTypes,
241
- zodSchema as zodSchema2
242
- } from "@ai-sdk/provider-utils";
243
- async function createGatewayErrorFromResponse({
244
- response,
245
- statusCode,
246
- defaultMessage = "Gateway request failed",
247
- cause,
248
- authMethod
249
- }) {
250
- var _a9;
251
- const parseResult = await safeValidateTypes({
252
- value: response,
253
- schema: gatewayErrorResponseSchema
254
- });
255
- if (!parseResult.success) {
256
- const rawGenerationId = typeof response === "object" && response !== null && "generationId" in response ? response.generationId : void 0;
257
- return new GatewayResponseError({
258
- message: `Invalid error response format: ${defaultMessage}`,
259
- statusCode,
260
- response,
261
- validationError: parseResult.error,
262
- cause,
263
- generationId: rawGenerationId
264
- });
265
- }
266
- const validatedResponse = parseResult.value;
267
- const errorType = validatedResponse.error.type;
268
- const message = validatedResponse.error.message;
269
- const generationId = (_a9 = validatedResponse.generationId) != null ? _a9 : void 0;
270
- switch (errorType) {
271
- case "authentication_error":
272
- return GatewayAuthenticationError.createContextualError({
273
- apiKeyProvided: authMethod === "api-key",
274
- oidcTokenProvided: authMethod === "oidc",
275
- statusCode,
276
- cause,
277
- generationId
278
- });
279
- case "invalid_request_error":
280
- return new GatewayInvalidRequestError({
281
- message,
282
- statusCode,
283
- cause,
284
- generationId
285
- });
286
- case "rate_limit_exceeded":
287
- return new GatewayRateLimitError({
288
- message,
289
- statusCode,
290
- cause,
291
- generationId
292
- });
293
- case "model_not_found": {
294
- const modelResult = await safeValidateTypes({
295
- value: validatedResponse.error.param,
296
- schema: modelNotFoundParamSchema
297
- });
298
- return new GatewayModelNotFoundError({
299
- message,
300
- statusCode,
301
- modelId: modelResult.success ? modelResult.value.modelId : void 0,
302
- cause,
303
- generationId
304
- });
305
- }
306
- case "internal_server_error":
307
- return new GatewayInternalServerError({
308
- message,
309
- statusCode,
310
- cause,
311
- generationId
312
- });
313
- default:
314
- return new GatewayInternalServerError({
315
- message,
316
- statusCode,
317
- cause,
318
- generationId
319
- });
320
- }
321
- }
322
- var gatewayErrorResponseSchema = lazySchema2(
323
- () => zodSchema2(
324
- z2.object({
325
- error: z2.object({
326
- message: z2.string(),
327
- type: z2.string().nullish(),
328
- param: z2.unknown().nullish(),
329
- code: z2.union([z2.string(), z2.number()]).nullish()
330
- }),
331
- generationId: z2.string().nullish()
332
- })
333
- )
334
- );
335
-
336
- // src/errors/gateway-timeout-error.ts
337
- var name7 = "GatewayTimeoutError";
338
- var marker8 = `vercel.ai.gateway.error.${name7}`;
339
- var symbol8 = Symbol.for(marker8);
340
- var _a8, _b8;
341
- var GatewayTimeoutError = class _GatewayTimeoutError extends (_b8 = GatewayError, _a8 = symbol8, _b8) {
342
- constructor({
343
- message = "Request timed out",
344
- statusCode = 408,
345
- cause,
346
- generationId
347
- } = {}) {
348
- super({ message, statusCode, cause, generationId });
349
- this[_a8] = true;
350
- // used in isInstance
351
- this.name = name7;
352
- this.type = "timeout_error";
353
- }
354
- static isInstance(error) {
355
- return GatewayError.hasMarker(error) && symbol8 in error;
356
- }
357
- /**
358
- * Creates a helpful timeout error message with troubleshooting guidance
359
- */
360
- static createTimeoutError({
361
- originalMessage,
362
- statusCode = 408,
363
- cause,
364
- generationId
365
- }) {
366
- const message = `Gateway request timed out: ${originalMessage}
367
-
368
- This is a client-side timeout. To resolve this, increase your timeout configuration: https://vercel.com/docs/ai-gateway/capabilities/video-generation#extending-timeouts-for-node.js`;
369
- return new _GatewayTimeoutError({
370
- message,
371
- statusCode,
372
- cause,
373
- generationId
374
- });
375
- }
376
- };
377
-
378
- // src/errors/as-gateway-error.ts
379
- function isTimeoutError(error) {
380
- if (!(error instanceof Error)) {
381
- return false;
382
- }
383
- const errorCode = error.code;
384
- if (typeof errorCode === "string") {
385
- const undiciTimeoutCodes = [
386
- "UND_ERR_HEADERS_TIMEOUT",
387
- "UND_ERR_BODY_TIMEOUT",
388
- "UND_ERR_CONNECT_TIMEOUT"
389
- ];
390
- return undiciTimeoutCodes.includes(errorCode);
391
- }
392
- return false;
393
- }
394
- async function asGatewayError(error, authMethod) {
395
- var _a9;
396
- if (GatewayError.isInstance(error)) {
397
- return error;
398
- }
399
- if (isTimeoutError(error)) {
400
- return GatewayTimeoutError.createTimeoutError({
401
- originalMessage: error instanceof Error ? error.message : "Unknown error",
402
- cause: error
403
- });
404
- }
405
- if (APICallError.isInstance(error)) {
406
- if (error.cause && isTimeoutError(error.cause)) {
407
- return GatewayTimeoutError.createTimeoutError({
408
- originalMessage: error.message,
409
- cause: error
410
- });
411
- }
412
- return await createGatewayErrorFromResponse({
413
- response: extractApiCallResponse(error),
414
- statusCode: (_a9 = error.statusCode) != null ? _a9 : 500,
415
- defaultMessage: "Gateway request failed",
416
- cause: error,
417
- authMethod
418
- });
419
- }
420
- return await createGatewayErrorFromResponse({
421
- response: {},
422
- statusCode: 500,
423
- defaultMessage: error instanceof Error ? `Gateway request failed: ${error.message}` : "Unknown Gateway error",
424
- cause: error,
425
- authMethod
426
- });
427
- }
428
-
429
- // src/errors/extract-api-call-response.ts
430
- function extractApiCallResponse(error) {
431
- if (error.data !== void 0) {
432
- return error.data;
433
- }
434
- if (error.responseBody != null) {
435
- try {
436
- return JSON.parse(error.responseBody);
437
- } catch (e) {
438
- return error.responseBody;
439
- }
440
- }
441
- return {};
442
- }
443
-
444
- // src/errors/parse-auth-method.ts
445
- import { z as z3 } from "zod/v4";
446
- import {
447
- lazySchema as lazySchema3,
448
- safeValidateTypes as safeValidateTypes2,
449
- zodSchema as zodSchema3
450
- } from "@ai-sdk/provider-utils";
451
- var GATEWAY_AUTH_METHOD_HEADER = "ai-gateway-auth-method";
452
- async function parseAuthMethod(headers) {
453
- const result = await safeValidateTypes2({
454
- value: headers[GATEWAY_AUTH_METHOD_HEADER],
455
- schema: gatewayAuthMethodSchema
456
- });
457
- return result.success ? result.value : void 0;
458
- }
459
- var gatewayAuthMethodSchema = lazySchema3(
460
- () => zodSchema3(z3.union([z3.literal("api-key"), z3.literal("oidc")]))
461
- );
462
-
463
- // src/gateway-fetch-metadata.ts
464
- import {
465
- createJsonErrorResponseHandler,
466
- createJsonResponseHandler,
467
- getFromApi,
468
- lazySchema as lazySchema4,
469
- resolve,
470
- zodSchema as zodSchema4
471
- } from "@ai-sdk/provider-utils";
472
- import { z as z4 } from "zod/v4";
473
- var GatewayFetchMetadata = class {
474
- constructor(config) {
475
- this.config = config;
476
- }
477
- async getAvailableModels() {
478
- try {
479
- const { value } = await getFromApi({
480
- url: `${this.config.baseURL}/config`,
481
- headers: await resolve(this.config.headers()),
482
- successfulResponseHandler: createJsonResponseHandler(
483
- gatewayAvailableModelsResponseSchema
484
- ),
485
- failedResponseHandler: createJsonErrorResponseHandler({
486
- errorSchema: z4.any(),
487
- errorToMessage: (data) => data
488
- }),
489
- fetch: this.config.fetch
490
- });
491
- return value;
492
- } catch (error) {
493
- throw await asGatewayError(error);
494
- }
495
- }
496
- async getCredits() {
497
- try {
498
- const baseUrl = new URL(this.config.baseURL);
499
- const { value } = await getFromApi({
500
- url: `${baseUrl.origin}/v1/credits`,
501
- headers: await resolve(this.config.headers()),
502
- successfulResponseHandler: createJsonResponseHandler(
503
- gatewayCreditsResponseSchema
504
- ),
505
- failedResponseHandler: createJsonErrorResponseHandler({
506
- errorSchema: z4.any(),
507
- errorToMessage: (data) => data
508
- }),
509
- fetch: this.config.fetch
510
- });
511
- return value;
512
- } catch (error) {
513
- throw await asGatewayError(error);
514
- }
515
- }
516
- };
517
- var gatewayAvailableModelsResponseSchema = lazySchema4(
518
- () => zodSchema4(
519
- z4.object({
520
- models: z4.array(
521
- z4.object({
522
- id: z4.string(),
523
- name: z4.string(),
524
- description: z4.string().nullish(),
525
- pricing: z4.object({
526
- input: z4.string(),
527
- output: z4.string(),
528
- input_cache_read: z4.string().nullish(),
529
- input_cache_write: z4.string().nullish()
530
- }).transform(
531
- ({ input, output, input_cache_read, input_cache_write }) => ({
532
- input,
533
- output,
534
- ...input_cache_read ? { cachedInputTokens: input_cache_read } : {},
535
- ...input_cache_write ? { cacheCreationInputTokens: input_cache_write } : {}
536
- })
537
- ).nullish(),
538
- specification: z4.object({
539
- specificationVersion: z4.literal("v3"),
540
- provider: z4.string(),
541
- modelId: z4.string()
542
- }),
543
- modelType: z4.enum(["embedding", "image", "language", "video"]).nullish()
544
- })
545
- )
546
- })
547
- )
548
- );
549
- var gatewayCreditsResponseSchema = lazySchema4(
550
- () => zodSchema4(
551
- z4.object({
552
- balance: z4.string(),
553
- total_used: z4.string()
554
- }).transform(({ balance, total_used }) => ({
555
- balance,
556
- totalUsed: total_used
557
- }))
558
- )
559
- );
560
-
561
- // src/gateway-language-model.ts
562
- import {
563
- combineHeaders,
564
- createEventSourceResponseHandler,
565
- createJsonErrorResponseHandler as createJsonErrorResponseHandler2,
566
- createJsonResponseHandler as createJsonResponseHandler2,
567
- postJsonToApi,
568
- resolve as resolve2
569
- } from "@ai-sdk/provider-utils";
570
- import { z as z5 } from "zod/v4";
571
- var GatewayLanguageModel = class {
572
- constructor(modelId, config) {
573
- this.modelId = modelId;
574
- this.config = config;
575
- this.specificationVersion = "v3";
576
- this.supportedUrls = { "*/*": [/.*/] };
577
- }
578
- get provider() {
579
- return this.config.provider;
580
- }
581
- async getArgs(options) {
582
- const { abortSignal: _abortSignal, ...optionsWithoutSignal } = options;
583
- return {
584
- args: this.maybeEncodeFileParts(optionsWithoutSignal),
585
- warnings: []
586
- };
587
- }
588
- async doGenerate(options) {
589
- const { args, warnings } = await this.getArgs(options);
590
- const { abortSignal } = options;
591
- const resolvedHeaders = await resolve2(this.config.headers());
592
- try {
593
- const {
594
- responseHeaders,
595
- value: responseBody,
596
- rawValue: rawResponse
597
- } = await postJsonToApi({
598
- url: this.getUrl(),
599
- headers: combineHeaders(
600
- resolvedHeaders,
601
- options.headers,
602
- this.getModelConfigHeaders(this.modelId, false),
603
- await resolve2(this.config.o11yHeaders)
604
- ),
605
- body: args,
606
- successfulResponseHandler: createJsonResponseHandler2(z5.any()),
607
- failedResponseHandler: createJsonErrorResponseHandler2({
608
- errorSchema: z5.any(),
609
- errorToMessage: (data) => data
610
- }),
611
- ...abortSignal && { abortSignal },
612
- fetch: this.config.fetch
613
- });
614
- return {
615
- ...responseBody,
616
- request: { body: args },
617
- response: { headers: responseHeaders, body: rawResponse },
618
- warnings
619
- };
620
- } catch (error) {
621
- throw await asGatewayError(error, await parseAuthMethod(resolvedHeaders));
622
- }
623
- }
624
- async doStream(options) {
625
- const { args, warnings } = await this.getArgs(options);
626
- const { abortSignal } = options;
627
- const resolvedHeaders = await resolve2(this.config.headers());
628
- try {
629
- const { value: response, responseHeaders } = await postJsonToApi({
630
- url: this.getUrl(),
631
- headers: combineHeaders(
632
- resolvedHeaders,
633
- options.headers,
634
- this.getModelConfigHeaders(this.modelId, true),
635
- await resolve2(this.config.o11yHeaders)
636
- ),
637
- body: args,
638
- successfulResponseHandler: createEventSourceResponseHandler(z5.any()),
639
- failedResponseHandler: createJsonErrorResponseHandler2({
640
- errorSchema: z5.any(),
641
- errorToMessage: (data) => data
642
- }),
643
- ...abortSignal && { abortSignal },
644
- fetch: this.config.fetch
645
- });
646
- return {
647
- stream: response.pipeThrough(
648
- new TransformStream({
649
- start(controller) {
650
- if (warnings.length > 0) {
651
- controller.enqueue({ type: "stream-start", warnings });
652
- }
653
- },
654
- transform(chunk, controller) {
655
- if (chunk.success) {
656
- const streamPart = chunk.value;
657
- if (streamPart.type === "raw" && !options.includeRawChunks) {
658
- return;
659
- }
660
- if (streamPart.type === "response-metadata" && streamPart.timestamp && typeof streamPart.timestamp === "string") {
661
- streamPart.timestamp = new Date(streamPart.timestamp);
662
- }
663
- controller.enqueue(streamPart);
664
- } else {
665
- controller.error(
666
- chunk.error
667
- );
668
- }
669
- }
670
- })
671
- ),
672
- request: { body: args },
673
- response: { headers: responseHeaders }
674
- };
675
- } catch (error) {
676
- throw await asGatewayError(error, await parseAuthMethod(resolvedHeaders));
677
- }
678
- }
679
- isFilePart(part) {
680
- return part && typeof part === "object" && "type" in part && part.type === "file";
681
- }
682
- /**
683
- * Encodes file parts in the prompt to base64. Mutates the passed options
684
- * instance directly to avoid copying the file data.
685
- * @param options - The options to encode.
686
- * @returns The options with the file parts encoded.
687
- */
688
- maybeEncodeFileParts(options) {
689
- for (const message of options.prompt) {
690
- for (const part of message.content) {
691
- if (this.isFilePart(part)) {
692
- const filePart = part;
693
- if (filePart.data instanceof Uint8Array) {
694
- const buffer = Uint8Array.from(filePart.data);
695
- const base64Data = Buffer.from(buffer).toString("base64");
696
- filePart.data = new URL(
697
- `data:${filePart.mediaType || "application/octet-stream"};base64,${base64Data}`
698
- );
699
- }
700
- }
701
- }
702
- }
703
- return options;
704
- }
705
- getUrl() {
706
- return `${this.config.baseURL}/language-model`;
707
- }
708
- getModelConfigHeaders(modelId, streaming) {
709
- return {
710
- "ai-language-model-specification-version": "3",
711
- "ai-language-model-id": modelId,
712
- "ai-language-model-streaming": String(streaming)
713
- };
714
- }
715
- };
716
-
717
- // src/gateway-embedding-model.ts
718
- import {
719
- combineHeaders as combineHeaders2,
720
- createJsonErrorResponseHandler as createJsonErrorResponseHandler3,
721
- createJsonResponseHandler as createJsonResponseHandler3,
722
- lazySchema as lazySchema5,
723
- postJsonToApi as postJsonToApi2,
724
- resolve as resolve3,
725
- zodSchema as zodSchema5
726
- } from "@ai-sdk/provider-utils";
727
- import { z as z6 } from "zod/v4";
728
- var GatewayEmbeddingModel = class {
729
- constructor(modelId, config) {
730
- this.modelId = modelId;
731
- this.config = config;
732
- this.specificationVersion = "v3";
733
- this.maxEmbeddingsPerCall = 2048;
734
- this.supportsParallelCalls = true;
735
- }
736
- get provider() {
737
- return this.config.provider;
738
- }
739
- async doEmbed({
740
- values,
741
- headers,
742
- abortSignal,
743
- providerOptions
744
- }) {
745
- var _a9;
746
- const resolvedHeaders = await resolve3(this.config.headers());
747
- try {
748
- const {
749
- responseHeaders,
750
- value: responseBody,
751
- rawValue
752
- } = await postJsonToApi2({
753
- url: this.getUrl(),
754
- headers: combineHeaders2(
755
- resolvedHeaders,
756
- headers != null ? headers : {},
757
- this.getModelConfigHeaders(),
758
- await resolve3(this.config.o11yHeaders)
759
- ),
760
- body: {
761
- values,
762
- ...providerOptions ? { providerOptions } : {}
763
- },
764
- successfulResponseHandler: createJsonResponseHandler3(
765
- gatewayEmbeddingResponseSchema
766
- ),
767
- failedResponseHandler: createJsonErrorResponseHandler3({
768
- errorSchema: z6.any(),
769
- errorToMessage: (data) => data
770
- }),
771
- ...abortSignal && { abortSignal },
772
- fetch: this.config.fetch
773
- });
774
- return {
775
- embeddings: responseBody.embeddings,
776
- usage: (_a9 = responseBody.usage) != null ? _a9 : void 0,
777
- providerMetadata: responseBody.providerMetadata,
778
- response: { headers: responseHeaders, body: rawValue },
779
- warnings: []
780
- };
781
- } catch (error) {
782
- throw await asGatewayError(error, await parseAuthMethod(resolvedHeaders));
783
- }
784
- }
785
- getUrl() {
786
- return `${this.config.baseURL}/embedding-model`;
787
- }
788
- getModelConfigHeaders() {
789
- return {
790
- "ai-embedding-model-specification-version": "3",
791
- "ai-model-id": this.modelId
792
- };
793
- }
794
- };
795
- var gatewayEmbeddingResponseSchema = lazySchema5(
796
- () => zodSchema5(
797
- z6.object({
798
- embeddings: z6.array(z6.array(z6.number())),
799
- usage: z6.object({ tokens: z6.number() }).nullish(),
800
- providerMetadata: z6.record(z6.string(), z6.record(z6.string(), z6.unknown())).optional()
801
- })
802
- )
803
- );
804
-
805
- // src/gateway-image-model.ts
806
- import {
807
- combineHeaders as combineHeaders3,
808
- convertUint8ArrayToBase64,
809
- createJsonResponseHandler as createJsonResponseHandler4,
810
- createJsonErrorResponseHandler as createJsonErrorResponseHandler4,
811
- postJsonToApi as postJsonToApi3,
812
- resolve as resolve4
813
- } from "@ai-sdk/provider-utils";
814
- import { z as z7 } from "zod/v4";
815
- var GatewayImageModel = class {
816
- constructor(modelId, config) {
817
- this.modelId = modelId;
818
- this.config = config;
819
- this.specificationVersion = "v3";
820
- // Set a very large number to prevent client-side splitting of requests
821
- this.maxImagesPerCall = Number.MAX_SAFE_INTEGER;
822
- }
823
- get provider() {
824
- return this.config.provider;
825
- }
826
- async doGenerate({
827
- prompt,
828
- n,
829
- size,
830
- aspectRatio,
831
- seed,
832
- files,
833
- mask,
834
- providerOptions,
835
- headers,
836
- abortSignal
837
- }) {
838
- var _a9, _b9, _c, _d;
839
- const resolvedHeaders = await resolve4(this.config.headers());
840
- try {
841
- const {
842
- responseHeaders,
843
- value: responseBody,
844
- rawValue
845
- } = await postJsonToApi3({
846
- url: this.getUrl(),
847
- headers: combineHeaders3(
848
- resolvedHeaders,
849
- headers != null ? headers : {},
850
- this.getModelConfigHeaders(),
851
- await resolve4(this.config.o11yHeaders)
852
- ),
853
- body: {
854
- prompt,
855
- n,
856
- ...size && { size },
857
- ...aspectRatio && { aspectRatio },
858
- ...seed && { seed },
859
- ...providerOptions && { providerOptions },
860
- ...files && {
861
- files: files.map((file) => maybeEncodeImageFile(file))
862
- },
863
- ...mask && { mask: maybeEncodeImageFile(mask) }
864
- },
865
- successfulResponseHandler: createJsonResponseHandler4(
866
- gatewayImageResponseSchema
867
- ),
868
- failedResponseHandler: createJsonErrorResponseHandler4({
869
- errorSchema: z7.any(),
870
- errorToMessage: (data) => data
871
- }),
872
- ...abortSignal && { abortSignal },
873
- fetch: this.config.fetch
874
- });
875
- return {
876
- images: responseBody.images,
877
- // Always base64 strings from server
878
- warnings: (_a9 = responseBody.warnings) != null ? _a9 : [],
879
- providerMetadata: responseBody.providerMetadata,
880
- response: {
881
- timestamp: /* @__PURE__ */ new Date(),
882
- modelId: this.modelId,
883
- headers: responseHeaders
884
- },
885
- ...responseBody.usage != null && {
886
- usage: {
887
- inputTokens: (_b9 = responseBody.usage.inputTokens) != null ? _b9 : void 0,
888
- outputTokens: (_c = responseBody.usage.outputTokens) != null ? _c : void 0,
889
- totalTokens: (_d = responseBody.usage.totalTokens) != null ? _d : void 0
890
- }
891
- }
892
- };
893
- } catch (error) {
894
- throw await asGatewayError(error, await parseAuthMethod(resolvedHeaders));
895
- }
896
- }
897
- getUrl() {
898
- return `${this.config.baseURL}/image-model`;
899
- }
900
- getModelConfigHeaders() {
901
- return {
902
- "ai-image-model-specification-version": "3",
903
- "ai-model-id": this.modelId
904
- };
905
- }
906
- };
907
- function maybeEncodeImageFile(file) {
908
- if (file.type === "file" && file.data instanceof Uint8Array) {
909
- return {
910
- ...file,
911
- data: convertUint8ArrayToBase64(file.data)
912
- };
913
- }
914
- return file;
915
- }
916
- var providerMetadataEntrySchema = z7.object({
917
- images: z7.array(z7.unknown()).optional()
918
- }).catchall(z7.unknown());
919
- var gatewayImageWarningSchema = z7.discriminatedUnion("type", [
920
- z7.object({
921
- type: z7.literal("unsupported"),
922
- feature: z7.string(),
923
- details: z7.string().optional()
924
- }),
925
- z7.object({
926
- type: z7.literal("compatibility"),
927
- feature: z7.string(),
928
- details: z7.string().optional()
929
- }),
930
- z7.object({
931
- type: z7.literal("other"),
932
- message: z7.string()
933
- })
934
- ]);
935
- var gatewayImageUsageSchema = z7.object({
936
- inputTokens: z7.number().nullish(),
937
- outputTokens: z7.number().nullish(),
938
- totalTokens: z7.number().nullish()
939
- });
940
- var gatewayImageResponseSchema = z7.object({
941
- images: z7.array(z7.string()),
942
- // Always base64 strings over the wire
943
- warnings: z7.array(gatewayImageWarningSchema).optional(),
944
- providerMetadata: z7.record(z7.string(), providerMetadataEntrySchema).optional(),
945
- usage: gatewayImageUsageSchema.optional()
946
- });
947
-
948
- // src/gateway-video-model.ts
949
- import { APICallError as APICallError2 } from "@ai-sdk/provider";
950
- import {
951
- combineHeaders as combineHeaders4,
952
- convertUint8ArrayToBase64 as convertUint8ArrayToBase642,
953
- createJsonErrorResponseHandler as createJsonErrorResponseHandler5,
954
- parseJsonEventStream,
955
- postJsonToApi as postJsonToApi4,
956
- resolve as resolve5
957
- } from "@ai-sdk/provider-utils";
958
- import { z as z8 } from "zod/v4";
959
- var GatewayVideoModel = class {
960
- constructor(modelId, config) {
961
- this.modelId = modelId;
962
- this.config = config;
963
- this.specificationVersion = "v3";
964
- // Set a very large number to prevent client-side splitting of requests
965
- this.maxVideosPerCall = Number.MAX_SAFE_INTEGER;
966
- }
967
- get provider() {
968
- return this.config.provider;
969
- }
970
- async doGenerate({
971
- prompt,
972
- n,
973
- aspectRatio,
974
- resolution,
975
- duration,
976
- fps,
977
- seed,
978
- image,
979
- providerOptions,
980
- headers,
981
- abortSignal
982
- }) {
983
- var _a9;
984
- const resolvedHeaders = await resolve5(this.config.headers());
985
- try {
986
- const { responseHeaders, value: responseBody } = await postJsonToApi4({
987
- url: this.getUrl(),
988
- headers: combineHeaders4(
989
- resolvedHeaders,
990
- headers != null ? headers : {},
991
- this.getModelConfigHeaders(),
992
- await resolve5(this.config.o11yHeaders),
993
- { accept: "text/event-stream" }
994
- ),
995
- body: {
996
- prompt,
997
- n,
998
- ...aspectRatio && { aspectRatio },
999
- ...resolution && { resolution },
1000
- ...duration && { duration },
1001
- ...fps && { fps },
1002
- ...seed && { seed },
1003
- ...providerOptions && { providerOptions },
1004
- ...image && { image: maybeEncodeVideoFile(image) }
1005
- },
1006
- successfulResponseHandler: async ({
1007
- response,
1008
- url,
1009
- requestBodyValues
1010
- }) => {
1011
- if (response.body == null) {
1012
- throw new APICallError2({
1013
- message: "SSE response body is empty",
1014
- url,
1015
- requestBodyValues,
1016
- statusCode: response.status
1017
- });
1018
- }
1019
- const eventStream = parseJsonEventStream({
1020
- stream: response.body,
1021
- schema: gatewayVideoEventSchema
1022
- });
1023
- const reader = eventStream.getReader();
1024
- const { done, value: parseResult } = await reader.read();
1025
- reader.releaseLock();
1026
- if (done || !parseResult) {
1027
- throw new APICallError2({
1028
- message: "SSE stream ended without a data event",
1029
- url,
1030
- requestBodyValues,
1031
- statusCode: response.status
1032
- });
1033
- }
1034
- if (!parseResult.success) {
1035
- throw new APICallError2({
1036
- message: "Failed to parse video SSE event",
1037
- cause: parseResult.error,
1038
- url,
1039
- requestBodyValues,
1040
- statusCode: response.status
1041
- });
1042
- }
1043
- const event = parseResult.value;
1044
- if (event.type === "error") {
1045
- throw new APICallError2({
1046
- message: event.message,
1047
- statusCode: event.statusCode,
1048
- url,
1049
- requestBodyValues,
1050
- responseHeaders: Object.fromEntries([...response.headers]),
1051
- responseBody: JSON.stringify(event),
1052
- data: {
1053
- error: {
1054
- message: event.message,
1055
- type: event.errorType,
1056
- param: event.param
1057
- }
1058
- }
1059
- });
1060
- }
1061
- return {
1062
- value: {
1063
- videos: event.videos,
1064
- warnings: event.warnings,
1065
- providerMetadata: event.providerMetadata
1066
- },
1067
- responseHeaders: Object.fromEntries([...response.headers])
1068
- };
1069
- },
1070
- failedResponseHandler: createJsonErrorResponseHandler5({
1071
- errorSchema: z8.any(),
1072
- errorToMessage: (data) => data
1073
- }),
1074
- ...abortSignal && { abortSignal },
1075
- fetch: this.config.fetch
1076
- });
1077
- return {
1078
- videos: responseBody.videos,
1079
- warnings: (_a9 = responseBody.warnings) != null ? _a9 : [],
1080
- providerMetadata: responseBody.providerMetadata,
1081
- response: {
1082
- timestamp: /* @__PURE__ */ new Date(),
1083
- modelId: this.modelId,
1084
- headers: responseHeaders
1085
- }
1086
- };
1087
- } catch (error) {
1088
- throw await asGatewayError(error, await parseAuthMethod(resolvedHeaders));
1089
- }
1090
- }
1091
- getUrl() {
1092
- return `${this.config.baseURL}/video-model`;
1093
- }
1094
- getModelConfigHeaders() {
1095
- return {
1096
- "ai-video-model-specification-version": "3",
1097
- "ai-model-id": this.modelId
1098
- };
1099
- }
1100
- };
1101
- function maybeEncodeVideoFile(file) {
1102
- if (file.type === "file" && file.data instanceof Uint8Array) {
1103
- return {
1104
- ...file,
1105
- data: convertUint8ArrayToBase642(file.data)
1106
- };
1107
- }
1108
- return file;
1109
- }
1110
- var providerMetadataEntrySchema2 = z8.object({
1111
- videos: z8.array(z8.unknown()).optional()
1112
- }).catchall(z8.unknown());
1113
- var gatewayVideoDataSchema = z8.union([
1114
- z8.object({
1115
- type: z8.literal("url"),
1116
- url: z8.string(),
1117
- mediaType: z8.string()
1118
- }),
1119
- z8.object({
1120
- type: z8.literal("base64"),
1121
- data: z8.string(),
1122
- mediaType: z8.string()
1123
- })
1124
- ]);
1125
- var gatewayVideoWarningSchema = z8.discriminatedUnion("type", [
1126
- z8.object({
1127
- type: z8.literal("unsupported"),
1128
- feature: z8.string(),
1129
- details: z8.string().optional()
1130
- }),
1131
- z8.object({
1132
- type: z8.literal("compatibility"),
1133
- feature: z8.string(),
1134
- details: z8.string().optional()
1135
- }),
1136
- z8.object({
1137
- type: z8.literal("other"),
1138
- message: z8.string()
1139
- })
1140
- ]);
1141
- var gatewayVideoEventSchema = z8.discriminatedUnion("type", [
1142
- z8.object({
1143
- type: z8.literal("result"),
1144
- videos: z8.array(gatewayVideoDataSchema),
1145
- warnings: z8.array(gatewayVideoWarningSchema).optional(),
1146
- providerMetadata: z8.record(z8.string(), providerMetadataEntrySchema2).optional()
1147
- }),
1148
- z8.object({
1149
- type: z8.literal("error"),
1150
- message: z8.string(),
1151
- errorType: z8.string(),
1152
- statusCode: z8.number(),
1153
- param: z8.unknown().nullable()
1154
- })
1155
- ]);
1156
-
1157
- // src/tool/parallel-search.ts
1158
- import {
1159
- createProviderToolFactoryWithOutputSchema,
1160
- lazySchema as lazySchema6,
1161
- zodSchema as zodSchema6
1162
- } from "@ai-sdk/provider-utils";
1163
- import { z as z9 } from "zod";
1164
- var parallelSearchInputSchema = lazySchema6(
1165
- () => zodSchema6(
1166
- z9.object({
1167
- objective: z9.string().describe(
1168
- "Natural-language description of the web research goal, including source or freshness guidance and broader context from the task. Maximum 5000 characters."
1169
- ),
1170
- search_queries: z9.array(z9.string()).optional().describe(
1171
- "Optional search queries to supplement the objective. Maximum 200 characters per query."
1172
- ),
1173
- mode: z9.enum(["one-shot", "agentic"]).optional().describe(
1174
- 'Mode preset: "one-shot" for comprehensive results with longer excerpts (default), "agentic" for concise, token-efficient results for multi-step workflows.'
1175
- ),
1176
- max_results: z9.number().optional().describe(
1177
- "Maximum number of results to return (1-20). Defaults to 10 if not specified."
1178
- ),
1179
- source_policy: z9.object({
1180
- include_domains: z9.array(z9.string()).optional().describe("List of domains to include in search results."),
1181
- exclude_domains: z9.array(z9.string()).optional().describe("List of domains to exclude from search results."),
1182
- after_date: z9.string().optional().describe(
1183
- "Only include results published after this date (ISO 8601 format)."
1184
- )
1185
- }).optional().describe(
1186
- "Source policy for controlling which domains to include/exclude and freshness."
1187
- ),
1188
- excerpts: z9.object({
1189
- max_chars_per_result: z9.number().optional().describe("Maximum characters per result."),
1190
- max_chars_total: z9.number().optional().describe("Maximum total characters across all results.")
1191
- }).optional().describe("Excerpt configuration for controlling result length."),
1192
- fetch_policy: z9.object({
1193
- max_age_seconds: z9.number().optional().describe(
1194
- "Maximum age in seconds for cached content. Set to 0 to always fetch fresh content."
1195
- )
1196
- }).optional().describe("Fetch policy for controlling content freshness.")
1197
- })
1198
- )
1199
- );
1200
- var parallelSearchOutputSchema = lazySchema6(
1201
- () => zodSchema6(
1202
- z9.union([
1203
- // Success response
1204
- z9.object({
1205
- searchId: z9.string(),
1206
- results: z9.array(
1207
- z9.object({
1208
- url: z9.string(),
1209
- title: z9.string(),
1210
- excerpt: z9.string(),
1211
- publishDate: z9.string().nullable().optional(),
1212
- relevanceScore: z9.number().optional()
1213
- })
1214
- )
1215
- }),
1216
- // Error response
1217
- z9.object({
1218
- error: z9.enum([
1219
- "api_error",
1220
- "rate_limit",
1221
- "timeout",
1222
- "invalid_input",
1223
- "configuration_error",
1224
- "unknown"
1225
- ]),
1226
- statusCode: z9.number().optional(),
1227
- message: z9.string()
1228
- })
1229
- ])
1230
- )
1231
- );
1232
- var parallelSearchToolFactory = createProviderToolFactoryWithOutputSchema({
1233
- id: "gateway.parallel_search",
1234
- inputSchema: parallelSearchInputSchema,
1235
- outputSchema: parallelSearchOutputSchema
1236
- });
1237
- var parallelSearch = (config = {}) => parallelSearchToolFactory(config);
1238
-
1239
- // src/tool/perplexity-search.ts
1240
- import {
1241
- createProviderToolFactoryWithOutputSchema as createProviderToolFactoryWithOutputSchema2,
1242
- lazySchema as lazySchema7,
1243
- zodSchema as zodSchema7
1244
- } from "@ai-sdk/provider-utils";
1245
- import { z as z10 } from "zod";
1246
- var perplexitySearchInputSchema = lazySchema7(
1247
- () => zodSchema7(
1248
- z10.object({
1249
- query: z10.union([z10.string(), z10.array(z10.string())]).describe(
1250
- "Search query (string) or multiple queries (array of up to 5 strings). Multi-query searches return combined results from all queries."
1251
- ),
1252
- max_results: z10.number().optional().describe(
1253
- "Maximum number of search results to return (1-20, default: 10)"
1254
- ),
1255
- max_tokens_per_page: z10.number().optional().describe(
1256
- "Maximum number of tokens to extract per search result page (256-2048, default: 2048)"
1257
- ),
1258
- max_tokens: z10.number().optional().describe(
1259
- "Maximum total tokens across all search results (default: 25000, max: 1000000)"
1260
- ),
1261
- country: z10.string().optional().describe(
1262
- "Two-letter ISO 3166-1 alpha-2 country code for regional search results (e.g., 'US', 'GB', 'FR')"
1263
- ),
1264
- search_domain_filter: z10.array(z10.string()).optional().describe(
1265
- "List of domains to include or exclude from search results (max 20). To include: ['nature.com', 'science.org']. To exclude: ['-example.com', '-spam.net']"
1266
- ),
1267
- search_language_filter: z10.array(z10.string()).optional().describe(
1268
- "List of ISO 639-1 language codes to filter results (max 10, lowercase). Examples: ['en', 'fr', 'de']"
1269
- ),
1270
- search_after_date: z10.string().optional().describe(
1271
- "Include only results published after this date. Format: 'MM/DD/YYYY' (e.g., '3/1/2025'). Cannot be used with search_recency_filter."
1272
- ),
1273
- search_before_date: z10.string().optional().describe(
1274
- "Include only results published before this date. Format: 'MM/DD/YYYY' (e.g., '3/15/2025'). Cannot be used with search_recency_filter."
1275
- ),
1276
- last_updated_after_filter: z10.string().optional().describe(
1277
- "Include only results last updated after this date. Format: 'MM/DD/YYYY' (e.g., '3/1/2025'). Cannot be used with search_recency_filter."
1278
- ),
1279
- last_updated_before_filter: z10.string().optional().describe(
1280
- "Include only results last updated before this date. Format: 'MM/DD/YYYY' (e.g., '3/15/2025'). Cannot be used with search_recency_filter."
1281
- ),
1282
- search_recency_filter: z10.enum(["day", "week", "month", "year"]).optional().describe(
1283
- "Filter results by relative time period. Cannot be used with search_after_date or search_before_date."
1284
- )
1285
- })
1286
- )
1287
- );
1288
- var perplexitySearchOutputSchema = lazySchema7(
1289
- () => zodSchema7(
1290
- z10.union([
1291
- // Success response
1292
- z10.object({
1293
- results: z10.array(
1294
- z10.object({
1295
- title: z10.string(),
1296
- url: z10.string(),
1297
- snippet: z10.string(),
1298
- date: z10.string().optional(),
1299
- lastUpdated: z10.string().optional()
1300
- })
1301
- ),
1302
- id: z10.string()
1303
- }),
1304
- // Error response
1305
- z10.object({
1306
- error: z10.enum([
1307
- "api_error",
1308
- "rate_limit",
1309
- "timeout",
1310
- "invalid_input",
1311
- "unknown"
1312
- ]),
1313
- statusCode: z10.number().optional(),
1314
- message: z10.string()
1315
- })
1316
- ])
1317
- )
1318
- );
1319
- var perplexitySearchToolFactory = createProviderToolFactoryWithOutputSchema2({
1320
- id: "gateway.perplexity_search",
1321
- inputSchema: perplexitySearchInputSchema,
1322
- outputSchema: perplexitySearchOutputSchema
1323
- });
1324
- var perplexitySearch = (config = {}) => perplexitySearchToolFactory(config);
1325
-
1326
- // src/gateway-tools.ts
1327
- var gatewayTools = {
1328
- /**
1329
- * Search the web using Parallel AI's Search API for LLM-optimized excerpts.
1330
- *
1331
- * Takes a natural language objective and returns relevant excerpts,
1332
- * replacing multiple keyword searches with a single call for broad
1333
- * or complex queries. Supports different search types for depth vs
1334
- * breadth tradeoffs.
1335
- */
1336
- parallelSearch,
1337
- /**
1338
- * Search the web using Perplexity's Search API for real-time information,
1339
- * news, research papers, and articles.
1340
- *
1341
- * Provides ranked search results with advanced filtering options including
1342
- * domain, language, date range, and recency filters.
1343
- */
1344
- perplexitySearch
1345
- };
1346
-
1347
- // src/vercel-environment.ts
1348
- import { getContext } from "@vercel/oidc";
1349
- import { getVercelOidcToken } from "@vercel/oidc";
1350
- async function getVercelRequestId() {
1351
- var _a9;
1352
- return (_a9 = getContext().headers) == null ? void 0 : _a9["x-vercel-id"];
1353
- }
1354
-
1355
- // src/gateway-provider.ts
1356
- import { withUserAgentSuffix } from "@ai-sdk/provider-utils";
1357
-
1358
- // src/version.ts
1359
- var VERSION = true ? "4.0.0-beta.5" : "0.0.0-test";
1360
-
1361
- // src/gateway-provider.ts
1362
- var AI_GATEWAY_PROTOCOL_VERSION = "0.0.1";
1363
- function createGatewayProvider(options = {}) {
1364
- var _a9, _b9;
1365
- let pendingMetadata = null;
1366
- let metadataCache = null;
1367
- const cacheRefreshMillis = (_a9 = options.metadataCacheRefreshMillis) != null ? _a9 : 1e3 * 60 * 5;
1368
- let lastFetchTime = 0;
1369
- const baseURL = (_b9 = withoutTrailingSlash(options.baseURL)) != null ? _b9 : "https://ai-gateway.vercel.sh/v3/ai";
1370
- const getHeaders = async () => {
1371
- try {
1372
- const auth = await getGatewayAuthToken(options);
1373
- return withUserAgentSuffix(
1374
- {
1375
- Authorization: `Bearer ${auth.token}`,
1376
- "ai-gateway-protocol-version": AI_GATEWAY_PROTOCOL_VERSION,
1377
- [GATEWAY_AUTH_METHOD_HEADER]: auth.authMethod,
1378
- ...options.headers
1379
- },
1380
- `ai-sdk/gateway/${VERSION}`
1381
- );
1382
- } catch (error) {
1383
- throw GatewayAuthenticationError.createContextualError({
1384
- apiKeyProvided: false,
1385
- oidcTokenProvided: false,
1386
- statusCode: 401,
1387
- cause: error
1388
- });
1389
- }
1390
- };
1391
- const createO11yHeaders = () => {
1392
- const deploymentId = loadOptionalSetting({
1393
- settingValue: void 0,
1394
- environmentVariableName: "VERCEL_DEPLOYMENT_ID"
1395
- });
1396
- const environment = loadOptionalSetting({
1397
- settingValue: void 0,
1398
- environmentVariableName: "VERCEL_ENV"
1399
- });
1400
- const region = loadOptionalSetting({
1401
- settingValue: void 0,
1402
- environmentVariableName: "VERCEL_REGION"
1403
- });
1404
- const projectId = loadOptionalSetting({
1405
- settingValue: void 0,
1406
- environmentVariableName: "VERCEL_PROJECT_ID"
1407
- });
1408
- return async () => {
1409
- const requestId = await getVercelRequestId();
1410
- return {
1411
- ...deploymentId && { "ai-o11y-deployment-id": deploymentId },
1412
- ...environment && { "ai-o11y-environment": environment },
1413
- ...region && { "ai-o11y-region": region },
1414
- ...requestId && { "ai-o11y-request-id": requestId },
1415
- ...projectId && { "ai-o11y-project-id": projectId }
1416
- };
1417
- };
1418
- };
1419
- const createLanguageModel = (modelId) => {
1420
- return new GatewayLanguageModel(modelId, {
1421
- provider: "gateway",
1422
- baseURL,
1423
- headers: getHeaders,
1424
- fetch: options.fetch,
1425
- o11yHeaders: createO11yHeaders()
1426
- });
1427
- };
1428
- const getAvailableModels = async () => {
1429
- var _a10, _b10, _c;
1430
- const now = (_c = (_b10 = (_a10 = options._internal) == null ? void 0 : _a10.currentDate) == null ? void 0 : _b10.call(_a10).getTime()) != null ? _c : Date.now();
1431
- if (!pendingMetadata || now - lastFetchTime > cacheRefreshMillis) {
1432
- lastFetchTime = now;
1433
- pendingMetadata = new GatewayFetchMetadata({
1434
- baseURL,
1435
- headers: getHeaders,
1436
- fetch: options.fetch
1437
- }).getAvailableModels().then((metadata) => {
1438
- metadataCache = metadata;
1439
- return metadata;
1440
- }).catch(async (error) => {
1441
- throw await asGatewayError(
1442
- error,
1443
- await parseAuthMethod(await getHeaders())
1444
- );
1445
- });
1446
- }
1447
- return metadataCache ? Promise.resolve(metadataCache) : pendingMetadata;
1448
- };
1449
- const getCredits = async () => {
1450
- return new GatewayFetchMetadata({
1451
- baseURL,
1452
- headers: getHeaders,
1453
- fetch: options.fetch
1454
- }).getCredits().catch(async (error) => {
1455
- throw await asGatewayError(
1456
- error,
1457
- await parseAuthMethod(await getHeaders())
1458
- );
1459
- });
1460
- };
1461
- const provider = function(modelId) {
1462
- if (new.target) {
1463
- throw new Error(
1464
- "The Gateway Provider model function cannot be called with the new keyword."
1465
- );
1466
- }
1467
- return createLanguageModel(modelId);
1468
- };
1469
- provider.specificationVersion = "v3";
1470
- provider.getAvailableModels = getAvailableModels;
1471
- provider.getCredits = getCredits;
1472
- provider.imageModel = (modelId) => {
1473
- return new GatewayImageModel(modelId, {
1474
- provider: "gateway",
1475
- baseURL,
1476
- headers: getHeaders,
1477
- fetch: options.fetch,
1478
- o11yHeaders: createO11yHeaders()
1479
- });
1480
- };
1481
- provider.languageModel = createLanguageModel;
1482
- const createEmbeddingModel = (modelId) => {
1483
- return new GatewayEmbeddingModel(modelId, {
1484
- provider: "gateway",
1485
- baseURL,
1486
- headers: getHeaders,
1487
- fetch: options.fetch,
1488
- o11yHeaders: createO11yHeaders()
1489
- });
1490
- };
1491
- provider.embeddingModel = createEmbeddingModel;
1492
- provider.textEmbeddingModel = createEmbeddingModel;
1493
- provider.videoModel = (modelId) => {
1494
- return new GatewayVideoModel(modelId, {
1495
- provider: "gateway",
1496
- baseURL,
1497
- headers: getHeaders,
1498
- fetch: options.fetch,
1499
- o11yHeaders: createO11yHeaders()
1500
- });
1501
- };
1502
- provider.chat = provider.languageModel;
1503
- provider.embedding = provider.embeddingModel;
1504
- provider.image = provider.imageModel;
1505
- provider.video = provider.videoModel;
1506
- provider.tools = gatewayTools;
1507
- return provider;
1508
- }
1509
- var gateway = createGatewayProvider();
1510
- async function getGatewayAuthToken(options) {
1511
- const apiKey = loadOptionalSetting({
1512
- settingValue: options.apiKey,
1513
- environmentVariableName: "AI_GATEWAY_API_KEY"
1514
- });
1515
- if (apiKey) {
1516
- return {
1517
- token: apiKey,
1518
- authMethod: "api-key"
1519
- };
1520
- }
1521
- const oidcToken = await getVercelOidcToken();
1522
- return {
1523
- token: oidcToken,
1524
- authMethod: "oidc"
1525
- };
1526
- }
1527
- export {
1528
- GatewayAuthenticationError,
1529
- GatewayError,
1530
- GatewayInternalServerError,
1531
- GatewayInvalidRequestError,
1532
- GatewayModelNotFoundError,
1533
- GatewayRateLimitError,
1534
- GatewayResponseError,
1535
- createGatewayProvider as createGateway,
1536
- createGatewayProvider,
1537
- gateway
1538
- };
1539
- //# sourceMappingURL=index.mjs.map