@zenning/ai 5.0.41-patched

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.
@@ -0,0 +1,1046 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name5 in all)
8
+ __defProp(target, name5, { get: all[name5], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // internal/index.ts
21
+ var internal_exports = {};
22
+ __export(internal_exports, {
23
+ convertAsyncIteratorToReadableStream: () => import_provider_utils7.convertAsyncIteratorToReadableStream,
24
+ convertToLanguageModelPrompt: () => convertToLanguageModelPrompt,
25
+ prepareCallSettings: () => prepareCallSettings,
26
+ prepareRetries: () => prepareRetries,
27
+ prepareToolsAndToolChoice: () => prepareToolsAndToolChoice,
28
+ standardizePrompt: () => standardizePrompt
29
+ });
30
+ module.exports = __toCommonJS(internal_exports);
31
+ var import_provider_utils7 = require("@ai-sdk/provider-utils");
32
+
33
+ // src/prompt/convert-to-language-model-prompt.ts
34
+ var import_provider_utils3 = require("@ai-sdk/provider-utils");
35
+
36
+ // src/util/detect-media-type.ts
37
+ var import_provider_utils = require("@ai-sdk/provider-utils");
38
+ var imageMediaTypeSignatures = [
39
+ {
40
+ mediaType: "image/gif",
41
+ bytesPrefix: [71, 73, 70],
42
+ base64Prefix: "R0lG"
43
+ },
44
+ {
45
+ mediaType: "image/png",
46
+ bytesPrefix: [137, 80, 78, 71],
47
+ base64Prefix: "iVBORw"
48
+ },
49
+ {
50
+ mediaType: "image/jpeg",
51
+ bytesPrefix: [255, 216],
52
+ base64Prefix: "/9j/"
53
+ },
54
+ {
55
+ mediaType: "image/webp",
56
+ bytesPrefix: [82, 73, 70, 70],
57
+ base64Prefix: "UklGRg"
58
+ },
59
+ {
60
+ mediaType: "image/bmp",
61
+ bytesPrefix: [66, 77],
62
+ base64Prefix: "Qk"
63
+ },
64
+ {
65
+ mediaType: "image/tiff",
66
+ bytesPrefix: [73, 73, 42, 0],
67
+ base64Prefix: "SUkqAA"
68
+ },
69
+ {
70
+ mediaType: "image/tiff",
71
+ bytesPrefix: [77, 77, 0, 42],
72
+ base64Prefix: "TU0AKg"
73
+ },
74
+ {
75
+ mediaType: "image/avif",
76
+ bytesPrefix: [
77
+ 0,
78
+ 0,
79
+ 0,
80
+ 32,
81
+ 102,
82
+ 116,
83
+ 121,
84
+ 112,
85
+ 97,
86
+ 118,
87
+ 105,
88
+ 102
89
+ ],
90
+ base64Prefix: "AAAAIGZ0eXBhdmlm"
91
+ },
92
+ {
93
+ mediaType: "image/heic",
94
+ bytesPrefix: [
95
+ 0,
96
+ 0,
97
+ 0,
98
+ 32,
99
+ 102,
100
+ 116,
101
+ 121,
102
+ 112,
103
+ 104,
104
+ 101,
105
+ 105,
106
+ 99
107
+ ],
108
+ base64Prefix: "AAAAIGZ0eXBoZWlj"
109
+ }
110
+ ];
111
+ var stripID3 = (data) => {
112
+ const bytes = typeof data === "string" ? (0, import_provider_utils.convertBase64ToUint8Array)(data) : data;
113
+ const id3Size = (bytes[6] & 127) << 21 | (bytes[7] & 127) << 14 | (bytes[8] & 127) << 7 | bytes[9] & 127;
114
+ return bytes.slice(id3Size + 10);
115
+ };
116
+ function stripID3TagsIfPresent(data) {
117
+ const hasId3 = typeof data === "string" && data.startsWith("SUQz") || typeof data !== "string" && data.length > 10 && data[0] === 73 && // 'I'
118
+ data[1] === 68 && // 'D'
119
+ data[2] === 51;
120
+ return hasId3 ? stripID3(data) : data;
121
+ }
122
+ function detectMediaType({
123
+ data,
124
+ signatures
125
+ }) {
126
+ const processedData = stripID3TagsIfPresent(data);
127
+ for (const signature of signatures) {
128
+ if (typeof processedData === "string" ? processedData.startsWith(signature.base64Prefix) : processedData.length >= signature.bytesPrefix.length && signature.bytesPrefix.every(
129
+ (byte, index) => processedData[index] === byte
130
+ )) {
131
+ return signature.mediaType;
132
+ }
133
+ }
134
+ return void 0;
135
+ }
136
+
137
+ // src/util/download/download-error.ts
138
+ var import_provider = require("@ai-sdk/provider");
139
+ var name = "AI_DownloadError";
140
+ var marker = `vercel.ai.error.${name}`;
141
+ var symbol = Symbol.for(marker);
142
+ var _a;
143
+ var DownloadError = class extends import_provider.AISDKError {
144
+ constructor({
145
+ url,
146
+ statusCode,
147
+ statusText,
148
+ cause,
149
+ message = cause == null ? `Failed to download ${url}: ${statusCode} ${statusText}` : `Failed to download ${url}: ${cause}`
150
+ }) {
151
+ super({ name, message, cause });
152
+ this[_a] = true;
153
+ this.url = url;
154
+ this.statusCode = statusCode;
155
+ this.statusText = statusText;
156
+ }
157
+ static isInstance(error) {
158
+ return import_provider.AISDKError.hasMarker(error, marker);
159
+ }
160
+ };
161
+ _a = symbol;
162
+
163
+ // src/util/download/download.ts
164
+ var download = async ({ url }) => {
165
+ var _a5;
166
+ const urlText = url.toString();
167
+ try {
168
+ const response = await fetch(urlText);
169
+ if (!response.ok) {
170
+ throw new DownloadError({
171
+ url: urlText,
172
+ statusCode: response.status,
173
+ statusText: response.statusText
174
+ });
175
+ }
176
+ return {
177
+ data: new Uint8Array(await response.arrayBuffer()),
178
+ mediaType: (_a5 = response.headers.get("content-type")) != null ? _a5 : void 0
179
+ };
180
+ } catch (error) {
181
+ if (DownloadError.isInstance(error)) {
182
+ throw error;
183
+ }
184
+ throw new DownloadError({ url: urlText, cause: error });
185
+ }
186
+ };
187
+
188
+ // src/util/download/download-function.ts
189
+ var createDefaultDownloadFunction = (download2 = download) => (requestedDownloads) => Promise.all(
190
+ requestedDownloads.map(
191
+ async (requestedDownload) => requestedDownload.isUrlSupportedByModel ? null : download2(requestedDownload)
192
+ )
193
+ );
194
+
195
+ // src/prompt/data-content.ts
196
+ var import_provider2 = require("@ai-sdk/provider");
197
+ var import_provider_utils2 = require("@ai-sdk/provider-utils");
198
+ var import_v4 = require("zod/v4");
199
+
200
+ // src/prompt/split-data-url.ts
201
+ function splitDataUrl(dataUrl) {
202
+ try {
203
+ const [header, base64Content] = dataUrl.split(",");
204
+ return {
205
+ mediaType: header.split(";")[0].split(":")[1],
206
+ base64Content
207
+ };
208
+ } catch (error) {
209
+ return {
210
+ mediaType: void 0,
211
+ base64Content: void 0
212
+ };
213
+ }
214
+ }
215
+
216
+ // src/prompt/data-content.ts
217
+ var dataContentSchema = import_v4.z.union([
218
+ import_v4.z.string(),
219
+ import_v4.z.instanceof(Uint8Array),
220
+ import_v4.z.instanceof(ArrayBuffer),
221
+ import_v4.z.custom(
222
+ // Buffer might not be available in some environments such as CloudFlare:
223
+ (value) => {
224
+ var _a5, _b;
225
+ return (_b = (_a5 = globalThis.Buffer) == null ? void 0 : _a5.isBuffer(value)) != null ? _b : false;
226
+ },
227
+ { message: "Must be a Buffer" }
228
+ )
229
+ ]);
230
+ function convertToLanguageModelV2DataContent(content) {
231
+ if (content instanceof Uint8Array) {
232
+ return { data: content, mediaType: void 0 };
233
+ }
234
+ if (content instanceof ArrayBuffer) {
235
+ return { data: new Uint8Array(content), mediaType: void 0 };
236
+ }
237
+ if (typeof content === "string") {
238
+ try {
239
+ content = new URL(content);
240
+ } catch (error) {
241
+ }
242
+ }
243
+ if (content instanceof URL && content.protocol === "data:") {
244
+ const { mediaType: dataUrlMediaType, base64Content } = splitDataUrl(
245
+ content.toString()
246
+ );
247
+ if (dataUrlMediaType == null || base64Content == null) {
248
+ throw new import_provider2.AISDKError({
249
+ name: "InvalidDataContentError",
250
+ message: `Invalid data URL format in content ${content.toString()}`
251
+ });
252
+ }
253
+ return { data: base64Content, mediaType: dataUrlMediaType };
254
+ }
255
+ return { data: content, mediaType: void 0 };
256
+ }
257
+
258
+ // src/prompt/invalid-message-role-error.ts
259
+ var import_provider3 = require("@ai-sdk/provider");
260
+ var name2 = "AI_InvalidMessageRoleError";
261
+ var marker2 = `vercel.ai.error.${name2}`;
262
+ var symbol2 = Symbol.for(marker2);
263
+ var _a2;
264
+ var InvalidMessageRoleError = class extends import_provider3.AISDKError {
265
+ constructor({
266
+ role,
267
+ message = `Invalid message role: '${role}'. Must be one of: "system", "user", "assistant", "tool".`
268
+ }) {
269
+ super({ name: name2, message });
270
+ this[_a2] = true;
271
+ this.role = role;
272
+ }
273
+ static isInstance(error) {
274
+ return import_provider3.AISDKError.hasMarker(error, marker2);
275
+ }
276
+ };
277
+ _a2 = symbol2;
278
+
279
+ // src/prompt/convert-to-language-model-prompt.ts
280
+ async function convertToLanguageModelPrompt({
281
+ prompt,
282
+ supportedUrls,
283
+ download: download2 = createDefaultDownloadFunction()
284
+ }) {
285
+ const downloadedAssets = await downloadAssets(
286
+ prompt.messages,
287
+ download2,
288
+ supportedUrls
289
+ );
290
+ return [
291
+ ...prompt.system != null ? [{ role: "system", content: prompt.system }] : [],
292
+ ...prompt.messages.map(
293
+ (message) => convertToLanguageModelMessage({ message, downloadedAssets })
294
+ )
295
+ ];
296
+ }
297
+ function convertToLanguageModelMessage({
298
+ message,
299
+ downloadedAssets
300
+ }) {
301
+ const role = message.role;
302
+ switch (role) {
303
+ case "system": {
304
+ return {
305
+ role: "system",
306
+ content: message.content,
307
+ providerOptions: message.providerOptions
308
+ };
309
+ }
310
+ case "user": {
311
+ if (typeof message.content === "string") {
312
+ return {
313
+ role: "user",
314
+ content: [{ type: "text", text: message.content }],
315
+ providerOptions: message.providerOptions
316
+ };
317
+ }
318
+ return {
319
+ role: "user",
320
+ content: message.content.map((part) => convertPartToLanguageModelPart(part, downloadedAssets)).filter((part) => part.type !== "text" || part.text !== ""),
321
+ providerOptions: message.providerOptions
322
+ };
323
+ }
324
+ case "assistant": {
325
+ if (typeof message.content === "string") {
326
+ return {
327
+ role: "assistant",
328
+ content: [{ type: "text", text: message.content }],
329
+ providerOptions: message.providerOptions
330
+ };
331
+ }
332
+ return {
333
+ role: "assistant",
334
+ content: message.content.filter(
335
+ // remove empty text parts:
336
+ (part) => part.type !== "text" || part.text !== ""
337
+ ).map((part) => {
338
+ const providerOptions = part.providerOptions;
339
+ switch (part.type) {
340
+ case "file": {
341
+ const { data, mediaType } = convertToLanguageModelV2DataContent(
342
+ part.data
343
+ );
344
+ return {
345
+ type: "file",
346
+ data,
347
+ filename: part.filename,
348
+ mediaType: mediaType != null ? mediaType : part.mediaType,
349
+ providerOptions
350
+ };
351
+ }
352
+ case "reasoning": {
353
+ return {
354
+ type: "reasoning",
355
+ text: part.text,
356
+ providerOptions
357
+ };
358
+ }
359
+ case "text": {
360
+ return {
361
+ type: "text",
362
+ text: part.text,
363
+ providerOptions
364
+ };
365
+ }
366
+ case "tool-call": {
367
+ return {
368
+ type: "tool-call",
369
+ toolCallId: part.toolCallId,
370
+ toolName: part.toolName,
371
+ input: part.input,
372
+ providerExecuted: part.providerExecuted,
373
+ providerOptions
374
+ };
375
+ }
376
+ case "tool-result": {
377
+ return {
378
+ type: "tool-result",
379
+ toolCallId: part.toolCallId,
380
+ toolName: part.toolName,
381
+ output: part.output,
382
+ providerOptions
383
+ };
384
+ }
385
+ }
386
+ }),
387
+ providerOptions: message.providerOptions
388
+ };
389
+ }
390
+ case "tool": {
391
+ return {
392
+ role: "tool",
393
+ content: message.content.map((part) => ({
394
+ type: "tool-result",
395
+ toolCallId: part.toolCallId,
396
+ toolName: part.toolName,
397
+ output: part.output,
398
+ providerOptions: part.providerOptions
399
+ })),
400
+ providerOptions: message.providerOptions
401
+ };
402
+ }
403
+ default: {
404
+ const _exhaustiveCheck = role;
405
+ throw new InvalidMessageRoleError({ role: _exhaustiveCheck });
406
+ }
407
+ }
408
+ }
409
+ async function downloadAssets(messages, download2, supportedUrls) {
410
+ const plannedDownloads = messages.filter((message) => message.role === "user").map((message) => message.content).filter(
411
+ (content) => Array.isArray(content)
412
+ ).flat().filter(
413
+ (part) => part.type === "image" || part.type === "file"
414
+ ).map((part) => {
415
+ var _a5;
416
+ const mediaType = (_a5 = part.mediaType) != null ? _a5 : part.type === "image" ? "image/*" : void 0;
417
+ let data = part.type === "image" ? part.image : part.data;
418
+ if (typeof data === "string") {
419
+ try {
420
+ data = new URL(data);
421
+ } catch (ignored) {
422
+ }
423
+ }
424
+ return { mediaType, data };
425
+ }).filter(
426
+ (part) => part.data instanceof URL
427
+ ).map((part) => ({
428
+ url: part.data,
429
+ isUrlSupportedByModel: part.mediaType != null && (0, import_provider_utils3.isUrlSupported)({
430
+ url: part.data.toString(),
431
+ mediaType: part.mediaType,
432
+ supportedUrls
433
+ })
434
+ }));
435
+ const downloadedFiles = await download2(plannedDownloads);
436
+ return Object.fromEntries(
437
+ downloadedFiles.filter(
438
+ (downloadedFile) => (downloadedFile == null ? void 0 : downloadedFile.data) != null
439
+ ).map(({ data, mediaType }, index) => [
440
+ plannedDownloads[index].url.toString(),
441
+ { data, mediaType }
442
+ ])
443
+ );
444
+ }
445
+ function convertPartToLanguageModelPart(part, downloadedAssets) {
446
+ var _a5;
447
+ if (part.type === "text") {
448
+ return {
449
+ type: "text",
450
+ text: part.text,
451
+ providerOptions: part.providerOptions
452
+ };
453
+ }
454
+ let originalData;
455
+ const type = part.type;
456
+ switch (type) {
457
+ case "image":
458
+ originalData = part.image;
459
+ break;
460
+ case "file":
461
+ originalData = part.data;
462
+ break;
463
+ default:
464
+ throw new Error(`Unsupported part type: ${type}`);
465
+ }
466
+ const { data: convertedData, mediaType: convertedMediaType } = convertToLanguageModelV2DataContent(originalData);
467
+ let mediaType = convertedMediaType != null ? convertedMediaType : part.mediaType;
468
+ let data = convertedData;
469
+ if (data instanceof URL) {
470
+ const downloadedFile = downloadedAssets[data.toString()];
471
+ if (downloadedFile) {
472
+ data = downloadedFile.data;
473
+ mediaType != null ? mediaType : mediaType = downloadedFile.mediaType;
474
+ }
475
+ }
476
+ switch (type) {
477
+ case "image": {
478
+ if (data instanceof Uint8Array || typeof data === "string") {
479
+ mediaType = (_a5 = detectMediaType({ data, signatures: imageMediaTypeSignatures })) != null ? _a5 : mediaType;
480
+ }
481
+ return {
482
+ type: "file",
483
+ mediaType: mediaType != null ? mediaType : "image/*",
484
+ // any image
485
+ filename: void 0,
486
+ data,
487
+ providerOptions: part.providerOptions
488
+ };
489
+ }
490
+ case "file": {
491
+ if (mediaType == null) {
492
+ throw new Error(`Media type is missing for file part`);
493
+ }
494
+ return {
495
+ type: "file",
496
+ mediaType,
497
+ filename: part.filename,
498
+ data,
499
+ providerOptions: part.providerOptions
500
+ };
501
+ }
502
+ }
503
+ }
504
+
505
+ // src/prompt/prepare-tools-and-tool-choice.ts
506
+ var import_provider_utils4 = require("@ai-sdk/provider-utils");
507
+
508
+ // src/util/is-non-empty-object.ts
509
+ function isNonEmptyObject(object) {
510
+ return object != null && Object.keys(object).length > 0;
511
+ }
512
+
513
+ // src/prompt/prepare-tools-and-tool-choice.ts
514
+ function prepareToolsAndToolChoice({
515
+ tools,
516
+ toolChoice,
517
+ activeTools
518
+ }) {
519
+ if (!isNonEmptyObject(tools)) {
520
+ return {
521
+ tools: void 0,
522
+ toolChoice: void 0
523
+ };
524
+ }
525
+ const filteredTools = activeTools != null ? Object.entries(tools).filter(
526
+ ([name5]) => activeTools.includes(name5)
527
+ ) : Object.entries(tools);
528
+ return {
529
+ tools: filteredTools.map(([name5, tool]) => {
530
+ const toolType = tool.type;
531
+ switch (toolType) {
532
+ case void 0:
533
+ case "dynamic":
534
+ case "function":
535
+ return {
536
+ type: "function",
537
+ name: name5,
538
+ description: tool.description,
539
+ inputSchema: (0, import_provider_utils4.asSchema)(tool.inputSchema).jsonSchema,
540
+ providerOptions: tool.providerOptions
541
+ };
542
+ case "provider-defined":
543
+ return {
544
+ type: "provider-defined",
545
+ name: name5,
546
+ id: tool.id,
547
+ args: tool.args
548
+ };
549
+ default: {
550
+ const exhaustiveCheck = toolType;
551
+ throw new Error(`Unsupported tool type: ${exhaustiveCheck}`);
552
+ }
553
+ }
554
+ }),
555
+ toolChoice: toolChoice == null ? { type: "auto" } : typeof toolChoice === "string" ? { type: toolChoice } : { type: "tool", toolName: toolChoice.toolName }
556
+ };
557
+ }
558
+
559
+ // src/prompt/standardize-prompt.ts
560
+ var import_provider4 = require("@ai-sdk/provider");
561
+ var import_provider_utils5 = require("@ai-sdk/provider-utils");
562
+ var import_v46 = require("zod/v4");
563
+
564
+ // src/prompt/message.ts
565
+ var import_v45 = require("zod/v4");
566
+
567
+ // src/types/provider-metadata.ts
568
+ var import_v43 = require("zod/v4");
569
+
570
+ // src/types/json-value.ts
571
+ var import_v42 = require("zod/v4");
572
+ var jsonValueSchema = import_v42.z.lazy(
573
+ () => import_v42.z.union([
574
+ import_v42.z.null(),
575
+ import_v42.z.string(),
576
+ import_v42.z.number(),
577
+ import_v42.z.boolean(),
578
+ import_v42.z.record(import_v42.z.string(), jsonValueSchema),
579
+ import_v42.z.array(jsonValueSchema)
580
+ ])
581
+ );
582
+
583
+ // src/types/provider-metadata.ts
584
+ var providerMetadataSchema = import_v43.z.record(
585
+ import_v43.z.string(),
586
+ import_v43.z.record(import_v43.z.string(), jsonValueSchema)
587
+ );
588
+
589
+ // src/prompt/content-part.ts
590
+ var import_v44 = require("zod/v4");
591
+ var textPartSchema = import_v44.z.object({
592
+ type: import_v44.z.literal("text"),
593
+ text: import_v44.z.string(),
594
+ providerOptions: providerMetadataSchema.optional()
595
+ });
596
+ var imagePartSchema = import_v44.z.object({
597
+ type: import_v44.z.literal("image"),
598
+ image: import_v44.z.union([dataContentSchema, import_v44.z.instanceof(URL)]),
599
+ mediaType: import_v44.z.string().optional(),
600
+ providerOptions: providerMetadataSchema.optional()
601
+ });
602
+ var filePartSchema = import_v44.z.object({
603
+ type: import_v44.z.literal("file"),
604
+ data: import_v44.z.union([dataContentSchema, import_v44.z.instanceof(URL)]),
605
+ filename: import_v44.z.string().optional(),
606
+ mediaType: import_v44.z.string(),
607
+ providerOptions: providerMetadataSchema.optional()
608
+ });
609
+ var reasoningPartSchema = import_v44.z.object({
610
+ type: import_v44.z.literal("reasoning"),
611
+ text: import_v44.z.string(),
612
+ providerOptions: providerMetadataSchema.optional()
613
+ });
614
+ var toolCallPartSchema = import_v44.z.object({
615
+ type: import_v44.z.literal("tool-call"),
616
+ toolCallId: import_v44.z.string(),
617
+ toolName: import_v44.z.string(),
618
+ input: import_v44.z.unknown(),
619
+ providerOptions: providerMetadataSchema.optional(),
620
+ providerExecuted: import_v44.z.boolean().optional()
621
+ });
622
+ var outputSchema = import_v44.z.discriminatedUnion("type", [
623
+ import_v44.z.object({
624
+ type: import_v44.z.literal("text"),
625
+ value: import_v44.z.string()
626
+ }),
627
+ import_v44.z.object({
628
+ type: import_v44.z.literal("json"),
629
+ value: jsonValueSchema
630
+ }),
631
+ import_v44.z.object({
632
+ type: import_v44.z.literal("error-text"),
633
+ value: import_v44.z.string()
634
+ }),
635
+ import_v44.z.object({
636
+ type: import_v44.z.literal("error-json"),
637
+ value: jsonValueSchema
638
+ }),
639
+ import_v44.z.object({
640
+ type: import_v44.z.literal("content"),
641
+ value: import_v44.z.array(
642
+ import_v44.z.union([
643
+ import_v44.z.object({
644
+ type: import_v44.z.literal("text"),
645
+ text: import_v44.z.string()
646
+ }),
647
+ import_v44.z.object({
648
+ type: import_v44.z.literal("media"),
649
+ data: import_v44.z.string(),
650
+ mediaType: import_v44.z.string()
651
+ })
652
+ ])
653
+ )
654
+ })
655
+ ]);
656
+ var toolResultPartSchema = import_v44.z.object({
657
+ type: import_v44.z.literal("tool-result"),
658
+ toolCallId: import_v44.z.string(),
659
+ toolName: import_v44.z.string(),
660
+ output: outputSchema,
661
+ providerOptions: providerMetadataSchema.optional()
662
+ });
663
+
664
+ // src/prompt/message.ts
665
+ var systemModelMessageSchema = import_v45.z.object(
666
+ {
667
+ role: import_v45.z.literal("system"),
668
+ content: import_v45.z.string(),
669
+ providerOptions: providerMetadataSchema.optional()
670
+ }
671
+ );
672
+ var userModelMessageSchema = import_v45.z.object({
673
+ role: import_v45.z.literal("user"),
674
+ content: import_v45.z.union([
675
+ import_v45.z.string(),
676
+ import_v45.z.array(import_v45.z.union([textPartSchema, imagePartSchema, filePartSchema]))
677
+ ]),
678
+ providerOptions: providerMetadataSchema.optional()
679
+ });
680
+ var assistantModelMessageSchema = import_v45.z.object({
681
+ role: import_v45.z.literal("assistant"),
682
+ content: import_v45.z.union([
683
+ import_v45.z.string(),
684
+ import_v45.z.array(
685
+ import_v45.z.union([
686
+ textPartSchema,
687
+ filePartSchema,
688
+ reasoningPartSchema,
689
+ toolCallPartSchema,
690
+ toolResultPartSchema
691
+ ])
692
+ )
693
+ ]),
694
+ providerOptions: providerMetadataSchema.optional()
695
+ });
696
+ var toolModelMessageSchema = import_v45.z.object({
697
+ role: import_v45.z.literal("tool"),
698
+ content: import_v45.z.array(toolResultPartSchema),
699
+ providerOptions: providerMetadataSchema.optional()
700
+ });
701
+ var modelMessageSchema = import_v45.z.union([
702
+ systemModelMessageSchema,
703
+ userModelMessageSchema,
704
+ assistantModelMessageSchema,
705
+ toolModelMessageSchema
706
+ ]);
707
+
708
+ // src/prompt/standardize-prompt.ts
709
+ async function standardizePrompt(prompt) {
710
+ if (prompt.prompt == null && prompt.messages == null) {
711
+ throw new import_provider4.InvalidPromptError({
712
+ prompt,
713
+ message: "prompt or messages must be defined"
714
+ });
715
+ }
716
+ if (prompt.prompt != null && prompt.messages != null) {
717
+ throw new import_provider4.InvalidPromptError({
718
+ prompt,
719
+ message: "prompt and messages cannot be defined at the same time"
720
+ });
721
+ }
722
+ if (prompt.system != null && typeof prompt.system !== "string") {
723
+ throw new import_provider4.InvalidPromptError({
724
+ prompt,
725
+ message: "system must be a string"
726
+ });
727
+ }
728
+ let messages;
729
+ if (prompt.prompt != null && typeof prompt.prompt === "string") {
730
+ messages = [{ role: "user", content: prompt.prompt }];
731
+ } else if (prompt.prompt != null && Array.isArray(prompt.prompt)) {
732
+ messages = prompt.prompt;
733
+ } else if (prompt.messages != null) {
734
+ messages = prompt.messages;
735
+ } else {
736
+ throw new import_provider4.InvalidPromptError({
737
+ prompt,
738
+ message: "prompt or messages must be defined"
739
+ });
740
+ }
741
+ if (messages.length === 0) {
742
+ throw new import_provider4.InvalidPromptError({
743
+ prompt,
744
+ message: "messages must not be empty"
745
+ });
746
+ }
747
+ const validationResult = await (0, import_provider_utils5.safeValidateTypes)({
748
+ value: messages,
749
+ schema: import_v46.z.array(modelMessageSchema)
750
+ });
751
+ if (!validationResult.success) {
752
+ throw new import_provider4.InvalidPromptError({
753
+ prompt,
754
+ message: "The messages must be a ModelMessage[]. If you have passed a UIMessage[], you can use convertToModelMessages to convert them.",
755
+ cause: validationResult.error
756
+ });
757
+ }
758
+ return {
759
+ messages,
760
+ system: prompt.system
761
+ };
762
+ }
763
+
764
+ // src/error/invalid-argument-error.ts
765
+ var import_provider5 = require("@ai-sdk/provider");
766
+ var name3 = "AI_InvalidArgumentError";
767
+ var marker3 = `vercel.ai.error.${name3}`;
768
+ var symbol3 = Symbol.for(marker3);
769
+ var _a3;
770
+ var InvalidArgumentError = class extends import_provider5.AISDKError {
771
+ constructor({
772
+ parameter,
773
+ value,
774
+ message
775
+ }) {
776
+ super({
777
+ name: name3,
778
+ message: `Invalid argument for parameter ${parameter}: ${message}`
779
+ });
780
+ this[_a3] = true;
781
+ this.parameter = parameter;
782
+ this.value = value;
783
+ }
784
+ static isInstance(error) {
785
+ return import_provider5.AISDKError.hasMarker(error, marker3);
786
+ }
787
+ };
788
+ _a3 = symbol3;
789
+
790
+ // src/prompt/prepare-call-settings.ts
791
+ function prepareCallSettings({
792
+ maxOutputTokens,
793
+ temperature,
794
+ topP,
795
+ topK,
796
+ presencePenalty,
797
+ frequencyPenalty,
798
+ seed,
799
+ stopSequences
800
+ }) {
801
+ if (maxOutputTokens != null) {
802
+ if (!Number.isInteger(maxOutputTokens)) {
803
+ throw new InvalidArgumentError({
804
+ parameter: "maxOutputTokens",
805
+ value: maxOutputTokens,
806
+ message: "maxOutputTokens must be an integer"
807
+ });
808
+ }
809
+ if (maxOutputTokens < 1) {
810
+ throw new InvalidArgumentError({
811
+ parameter: "maxOutputTokens",
812
+ value: maxOutputTokens,
813
+ message: "maxOutputTokens must be >= 1"
814
+ });
815
+ }
816
+ }
817
+ if (temperature != null) {
818
+ if (typeof temperature !== "number") {
819
+ throw new InvalidArgumentError({
820
+ parameter: "temperature",
821
+ value: temperature,
822
+ message: "temperature must be a number"
823
+ });
824
+ }
825
+ }
826
+ if (topP != null) {
827
+ if (typeof topP !== "number") {
828
+ throw new InvalidArgumentError({
829
+ parameter: "topP",
830
+ value: topP,
831
+ message: "topP must be a number"
832
+ });
833
+ }
834
+ }
835
+ if (topK != null) {
836
+ if (typeof topK !== "number") {
837
+ throw new InvalidArgumentError({
838
+ parameter: "topK",
839
+ value: topK,
840
+ message: "topK must be a number"
841
+ });
842
+ }
843
+ }
844
+ if (presencePenalty != null) {
845
+ if (typeof presencePenalty !== "number") {
846
+ throw new InvalidArgumentError({
847
+ parameter: "presencePenalty",
848
+ value: presencePenalty,
849
+ message: "presencePenalty must be a number"
850
+ });
851
+ }
852
+ }
853
+ if (frequencyPenalty != null) {
854
+ if (typeof frequencyPenalty !== "number") {
855
+ throw new InvalidArgumentError({
856
+ parameter: "frequencyPenalty",
857
+ value: frequencyPenalty,
858
+ message: "frequencyPenalty must be a number"
859
+ });
860
+ }
861
+ }
862
+ if (seed != null) {
863
+ if (!Number.isInteger(seed)) {
864
+ throw new InvalidArgumentError({
865
+ parameter: "seed",
866
+ value: seed,
867
+ message: "seed must be an integer"
868
+ });
869
+ }
870
+ }
871
+ return {
872
+ maxOutputTokens,
873
+ temperature,
874
+ topP,
875
+ topK,
876
+ presencePenalty,
877
+ frequencyPenalty,
878
+ stopSequences,
879
+ seed
880
+ };
881
+ }
882
+
883
+ // src/util/retry-with-exponential-backoff.ts
884
+ var import_provider7 = require("@ai-sdk/provider");
885
+ var import_provider_utils6 = require("@ai-sdk/provider-utils");
886
+
887
+ // src/util/retry-error.ts
888
+ var import_provider6 = require("@ai-sdk/provider");
889
+ var name4 = "AI_RetryError";
890
+ var marker4 = `vercel.ai.error.${name4}`;
891
+ var symbol4 = Symbol.for(marker4);
892
+ var _a4;
893
+ var RetryError = class extends import_provider6.AISDKError {
894
+ constructor({
895
+ message,
896
+ reason,
897
+ errors
898
+ }) {
899
+ super({ name: name4, message });
900
+ this[_a4] = true;
901
+ this.reason = reason;
902
+ this.errors = errors;
903
+ this.lastError = errors[errors.length - 1];
904
+ }
905
+ static isInstance(error) {
906
+ return import_provider6.AISDKError.hasMarker(error, marker4);
907
+ }
908
+ };
909
+ _a4 = symbol4;
910
+
911
+ // src/util/retry-with-exponential-backoff.ts
912
+ function getRetryDelayInMs({
913
+ error,
914
+ exponentialBackoffDelay
915
+ }) {
916
+ const headers = error.responseHeaders;
917
+ if (!headers)
918
+ return exponentialBackoffDelay;
919
+ let ms;
920
+ const retryAfterMs = headers["retry-after-ms"];
921
+ if (retryAfterMs) {
922
+ const timeoutMs = parseFloat(retryAfterMs);
923
+ if (!Number.isNaN(timeoutMs)) {
924
+ ms = timeoutMs;
925
+ }
926
+ }
927
+ const retryAfter = headers["retry-after"];
928
+ if (retryAfter && ms === void 0) {
929
+ const timeoutSeconds = parseFloat(retryAfter);
930
+ if (!Number.isNaN(timeoutSeconds)) {
931
+ ms = timeoutSeconds * 1e3;
932
+ } else {
933
+ ms = Date.parse(retryAfter) - Date.now();
934
+ }
935
+ }
936
+ if (ms != null && !Number.isNaN(ms) && 0 <= ms && (ms < 60 * 1e3 || ms < exponentialBackoffDelay)) {
937
+ return ms;
938
+ }
939
+ return exponentialBackoffDelay;
940
+ }
941
+ var retryWithExponentialBackoffRespectingRetryHeaders = ({
942
+ maxRetries = 2,
943
+ initialDelayInMs = 2e3,
944
+ backoffFactor = 2,
945
+ abortSignal
946
+ } = {}) => async (f) => _retryWithExponentialBackoff(f, {
947
+ maxRetries,
948
+ delayInMs: initialDelayInMs,
949
+ backoffFactor,
950
+ abortSignal
951
+ });
952
+ async function _retryWithExponentialBackoff(f, {
953
+ maxRetries,
954
+ delayInMs,
955
+ backoffFactor,
956
+ abortSignal
957
+ }, errors = []) {
958
+ try {
959
+ return await f();
960
+ } catch (error) {
961
+ if ((0, import_provider_utils6.isAbortError)(error)) {
962
+ throw error;
963
+ }
964
+ if (maxRetries === 0) {
965
+ throw error;
966
+ }
967
+ const errorMessage = (0, import_provider_utils6.getErrorMessage)(error);
968
+ const newErrors = [...errors, error];
969
+ const tryNumber = newErrors.length;
970
+ if (tryNumber > maxRetries) {
971
+ throw new RetryError({
972
+ message: `Failed after ${tryNumber} attempts. Last error: ${errorMessage}`,
973
+ reason: "maxRetriesExceeded",
974
+ errors: newErrors
975
+ });
976
+ }
977
+ if (error instanceof Error && import_provider7.APICallError.isInstance(error) && error.isRetryable === true && tryNumber <= maxRetries) {
978
+ await (0, import_provider_utils6.delay)(
979
+ getRetryDelayInMs({
980
+ error,
981
+ exponentialBackoffDelay: delayInMs
982
+ }),
983
+ { abortSignal }
984
+ );
985
+ return _retryWithExponentialBackoff(
986
+ f,
987
+ {
988
+ maxRetries,
989
+ delayInMs: backoffFactor * delayInMs,
990
+ backoffFactor,
991
+ abortSignal
992
+ },
993
+ newErrors
994
+ );
995
+ }
996
+ if (tryNumber === 1) {
997
+ throw error;
998
+ }
999
+ throw new RetryError({
1000
+ message: `Failed after ${tryNumber} attempts with non-retryable error: '${errorMessage}'`,
1001
+ reason: "errorNotRetryable",
1002
+ errors: newErrors
1003
+ });
1004
+ }
1005
+ }
1006
+
1007
+ // src/util/prepare-retries.ts
1008
+ function prepareRetries({
1009
+ maxRetries,
1010
+ abortSignal
1011
+ }) {
1012
+ if (maxRetries != null) {
1013
+ if (!Number.isInteger(maxRetries)) {
1014
+ throw new InvalidArgumentError({
1015
+ parameter: "maxRetries",
1016
+ value: maxRetries,
1017
+ message: "maxRetries must be an integer"
1018
+ });
1019
+ }
1020
+ if (maxRetries < 0) {
1021
+ throw new InvalidArgumentError({
1022
+ parameter: "maxRetries",
1023
+ value: maxRetries,
1024
+ message: "maxRetries must be >= 0"
1025
+ });
1026
+ }
1027
+ }
1028
+ const maxRetriesResult = maxRetries != null ? maxRetries : 2;
1029
+ return {
1030
+ maxRetries: maxRetriesResult,
1031
+ retry: retryWithExponentialBackoffRespectingRetryHeaders({
1032
+ maxRetries: maxRetriesResult,
1033
+ abortSignal
1034
+ })
1035
+ };
1036
+ }
1037
+ // Annotate the CommonJS export names for ESM import in node:
1038
+ 0 && (module.exports = {
1039
+ convertAsyncIteratorToReadableStream,
1040
+ convertToLanguageModelPrompt,
1041
+ prepareCallSettings,
1042
+ prepareRetries,
1043
+ prepareToolsAndToolChoice,
1044
+ standardizePrompt
1045
+ });
1046
+ //# sourceMappingURL=index.js.map