@ai-sdk/gateway 0.0.0-02dba89b-20251009204516 → 0.0.0-4115c213-20260122152721

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.
Files changed (37) hide show
  1. package/CHANGELOG.md +886 -167
  2. package/dist/index.d.mts +205 -34
  3. package/dist/index.d.ts +205 -34
  4. package/dist/index.js +459 -180
  5. package/dist/index.js.map +1 -1
  6. package/dist/index.mjs +450 -148
  7. package/dist/index.mjs.map +1 -1
  8. package/docs/00-ai-gateway.mdx +625 -0
  9. package/package.json +19 -6
  10. package/src/errors/as-gateway-error.ts +33 -0
  11. package/src/errors/create-gateway-error.ts +132 -0
  12. package/src/errors/extract-api-call-response.ts +15 -0
  13. package/src/errors/gateway-authentication-error.ts +84 -0
  14. package/src/errors/gateway-error.ts +47 -0
  15. package/src/errors/gateway-internal-server-error.ts +33 -0
  16. package/src/errors/gateway-invalid-request-error.ts +33 -0
  17. package/src/errors/gateway-model-not-found-error.ts +47 -0
  18. package/src/errors/gateway-rate-limit-error.ts +33 -0
  19. package/src/errors/gateway-response-error.ts +42 -0
  20. package/src/errors/index.ts +16 -0
  21. package/src/errors/parse-auth-method.ts +23 -0
  22. package/src/gateway-config.ts +7 -0
  23. package/src/gateway-embedding-model-settings.ts +22 -0
  24. package/src/gateway-embedding-model.ts +109 -0
  25. package/src/gateway-fetch-metadata.ts +127 -0
  26. package/src/gateway-image-model-settings.ts +12 -0
  27. package/src/gateway-image-model.ts +145 -0
  28. package/src/gateway-language-model-settings.ts +159 -0
  29. package/src/gateway-language-model.ts +212 -0
  30. package/src/gateway-model-entry.ts +58 -0
  31. package/src/gateway-provider-options.ts +66 -0
  32. package/src/gateway-provider.ts +284 -0
  33. package/src/gateway-tools.ts +15 -0
  34. package/src/index.ts +27 -0
  35. package/src/tool/perplexity-search.ts +294 -0
  36. package/src/vercel-environment.ts +6 -0
  37. package/src/version.ts +6 -0
