ai 4.1.62 → 4.1.64

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -802,12 +802,6 @@ var DefaultEmbedManyResult = class {
802
802
  }
803
803
  };
804
804
 
805
- // core/generate-image/generate-image.ts
806
- import {
807
- convertBase64ToUint8Array,
808
- convertUint8ArrayToBase64
809
- } from "@ai-sdk/provider-utils";
810
-
811
805
  // errors/no-image-generated-error.ts
812
806
  import { AISDKError as AISDKError3 } from "@ai-sdk/provider";
813
807
  var name3 = "AI_NoImageGeneratedError";
@@ -830,6 +824,126 @@ var NoImageGeneratedError = class extends AISDKError3 {
830
824
  };
831
825
  _a3 = symbol3;
832
826
 
827
+ // core/generate-text/generated-file.ts
828
+ import {
829
+ convertBase64ToUint8Array,
830
+ convertUint8ArrayToBase64
831
+ } from "@ai-sdk/provider-utils";
832
+ var DefaultGeneratedFile = class {
833
+ constructor({
834
+ data,
835
+ mimeType
836
+ }) {
837
+ const isUint8Array = data instanceof Uint8Array;
838
+ this.base64Data = isUint8Array ? void 0 : data;
839
+ this.uint8ArrayData = isUint8Array ? data : void 0;
840
+ this.mimeType = mimeType;
841
+ }
842
+ // lazy conversion with caching to avoid unnecessary conversion overhead:
843
+ get base64() {
844
+ if (this.base64Data == null) {
845
+ this.base64Data = convertUint8ArrayToBase64(this.uint8ArrayData);
846
+ }
847
+ return this.base64Data;
848
+ }
849
+ // lazy conversion with caching to avoid unnecessary conversion overhead:
850
+ get uint8Array() {
851
+ if (this.uint8ArrayData == null) {
852
+ this.uint8ArrayData = convertBase64ToUint8Array(this.base64Data);
853
+ }
854
+ return this.uint8ArrayData;
855
+ }
856
+ };
857
+ var DefaultGeneratedFileWithType = class extends DefaultGeneratedFile {
858
+ constructor(options) {
859
+ super(options);
860
+ this.type = "file";
861
+ }
862
+ };
863
+
864
+ // core/util/detect-image-mimetype.ts
865
+ var mimeTypeSignatures = [
866
+ {
867
+ mimeType: "image/gif",
868
+ bytesPrefix: [71, 73, 70],
869
+ base64Prefix: "R0lG"
870
+ },
871
+ {
872
+ mimeType: "image/png",
873
+ bytesPrefix: [137, 80, 78, 71],
874
+ base64Prefix: "iVBORw"
875
+ },
876
+ {
877
+ mimeType: "image/jpeg",
878
+ bytesPrefix: [255, 216],
879
+ base64Prefix: "/9j/"
880
+ },
881
+ {
882
+ mimeType: "image/webp",
883
+ bytesPrefix: [82, 73, 70, 70],
884
+ base64Prefix: "UklGRg"
885
+ },
886
+ {
887
+ mimeType: "image/bmp",
888
+ bytesPrefix: [66, 77],
889
+ base64Prefix: "Qk"
890
+ },
891
+ {
892
+ mimeType: "image/tiff",
893
+ bytesPrefix: [73, 73, 42, 0],
894
+ base64Prefix: "SUkqAA"
895
+ },
896
+ {
897
+ mimeType: "image/tiff",
898
+ bytesPrefix: [77, 77, 0, 42],
899
+ base64Prefix: "TU0AKg"
900
+ },
901
+ {
902
+ mimeType: "image/avif",
903
+ bytesPrefix: [
904
+ 0,
905
+ 0,
906
+ 0,
907
+ 32,
908
+ 102,
909
+ 116,
910
+ 121,
911
+ 112,
912
+ 97,
913
+ 118,
914
+ 105,
915
+ 102
916
+ ],
917
+ base64Prefix: "AAAAIGZ0eXBhdmlm"
918
+ },
919
+ {
920
+ mimeType: "image/heic",
921
+ bytesPrefix: [
922
+ 0,
923
+ 0,
924
+ 0,
925
+ 32,
926
+ 102,
927
+ 116,
928
+ 121,
929
+ 112,
930
+ 104,
931
+ 101,
932
+ 105,
933
+ 99
934
+ ],
935
+ base64Prefix: "AAAAIGZ0eXBoZWlj"
936
+ }
937
+ ];
938
+ function detectImageMimeType(image) {
939
+ for (const signature of mimeTypeSignatures) {
940
+ if (typeof image === "string" ? image.startsWith(signature.base64Prefix) : image.length >= signature.bytesPrefix.length && signature.bytesPrefix.every((byte, index) => image[index] === byte)) {
941
+ return signature.mimeType;
942
+ }
943
+ }
944
+ return void 0;
945
+ }
946
+
833
947
  // core/generate-image/generate-image.ts
