@zenning/ai 5.3.2 → 6.0.13

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.
@@ -4,8 +4,8 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
6
  var __export = (target, all) => {
7
- for (var name5 in all)
8
- __defProp(target, name5, { get: all[name5], enumerable: true });
7
+ for (var name4 in all)
8
+ __defProp(target, name4, { get: all[name4], enumerable: true });
9
9
  };
10
10
  var __copyProps = (to, from, except, desc) => {
11
11
  if (from && typeof from === "object" || typeof from === "function") {
@@ -20,7 +20,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // internal/index.ts
21
21
  var internal_exports = {};
22
22
  __export(internal_exports, {
23
- convertAsyncIteratorToReadableStream: () => import_provider_utils8.convertAsyncIteratorToReadableStream,
23
+ asLanguageModelUsage: () => asLanguageModelUsage,
24
+ convertAsyncIteratorToReadableStream: () => import_provider_utils9.convertAsyncIteratorToReadableStream,
24
25
  convertToLanguageModelPrompt: () => convertToLanguageModelPrompt,
25
26
  prepareCallSettings: () => prepareCallSettings,
26
27
  prepareRetries: () => prepareRetries,
@@ -28,10 +29,10 @@ __export(internal_exports, {
28
29
  standardizePrompt: () => standardizePrompt
29
30
  });
30
31
  module.exports = __toCommonJS(internal_exports);
31
- var import_provider_utils8 = require("@zenning/provider-utils");
32
+ var import_provider_utils9 = require("@zenning/provider-utils");
32
33
 
33
34
  // src/prompt/convert-to-language-model-prompt.ts
34
- var import_provider_utils4 = require("@zenning/provider-utils");
35
+ var import_provider_utils5 = require("@zenning/provider-utils");
35
36
 
36
37
  // src/util/detect-media-type.ts
37
38
  var import_provider_utils = require("@zenning/provider-utils");
@@ -147,52 +148,27 @@ function detectMediaType({
147
148
  return void 0;
148
149
  }
149
150
 
150
- // src/util/download/download-error.ts
151
- var import_provider = require("@zenning/provider");
152
- var name = "AI_DownloadError";
153
- var marker = `vercel.ai.error.${name}`;
154
- var symbol = Symbol.for(marker);
155
- var _a;
156
- var DownloadError = class extends import_provider.AISDKError {
157
- constructor({
158
- url,
159
- statusCode,
160
- statusText,
161
- cause,
162
- message = cause == null ? `Failed to download ${url}: ${statusCode} ${statusText}` : `Failed to download ${url}: ${cause}`
163
- }) {
164
- super({ name, message, cause });
165
- this[_a] = true;
166
- this.url = url;
167
- this.statusCode = statusCode;
168
- this.statusText = statusText;
169
- }
170
- static isInstance(error) {
171
- return import_provider.AISDKError.hasMarker(error, marker);
172
- }
173
- };
174
- _a = symbol;
175
-
176
151
  // src/util/download/download.ts
177
152
  var import_provider_utils2 = require("@zenning/provider-utils");
153
+ var import_provider_utils3 = require("@zenning/provider-utils");
178
154
 
179
155
  // src/version.ts
180
- var VERSION = true ? "5.3.2" : "0.0.0-test";
156
+ var VERSION = true ? "6.0.13" : "0.0.0-test";
181
157
 
182
158
  // src/util/download/download.ts
183
159
  var download = async ({ url }) => {
184
- var _a5;
160
+ var _a4;
185
161
  const urlText = url.toString();
186
162
  try {
187
163
  const response = await fetch(urlText, {
188
- headers: (0, import_provider_utils2.withUserAgentSuffix)(
164
+ headers: (0, import_provider_utils3.withUserAgentSuffix)(
189
165
  {},
190
166
  `ai-sdk/${VERSION}`,
191
- (0, import_provider_utils2.getRuntimeEnvironmentUserAgent)()
167
+ (0, import_provider_utils3.getRuntimeEnvironmentUserAgent)()
192
168
  )
193
169
  });
194
170
  if (!response.ok) {
195
- throw new DownloadError({
171
+ throw new import_provider_utils2.DownloadError({
196
172
  url: urlText,
197
173
  statusCode: response.status,
198
174
  statusText: response.statusText
@@ -200,13 +176,13 @@ var download = async ({ url }) => {
200
176
  }
201
177
  return {
202
178
  data: new Uint8Array(await response.arrayBuffer()),
203
- mediaType: (_a5 = response.headers.get("content-type")) != null ? _a5 : void 0
179
+ mediaType: (_a4 = response.headers.get("content-type")) != null ? _a4 : void 0
204
180
  };
205
181
  } catch (error) {
206
- if (DownloadError.isInstance(error)) {
182
+ if (import_provider_utils2.DownloadError.isInstance(error)) {
207
183
  throw error;
208
184
  }
209
- throw new DownloadError({ url: urlText, cause: error });
185
+ throw new import_provider_utils2.DownloadError({ url: urlText, cause: error });
210
186
  }
211
187
  };
212
188
 
@@ -218,8 +194,8 @@ var createDefaultDownloadFunction = (download2 = download) => (requestedDownload
218
194
  );
219
195
 
220
196
  // src/prompt/data-content.ts
221
- var import_provider2 = require("@zenning/provider");
222
- var import_provider_utils3 = require("@zenning/provider-utils");
197
+ var import_provider = require("@zenning/provider");
198
+ var import_provider_utils4 = require("@zenning/provider-utils");
223
199
  var import_v4 = require("zod/v4");
224
200
 
225
201
  // src/prompt/split-data-url.ts
@@ -246,8 +222,8 @@ var dataContentSchema = import_v4.z.union([
246
222
  import_v4.z.custom(
247
223
  // Buffer might not be available in some environments such as CloudFlare:
248
224
  (value) => {
249
- var _a5, _b;
250
- return (_b = (_a5 = globalThis.Buffer) == null ? void 0 : _a5.isBuffer(value)) != null ? _b : false;
225
+ var _a4, _b;
226
+ return (_b = (_a4 = globalThis.Buffer) == null ? void 0 : _a4.isBuffer(value)) != null ? _b : false;
251
227
  },
252
228
  { message: "Must be a Buffer" }
253
229
  )
@@ -270,7 +246,7 @@ function convertToLanguageModelV3DataContent(content) {
270
246
  content.toString()
271
247
  );
272
248
  if (dataUrlMediaType == null || base64Content == null) {
273
- throw new import_provider2.AISDKError({
249
+ throw new import_provider.AISDKError({
274
250
  name: "InvalidDataContentError",
275
251
  message: `Invalid data URL format in content ${content.toString()}`
276
252
  });
@@ -281,25 +257,30 @@ function convertToLanguageModelV3DataContent(content) {
281
257
  }
282
258
 
283
259
  // src/prompt/invalid-message-role-error.ts
284
- var import_provider3 = require("@zenning/provider");
285
- var name2 = "AI_InvalidMessageRoleError";
286
- var marker2 = `vercel.ai.error.${name2}`;
287
- var symbol2 = Symbol.for(marker2);
288
- var _a2;
289
- var InvalidMessageRoleError = class extends import_provider3.AISDKError {
260
+ var import_provider2 = require("@zenning/provider");
261
+ var name = "AI_InvalidMessageRoleError";
262
+ var marker = `vercel.ai.error.${name}`;
263
+ var symbol = Symbol.for(marker);
264
+ var _a;
265
+ var InvalidMessageRoleError = class extends import_provider2.AISDKError {
290
266
  constructor({
291
267
  role,
292
268
  message = `Invalid message role: '${role}'. Must be one of: "system", "user", "assistant", "tool".`
293
269
  }) {
294
- super({ name: name2, message });
295
- this[_a2] = true;
270
+ super({ name, message });
271
+ this[_a] = true;
296
272
  this.role = role;
297
273
  }
298
274
  static isInstance(error) {
299
- return import_provider3.AISDKError.hasMarker(error, marker2);
275
+ return import_provider2.AISDKError.hasMarker(error, marker);
300
276
  }
301
277
  };
302
- _a2 = symbol2;
278
+ _a = symbol;
279
+
280
+ // src/util/as-array.ts
281
+ function asArray(value) {
282
+ return value === void 0 ? [] : Array.isArray(value) ? value : [value];
283
+ }
303
284
 
304
285
  // src/prompt/convert-to-language-model-prompt.ts
305
286
  async function convertToLanguageModelPrompt({
@@ -312,12 +293,30 @@ async function convertToLanguageModelPrompt({
312
293
  download2,
313
294
  supportedUrls
314
295
  );
315
- return [
316
- ...prompt.system != null ? [{ role: "system", content: prompt.system }] : [],
296
+ const messages = [
297
+ ...prompt.system != null ? typeof prompt.system === "string" ? [{ role: "system", content: prompt.system }] : asArray(prompt.system).map((message) => ({
298
+ role: "system",
299
+ content: message.content,
300
+ providerOptions: message.providerOptions
301
+ })) : [],
317
302
  ...prompt.messages.map(
318
303
  (message) => convertToLanguageModelMessage({ message, downloadedAssets })
319
304
  )
320
305
  ];
306
+ const combinedMessages = [];
307
+ for (const message of messages) {
308
+ if (message.role !== "tool") {
309
+ combinedMessages.push(message);
310
+ continue;
311
+ }
312
+ const lastCombinedMessage = combinedMessages.at(-1);
313
+ if ((lastCombinedMessage == null ? void 0 : lastCombinedMessage.role) === "tool") {
314
+ lastCombinedMessage.content.push(...message.content);
315
+ } else {
316
+ combinedMessages.push(message);
317
+ }
318
+ }
319
+ return combinedMessages;
321
320
  }
322
321
  function convertToLanguageModelMessage({
323
322
  message,
@@ -359,6 +358,8 @@ function convertToLanguageModelMessage({
359
358
  content: message.content.filter(
360
359
  // remove empty text parts (no text, and no provider options):
361
360
  (part) => part.type !== "text" || part.text !== "" || part.providerOptions != null
361
+ ).filter(
362
+ (part) => part.type !== "tool-approval-request"
362
363
  ).map((part) => {
363
364
  const providerOptions = part.providerOptions;
364
365
  switch (part.type) {
@@ -403,7 +404,7 @@ function convertToLanguageModelMessage({
403
404
  type: "tool-result",
404
405
  toolCallId: part.toolCallId,
405
406
  toolName: part.toolName,
406
- output: part.output,
407
+ output: mapToolResultOutput(part.output),
407
408
  providerOptions
408
409
  };
409
410
  }
@@ -415,13 +416,30 @@ function convertToLanguageModelMessage({
415
416
  case "tool": {
416
417
  return {
417
418
  role: "tool",
418
- content: message.content.map((part) => ({
419
- type: "tool-result",
420
- toolCallId: part.toolCallId,
421
- toolName: part.toolName,
422
- output: part.output,
423
- providerOptions: part.providerOptions
424
- })),
419
+ content: message.content.filter(
420
+ // Only include tool-approval-response for provider-executed tools
421
+ (part) => part.type !== "tool-approval-response" || part.providerExecuted
422
+ ).map((part) => {
423
+ switch (part.type) {
424
+ case "tool-result": {
425
+ return {
426
+ type: "tool-result",
427
+ toolCallId: part.toolCallId,
428
+ toolName: part.toolName,
429
+ output: mapToolResultOutput(part.output),
430
+ providerOptions: part.providerOptions
431
+ };
432
+ }
433
+ case "tool-approval-response": {
434
+ return {
435
+ type: "tool-approval-response",
436
+ approvalId: part.approvalId,
437
+ approved: part.approved,
438
+ reason: part.reason
439
+ };
440
+ }
441
+ }
442
+ }),
425
443
  providerOptions: message.providerOptions
426
444
  };
427
445
  }
@@ -437,8 +455,8 @@ async function downloadAssets(messages, download2, supportedUrls) {
437
455
  ).flat().filter(
438
456
  (part) => part.type === "image" || part.type === "file"
439
457
  ).map((part) => {
440
- var _a5;
441
- const mediaType = (_a5 = part.mediaType) != null ? _a5 : part.type === "image" ? "image/*" : void 0;
458
+ var _a4;
459
+ const mediaType = (_a4 = part.mediaType) != null ? _a4 : part.type === "image" ? "image/*" : void 0;
442
460
  let data = part.type === "image" ? part.image : part.data;
443
461
  if (typeof data === "string") {
444
462
  try {
@@ -451,7 +469,7 @@ async function downloadAssets(messages, download2, supportedUrls) {
451
469
  (part) => part.data instanceof URL
452
470
  ).map((part) => ({
453
471
  url: part.data,
454
- isUrlSupportedByModel: part.mediaType != null && (0, import_provider_utils4.isUrlSupported)({
472
+ isUrlSupportedByModel: part.mediaType != null && (0, import_provider_utils5.isUrlSupported)({
455
473
  url: part.data.toString(),
456
474
  mediaType: part.mediaType,
457
475
  supportedUrls
@@ -468,7 +486,7 @@ async function downloadAssets(messages, download2, supportedUrls) {
468
486
  );
469
487
  }
470
488
  function convertPartToLanguageModelPart(part, downloadedAssets) {
471
- var _a5;
489
+ var _a4;
472
490
  if (part.type === "text") {
473
491
  return {
474
492
  type: "text",
@@ -501,7 +519,7 @@ function convertPartToLanguageModelPart(part, downloadedAssets) {
501
519
  switch (type) {
502
520
  case "image": {
503
521
  if (data instanceof Uint8Array || typeof data === "string") {
504
- mediaType = (_a5 = detectMediaType({ data, signatures: imageMediaTypeSignatures })) != null ? _a5 : mediaType;
522
+ mediaType = (_a4 = detectMediaType({ data, signatures: imageMediaTypeSignatures })) != null ? _a4 : mediaType;
505
523
  }
506
524
  return {
507
525
  type: "file",
@@ -526,9 +544,34 @@ function convertPartToLanguageModelPart(part, downloadedAssets) {
526
544
  }
527
545
  }
528
546
  }
547
+ function mapToolResultOutput(output) {
548
+ if (output.type !== "content") {
549
+ return output;
550
+ }
551
+ return {
552
+ type: "content",
553
+ value: output.value.map((item) => {
554
+ if (item.type !== "media") {
555
+ return item;
556
+ }
557
+ if (item.mediaType.startsWith("image/")) {
558
+ return {
559
+ type: "image-data",
560
+ data: item.data,
561
+ mediaType: item.mediaType
562
+ };
563
+ }
564
+ return {
565
+ type: "file-data",
566
+ data: item.data,
567
+ mediaType: item.mediaType
568
+ };
569
+ })
570
+ };
571
+ }
529
572
 
530
573
  // src/prompt/prepare-tools-and-tool-choice.ts
531
- var import_provider_utils5 = require("@zenning/provider-utils");
574
+ var import_provider_utils6 = require("@zenning/provider-utils");
532
575
 
533
576
  // src/util/is-non-empty-object.ts
534
577
  function isNonEmptyObject(object) {
@@ -536,7 +579,7 @@ function isNonEmptyObject(object) {
536
579
  }
537
580
 
538
581
  // src/prompt/prepare-tools-and-tool-choice.ts
539
- function prepareToolsAndToolChoice({
582
+ async function prepareToolsAndToolChoice({
540
583
  tools,
541
584
  toolChoice,
542
585
  activeTools
@@ -548,42 +591,48 @@ function prepareToolsAndToolChoice({
548
591
  };
549
592
  }
550
593
  const filteredTools = activeTools != null ? Object.entries(tools).filter(
551
- ([name5]) => activeTools.includes(name5)
594
+ ([name4]) => activeTools.includes(name4)
552
595
  ) : Object.entries(tools);
553
- return {
554
- tools: filteredTools.map(([name5, tool]) => {
555
- const toolType = tool.type;
556
- switch (toolType) {
557
- case void 0:
558
- case "dynamic":
559
- case "function":
560
- return {
561
- type: "function",
562
- name: name5,
563
- description: tool.description,
564
- inputSchema: (0, import_provider_utils5.asSchema)(tool.inputSchema).jsonSchema,
565
- providerOptions: tool.providerOptions
566
- };
567
- case "provider-defined":
568
- return {
569
- type: "provider-defined",
570
- name: name5,
571
- id: tool.id,
572
- args: tool.args
573
- };
574
- default: {
575
- const exhaustiveCheck = toolType;
576
- throw new Error(`Unsupported tool type: ${exhaustiveCheck}`);
577
- }
596
+ const languageModelTools = [];
597
+ for (const [name4, tool] of filteredTools) {
598
+ const toolType = tool.type;
599
+ switch (toolType) {
600
+ case void 0:
601
+ case "dynamic":
602
+ case "function":
603
+ languageModelTools.push({
604
+ type: "function",
605
+ name: name4,
606
+ description: tool.description,
607
+ inputSchema: await (0, import_provider_utils6.asSchema)(tool.inputSchema).jsonSchema,
608
+ ...tool.inputExamples != null ? { inputExamples: tool.inputExamples } : {},
609
+ providerOptions: tool.providerOptions,
610
+ ...tool.strict != null ? { strict: tool.strict } : {}
611
+ });
612
+ break;
613
+ case "provider":
614
+ languageModelTools.push({
615
+ type: "provider",
616
+ name: name4,
617
+ id: tool.id,
618
+ args: tool.args
619
+ });
620
+ break;
621
+ default: {
622
+ const exhaustiveCheck = toolType;
623
+ throw new Error(`Unsupported tool type: ${exhaustiveCheck}`);
578
624
  }
579
- }),
625
+ }
626
+ }
627
+ return {
628
+ tools: languageModelTools,
580
629
  toolChoice: toolChoice == null ? { type: "auto" } : typeof toolChoice === "string" ? { type: toolChoice } : { type: "tool", toolName: toolChoice.toolName }
581
630
  };
582
631
  }
583
632
 
584
633
  // src/prompt/standardize-prompt.ts
585
- var import_provider4 = require("@zenning/provider");
586
- var import_provider_utils6 = require("@zenning/provider-utils");
634
+ var import_provider3 = require("@zenning/provider");
635
+ var import_provider_utils7 = require("@zenning/provider-utils");
587
636
  var import_v46 = require("zod/v4");
588
637
 
589
638
  // src/prompt/message.ts
@@ -600,7 +649,7 @@ var jsonValueSchema = import_v42.z.lazy(
600
649
  import_v42.z.string(),
601
650
  import_v42.z.number(),
602
651
  import_v42.z.boolean(),
603
- import_v42.z.record(import_v42.z.string(), jsonValueSchema),
652
+ import_v42.z.record(import_v42.z.string(), jsonValueSchema.optional()),
604
653
  import_v42.z.array(jsonValueSchema)
605
654
  ])
606
655
  );
@@ -608,7 +657,7 @@ var jsonValueSchema = import_v42.z.lazy(
608
657
  // src/types/provider-metadata.ts
609
658
  var providerMetadataSchema = import_v43.z.record(
610
659
  import_v43.z.string(),
611
- import_v43.z.record(import_v43.z.string(), jsonValueSchema)
660
+ import_v43.z.record(import_v43.z.string(), jsonValueSchema.optional())
612
661
  );
613
662
 
614
663
  // src/prompt/content-part.ts
@@ -636,6 +685,11 @@ var reasoningPartSchema = import_v44.z.object({
636
685
  text: import_v44.z.string(),
637
686
  providerOptions: providerMetadataSchema.optional()
638
687
  });
688
+ var compactionPartSchema = import_v44.z.object({
689
+ type: import_v44.z.literal("compaction"),
690
+ encrypted_content: import_v44.z.string(),
691
+ providerOptions: providerMetadataSchema.optional()
692
+ });
639
693
  var toolCallPartSchema = import_v44.z.object({
640
694
  type: import_v44.z.literal("tool-call"),
641
695
  toolCallId: import_v44.z.string(),
@@ -644,40 +698,90 @@ var toolCallPartSchema = import_v44.z.object({
644
698
  providerOptions: providerMetadataSchema.optional(),
645
699
  providerExecuted: import_v44.z.boolean().optional()
646
700
  });
647
- var outputSchema = import_v44.z.discriminatedUnion("type", [
648
- import_v44.z.object({
649
- type: import_v44.z.literal("text"),
650
- value: import_v44.z.string()
651
- }),
652
- import_v44.z.object({
653
- type: import_v44.z.literal("json"),
654
- value: jsonValueSchema
655
- }),
656
- import_v44.z.object({
657
- type: import_v44.z.literal("error-text"),
658
- value: import_v44.z.string()
659
- }),
660
- import_v44.z.object({
661
- type: import_v44.z.literal("error-json"),
662
- value: jsonValueSchema
663
- }),
664
- import_v44.z.object({
665
- type: import_v44.z.literal("content"),
666
- value: import_v44.z.array(
667
- import_v44.z.union([
668
- import_v44.z.object({
669
- type: import_v44.z.literal("text"),
670
- text: import_v44.z.string()
671
- }),
672
- import_v44.z.object({
673
- type: import_v44.z.literal("media"),
674
- data: import_v44.z.string(),
675
- mediaType: import_v44.z.string()
676
- })
677
- ])
678
- )
679
- })
680
- ]);
701
+ var outputSchema = import_v44.z.discriminatedUnion(
702
+ "type",
703
+ [
704
+ import_v44.z.object({
705
+ type: import_v44.z.literal("text"),
706
+ value: import_v44.z.string(),
707
+ providerOptions: providerMetadataSchema.optional()
708
+ }),
709
+ import_v44.z.object({
710
+ type: import_v44.z.literal("json"),
711
+ value: jsonValueSchema,
712
+ providerOptions: providerMetadataSchema.optional()
713
+ }),
714
+ import_v44.z.object({
715
+ type: import_v44.z.literal("execution-denied"),
716
+ reason: import_v44.z.string().optional(),
717
+ providerOptions: providerMetadataSchema.optional()
718
+ }),
719
+ import_v44.z.object({
720
+ type: import_v44.z.literal("error-text"),
721
+ value: import_v44.z.string(),
722
+ providerOptions: providerMetadataSchema.optional()
723
+ }),
724
+ import_v44.z.object({
725
+ type: import_v44.z.literal("error-json"),
726
+ value: jsonValueSchema,
727
+ providerOptions: providerMetadataSchema.optional()
728
+ }),
729
+ import_v44.z.object({
730
+ type: import_v44.z.literal("content"),
731
+ value: import_v44.z.array(
732
+ import_v44.z.union([
733
+ import_v44.z.object({
734
+ type: import_v44.z.literal("text"),
735
+ text: import_v44.z.string(),
736
+ providerOptions: providerMetadataSchema.optional()
737
+ }),
738
+ import_v44.z.object({
739
+ type: import_v44.z.literal("media"),
740
+ data: import_v44.z.string(),
741
+ mediaType: import_v44.z.string()
742
+ }),
743
+ import_v44.z.object({
744
+ type: import_v44.z.literal("file-data"),
745
+ data: import_v44.z.string(),
746
+ mediaType: import_v44.z.string(),
747
+ filename: import_v44.z.string().optional(),
748
+ providerOptions: providerMetadataSchema.optional()
749
+ }),
750
+ import_v44.z.object({
751
+ type: import_v44.z.literal("file-url"),
752
+ url: import_v44.z.string(),
753
+ providerOptions: providerMetadataSchema.optional()
754
+ }),
755
+ import_v44.z.object({
756
+ type: import_v44.z.literal("file-id"),
757
+ fileId: import_v44.z.union([import_v44.z.string(), import_v44.z.record(import_v44.z.string(), import_v44.z.string())]),
758
+ providerOptions: providerMetadataSchema.optional()
759
+ }),
760
+ import_v44.z.object({
761
+ type: import_v44.z.literal("image-data"),
762
+ data: import_v44.z.string(),
763
+ mediaType: import_v44.z.string(),
764
+ providerOptions: providerMetadataSchema.optional()
765
+ }),
766
+ import_v44.z.object({
767
+ type: import_v44.z.literal("image-url"),
768
+ url: import_v44.z.string(),
769
+ providerOptions: providerMetadataSchema.optional()
770
+ }),
771
+ import_v44.z.object({
772
+ type: import_v44.z.literal("image-file-id"),
773
+ fileId: import_v44.z.union([import_v44.z.string(), import_v44.z.record(import_v44.z.string(), import_v44.z.string())]),
774
+ providerOptions: providerMetadataSchema.optional()
775
+ }),
776
+ import_v44.z.object({
777
+ type: import_v44.z.literal("custom"),
778
+ providerOptions: providerMetadataSchema.optional()
779
+ })
780
+ ])
781
+ )
782
+ })
783
+ ]
784
+ );
681
785
  var toolResultPartSchema = import_v44.z.object({
682
786
  type: import_v44.z.literal("tool-result"),
683
787
  toolCallId: import_v44.z.string(),
@@ -685,6 +789,17 @@ var toolResultPartSchema = import_v44.z.object({
685
789
  output: outputSchema,
686
790
  providerOptions: providerMetadataSchema.optional()
687
791
  });
792
+ var toolApprovalRequestSchema = import_v44.z.object({
793
+ type: import_v44.z.literal("tool-approval-request"),
794
+ approvalId: import_v44.z.string(),
795
+ toolCallId: import_v44.z.string()
796
+ });
797
+ var toolApprovalResponseSchema = import_v44.z.object({
798
+ type: import_v44.z.literal("tool-approval-response"),
799
+ approvalId: import_v44.z.string(),
800
+ approved: import_v44.z.boolean(),
801
+ reason: import_v44.z.string().optional()
802
+ });
688
803
 
689
804
  // src/prompt/message.ts
690
805
  var systemModelMessageSchema = import_v45.z.object(
@@ -712,7 +827,9 @@ var assistantModelMessageSchema = import_v45.z.object({
712
827
  filePartSchema,
713
828
  reasoningPartSchema,
714
829
  toolCallPartSchema,
715
- toolResultPartSchema
830
+ toolResultPartSchema,
831
+ toolApprovalRequestSchema,
832
+ compactionPartSchema
716
833
  ])
717
834
  )
718
835
  ]),
@@ -720,7 +837,7 @@ var assistantModelMessageSchema = import_v45.z.object({
720
837
  });
721
838
  var toolModelMessageSchema = import_v45.z.object({
722
839
  role: import_v45.z.literal("tool"),
723
- content: import_v45.z.array(toolResultPartSchema),
840
+ content: import_v45.z.array(import_v45.z.union([toolResultPartSchema, toolApprovalResponseSchema])),
724
841
  providerOptions: providerMetadataSchema.optional()
725
842
  });
726
843
  var modelMessageSchema = import_v45.z.union([
@@ -733,21 +850,23 @@ var modelMessageSchema = import_v45.z.union([
733
850
  // src/prompt/standardize-prompt.ts
734
851
  async function standardizePrompt(prompt) {
735
852
  if (prompt.prompt == null && prompt.messages == null) {
736
- throw new import_provider4.InvalidPromptError({
853
+ throw new import_provider3.InvalidPromptError({
737
854
  prompt,
738
855
  message: "prompt or messages must be defined"
739
856
  });
740
857
  }
741
858
  if (prompt.prompt != null && prompt.messages != null) {
742
- throw new import_provider4.InvalidPromptError({
859
+ throw new import_provider3.InvalidPromptError({
743
860
  prompt,
744
861
  message: "prompt and messages cannot be defined at the same time"
745
862
  });
746
863
  }
747
- if (prompt.system != null && typeof prompt.system !== "string") {
748
- throw new import_provider4.InvalidPromptError({
864
+ if (prompt.system != null && typeof prompt.system !== "string" && !asArray(prompt.system).every(
865
+ (message) => typeof message === "object" && message !== null && "role" in message && message.role === "system"
866
+ )) {
867
+ throw new import_provider3.InvalidPromptError({
749
868
  prompt,
750
- message: "system must be a string"
869
+ message: "system must be a string, SystemModelMessage, or array of SystemModelMessage"
751
870
  });
752
871
  }
753
872
  let messages;
@@ -758,25 +877,25 @@ async function standardizePrompt(prompt) {
758
877
  } else if (prompt.messages != null) {
759
878
  messages = prompt.messages;
760
879
  } else {
761
- throw new import_provider4.InvalidPromptError({
880
+ throw new import_provider3.InvalidPromptError({
762
881
  prompt,
763
882
  message: "prompt or messages must be defined"
764
883
  });
765
884
  }
766
885
  if (messages.length === 0) {
767
- throw new import_provider4.InvalidPromptError({
886
+ throw new import_provider3.InvalidPromptError({
768
887
  prompt,
769
888
  message: "messages must not be empty"
770
889
  });
771
890
  }
772
- const validationResult = await (0, import_provider_utils6.safeValidateTypes)({
891
+ const validationResult = await (0, import_provider_utils7.safeValidateTypes)({
773
892
  value: messages,
774
893
  schema: import_v46.z.array(modelMessageSchema)
775
894
  });
776
895
  if (!validationResult.success) {
777
- throw new import_provider4.InvalidPromptError({
896
+ throw new import_provider3.InvalidPromptError({
778
897
  prompt,
779
- message: "The messages must be a ModelMessage[]. If you have passed a UIMessage[], you can use convertToModelMessages to convert them.",
898
+ message: "The messages do not match the ModelMessage[] schema.",
780
899
  cause: validationResult.error
781
900
  });
782
901
  }
@@ -787,30 +906,30 @@ async function standardizePrompt(prompt) {
787
906
  }
788
907
 
789
908
  // src/error/invalid-argument-error.ts
790
- var import_provider5 = require("@zenning/provider");
791
- var name3 = "AI_InvalidArgumentError";
792
- var marker3 = `vercel.ai.error.${name3}`;
793
- var symbol3 = Symbol.for(marker3);
794
- var _a3;
795
- var InvalidArgumentError = class extends import_provider5.AISDKError {
909
+ var import_provider4 = require("@zenning/provider");
910
+ var name2 = "AI_InvalidArgumentError";
911
+ var marker2 = `vercel.ai.error.${name2}`;
912
+ var symbol2 = Symbol.for(marker2);
913
+ var _a2;
914
+ var InvalidArgumentError = class extends import_provider4.AISDKError {
796
915
  constructor({
797
916
  parameter,
798
917
  value,
799
918
  message
800
919
  }) {
801
920
  super({
802
- name: name3,
921
+ name: name2,
803
922
  message: `Invalid argument for parameter ${parameter}: ${message}`
804
923
  });
805
- this[_a3] = true;
924
+ this[_a2] = true;
806
925
  this.parameter = parameter;
807
926
  this.value = value;
808
927
  }
809
928
  static isInstance(error) {
810
- return import_provider5.AISDKError.hasMarker(error, marker3);
929
+ return import_provider4.AISDKError.hasMarker(error, marker2);
811
930
  }
812
931
  };
813
- _a3 = symbol3;
932
+ _a2 = symbol2;
814
933
 
815
934
  // src/prompt/prepare-call-settings.ts
816
935
  function prepareCallSettings({
@@ -906,32 +1025,32 @@ function prepareCallSettings({
906
1025
  }
907
1026
 
908
1027
  // src/util/retry-with-exponential-backoff.ts
909
- var import_provider7 = require("@zenning/provider");
910
- var import_provider_utils7 = require("@zenning/provider-utils");
1028
+ var import_provider6 = require("@zenning/provider");
1029
+ var import_provider_utils8 = require("@zenning/provider-utils");
911
1030
 
912
1031
  // src/util/retry-error.ts
913
- var import_provider6 = require("@zenning/provider");
914
- var name4 = "AI_RetryError";
915
- var marker4 = `vercel.ai.error.${name4}`;
916
- var symbol4 = Symbol.for(marker4);
917
- var _a4;
918
- var RetryError = class extends import_provider6.AISDKError {
1032
+ var import_provider5 = require("@zenning/provider");
1033
+ var name3 = "AI_RetryError";
1034
+ var marker3 = `vercel.ai.error.${name3}`;
1035
+ var symbol3 = Symbol.for(marker3);
1036
+ var _a3;
1037
+ var RetryError = class extends import_provider5.AISDKError {
919
1038
  constructor({
920
1039
  message,
921
1040
  reason,
922
1041
  errors
923
1042
  }) {
924
- super({ name: name4, message });
925
- this[_a4] = true;
1043
+ super({ name: name3, message });
1044
+ this[_a3] = true;
926
1045
  this.reason = reason;
927
1046
  this.errors = errors;
928
1047
  this.lastError = errors[errors.length - 1];
929
1048
  }
930
1049
  static isInstance(error) {
931
- return import_provider6.AISDKError.hasMarker(error, marker4);
1050
+ return import_provider5.AISDKError.hasMarker(error, marker3);
932
1051
  }
933
1052
  };
934
- _a4 = symbol4;
1053
+ _a3 = symbol3;
935
1054
 
936
1055
  // src/util/retry-with-exponential-backoff.ts
937
1056
  function getRetryDelayInMs({
@@ -983,13 +1102,13 @@ async function _retryWithExponentialBackoff(f, {
983
1102
  try {
984
1103
  return await f();
985
1104
  } catch (error) {
986
- if ((0, import_provider_utils7.isAbortError)(error)) {
1105
+ if ((0, import_provider_utils8.isAbortError)(error)) {
987
1106
  throw error;
988
1107
  }
989
1108
  if (maxRetries === 0) {
990
1109
  throw error;
991
1110
  }
992
- const errorMessage = (0, import_provider_utils7.getErrorMessage)(error);
1111
+ const errorMessage = (0, import_provider_utils8.getErrorMessage)(error);
993
1112
  const newErrors = [...errors, error];
994
1113
  const tryNumber = newErrors.length;
995
1114
  if (tryNumber > maxRetries) {
@@ -999,8 +1118,8 @@ async function _retryWithExponentialBackoff(f, {
999
1118
  errors: newErrors
1000
1119
  });
1001
1120
  }
1002
- if (error instanceof Error && import_provider7.APICallError.isInstance(error) && error.isRetryable === true && tryNumber <= maxRetries) {
1003
- await (0, import_provider_utils7.delay)(
1121
+ if (error instanceof Error && import_provider6.APICallError.isInstance(error) && error.isRetryable === true && tryNumber <= maxRetries) {
1122
+ await (0, import_provider_utils8.delay)(
1004
1123
  getRetryDelayInMs({
1005
1124
  error,
1006
1125
  exponentialBackoffDelay: delayInMs
@@ -1059,8 +1178,36 @@ function prepareRetries({
1059
1178
  })
1060
1179
  };
1061
1180
  }
1181
+
1182
+ // src/types/usage.ts
1183
+ function asLanguageModelUsage(usage) {
1184
+ return {
1185
+ inputTokens: usage.inputTokens.total,
1186
+ inputTokenDetails: {
1187
+ noCacheTokens: usage.inputTokens.noCache,
1188
+ cacheReadTokens: usage.inputTokens.cacheRead,
1189
+ cacheWriteTokens: usage.inputTokens.cacheWrite
1190
+ },
1191
+ outputTokens: usage.outputTokens.total,
1192
+ outputTokenDetails: {
1193
+ textTokens: usage.outputTokens.text,
1194
+ reasoningTokens: usage.outputTokens.reasoning
1195
+ },
1196
+ totalTokens: addTokenCounts(
1197
+ usage.inputTokens.total,
1198
+ usage.outputTokens.total
1199
+ ),
1200
+ raw: usage.raw,
1201
+ reasoningTokens: usage.outputTokens.reasoning,
1202
+ cachedInputTokens: usage.inputTokens.cacheRead
1203
+ };
1204
+ }
1205
+ function addTokenCounts(tokenCount1, tokenCount2) {
1206
+ return tokenCount1 == null && tokenCount2 == null ? void 0 : (tokenCount1 != null ? tokenCount1 : 0) + (tokenCount2 != null ? tokenCount2 : 0);
1207
+ }
1062
1208
  // Annotate the CommonJS export names for ESM import in node:
1063
1209
  0 && (module.exports = {
1210
+ asLanguageModelUsage,
1064
1211
  convertAsyncIteratorToReadableStream,
1065
1212
  convertToLanguageModelPrompt,
1066
1213
  prepareCallSettings,