package/dist/index.js CHANGED
@@ -34,8 +34,7 @@ __export(src_exports, {
34
34
  module.exports = __toCommonJS(src_exports);
35
35
 
36
36
  // src/gateway-provider.ts
37
- var import_provider2 = require("@ai-sdk/provider");
38
- var import_provider_utils4 = require("@ai-sdk/provider-utils");
37
+ var import_provider_utils9 = require("@ai-sdk/provider-utils");
39
38
 
40
39
  // src/errors/as-gateway-error.ts
41
40
  var import_provider = require("@ai-sdk/provider");
@@ -51,12 +50,14 @@ var GatewayError = class _GatewayError extends (_b = Error, _a = symbol, _b) {
51
50
  constructor({
52
51
  message,
53
52
  statusCode = 500,
54
- cause
53
+ cause,
54
+ generationId
55
55
  }) {
56
- super(message);
56
+ super(generationId ? `${message} [${generationId}]` : message);
57
57
  this[_a] = true;
58
58
  this.statusCode = statusCode;
59
59
  this.cause = cause;
60
+ this.generationId = generationId;
60
61
  }
61
62
  /**
62
63
  * Checks if the given error is a Gateway Error.
@@ -80,9 +81,10 @@ var GatewayAuthenticationError = class _GatewayAuthenticationError extends (_b2
80
81
  constructor({
81
82
  message = "Authentication failed",
82
83
  statusCode = 401,
83
- cause
84
+ cause,
85
+ generationId
84
86
  } = {}) {
85
- super({ message, statusCode, cause });
87
+ super({ message, statusCode, cause, generationId });
86
88
  this[_a2] = true;
87
89
  // used in isInstance
88
90
  this.name = name;
@@ -99,44 +101,37 @@ var GatewayAuthenticationError = class _GatewayAuthenticationError extends (_b2
99
101
  oidcTokenProvided,
100
102
  message = "Authentication failed",
101
103
  statusCode = 401,
102
- cause
104
+ cause,
105
+ generationId
103
106
  }) {
104
107
  let contextualMessage;
105
108
  if (apiKeyProvided) {
106
- contextualMessage = `AI Gateway authentication failed: Invalid API key provided.
109
+ contextualMessage = `AI Gateway authentication failed: Invalid API key.
110
+
111
+ Create a new API key: https://vercel.com/d?to=%2F%5Bteam%5D%2F%7E%2Fai%2Fapi-keys
107
112
 
108
- The token is expected to be provided via the 'apiKey' option or 'AI_GATEWAY_API_KEY' environment variable.`;
113
+ Provide via 'apiKey' option or 'AI_GATEWAY_API_KEY' environment variable.`;
109
114
  } else if (oidcTokenProvided) {
110
- contextualMessage = `AI Gateway authentication failed: Invalid OIDC token provided.
115
+ contextualMessage = `AI Gateway authentication failed: Invalid OIDC token.
111
116
 
112
- The token is expected to be provided via the 'VERCEL_OIDC_TOKEN' environment variable. It expires every 12 hours.
113
- - make sure your Vercel project settings have OIDC enabled
114
- - if running locally with 'vercel dev', the token is automatically obtained and refreshed
115
- - if running locally with your own dev server, run 'vercel env pull' to fetch the token
116
- - in production/preview, the token is automatically obtained and refreshed
117
+ Run 'npx vercel link' to link your project, then 'vc env pull' to fetch the token.
117
118
 
118
- Alternative: Provide an API key via 'apiKey' option or 'AI_GATEWAY_API_KEY' environment variable.`;
119
+ Alternatively, use an API key: https://vercel.com/d?to=%2F%5Bteam%5D%2F%7E%2Fai%2Fapi-keys`;
119
120
  } else {
120
121
  contextualMessage = `AI Gateway authentication failed: No authentication provided.
121
122
 
122
- Provide either an API key or OIDC token.
123
-
124
- API key instructions:
125
-
126
- The token is expected to be provided via the 'apiKey' option or 'AI_GATEWAY_API_KEY' environment variable.
123
+ Option 1 - API key:
124
+ Create an API key: https://vercel.com/d?to=%2F%5Bteam%5D%2F%7E%2Fai%2Fapi-keys
125
+ Provide via 'apiKey' option or 'AI_GATEWAY_API_KEY' environment variable.
127
126
 
128
- OIDC token instructions:
129
-
130
- The token is expected to be provided via the 'VERCEL_OIDC_TOKEN' environment variable. It expires every 12 hours.
131
- - make sure your Vercel project settings have OIDC enabled
132
- - if running locally with 'vercel dev', the token is automatically obtained and refreshed
133
- - if running locally with your own dev server, run 'vercel env pull' to fetch the token
134
- - in production/preview, the token is automatically obtained and refreshed`;
127
+ Option 2 - OIDC token:
128
+ Run 'npx vercel link' to link your project, then 'vc env pull' to fetch the token.`;
135
129
  }
136
130
  return new _GatewayAuthenticationError({
137
131
  message: contextualMessage,
138
132
  statusCode,
139
- cause
133
+ cause,
134
+ generationId
140
135
  });
141
136
  }
142
137
  };
@@ -150,9 +145,10 @@ var GatewayInvalidRequestError = class extends (_b3 = GatewayError, _a3 = symbol
150
145
  constructor({
151
146
  message = "Invalid request",
152
147
  statusCode = 400,
153
- cause
148
+ cause,
149
+ generationId
154
150
  } = {}) {
155
- super({ message, statusCode, cause });
151
+ super({ message, statusCode, cause, generationId });
156
152
  this[_a3] = true;
157
153
  // used in isInstance
158
154
  this.name = name2;
@@ -172,9 +168,10 @@ var GatewayRateLimitError = class extends (_b4 = GatewayError, _a4 = symbol4, _b
172
168
  constructor({
173
169
  message = "Rate limit exceeded",
174
170
  statusCode = 429,
175
- cause
171
+ cause,
172
+ generationId
176
173
  } = {}) {
177
- super({ message, statusCode, cause });
174
+ super({ message, statusCode, cause, generationId });
178
175
  this[_a4] = true;
179
176
  // used in isInstance
180
177
  this.name = name3;
@@ -187,21 +184,27 @@ var GatewayRateLimitError = class extends (_b4 = GatewayError, _a4 = symbol4, _b
187
184
 
188
185
  // src/errors/gateway-model-not-found-error.ts
189
186
  var import_v4 = require("zod/v4");
187
+ var import_provider_utils = require("@ai-sdk/provider-utils");
190
188
  var name4 = "GatewayModelNotFoundError";
191
189
  var marker5 = `vercel.ai.gateway.error.${name4}`;
192
190
  var symbol5 = Symbol.for(marker5);
193
- var modelNotFoundParamSchema = import_v4.z.object({
194
- modelId: import_v4.z.string()
195
- });
191
+ var modelNotFoundParamSchema = (0, import_provider_utils.lazySchema)(
192
+ () => (0, import_provider_utils.zodSchema)(
193
+ import_v4.z.object({
194
+ modelId: import_v4.z.string()
195
+ })
196
+ )
197
+ );
196
198
  var _a5, _b5;
197
199
  var GatewayModelNotFoundError = class extends (_b5 = GatewayError, _a5 = symbol5, _b5) {
198
200
  constructor({
199
201
  message = "Model not found",
200
202
  statusCode = 404,
201
203
  modelId,
202
- cause
204
+ cause,
205
+ generationId
203
206
  } = {}) {
204
- super({ message, statusCode, cause });
207
+ super({ message, statusCode, cause, generationId });
205
208
  this[_a5] = true;
206
209
  // used in isInstance
207
210
  this.name = name4;
@@ -222,9 +225,10 @@ var GatewayInternalServerError = class extends (_b6 = GatewayError, _a6 = symbol
222
225
  constructor({
223
226
  message = "Internal server error",
224
227
  statusCode = 500,
225
- cause
228
+ cause,
229
+ generationId
226
230
  } = {}) {
227
- super({ message, statusCode, cause });
231
+ super({ message, statusCode, cause, generationId });
228
232
  this[_a6] = true;
229
233
  // used in isInstance
230
234
  this.name = name5;
@@ -246,9 +250,10 @@ var GatewayResponseError = class extends (_b7 = GatewayError, _a7 = symbol7, _b7
246
250
  statusCode = 502,
247
251
  response,
248
252
  validationError,
249
- cause
253
+ cause,
254
+ generationId
250
255
  } = {}) {
251
- super({ message, statusCode, cause });
256
+ super({ message, statusCode, cause, generationId });
252
257
  this[_a7] = true;
253
258
  // used in isInstance
254
259
  this.name = name6;
@@ -262,63 +267,99 @@ var GatewayResponseError = class extends (_b7 = GatewayError, _a7 = symbol7, _b7
262
267
  };
263
268
 
264
269
  // src/errors/create-gateway-error.ts
265
- function createGatewayErrorFromResponse({
270
+ var import_provider_utils2 = require("@ai-sdk/provider-utils");
271
+ async function createGatewayErrorFromResponse({
266
272
  response,
267
273
  statusCode,
268
274
  defaultMessage = "Gateway request failed",
269
275
  cause,
270
276
  authMethod
271
277
  }) {
272
- const parseResult = gatewayErrorResponseSchema.safeParse(response);
278
+ var _a8;
279
+ const parseResult = await (0, import_provider_utils2.safeValidateTypes)({
280
+ value: response,
281
+ schema: gatewayErrorResponseSchema
282
+ });
273
283
  if (!parseResult.success) {
284
+ const rawGenerationId = typeof response === "object" && response !== null && "generationId" in response ? response.generationId : void 0;
274
285
  return new GatewayResponseError({
275
286
  message: `Invalid error response format: ${defaultMessage}`,
276
287
  statusCode,
277
288
  response,
278
289
  validationError: parseResult.error,
279
- cause
290
+ cause,
291
+ generationId: rawGenerationId
280
292
  });
281
293
  }
282
- const validatedResponse = parseResult.data;
294
+ const validatedResponse = parseResult.value;
283
295
  const errorType = validatedResponse.error.type;
284
296
  const message = validatedResponse.error.message;
297
+ const generationId = (_a8 = validatedResponse.generationId) != null ? _a8 : void 0;
285
298
  switch (errorType) {
286
299
  case "authentication_error":
287
300
  return GatewayAuthenticationError.createContextualError({
288
301
  apiKeyProvided: authMethod === "api-key",
289
302
  oidcTokenProvided: authMethod === "oidc",
290
303
  statusCode,
291
- cause
304
+ cause,
305
+ generationId
292
306
  });
293
307
  case "invalid_request_error":
294
- return new GatewayInvalidRequestError({ message, statusCode, cause });
308
+ return new GatewayInvalidRequestError({
309
+ message,
310
+ statusCode,
311
+ cause,
312
+ generationId
313
+ });
295
314
  case "rate_limit_exceeded":
296
- return new GatewayRateLimitError({ message, statusCode, cause });
315
+ return new GatewayRateLimitError({
316
+ message,
317
+ statusCode,
318
+ cause,
319
+ generationId
320
+ });
297
321
  case "model_not_found": {
298
- const modelResult = modelNotFoundParamSchema.safeParse(
299
- validatedResponse.error.param
300
- );
322
+ const modelResult = await (0, import_provider_utils2.safeValidateTypes)({
323
+ value: validatedResponse.error.param,
324
+ schema: modelNotFoundParamSchema
325
+ });
301
326
  return new GatewayModelNotFoundError({
302
327
  message,
303
328
  statusCode,
304
- modelId: modelResult.success ? modelResult.data.modelId : void 0,
305
- cause
329
+ modelId: modelResult.success ? modelResult.value.modelId : void 0,
330
+ cause,
331
+ generationId
306
332
  });
307
333
  }
308
334
  case "internal_server_error":
309
- return new GatewayInternalServerError({ message, statusCode, cause });
335
+ return new GatewayInternalServerError({
336
+ message,
337
+ statusCode,
338
+ cause,
339
+ generationId
340
+ });
310
341
  default:
311
- return new GatewayInternalServerError({ message, statusCode, cause });
342
+ return new GatewayInternalServerError({
343
+ message,
344
+ statusCode,
345
+ cause,
346
+ generationId
347
+ });
312
348
  }
313
349
  }
314
- var gatewayErrorResponseSchema = import_v42.z.object({
315
- error: import_v42.z.object({
316
- message: import_v42.z.string(),
317
- type: import_v42.z.string().nullish(),
318
- param: import_v42.z.unknown().nullish(),
319
- code: import_v42.z.union([import_v42.z.string(), import_v42.z.number()]).nullish()
320
- })
321
- });
350
+ var gatewayErrorResponseSchema = (0, import_provider_utils2.lazySchema)(
351
+ () => (0, import_provider_utils2.zodSchema)(
352
+ import_v42.z.object({
353
+ error: import_v42.z.object({
354
+ message: import_v42.z.string(),
355
+ type: import_v42.z.string().nullish(),
356
+ param: import_v42.z.unknown().nullish(),
357
+ code: import_v42.z.union([import_v42.z.string(), import_v42.z.number()]).nullish()
358
+ }),
359
+ generationId: import_v42.z.string().nullish()
360
+ })
361
+ )
362
+ );
322
363
 
323
364
  // src/errors/as-gateway-error.ts
324
365
  function asGatewayError(error, authMethod) {
@@ -361,20 +402,21 @@ function extractApiCallResponse(error) {
361
402
 
362
403
  // src/errors/parse-auth-method.ts
363
404
  var import_v43 = require("zod/v4");
405
+ var import_provider_utils3 = require("@ai-sdk/provider-utils");
364
406
  var GATEWAY_AUTH_METHOD_HEADER = "ai-gateway-auth-method";
365
- function parseAuthMethod(headers) {
366
- const result = gatewayAuthMethodSchema.safeParse(
367
- headers[GATEWAY_AUTH_METHOD_HEADER]
368
- );
369
- return result.success ? result.data : void 0;
407
+ async function parseAuthMethod(headers) {
408
+ const result = await (0, import_provider_utils3.safeValidateTypes)({
409
+ value: headers[GATEWAY_AUTH_METHOD_HEADER],
410
+ schema: gatewayAuthMethodSchema
411
+ });
412
+ return result.success ? result.value : void 0;
370
413
  }
371
- var gatewayAuthMethodSchema = import_v43.z.union([
372
- import_v43.z.literal("api-key"),
373
- import_v43.z.literal("oidc")
374
- ]);
414
+ var gatewayAuthMethodSchema = (0, import_provider_utils3.lazySchema)(
415
+ () => (0, import_provider_utils3.zodSchema)(import_v43.z.union([import_v43.z.literal("api-key"), import_v43.z.literal("oidc")]))
416
+ );
375
417
 
376
418
  // src/gateway-fetch-metadata.ts
377
- var import_provider_utils = require("@ai-sdk/provider-utils");
419
+ var import_provider_utils4 = require("@ai-sdk/provider-utils");
378
420
  var import_v44 = require("zod/v4");
379
421
  var GatewayFetchMetadata = class {
380
422
  constructor(config) {
@@ -382,13 +424,13 @@ var GatewayFetchMetadata = class {
382
424
  }
383
425
  async getAvailableModels() {
384
426
  try {
385
- const { value } = await (0, import_provider_utils.getFromApi)({
427
+ const { value } = await (0, import_provider_utils4.getFromApi)({
386
428
  url: `${this.config.baseURL}/config`,
387
- headers: await (0, import_provider_utils.resolve)(this.config.headers()),
388
- successfulResponseHandler: (0, import_provider_utils.createJsonResponseHandler)(
389
- gatewayFetchMetadataSchema
429
+ headers: await (0, import_provider_utils4.resolve)(this.config.headers()),
430
+ successfulResponseHandler: (0, import_provider_utils4.createJsonResponseHandler)(
431
+ gatewayAvailableModelsResponseSchema
390
432
  ),
391
- failedResponseHandler: (0, import_provider_utils.createJsonErrorResponseHandler)({
433
+ failedResponseHandler: (0, import_provider_utils4.createJsonErrorResponseHandler)({
392
434
  errorSchema: import_v44.z.any(),
393
435
  errorToMessage: (data) => data
394
436
  }),
@@ -396,17 +438,19 @@ var GatewayFetchMetadata = class {
396
438
  });
397
439
  return value;
398
440
  } catch (error) {
399
- throw asGatewayError(error);
441
+ throw await asGatewayError(error);
400
442
  }
401
443
  }
402
444
  async getCredits() {
403
445
  try {
404
446
  const baseUrl = new URL(this.config.baseURL);
405
- const { value } = await (0, import_provider_utils.getFromApi)({
447
+ const { value } = await (0, import_provider_utils4.getFromApi)({
406
448
  url: `${baseUrl.origin}/v1/credits`,
407
- headers: await (0, import_provider_utils.resolve)(this.config.headers()),
408
- successfulResponseHandler: (0, import_provider_utils.createJsonResponseHandler)(gatewayCreditsSchema),
409
- failedResponseHandler: (0, import_provider_utils.createJsonErrorResponseHandler)({
449
+ headers: await (0, import_provider_utils4.resolve)(this.config.headers()),
450
+ successfulResponseHandler: (0, import_provider_utils4.createJsonResponseHandler)(
451
+ gatewayCreditsResponseSchema
452
+ ),
453
+ failedResponseHandler: (0, import_provider_utils4.createJsonErrorResponseHandler)({
410
454
  errorSchema: import_v44.z.any(),
411
455
  errorToMessage: (data) => data
412
456
  }),
@@ -414,53 +458,62 @@ var GatewayFetchMetadata = class {
414
458
  });
415
459
  return value;
416
460
  } catch (error) {
417
- throw asGatewayError(error);
461
+ throw await asGatewayError(error);
418
462
  }
419
463
  }
420
464
  };
421
- var gatewayLanguageModelSpecificationSchema = import_v44.z.object({
422
- specificationVersion: import_v44.z.literal("v2"),
423
- provider: import_v44.z.string(),
424
- modelId: import_v44.z.string()
425
- });
426
- var gatewayLanguageModelPricingSchema = import_v44.z.object({
427
- input: import_v44.z.string(),
428
- output: import_v44.z.string(),
429
- input_cache_read: import_v44.z.string().nullish(),
430
- input_cache_write: import_v44.z.string().nullish()
431
- }).transform(({ input, output, input_cache_read, input_cache_write }) => ({
432
- input,
433
- output,
434
- ...input_cache_read ? { cachedInputTokens: input_cache_read } : {},
435
- ...input_cache_write ? { cacheCreationInputTokens: input_cache_write } : {}
436
- }));
437
- var gatewayLanguageModelEntrySchema = import_v44.z.object({
438
- id: import_v44.z.string(),
439
- name: import_v44.z.string(),
440
- description: import_v44.z.string().nullish(),
441
- pricing: gatewayLanguageModelPricingSchema.nullish(),
442
- specification: gatewayLanguageModelSpecificationSchema,
443
- modelType: import_v44.z.enum(["language", "embedding", "image"]).nullish()
444
- });
445
- var gatewayFetchMetadataSchema = import_v44.z.object({
446
- models: import_v44.z.array(gatewayLanguageModelEntrySchema)
447
- });
448
- var gatewayCreditsSchema = import_v44.z.object({
449
- balance: import_v44.z.string(),
450
- total_used: import_v44.z.string()
451
- }).transform(({ balance, total_used }) => ({
452
- balance,
453
- totalUsed: total_used
454
- }));
465
+ var gatewayAvailableModelsResponseSchema = (0, import_provider_utils4.lazySchema)(
466
+ () => (0, import_provider_utils4.zodSchema)(
467
+ import_v44.z.object({
468
+ models: import_v44.z.array(
469
+ import_v44.z.object({
470
+ id: import_v44.z.string(),
471
+ name: import_v44.z.string(),
472
+ description: import_v44.z.string().nullish(),
473
+ pricing: import_v44.z.object({
474
+ input: import_v44.z.string(),
475
+ output: import_v44.z.string(),
476
+ input_cache_read: import_v44.z.string().nullish(),
477
+ input_cache_write: import_v44.z.string().nullish()
478
+ }).transform(
479
+ ({ input, output, input_cache_read, input_cache_write }) => ({
480
+ input,
481
+ output,
482
+ ...input_cache_read ? { cachedInputTokens: input_cache_read } : {},
483
+ ...input_cache_write ? { cacheCreationInputTokens: input_cache_write } : {}
484
+ })
485
+ ).nullish(),
486
+ specification: import_v44.z.object({
487
+ specificationVersion: import_v44.z.literal("v3"),
488
+ provider: import_v44.z.string(),
489
+ modelId: import_v44.z.string()
490
+ }),
491
+ modelType: import_v44.z.enum(["language", "embedding", "image"]).nullish()
492
+ })
493
+ )
494
+ })
495
+ )
496
+ );
497
+ var gatewayCreditsResponseSchema = (0, import_provider_utils4.lazySchema)(
498
+ () => (0, import_provider_utils4.zodSchema)(
499
+ import_v44.z.object({
500
+ balance: import_v44.z.string(),
501
+ total_used: import_v44.z.string()
502
+ }).transform(({ balance, total_used }) => ({
503
+ balance,
504
+ totalUsed: total_used
505
+ }))
506
+ )
507
+ );
455
508
 
456
509
  // src/gateway-language-model.ts
457
- var import_provider_utils2 = require("@ai-sdk/provider-utils");
510
+ var import_provider_utils5 = require("@ai-sdk/provider-utils");
458
511
  var import_v45 = require("zod/v4");
459
512
  var GatewayLanguageModel = class {
460
513
  constructor(modelId, config) {
461
514
  this.modelId = modelId;
462
515
  this.config = config;
463
- this.specificationVersion = "v2";
516
+ this.specificationVersion = "v3";
464
517
  this.supportedUrls = { "*/*": [/.*/] };
465
518
  }
466
519
  get provider() {
@@ -476,23 +529,23 @@ var GatewayLanguageModel = class {
476
529
  async doGenerate(options) {
477
530
  const { args, warnings } = await this.getArgs(options);
478
531
  const { abortSignal } = options;
479
- const resolvedHeaders = await (0, import_provider_utils2.resolve)(this.config.headers());
532
+ const resolvedHeaders = await (0, import_provider_utils5.resolve)(this.config.headers());
480
533
  try {
481
534
  const {
482
535
  responseHeaders,
483
536
  value: responseBody,
484
537
  rawValue: rawResponse
485
- } = await (0, import_provider_utils2.postJsonToApi)({
538
+ } = await (0, import_provider_utils5.postJsonToApi)({
486
539
  url: this.getUrl(),
487
- headers: (0, import_provider_utils2.combineHeaders)(
540
+ headers: (0, import_provider_utils5.combineHeaders)(
488
541
  resolvedHeaders,
489
542
  options.headers,
490
543
  this.getModelConfigHeaders(this.modelId, false),
491
- await (0, import_provider_utils2.resolve)(this.config.o11yHeaders)
544
+ await (0, import_provider_utils5.resolve)(this.config.o11yHeaders)
492
545
  ),
493
546
  body: args,
494
- successfulResponseHandler: (0, import_provider_utils2.createJsonResponseHandler)(import_v45.z.any()),
495
- failedResponseHandler: (0, import_provider_utils2.createJsonErrorResponseHandler)({
547
+ successfulResponseHandler: (0, import_provider_utils5.createJsonResponseHandler)(import_v45.z.any()),
548
+ failedResponseHandler: (0, import_provider_utils5.createJsonErrorResponseHandler)({
496
549
  errorSchema: import_v45.z.any(),
497
550
  errorToMessage: (data) => data
498
551
  }),
@@ -506,25 +559,25 @@ var GatewayLanguageModel = class {
506
559
  warnings
507
560
  };
508
561
  } catch (error) {
509
- throw asGatewayError(error, parseAuthMethod(resolvedHeaders));
562
+ throw await asGatewayError(error, await parseAuthMethod(resolvedHeaders));
510
563
  }
511
564
  }
512
565
  async doStream(options) {
513
566
  const { args, warnings } = await this.getArgs(options);
514
567
  const { abortSignal } = options;
515
- const resolvedHeaders = await (0, import_provider_utils2.resolve)(this.config.headers());
568
+ const resolvedHeaders = await (0, import_provider_utils5.resolve)(this.config.headers());
516
569
  try {
517
- const { value: response, responseHeaders } = await (0, import_provider_utils2.postJsonToApi)({
570
+ const { value: response, responseHeaders } = await (0, import_provider_utils5.postJsonToApi)({
518
571
  url: this.getUrl(),
519
- headers: (0, import_provider_utils2.combineHeaders)(
572
+ headers: (0, import_provider_utils5.combineHeaders)(
520
573
  resolvedHeaders,
521
574
  options.headers,
522
575
  this.getModelConfigHeaders(this.modelId, true),
523
- await (0, import_provider_utils2.resolve)(this.config.o11yHeaders)
576
+ await (0, import_provider_utils5.resolve)(this.config.o11yHeaders)
524
577
  ),
525
578
  body: args,
526
- successfulResponseHandler: (0, import_provider_utils2.createEventSourceResponseHandler)(import_v45.z.any()),
527
- failedResponseHandler: (0, import_provider_utils2.createJsonErrorResponseHandler)({
579
+ successfulResponseHandler: (0, import_provider_utils5.createEventSourceResponseHandler)(import_v45.z.any()),
580
+ failedResponseHandler: (0, import_provider_utils5.createJsonErrorResponseHandler)({
528
581
  errorSchema: import_v45.z.any(),
529
582
  errorToMessage: (data) => data
530
583
  }),
@@ -561,7 +614,7 @@ var GatewayLanguageModel = class {
561
614
  response: { headers: responseHeaders }
562
615
  };
563
616
  } catch (error) {
564
- throw asGatewayError(error, parseAuthMethod(resolvedHeaders));
617
+ throw await asGatewayError(error, await parseAuthMethod(resolvedHeaders));
565
618
  }
566
619
  }
567
620
  isFilePart(part) {
@@ -595,7 +648,7 @@ var GatewayLanguageModel = class {
595
648
  }
596
649
  getModelConfigHeaders(modelId, streaming) {
597
650
  return {
598
- "ai-language-model-specification-version": "2",
651
+ "ai-language-model-specification-version": "3",
599
652
  "ai-language-model-id": modelId,
600
653
  "ai-language-model-streaming": String(streaming)
601
654
  };
@@ -603,13 +656,13 @@ var GatewayLanguageModel = class {
603
656
  };
604
657
 
605
658
  // src/gateway-embedding-model.ts
606
- var import_provider_utils3 = require("@ai-sdk/provider-utils");
659
+ var import_provider_utils6 = require("@ai-sdk/provider-utils");
607
660
  var import_v46 = require("zod/v4");
608
661
  var GatewayEmbeddingModel = class {
609
662
  constructor(modelId, config) {
610
663
  this.modelId = modelId;
611
664
  this.config = config;
612
- this.specificationVersion = "v2";
665
+ this.specificationVersion = "v3";
613
666
  this.maxEmbeddingsPerCall = 2048;
614
667
  this.supportsParallelCalls = true;
615
668
  }
@@ -623,28 +676,28 @@ var GatewayEmbeddingModel = class {
623
676
  providerOptions
624
677
  }) {
625
678
  var _a8;
626
- const resolvedHeaders = await (0, import_provider_utils3.resolve)(this.config.headers());
679
+ const resolvedHeaders = await (0, import_provider_utils6.resolve)(this.config.headers());
627
680
  try {
628
681
  const {
629
682
  responseHeaders,
630
683
  value: responseBody,
631
684
  rawValue
632
- } = await (0, import_provider_utils3.postJsonToApi)({
685
+ } = await (0, import_provider_utils6.postJsonToApi)({
633
686
  url: this.getUrl(),
634
- headers: (0, import_provider_utils3.combineHeaders)(
687
+ headers: (0, import_provider_utils6.combineHeaders)(
635
688
  resolvedHeaders,
636
689
  headers != null ? headers : {},
637
690
  this.getModelConfigHeaders(),
638
- await (0, import_provider_utils3.resolve)(this.config.o11yHeaders)
691
+ await (0, import_provider_utils6.resolve)(this.config.o11yHeaders)
639
692
  ),
640
693
  body: {
641
- input: values.length === 1 ? values[0] : values,
694
+ values,
642
695
  ...providerOptions ? { providerOptions } : {}
643
696
  },
644
- successfulResponseHandler: (0, import_provider_utils3.createJsonResponseHandler)(
697
+ successfulResponseHandler: (0, import_provider_utils6.createJsonResponseHandler)(
645
698
  gatewayEmbeddingResponseSchema
646
699
  ),
647
- failedResponseHandler: (0, import_provider_utils3.createJsonErrorResponseHandler)({
700
+ failedResponseHandler: (0, import_provider_utils6.createJsonErrorResponseHandler)({
648
701
  errorSchema: import_v46.z.any(),
649
702
  errorToMessage: (data) => data
650
703
  }),
@@ -655,10 +708,11 @@ var GatewayEmbeddingModel = class {
655
708
  embeddings: responseBody.embeddings,
656
709
  usage: (_a8 = responseBody.usage) != null ? _a8 : void 0,
657
710
  providerMetadata: responseBody.providerMetadata,
658
- response: { headers: responseHeaders, body: rawValue }
711
+ response: { headers: responseHeaders, body: rawValue },
712
+ warnings: []
659
713
  };
660
714
  } catch (error) {
661
- throw asGatewayError(error, parseAuthMethod(resolvedHeaders));
715
+ throw await asGatewayError(error, await parseAuthMethod(resolvedHeaders));
662
716
  }
663
717
  }
664
718
  getUrl() {
@@ -666,16 +720,227 @@ var GatewayEmbeddingModel = class {
666
720
  }
667
721
  getModelConfigHeaders() {
668
722
  return {
669
- "ai-embedding-model-specification-version": "2",
723
+ "ai-embedding-model-specification-version": "3",
724
+ "ai-model-id": this.modelId
725
+ };
726
+ }
727
+ };
728
+ var gatewayEmbeddingResponseSchema = (0, import_provider_utils6.lazySchema)(
729
+ () => (0, import_provider_utils6.zodSchema)(
730
+ import_v46.z.object({
731
+ embeddings: import_v46.z.array(import_v46.z.array(import_v46.z.number())),
732
+ usage: import_v46.z.object({ tokens: import_v46.z.number() }).nullish(),
733
+ providerMetadata: import_v46.z.record(import_v46.z.string(), import_v46.z.record(import_v46.z.string(), import_v46.z.unknown())).optional()
734
+ })
735
+ )
736
+ );
737
+
738
+ // src/gateway-image-model.ts
739
+ var import_provider_utils7 = require("@ai-sdk/provider-utils");
740
+ var import_v47 = require("zod/v4");
741
+ var GatewayImageModel = class {
742
+ constructor(modelId, config) {
743
+ this.modelId = modelId;
744
+ this.config = config;
745
+ this.specificationVersion = "v3";
746
+ // Set a very large number to prevent client-side splitting of requests
747
+ this.maxImagesPerCall = Number.MAX_SAFE_INTEGER;
748
+ }
749
+ get provider() {
750
+ return this.config.provider;
751
+ }
752
+ async doGenerate({
753
+ prompt,
754
+ n,
755
+ size,
756
+ aspectRatio,
757
+ seed,
758
+ files,
759
+ mask,
760
+ providerOptions,
761
+ headers,
762
+ abortSignal
763
+ }) {
764
+ var _a8;
765
+ const resolvedHeaders = await (0, import_provider_utils7.resolve)(this.config.headers());
766
+ try {
767
+ const {
768
+ responseHeaders,
769
+ value: responseBody,
770
+ rawValue
771
+ } = await (0, import_provider_utils7.postJsonToApi)({
772
+ url: this.getUrl(),
773
+ headers: (0, import_provider_utils7.combineHeaders)(
774
+ resolvedHeaders,
775
+ headers != null ? headers : {},
776
+ this.getModelConfigHeaders(),
777
+ await (0, import_provider_utils7.resolve)(this.config.o11yHeaders)
778
+ ),
779
+ body: {
780
+ prompt,
781
+ n,
782
+ ...size && { size },
783
+ ...aspectRatio && { aspectRatio },
784
+ ...seed && { seed },
785
+ ...providerOptions && { providerOptions },
786
+ ...files && {
787
+ files: files.map((file) => maybeEncodeImageFile(file))
788
+ },
789
+ ...mask && { mask: maybeEncodeImageFile(mask) }
790
+ },
791
+ successfulResponseHandler: (0, import_provider_utils7.createJsonResponseHandler)(
792
+ gatewayImageResponseSchema
793
+ ),
794
+ failedResponseHandler: (0, import_provider_utils7.createJsonErrorResponseHandler)({
795
+ errorSchema: import_v47.z.any(),
796
+ errorToMessage: (data) => data
797
+ }),
798
+ ...abortSignal && { abortSignal },
799
+ fetch: this.config.fetch
800
+ });
801
+ return {
802
+ images: responseBody.images,
803
+ // Always base64 strings from server
804
+ warnings: (_a8 = responseBody.warnings) != null ? _a8 : [],
805
+ providerMetadata: responseBody.providerMetadata,
806
+ response: {
807
+ timestamp: /* @__PURE__ */ new Date(),
808
+ modelId: this.modelId,
809
+ headers: responseHeaders
810
+ }
811
+ };
812
+ } catch (error) {
813
+ throw asGatewayError(error, await parseAuthMethod(resolvedHeaders));
814
+ }
815
+ }
816
+ getUrl() {
817
+ return `${this.config.baseURL}/image-model`;
818
+ }
819
+ getModelConfigHeaders() {
820
+ return {
821
+ "ai-image-model-specification-version": "3",
670
822
  "ai-model-id": this.modelId
671
823
  };
672
824
  }
673
825
  };
674
- var gatewayEmbeddingResponseSchema = import_v46.z.object({
675
- embeddings: import_v46.z.array(import_v46.z.array(import_v46.z.number())),
676
- usage: import_v46.z.object({ tokens: import_v46.z.number() }).nullish(),
677
- providerMetadata: import_v46.z.record(import_v46.z.string(), import_v46.z.record(import_v46.z.string(), import_v46.z.unknown())).optional()
826
+ function maybeEncodeImageFile(file) {
827
+ if (file.type === "file" && file.data instanceof Uint8Array) {
828
+ return {
829
+ ...file,
830
+ data: (0, import_provider_utils7.convertUint8ArrayToBase64)(file.data)
831
+ };
832
+ }
833
+ return file;
834
+ }
835
+ var providerMetadataEntrySchema = import_v47.z.object({
836
+ images: import_v47.z.array(import_v47.z.unknown()).optional()
837
+ }).catchall(import_v47.z.unknown());
838
+ var gatewayImageResponseSchema = import_v47.z.object({
839
+ images: import_v47.z.array(import_v47.z.string()),
840
+ // Always base64 strings over the wire
841
+ warnings: import_v47.z.array(
842
+ import_v47.z.object({
843
+ type: import_v47.z.literal("other"),
844
+ message: import_v47.z.string()
845
+ })
846
+ ).optional(),
847
+ providerMetadata: import_v47.z.record(import_v47.z.string(), providerMetadataEntrySchema).optional()
848
+ });
849
+
850
+ // src/tool/perplexity-search.ts
851
+ var import_provider_utils8 = require("@ai-sdk/provider-utils");
852
+ var import_zod = require("zod");
853
+ var perplexitySearchInputSchema = (0, import_provider_utils8.lazySchema)(
854
+ () => (0, import_provider_utils8.zodSchema)(
855
+ import_zod.z.object({
856
+ query: import_zod.z.union([import_zod.z.string(), import_zod.z.array(import_zod.z.string())]).describe(
857
+ "Search query (string) or multiple queries (array of up to 5 strings). Multi-query searches return combined results from all queries."
858
+ ),
859
+ max_results: import_zod.z.number().optional().describe(
860
+ "Maximum number of search results to return (1-20, default: 10)"
861
+ ),
862
+ max_tokens_per_page: import_zod.z.number().optional().describe(
863
+ "Maximum number of tokens to extract per search result page (256-2048, default: 2048)"
864
+ ),
865
+ max_tokens: import_zod.z.number().optional().describe(
866
+ "Maximum total tokens across all search results (default: 25000, max: 1000000)"
867
+ ),
868
+ country: import_zod.z.string().optional().describe(
869
+ "Two-letter ISO 3166-1 alpha-2 country code for regional search results (e.g., 'US', 'GB', 'FR')"
870
+ ),
871
+ search_domain_filter: import_zod.z.array(import_zod.z.string()).optional().describe(
872
+ "List of domains to include or exclude from search results (max 20). To include: ['nature.com', 'science.org']. To exclude: ['-example.com', '-spam.net']"
873
+ ),
874
+ search_language_filter: import_zod.z.array(import_zod.z.string()).optional().describe(
875
+ "List of ISO 639-1 language codes to filter results (max 10, lowercase). Examples: ['en', 'fr', 'de']"
876
+ ),
877
+ search_after_date: import_zod.z.string().optional().describe(
878
+ "Include only results published after this date. Format: 'MM/DD/YYYY' (e.g., '3/1/2025'). Cannot be used with search_recency_filter."
879
+ ),
880
+ search_before_date: import_zod.z.string().optional().describe(
881
+ "Include only results published before this date. Format: 'MM/DD/YYYY' (e.g., '3/15/2025'). Cannot be used with search_recency_filter."
882
+ ),
883
+ last_updated_after_filter: import_zod.z.string().optional().describe(
884
+ "Include only results last updated after this date. Format: 'MM/DD/YYYY' (e.g., '3/1/2025'). Cannot be used with search_recency_filter."
885
+ ),
886
+ last_updated_before_filter: import_zod.z.string().optional().describe(
887
+ "Include only results last updated before this date. Format: 'MM/DD/YYYY' (e.g., '3/15/2025'). Cannot be used with search_recency_filter."
888
+ ),
889
+ search_recency_filter: import_zod.z.enum(["day", "week", "month", "year"]).optional().describe(
890
+ "Filter results by relative time period. Cannot be used with search_after_date or search_before_date."
891
+ )
892
+ })
893
+ )
894
+ );
895
+ var perplexitySearchOutputSchema = (0, import_provider_utils8.lazySchema)(
896
+ () => (0, import_provider_utils8.zodSchema)(
897
+ import_zod.z.union([
898
+ // Success response
899
+ import_zod.z.object({
900
+ results: import_zod.z.array(
901
+ import_zod.z.object({
902
+ title: import_zod.z.string(),
903
+ url: import_zod.z.string(),
904
+ snippet: import_zod.z.string(),
905
+ date: import_zod.z.string().optional(),
906
+ lastUpdated: import_zod.z.string().optional()
907
+ })
908
+ ),
909
+ id: import_zod.z.string()
910
+ }),
911
+ // Error response
912
+ import_zod.z.object({
913
+ error: import_zod.z.enum([
914
+ "api_error",
915
+ "rate_limit",
916
+ "timeout",
917
+ "invalid_input",
918
+ "unknown"
919
+ ]),
920
+ statusCode: import_zod.z.number().optional(),
921
+ message: import_zod.z.string()
922
+ })
923
+ ])
924
+ )
925
+ );
926
+ var perplexitySearchToolFactory = (0, import_provider_utils8.createProviderToolFactoryWithOutputSchema)({
927
+ id: "gateway.perplexity_search",
928
+ inputSchema: perplexitySearchInputSchema,
929
+ outputSchema: perplexitySearchOutputSchema
678
930
  });
931
+ var perplexitySearch = (config = {}) => perplexitySearchToolFactory(config);
932
+
933
+ // src/gateway-tools.ts
934
+ var gatewayTools = {
935
+ /**
936
+ * Search the web using Perplexity's Search API for real-time information,
937
+ * news, research papers, and articles.
938
+ *
939
+ * Provides ranked search results with advanced filtering options including
940
+ * domain, language, date range, and recency filters.
941
+ */
942
+ perplexitySearch
943
+ };
679
944
 
680
945
  // src/vercel-environment.ts
681
946
  var import_oidc = require("@vercel/oidc");
@@ -686,10 +951,10 @@ async function getVercelRequestId() {
686
951
  }
687
952
 
688
953
  // src/gateway-provider.ts
689
- var import_provider_utils5 = require("@ai-sdk/provider-utils");
954
+ var import_provider_utils10 = require("@ai-sdk/provider-utils");
690
955
 
691
956
  // src/version.ts
692
- var VERSION = true ? "0.0.0-02dba89b-20251009204516" : "0.0.0-test";
957
+ var VERSION = true ? "0.0.0-4115c213-20260122152721" : "0.0.0-test";
693
958
 
694
959
  // src/gateway-provider.ts
695
960
  var AI_GATEWAY_PROTOCOL_VERSION = "0.0.1";
@@ -699,11 +964,11 @@ function createGatewayProvider(options = {}) {
699
964
  let metadataCache = null;
700
965
  const cacheRefreshMillis = (_a8 = options.metadataCacheRefreshMillis) != null ? _a8 : 1e3 * 60 * 5;
701
966
  let lastFetchTime = 0;
702
- const baseURL = (_b8 = (0, import_provider_utils4.withoutTrailingSlash)(options.baseURL)) != null ? _b8 : "https://ai-gateway.vercel.sh/v1/ai";
967
+ const baseURL = (_b8 = (0, import_provider_utils9.withoutTrailingSlash)(options.baseURL)) != null ? _b8 : "https://ai-gateway.vercel.sh/v3/ai";
703
968
  const getHeaders = async () => {
704
- const auth = await getGatewayAuthToken(options);
705
- if (auth) {
706
- return (0, import_provider_utils5.withUserAgentSuffix)(
969
+ try {
970
+ const auth = await getGatewayAuthToken(options);
971
+ return (0, import_provider_utils10.withUserAgentSuffix)(
707
972
  {
708
973
  Authorization: `Bearer ${auth.token}`,
709
974
  "ai-gateway-protocol-version": AI_GATEWAY_PROTOCOL_VERSION,
@@ -712,23 +977,25 @@ function createGatewayProvider(options = {}) {
712
977
  },
713
978
  `ai-sdk/gateway/${VERSION}`
714
979
  );
980
+ } catch (error) {
981
+ throw GatewayAuthenticationError.createContextualError({
982
+ apiKeyProvided: false,
983
+ oidcTokenProvided: false,
984
+ statusCode: 401,
985
+ cause: error
986
+ });
715
987
  }
716
- throw GatewayAuthenticationError.createContextualError({
717
- apiKeyProvided: false,
718
- oidcTokenProvided: false,
719
- statusCode: 401
720
- });
721
988
  };
722
989
  const createO11yHeaders = () => {
723
- const deploymentId = (0, import_provider_utils4.loadOptionalSetting)({
990
+ const deploymentId = (0, import_provider_utils9.loadOptionalSetting)({
724
991
  settingValue: void 0,
725
992
  environmentVariableName: "VERCEL_DEPLOYMENT_ID"
726
993
  });
727
- const environment = (0, import_provider_utils4.loadOptionalSetting)({
994
+ const environment = (0, import_provider_utils9.loadOptionalSetting)({
728
995
  settingValue: void 0,
729
996
  environmentVariableName: "VERCEL_ENV"
730
997
  });
731
- const region = (0, import_provider_utils4.loadOptionalSetting)({
998
+ const region = (0, import_provider_utils9.loadOptionalSetting)({
732
999
  settingValue: void 0,
733
1000
  environmentVariableName: "VERCEL_REGION"
734
1001
  });
@@ -764,7 +1031,10 @@ function createGatewayProvider(options = {}) {
764
1031
  metadataCache = metadata;
765
1032
  return metadata;
766
1033
  }).catch(async (error) => {
767
- throw asGatewayError(error, parseAuthMethod(await getHeaders()));
1034
+ throw await asGatewayError(
1035
+ error,
1036
+ await parseAuthMethod(await getHeaders())
1037
+ );
768
1038
  });
769
1039
  }
770
1040
  return metadataCache ? Promise.resolve(metadataCache) : pendingMetadata;
@@ -775,7 +1045,10 @@ function createGatewayProvider(options = {}) {
775
1045
  headers: getHeaders,
776
1046
  fetch: options.fetch
777
1047
  }).getCredits().catch(async (error) => {
778
- throw asGatewayError(error, parseAuthMethod(await getHeaders()));
1048
+ throw await asGatewayError(
1049
+ error,
1050
+ await parseAuthMethod(await getHeaders())
1051
+ );
779
1052
  });
780
1053
  };
781
1054
  const provider = function(modelId) {
@@ -786,13 +1059,20 @@ function createGatewayProvider(options = {}) {
786
1059
  }
787
1060
  return createLanguageModel(modelId);
788
1061
  };
1062
+ provider.specificationVersion = "v3";
789
1063
  provider.getAvailableModels = getAvailableModels;
790
1064
  provider.getCredits = getCredits;
791
1065
  provider.imageModel = (modelId) => {
792
- throw new import_provider2.NoSuchModelError({ modelId, modelType: "imageModel" });
1066
+ return new GatewayImageModel(modelId, {
1067
+ provider: "gateway",
1068
+ baseURL,
1069
+ headers: getHeaders,
1070
+ fetch: options.fetch,
1071
+ o11yHeaders: createO11yHeaders()
1072
+ });
793
1073
  };
794
1074
  provider.languageModel = createLanguageModel;
795
- provider.textEmbeddingModel = (modelId) => {
1075
+ const createEmbeddingModel = (modelId) => {
796
1076
  return new GatewayEmbeddingModel(modelId, {
797
1077
  provider: "gateway",
798
1078
  baseURL,
@@ -801,11 +1081,14 @@ function createGatewayProvider(options = {}) {
801
1081
  o11yHeaders: createO11yHeaders()
802
1082
  });
803
1083
  };
1084
+ provider.embeddingModel = createEmbeddingModel;
1085
+ provider.textEmbeddingModel = createEmbeddingModel;
1086
+ provider.tools = gatewayTools;
804
1087
  return provider;
805
1088
  }
806
1089
  var gateway = createGatewayProvider();
807
1090
  async function getGatewayAuthToken(options) {
808
- const apiKey = (0, import_provider_utils4.loadOptionalSetting)({
1091
+ const apiKey = (0, import_provider_utils9.loadOptionalSetting)({
809
1092
  settingValue: options.apiKey,
810
1093
  environmentVariableName: "AI_GATEWAY_API_KEY"
811
1094
  });
@@ -815,15 +1098,11 @@ async function getGatewayAuthToken(options) {
815
1098
  authMethod: "api-key"
816
1099
  };
817
1100
  }
818
- try {
819
- const oidcToken = await (0, import_oidc2.getVercelOidcToken)();
820
- return {
821
- token: oidcToken,
822
- authMethod: "oidc"
823
- };
824
- } catch (e) {
825
- return null;
826
- }
1101
+ const oidcToken = await (0, import_oidc2.getVercelOidcToken)();
1102
+ return {
1103
+ token: oidcToken,
1104
+ authMethod: "oidc"
1105
+ };
827
1106
  }
828
1107
  // Annotate the CommonJS export names for ESM import in node:
829
1108
  0 && (module.exports = {