ai 4.3.1 → 4.3.3

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.js CHANGED
@@ -73,6 +73,7 @@ __export(streams_exports, {
73
73
  experimental_createProviderRegistry: () => experimental_createProviderRegistry,
74
74
  experimental_customProvider: () => experimental_customProvider,
75
75
  experimental_generateImage: () => generateImage,
76
+ experimental_transcribe: () => transcribe,
76
77
  experimental_wrapLanguageModel: () => experimental_wrapLanguageModel,
77
78
  extractReasoningMiddleware: () => extractReasoningMiddleware,
78
79
  formatAssistantStreamPart: () => import_ui_utils11.formatAssistantStreamPart,
@@ -942,8 +943,8 @@ var DefaultGeneratedFileWithType = class extends DefaultGeneratedFile {
942
943
  }
943
944
  };
944
945
 
945
- // core/util/detect-image-mimetype.ts
946
- var mimeTypeSignatures = [
946
+ // core/util/detect-mimetype.ts
947
+ var imageMimeTypeSignatures = [
947
948
  {
948
949
  mimeType: "image/gif",
949
950
  bytesPrefix: [71, 73, 70],
@@ -1016,9 +1017,44 @@ var mimeTypeSignatures = [
1016
1017
  base64Prefix: "AAAAIGZ0eXBoZWlj"
1017
1018
  }
1018
1019
  ];
1019
- function detectImageMimeType(image) {
1020
- for (const signature of mimeTypeSignatures) {
1021
- if (typeof image === "string" ? image.startsWith(signature.base64Prefix) : image.length >= signature.bytesPrefix.length && signature.bytesPrefix.every((byte, index) => image[index] === byte)) {
1020
+ var audioMimeTypeSignatures = [
1021
+ {
1022
+ mimeType: "audio/mpeg",
1023
+ bytesPrefix: [255, 251],
1024
+ base64Prefix: "//s="
1025
+ },
1026
+ {
1027
+ mimeType: "audio/wav",
1028
+ bytesPrefix: [82, 73, 70, 70],
1029
+ base64Prefix: "UklGR"
1030
+ },
1031
+ {
1032
+ mimeType: "audio/ogg",
1033
+ bytesPrefix: [79, 103, 103, 83],
1034
+ base64Prefix: "T2dnUw"
1035
+ },
1036
+ {
1037
+ mimeType: "audio/flac",
1038
+ bytesPrefix: [102, 76, 97, 67],
1039
+ base64Prefix: "ZkxhQw"
1040
+ },
1041
+ {
1042
+ mimeType: "audio/aac",
1043
+ bytesPrefix: [64, 21, 0, 0],
1044
+ base64Prefix: "QBUA"
1045
+ },
1046
+ {
1047
+ mimeType: "audio/mp4",
1048
+ bytesPrefix: [102, 116, 121, 112],
1049
+ base64Prefix: "ZnR5cA"
1050
+ }
1051
+ ];
1052
+ function detectMimeType({
1053
+ data,
1054
+ signatures
1055
+ }) {
1056
+ for (const signature of signatures) {
1057
+ if (typeof data === "string" ? data.startsWith(signature.base64Prefix) : data.length >= signature.bytesPrefix.length && signature.bytesPrefix.every((byte, index) => data[index] === byte)) {
1022
1058
  return signature.mimeType;
1023
1059
  }
1024
1060
  }
@@ -1075,7 +1111,10 @@ async function generateImage({
1075
1111
  var _a18;
1076
1112
  return new DefaultGeneratedFile({
1077
1113
  data: image,
1078
- mimeType: (_a18 = detectImageMimeType(image)) != null ? _a18 : "image/png"
1114
+ mimeType: (_a18 = detectMimeType({
1115
+ data: image,
1116
+ signatures: imageMimeTypeSignatures
1117
+ })) != null ? _a18 : "image/png"
1079
1118
  });
1080
1119
  }
1081
1120
  )
@@ -1504,7 +1543,10 @@ function convertPartToLanguageModelPart(part, downloadedAssets) {
1504
1543
  switch (type) {
1505
1544
  case "image": {
1506
1545
  if (normalizedData instanceof Uint8Array) {
1507
- mimeType = (_b = detectImageMimeType(normalizedData)) != null ? _b : mimeType;
1546
+ mimeType = (_b = detectMimeType({
1547
+ data: normalizedData,
1548
+ signatures: imageMimeTypeSignatures
1549
+ })) != null ? _b : mimeType;
1508
1550
  }
1509
1551
  return {
1510
1552
  type: "image",
@@ -4754,6 +4796,25 @@ function asArray(value) {
4754
4796
  return value === void 0 ? [] : Array.isArray(value) ? value : [value];
4755
4797
  }
4756
4798
 
4799
+ // util/consume-stream.ts
4800
+ async function consumeStream({
4801
+ stream,
4802
+ onError
4803
+ }) {
4804
+ const reader = stream.getReader();
4805
+ try {
4806
+ while (true) {
4807
+ const { done } = await reader.read();
4808
+ if (done)
4809
+ break;
4810
+ }
4811
+ } catch (error) {
4812
+ onError == null ? void 0 : onError(error);
4813
+ } finally {
4814
+ reader.releaseLock();
4815
+ }
4816
+ }
4817
+
4757
4818
  // core/util/merge-streams.ts
4758
4819
  function mergeStreams(stream1, stream2) {
4759
4820
  const reader1 = stream1.getReader();
@@ -5995,9 +6056,15 @@ var DefaultStreamTextResult = class {
5995
6056
  )
5996
6057
  );
5997
6058
  }
5998
- async consumeStream() {
5999
- const stream = this.fullStream;
6000
- for await (const part of stream) {
6059
+ async consumeStream(options) {
6060
+ var _a17;
6061
+ try {
6062
+ await consumeStream({
6063
+ stream: this.fullStream,
6064
+ onError: options == null ? void 0 : options.onError
6065
+ });
6066
+ } catch (error) {
6067
+ (_a17 = options == null ? void 0 : options.onError) == null ? void 0 : _a17.call(options, error);
6001
6068
  }
6002
6069
  }
6003
6070
  get experimental_partialOutputStream() {
@@ -6268,6 +6335,70 @@ var DefaultStreamTextResult = class {
6268
6335
  }
6269
6336
  };
6270
6337
 
6338
+ // errors/no-transcript-generated-error.ts
6339
+ var import_provider23 = require("@ai-sdk/provider");
6340
+ var NoTranscriptGeneratedError = class extends import_provider23.AISDKError {
6341
+ constructor(options) {
6342
+ super({
6343
+ name: "AI_NoTranscriptGeneratedError",
6344
+ message: "No transcript generated."
6345
+ });
6346
+ this.responses = options.responses;
6347
+ }
6348
+ };
6349
+
6350
+ // core/transcribe/transcribe.ts
6351
+ async function transcribe({
6352
+ model,
6353
+ audio,
6354
+ providerOptions = {},
6355
+ maxRetries: maxRetriesArg,
6356
+ abortSignal,
6357
+ headers
6358
+ }) {
6359
+ const { retry } = prepareRetries({ maxRetries: maxRetriesArg });
6360
+ const audioData = audio instanceof URL ? new Uint8Array((await download({ url: audio })).data) : convertDataContentToUint8Array(audio);
6361
+ const result = await retry(
6362
+ () => {
6363
+ var _a17;
6364
+ return model.doGenerate({
6365
+ audio: audioData,
6366
+ abortSignal,
6367
+ headers,
6368
+ providerOptions,
6369
+ mimeType: (_a17 = detectMimeType({
6370
+ data: audioData,
6371
+ signatures: audioMimeTypeSignatures
6372
+ })) != null ? _a17 : "audio/wav"
6373
+ });
6374
+ }
6375
+ );
6376
+ if (!result.text) {
6377
+ throw new NoTranscriptGeneratedError({ responses: [result.response] });
6378
+ }
6379
+ return new DefaultTranscriptionResult({
6380
+ text: result.text,
6381
+ segments: result.segments,
6382
+ language: result.language,
6383
+ durationInSeconds: result.durationInSeconds,
6384
+ warnings: result.warnings,
6385
+ responses: [result.response],
6386
+ providerMetadata: result.providerMetadata
6387
+ });
6388
+ }
6389
+ var DefaultTranscriptionResult = class {
6390
+ constructor(options) {
6391
+ var _a17;
6392
+ this.text = options.text;
6393
+ this.segments = options.segments;
6394
+ this.language = options.language;
6395
+ this.durationInSeconds = options.durationInSeconds;
6396
+ this.warnings = options.warnings;
6397
+ this.responses = options.responses;
6398
+ this.providerMetadata = (_a17 = options.providerMetadata) != null ? _a17 : {};
6399
+ }
6400
+ };
6401
+
6271
6402
  // core/util/merge-objects.ts
6272
6403
  function mergeObjects(target, source) {
6273
6404
  if (target === void 0 && source === void 0) {
@@ -6583,7 +6714,7 @@ function appendClientMessage({
6583
6714
 
6584
6715
  // core/prompt/append-response-messages.ts
6585
6716
  var import_ui_utils9 = require("@ai-sdk/ui-utils");
6586
- var import_provider23 = require("@ai-sdk/provider");
6717
+ var import_provider24 = require("@ai-sdk/provider");
6587
6718
  function appendResponseMessages({
6588
6719
  messages,
6589
6720
  responseMessages,
@@ -6666,7 +6797,7 @@ function appendResponseMessages({
6666
6797
  break;
6667
6798
  case "file":
6668
6799
  if (part.data instanceof URL) {
6669
- throw new import_provider23.AISDKError({
6800
+ throw new import_provider24.AISDKError({
6670
6801
  name: "InvalidAssistantFileData",
6671
6802
  message: "File data cannot be a URL"
6672
6803
  });
@@ -6760,7 +6891,7 @@ function appendResponseMessages({
6760
6891
  }
6761
6892
 
6762
6893
  // core/registry/custom-provider.ts
6763
- var import_provider24 = require("@ai-sdk/provider");
6894
+ var import_provider25 = require("@ai-sdk/provider");
6764
6895
  function customProvider({
6765
6896
  languageModels,
6766
6897
  textEmbeddingModels,
@@ -6775,7 +6906,7 @@ function customProvider({
6775
6906
  if (fallbackProvider) {
6776
6907
  return fallbackProvider.languageModel(modelId);
6777
6908
  }
6778
- throw new import_provider24.NoSuchModelError({ modelId, modelType: "languageModel" });
6909
+ throw new import_provider25.NoSuchModelError({ modelId, modelType: "languageModel" });
6779
6910
  },
6780
6911
  textEmbeddingModel(modelId) {
6781
6912
  if (textEmbeddingModels != null && modelId in textEmbeddingModels) {
@@ -6784,7 +6915,7 @@ function customProvider({
6784
6915
  if (fallbackProvider) {
6785
6916
  return fallbackProvider.textEmbeddingModel(modelId);
6786
6917
  }
6787
- throw new import_provider24.NoSuchModelError({ modelId, modelType: "textEmbeddingModel" });
6918
+ throw new import_provider25.NoSuchModelError({ modelId, modelType: "textEmbeddingModel" });
6788
6919
  },
6789
6920
  imageModel(modelId) {
6790
6921
  if (imageModels != null && modelId in imageModels) {
@@ -6793,19 +6924,19 @@ function customProvider({
6793
6924
  if (fallbackProvider == null ? void 0 : fallbackProvider.imageModel) {
6794
6925
  return fallbackProvider.imageModel(modelId);
6795
6926
  }
6796
- throw new import_provider24.NoSuchModelError({ modelId, modelType: "imageModel" });
6927
+ throw new import_provider25.NoSuchModelError({ modelId, modelType: "imageModel" });
6797
6928
  }
6798
6929
  };
6799
6930
  }
6800
6931
  var experimental_customProvider = customProvider;
6801
6932
 
6802
6933
  // core/registry/no-such-provider-error.ts
6803
- var import_provider25 = require("@ai-sdk/provider");
6934
+ var import_provider26 = require("@ai-sdk/provider");
6804
6935
  var name16 = "AI_NoSuchProviderError";
6805
6936
  var marker16 = `vercel.ai.error.${name16}`;
6806
6937
  var symbol16 = Symbol.for(marker16);
6807
6938
  var _a16;
6808
- var NoSuchProviderError = class extends import_provider25.NoSuchModelError {
6939
+ var NoSuchProviderError = class extends import_provider26.NoSuchModelError {
6809
6940
  constructor({
6810
6941
  modelId,
6811
6942
  modelType,
@@ -6819,13 +6950,13 @@ var NoSuchProviderError = class extends import_provider25.NoSuchModelError {
6819
6950
  this.availableProviders = availableProviders;
6820
6951
  }
6821
6952
  static isInstance(error) {
6822
- return import_provider25.AISDKError.hasMarker(error, marker16);
6953
+ return import_provider26.AISDKError.hasMarker(error, marker16);
6823
6954
  }
6824
6955
  };
6825
6956
  _a16 = symbol16;
6826
6957
 
6827
6958
  // core/registry/provider-registry.ts
6828
- var import_provider26 = require("@ai-sdk/provider");
6959
+ var import_provider27 = require("@ai-sdk/provider");
6829
6960
  function createProviderRegistry(providers, {
6830
6961
  separator = ":"
6831
6962
  } = {}) {
@@ -6864,7 +6995,7 @@ var DefaultProviderRegistry = class {
6864
6995
  splitId(id, modelType) {
6865
6996
  const index = id.indexOf(this.separator);
6866
6997
  if (index === -1) {
6867
- throw new import_provider26.NoSuchModelError({
6998
+ throw new import_provider27.NoSuchModelError({
6868
6999
  modelId: id,
6869
7000
  modelType,
6870
7001
  message: `Invalid ${modelType} id for registry: ${id} (must be in the format "providerId${this.separator}modelId")`
@@ -6877,7 +7008,7 @@ var DefaultProviderRegistry = class {
6877
7008
  const [providerId, modelId] = this.splitId(id, "languageModel");
6878
7009
  const model = (_b = (_a17 = this.getProvider(providerId)).languageModel) == null ? void 0 : _b.call(_a17, modelId);
6879
7010
  if (model == null) {
6880
- throw new import_provider26.NoSuchModelError({ modelId: id, modelType: "languageModel" });
7011
+ throw new import_provider27.NoSuchModelError({ modelId: id, modelType: "languageModel" });
6881
7012
  }
6882
7013
  return model;
6883
7014
  }
@@ -6887,7 +7018,7 @@ var DefaultProviderRegistry = class {
6887
7018
  const provider = this.getProvider(providerId);
6888
7019
  const model = (_a17 = provider.textEmbeddingModel) == null ? void 0 : _a17.call(provider, modelId);
6889
7020
  if (model == null) {
6890
- throw new import_provider26.NoSuchModelError({
7021
+ throw new import_provider27.NoSuchModelError({
6891
7022
  modelId: id,
6892
7023
  modelType: "textEmbeddingModel"
6893
7024
  });
@@ -6900,7 +7031,7 @@ var DefaultProviderRegistry = class {
6900
7031
  const provider = this.getProvider(providerId);
6901
7032
  const model = (_a17 = provider.imageModel) == null ? void 0 : _a17.call(provider, modelId);
6902
7033
  if (model == null) {
6903
- throw new import_provider26.NoSuchModelError({ modelId: id, modelType: "imageModel" });
7034
+ throw new import_provider27.NoSuchModelError({ modelId: id, modelType: "imageModel" });
6904
7035
  }
6905
7036
  return model;
6906
7037
  }
@@ -7902,6 +8033,7 @@ var StreamData = class {
7902
8033
  experimental_createProviderRegistry,
7903
8034
  experimental_customProvider,
7904
8035
  experimental_generateImage,
8036
+ experimental_transcribe,
7905
8037
  experimental_wrapLanguageModel,
7906
8038
  extractReasoningMiddleware,
7907
8039
  formatAssistantStreamPart,