834
948
  async function generateImage({
835
949
  model,
@@ -841,10 +955,7 @@ async function generateImage({
841
955
  providerOptions,
842
956
  maxRetries: maxRetriesArg,
843
957
  abortSignal,
844
- headers,
845
- _internal = {
846
- currentDate: () => /* @__PURE__ */ new Date()
847
- }
958
+ headers
848
959
  }) {
849
960
  var _a17;
850
961
  const { retry } = prepareRetries({ maxRetries: maxRetriesArg });
@@ -878,7 +989,15 @@ async function generateImage({
878
989
  const responses = [];
879
990
  for (const result of results) {
880
991
  images.push(
881
- ...result.images.map((image) => new DefaultGeneratedImage({ image }))
992
+ ...result.images.map(
993
+ (image) => {
994
+ var _a18;
995
+ return new DefaultGeneratedFile({
996
+ data: image,
997
+ mimeType: (_a18 = detectImageMimeType(image)) != null ? _a18 : "image/png"
998
+ });
999
+ }
1000
+ )
882
1001
  );
883
1002
  warnings.push(...result.warnings);
884
1003
  responses.push(result.response);
@@ -898,27 +1017,6 @@ var DefaultGenerateImageResult = class {
898
1017
  return this.images[0];
899
1018
  }
900
1019
  };
901
- var DefaultGeneratedImage = class {
902
- constructor({ image }) {
903
- const isUint8Array = image instanceof Uint8Array;
904
- this.base64Data = isUint8Array ? void 0 : image;
905
- this.uint8ArrayData = isUint8Array ? image : void 0;
906
- }
907
- // lazy conversion with caching to avoid unnecessary conversion overhead:
908
- get base64() {
909
- if (this.base64Data == null) {
910
- this.base64Data = convertUint8ArrayToBase64(this.uint8ArrayData);
911
- }
912
- return this.base64Data;
913
- }
914
- // lazy conversion with caching to avoid unnecessary conversion overhead:
915
- get uint8Array() {
916
- if (this.uint8ArrayData == null) {
917
- this.uint8ArrayData = convertBase64ToUint8Array(this.base64Data);
918
- }
919
- return this.uint8ArrayData;
920
- }
921
- };
922
1020
 
923
1021
  // core/generate-object/generate-object.ts
924
1022
  import {
@@ -1007,22 +1105,6 @@ async function download({
1007
1105
  }
1008
1106
  }
1009
1107
 
1010
- // core/util/detect-image-mimetype.ts
1011
- var mimeTypeSignatures = [
1012
- { mimeType: "image/gif", bytes: [71, 73, 70] },
1013
- { mimeType: "image/png", bytes: [137, 80, 78, 71] },
1014
- { mimeType: "image/jpeg", bytes: [255, 216] },
1015
- { mimeType: "image/webp", bytes: [82, 73, 70, 70] }
1016
- ];
1017
- function detectImageMimeType(image) {
1018
- for (const { bytes, mimeType } of mimeTypeSignatures) {
1019
- if (image.length >= bytes.length && bytes.every((byte, index) => image[index] === byte)) {
1020
- return mimeType;
1021
- }
1022
- }
1023
- return void 0;
1024
- }
1025
-
1026
1108
  // core/prompt/data-content.ts
1027
1109
  import {
1028
1110
  convertBase64ToUint8Array as convertBase64ToUint8Array2,
@@ -1199,11 +1281,50 @@ function convertToLanguageModelMessage(message, downloadedAssets) {
1199
1281
  // remove empty text parts:
1200
1282
  (part) => part.type !== "text" || part.text !== ""
1201
1283
  ).map((part) => {
1202
- const { experimental_providerMetadata, providerOptions, ...rest } = part;
1203
- return {
1204
- ...rest,
1205
- providerMetadata: providerOptions != null ? providerOptions : experimental_providerMetadata
1206
- };
1284
+ var _a18;
1285
+ const providerOptions = (_a18 = part.providerOptions) != null ? _a18 : part.experimental_providerMetadata;
1286
+ switch (part.type) {
1287
+ case "file": {
1288
+ return {
1289
+ type: "file",
1290
+ data: part.data instanceof URL ? part.data : convertDataContentToBase64String(part.data),
1291
+ filename: part.filename,
1292
+ mimeType: part.mimeType,
1293
+ providerMetadata: providerOptions
1294
+ };
1295
+ }
1296
+ case "reasoning": {
1297
+ return {
1298
+ type: "reasoning",
1299
+ text: part.text,
1300
+ signature: part.signature,
1301
+ providerMetadata: providerOptions
1302
+ };
1303
+ }
1304
+ case "redacted-reasoning": {
1305
+ return {
1306
+ type: "redacted-reasoning",
1307
+ data: part.data,
1308
+ providerMetadata: providerOptions
1309
+ };
1310
+ }
1311
+ case "text": {
1312
+ return {
1313
+ type: "text",
1314
+ text: part.text,
1315
+ providerMetadata: providerOptions
1316
+ };
1317
+ }
1318
+ case "tool-call": {
1319
+ return {
1320
+ type: "tool-call",
1321
+ toolCallId: part.toolCallId,
1322
+ toolName: part.toolName,
1323
+ args: part.args,
1324
+ providerMetadata: providerOptions
1325
+ };
1326
+ }
1327
+ }
1207
1328
  }),
1208
1329
  providerMetadata: (_e = message.providerOptions) != null ? _e : message.experimental_providerMetadata
1209
1330
  };
@@ -1563,12 +1684,11 @@ function convertToCoreMessages(messages, options) {
1563
1684
  const content2 = [];
1564
1685
  for (const part of block) {
1565
1686
  switch (part.type) {
1566
- case "text":
1567
- content2.push({
1568
- type: "text",
1569
- text: part.text
1570
- });
1687
+ case "file":
1688
+ case "text": {
1689
+ content2.push(part);
1571
1690
  break;
1691
+ }
1572
1692
  case "reasoning": {
1573
1693
  for (const detail of part.details) {
1574
1694
  switch (detail.type) {
@@ -1649,9 +1769,6 @@ function convertToCoreMessages(messages, options) {
1649
1769
  let block = [];
1650
1770
  for (const part of message.parts) {
1651
1771
  switch (part.type) {
1652
- case "reasoning":
1653
- block.push(part);
1654
- break;
1655
1772
  case "text": {
1656
1773
  if (blockHasToolInvocations) {
1657
1774
  processBlock2();
@@ -1659,6 +1776,11 @@ function convertToCoreMessages(messages, options) {
1659
1776
  block.push(part);
1660
1777
  break;
1661
1778
  }
1779
+ case "file":
1780
+ case "reasoning": {
1781
+ block.push(part);
1782
+ break;
1783
+ }
1662
1784
  case "tool-invocation": {
1663
1785
  if (((_b = part.toolInvocation.step) != null ? _b : 0) !== currentStep) {
1664
1786
  processBlock2();
@@ -1774,6 +1896,7 @@ function detectSingleMessageCharacteristics(message) {
1774
1896
  if (typeof message === "object" && message !== null && (message.role === "function" || // UI-only role
1775
1897
  message.role === "data" || // UI-only role
1776
1898
  "toolInvocations" in message || // UI-specific field
1899
+ "parts" in message || // UI-specific field
1777
1900
  "experimental_attachments" in message)) {
1778
1901
  return "has-ui-specific-parts";
1779
1902
  } else if (typeof message === "object" && message !== null && "content" in message && (Array.isArray(message.content) || // Core messages can have array content
@@ -1903,6 +2026,7 @@ var coreAssistantMessageSchema = z6.object({
1903
2026
  z6.array(
1904
2027
  z6.union([
1905
2028
  textPartSchema,
2029
+ filePartSchema,
1906
2030
  reasoningPartSchema,
1907
2031
  redactedReasoningPartSchema,
1908
2032
  toolCallPartSchema
@@ -3812,6 +3936,7 @@ function asReasoningText(reasoning) {
3812
3936
  // core/generate-text/to-response-messages.ts
3813
3937
  function toResponseMessages({
3814
3938
  text: text2 = "",
3939
+ files,
3815
3940
  reasoning,
3816
3941
  tools,
3817
3942
  toolCalls,
@@ -3826,6 +3951,12 @@ function toResponseMessages({
3826
3951
  ...reasoning.map(
3827
3952
  (part) => part.type === "text" ? { ...part, type: "reasoning" } : { ...part, type: "redacted-reasoning" }
3828
3953
  ),
3954
+ // TODO language model v2: switch to order response content (instead of type-based ordering)
3955
+ ...files.map((file) => ({
3956
+ type: "file",
3957
+ data: file.base64,
3958
+ mimeType: file.mimeType
3959
+ })),
3829
3960
  { type: "text", text: text2 },
3830
3961
  ...toolCalls
3831
3962
  ],
@@ -4115,6 +4246,7 @@ async function generateText({
4115
4246
  responseMessages.push(
4116
4247
  ...toResponseMessages({
4117
4248
  text: text2,
4249
+ files: asFiles(currentModelResponse.files),
4118
4250
  reasoning: asReasoningDetails(currentModelResponse.reasoning),
4119
4251
  tools: tools != null ? tools : {},
4120
4252
  toolCalls: currentToolCalls,
@@ -4130,6 +4262,7 @@ async function generateText({
4130
4262
  // TODO v5: rename reasoning to reasoningText (and use reasoning for composite array)
4131
4263
  reasoning: asReasoningText(currentReasoningDetails),
4132
4264
  reasoningDetails: currentReasoningDetails,
4265
+ files: asFiles(currentModelResponse.files),
4133
4266
  sources: (_e = currentModelResponse.sources) != null ? _e : [],
4134
4267
  toolCalls: currentToolCalls,
4135
4268
  toolResults: currentToolResults,
@@ -4171,6 +4304,7 @@ async function generateText({
4171
4304
  );
4172
4305
  return new DefaultGenerateTextResult({
4173
4306
  text: text2,
4307
+ files: asFiles(currentModelResponse.files),
4174
4308
  reasoning: asReasoningText(currentReasoningDetails),
4175
4309
  reasoningDetails: currentReasoningDetails,
4176
4310
  sources,
@@ -4280,6 +4414,7 @@ async function executeTools({
4280
4414
  var DefaultGenerateTextResult = class {
4281
4415
  constructor(options) {
4282
4416
  this.text = options.text;
4417
+ this.files = options.files;
4283
4418
  this.reasoning = options.reasoning;
4284
4419
  this.reasoningDetails = options.reasoningDetails;
4285
4420
  this.toolCalls = options.toolCalls;
@@ -4309,6 +4444,10 @@ function asReasoningDetails(reasoning) {
4309
4444
  }
4310
4445
  return reasoning;
4311
4446
  }
4447
+ function asFiles(files) {
4448
+ var _a17;
4449
+ return (_a17 = files == null ? void 0 : files.map((file) => new DefaultGeneratedFile(file))) != null ? _a17 : [];
4450
+ }
4312
4451
 
4313
4452
  // core/generate-text/output.ts
4314
4453
  var output_exports = {};
@@ -4647,6 +4786,15 @@ function runToolsTransformation({
4647
4786
  controller.enqueue(chunk);
4648
4787
  break;
4649
4788
  }
4789
+ case "file": {
4790
+ controller.enqueue(
4791
+ new DefaultGeneratedFileWithType({
4792
+ data: chunk.data,
4793
+ mimeType: chunk.mimeType
4794
+ })
4795
+ );
4796
+ break;
4797
+ }
4650
4798
  case "tool-call-delta": {
4651
4799
  if (toolCallStreaming) {
4652
4800
  if (!activeToolCalls[chunk.toolCallId]) {
@@ -4954,6 +5102,7 @@ var DefaultStreamTextResult = class {
4954
5102
  this.reasoningPromise = new DelayedPromise();
4955
5103
  this.reasoningDetailsPromise = new DelayedPromise();
4956
5104
  this.sourcesPromise = new DelayedPromise();
5105
+ this.filesPromise = new DelayedPromise();
4957
5106
  this.toolCallsPromise = new DelayedPromise();
4958
5107
  this.toolResultsPromise = new DelayedPromise();
4959
5108
  this.requestPromise = new DelayedPromise();
@@ -4972,6 +5121,7 @@ var DefaultStreamTextResult = class {
4972
5121
  let recordedContinuationText = "";
4973
5122
  let recordedFullText = "";
4974
5123
  let stepReasoning = [];
5124
+ let stepFiles = [];
4975
5125
  let activeReasoningText = void 0;
4976
5126
  let recordedStepSources = [];
4977
5127
  const recordedSources = [];
@@ -5024,6 +5174,9 @@ var DefaultStreamTextResult = class {
5024
5174
  if (part.type === "redacted-reasoning") {
5025
5175
  stepReasoning.push({ type: "redacted", data: part.data });
5026
5176
  }
5177
+ if (part.type === "file") {
5178
+ stepFiles.push(part);
5179
+ }
5027
5180
  if (part.type === "source") {
5028
5181
  recordedSources.push(part.source);
5029
5182
  recordedStepSources.push(part.source);
@@ -5037,6 +5190,7 @@ var DefaultStreamTextResult = class {
5037
5190
  if (part.type === "step-finish") {
5038
5191
  const stepMessages = toResponseMessages({
5039
5192
  text: recordedContinuationText,
5193
+ files: stepFiles,
5040
5194
  reasoning: stepReasoning,
5041
5195
  tools: tools != null ? tools : {},
5042
5196
  toolCalls: recordedToolCalls,
@@ -5063,6 +5217,7 @@ var DefaultStreamTextResult = class {
5063
5217
  text: recordedStepText,
5064
5218
  reasoning: asReasoningText(stepReasoning),
5065
5219
  reasoningDetails: stepReasoning,
5220
+ files: stepFiles,
5066
5221
  sources: recordedStepSources,
5067
5222
  toolCalls: recordedToolCalls,
5068
5223
  toolResults: recordedToolResults,
@@ -5086,6 +5241,7 @@ var DefaultStreamTextResult = class {
5086
5241
  recordedStepText = "";
5087
5242
  recordedStepSources = [];
5088
5243
  stepReasoning = [];
5244
+ stepFiles = [];
5089
5245
  activeReasoningText = void 0;
5090
5246
  if (nextStepType !== "done") {
5091
5247
  stepType = nextStepType;
@@ -5131,6 +5287,7 @@ var DefaultStreamTextResult = class {
5131
5287
  self.usagePromise.resolve(usage);
5132
5288
  self.textPromise.resolve(recordedFullText);
5133
5289
  self.sourcesPromise.resolve(recordedSources);
5290
+ self.filesPromise.resolve(lastStep.files);
5134
5291
  self.stepsPromise.resolve(recordedSteps);
5135
5292
  await (onFinish == null ? void 0 : onFinish({
5136
5293
  finishReason,
@@ -5139,6 +5296,7 @@ var DefaultStreamTextResult = class {
5139
5296
  text: recordedFullText,
5140
5297
  reasoning: lastStep.reasoning,
5141
5298
  reasoningDetails: lastStep.reasoningDetails,
5299
+ files: lastStep.files,
5142
5300
  sources: lastStep.sources,
5143
5301
  toolCalls: lastStep.toolCalls,
5144
5302
  toolResults: lastStep.toolResults,
@@ -5331,6 +5489,7 @@ var DefaultStreamTextResult = class {
5331
5489
  const stepToolCalls = [];
5332
5490
  const stepToolResults = [];
5333
5491
  const stepReasoning2 = [];
5492
+ const stepFiles2 = [];
5334
5493
  let activeReasoningText2 = void 0;
5335
5494
  let stepFinishReason = "unknown";
5336
5495
  let stepUsage = {
@@ -5476,6 +5635,11 @@ var DefaultStreamTextResult = class {
5476
5635
  });
5477
5636
  break;
5478
5637
  }
5638
+ case "file": {
5639
+ stepFiles2.push(chunk);
5640
+ controller.enqueue(chunk);
5641
+ break;
5642
+ }
5479
5643
  case "source":
5480
5644
  case "tool-call-streaming-start":
5481
5645
  case "tool-call-delta": {
@@ -5594,6 +5758,7 @@ var DefaultStreamTextResult = class {
5594
5758
  responseMessages.push(
5595
5759
  ...toResponseMessages({
5596
5760
  text: stepText,
5761
+ files: stepFiles2,
5597
5762
  reasoning: stepReasoning2,
5598
5763
  tools: tools != null ? tools : {},
5599
5764
  toolCalls: stepToolCalls,
@@ -5674,6 +5839,9 @@ var DefaultStreamTextResult = class {
5674
5839
  get sources() {
5675
5840
  return this.sourcesPromise.value;
5676
5841
  }
5842
+ get files() {
5843
+ return this.filesPromise.value;
5844
+ }
5677
5845
  get toolCalls() {
5678
5846
  return this.toolCallsPromise.value;
5679
5847
  }
@@ -5792,6 +5960,15 @@ var DefaultStreamTextResult = class {
5792
5960
  }
5793
5961
  break;
5794
5962
  }
5963
+ case "file": {
5964
+ controller.enqueue(
5965
+ formatDataStreamPart2("file", {
5966
+ mimeType: chunk.mimeType,
5967
+ data: chunk.base64
5968
+ })
5969
+ );
5970
+ break;
5971
+ }
5795
5972
  case "source": {
5796
5973
  if (sendSources) {
5797
5974
  controller.enqueue(
@@ -6307,6 +6484,7 @@ function appendClientMessage({
6307
6484
  import {
6308
6485
  extractMaxToolInvocationStep
6309
6486
  } from "@ai-sdk/ui-utils";
6487
+ import { AISDKError as AISDKError18 } from "@ai-sdk/provider";
6310
6488
  function appendResponseMessages({
6311
6489
  messages,
6312
6490
  responseMessages,
@@ -6387,6 +6565,19 @@ function appendResponseMessages({
6387
6565
  }
6388
6566
  case "tool-call":
6389
6567
  break;
6568
+ case "file":
6569
+ if (part.data instanceof URL) {
6570
+ throw new AISDKError18({
6571
+ name: "InvalidAssistantFileData",
6572
+ message: "File data cannot be a URL"
6573
+ });
6574
+ }
6575
+ parts.push({
6576
+ type: "file",
6577
+ mimeType: part.mimeType,
6578
+ data: convertDataContentToBase64String(part.data)
6579
+ });
6580
+ break;
6390
6581
  }
6391
6582
  }
6392
6583
  }
@@ -6510,7 +6701,7 @@ function customProvider({
6510
6701
  var experimental_customProvider = customProvider;
6511
6702
 
6512
6703
  // core/registry/no-such-provider-error.ts
6513
- import { AISDKError as AISDKError18, NoSuchModelError as NoSuchModelError3 } from "@ai-sdk/provider";
6704
+ import { AISDKError as AISDKError19, NoSuchModelError as NoSuchModelError3 } from "@ai-sdk/provider";
6514
6705
  var name16 = "AI_NoSuchProviderError";
6515
6706
  var marker16 = `vercel.ai.error.${name16}`;
6516
6707
  var symbol16 = Symbol.for(marker16);
@@ -6529,7 +6720,7 @@ var NoSuchProviderError = class extends NoSuchModelError3 {
6529
6720
  this.availableProviders = availableProviders;
6530
6721
  }
6531
6722
  static isInstance(error) {
6532
- return AISDKError18.hasMarker(error, marker16);
6723
+ return AISDKError19.hasMarker(error, marker16);
6533
6724
  }
6534
6725
  };
6535
6726
  _a16 = symbol16;