ai 4.3.5 → 4.3.7

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_generateSpeech: () => generateSpeech,
76
77
  experimental_transcribe: () => transcribe,
77
78
  experimental_wrapLanguageModel: () => experimental_wrapLanguageModel,
78
79
  extractReasoningMiddleware: () => extractReasoningMiddleware,
@@ -4076,23 +4077,36 @@ function toResponseMessages({
4076
4077
  generateMessageId
4077
4078
  }) {
4078
4079
  const responseMessages = [];
4079
- responseMessages.push({
4080
- role: "assistant",
4081
- content: [
4080
+ const content = [];
4081
+ if (reasoning.length > 0) {
4082
+ content.push(
4082
4083
  ...reasoning.map(
4083
4084
  (part) => part.type === "text" ? { ...part, type: "reasoning" } : { ...part, type: "redacted-reasoning" }
4084
- ),
4085
- // TODO language model v2: switch to order response content (instead of type-based ordering)
4085
+ )
4086
+ );
4087
+ }
4088
+ if (files.length > 0) {
4089
+ content.push(
4086
4090
  ...files.map((file) => ({
4087
4091
  type: "file",
4088
4092
  data: file.base64,
4089
4093
  mimeType: file.mimeType
4090
- })),
4091
- { type: "text", text: text2 },
4092
- ...toolCalls
4093
- ],
4094
- id: messageId
4095
- });
4094
+ }))
4095
+ );
4096
+ }
4097
+ if (text2.length > 0) {
4098
+ content.push({ type: "text", text: text2 });
4099
+ }
4100
+ if (toolCalls.length > 0) {
4101
+ content.push(...toolCalls);
4102
+ }
4103
+ if (content.length > 0) {
4104
+ responseMessages.push({
4105
+ role: "assistant",
4106
+ content,
4107
+ id: messageId
4108
+ });
4109
+ }
4096
4110
  if (toolResults.length > 0) {
4097
4111
  responseMessages.push({
4098
4112
  role: "tool",
@@ -6335,9 +6349,99 @@ var DefaultStreamTextResult = class {
6335
6349
  }
6336
6350
  };
6337
6351
 
6338
- // errors/no-transcript-generated-error.ts
6352
+ // errors/no-speech-generated-error.ts
6339
6353
  var import_provider23 = require("@ai-sdk/provider");
6340
- var NoTranscriptGeneratedError = class extends import_provider23.AISDKError {
6354
+ var NoSpeechGeneratedError = class extends import_provider23.AISDKError {
6355
+ constructor(options) {
6356
+ super({
6357
+ name: "AI_NoSpeechGeneratedError",
6358
+ message: "No speech audio generated."
6359
+ });
6360
+ this.responses = options.responses;
6361
+ }
6362
+ };
6363
+
6364
+ // core/generate-speech/generated-audio-file.ts
6365
+ var DefaultGeneratedAudioFile = class extends DefaultGeneratedFile {
6366
+ constructor({
6367
+ data,
6368
+ mimeType
6369
+ }) {
6370
+ super({ data, mimeType });
6371
+ let format = "mp3";
6372
+ if (mimeType) {
6373
+ const mimeTypeParts = mimeType.split("/");
6374
+ if (mimeTypeParts.length === 2) {
6375
+ if (mimeType !== "audio/mpeg") {
6376
+ format = mimeTypeParts[1];
6377
+ }
6378
+ }
6379
+ }
6380
+ if (!format) {
6381
+ throw new Error(
6382
+ "Audio format must be provided or determinable from mimeType"
6383
+ );
6384
+ }
6385
+ this.format = format;
6386
+ }
6387
+ };
6388
+
6389
+ // core/generate-speech/generate-speech.ts
6390
+ async function generateSpeech({
6391
+ model,
6392
+ text: text2,
6393
+ voice,
6394
+ outputFormat,
6395
+ instructions,
6396
+ speed,
6397
+ providerOptions = {},
6398
+ maxRetries: maxRetriesArg,
6399
+ abortSignal,
6400
+ headers
6401
+ }) {
6402
+ var _a17;
6403
+ const { retry } = prepareRetries({ maxRetries: maxRetriesArg });
6404
+ const result = await retry(
6405
+ () => model.doGenerate({
6406
+ text: text2,
6407
+ voice,
6408
+ outputFormat,
6409
+ instructions,
6410
+ speed,
6411
+ abortSignal,
6412
+ headers,
6413
+ providerOptions
6414
+ })
6415
+ );
6416
+ if (!result.audio || result.audio.length === 0) {
6417
+ throw new NoSpeechGeneratedError({ responses: [result.response] });
6418
+ }
6419
+ return new DefaultSpeechResult({
6420
+ audio: new DefaultGeneratedAudioFile({
6421
+ data: result.audio,
6422
+ mimeType: (_a17 = detectMimeType({
6423
+ data: result.audio,
6424
+ signatures: audioMimeTypeSignatures
6425
+ })) != null ? _a17 : "audio/mp3"
6426
+ }),
6427
+ warnings: result.warnings,
6428
+ responses: [result.response],
6429
+ providerMetadata: result.providerMetadata
6430
+ });
6431
+ }
6432
+ var DefaultSpeechResult = class {
6433
+ constructor(options) {
6434
+ var _a17;
6435
+ this.audio = options.audio;
6436
+ this.warnings = options.warnings;
6437
+ this.responses = options.responses;
6438
+ this.providerMetadata = (_a17 = options.providerMetadata) != null ? _a17 : {};
6439
+ }
6440
+ };
6441
+
6442
+ // errors/no-transcript-generated-error.ts
6443
+ var import_provider24 = require("@ai-sdk/provider");
6444
+ var NoTranscriptGeneratedError = class extends import_provider24.AISDKError {
6341
6445
  constructor(options) {
6342
6446
  super({
6343
6447
  name: "AI_NoTranscriptGeneratedError",
@@ -6714,7 +6818,7 @@ function appendClientMessage({
6714
6818
 
6715
6819
  // core/prompt/append-response-messages.ts
6716
6820
  var import_ui_utils9 = require("@ai-sdk/ui-utils");
6717
- var import_provider24 = require("@ai-sdk/provider");
6821
+ var import_provider25 = require("@ai-sdk/provider");
6718
6822
  function appendResponseMessages({
6719
6823
  messages,
6720
6824
  responseMessages,
@@ -6797,7 +6901,7 @@ function appendResponseMessages({
6797
6901
  break;
6798
6902
  case "file":
6799
6903
  if (part.data instanceof URL) {
6800
- throw new import_provider24.AISDKError({
6904
+ throw new import_provider25.AISDKError({
6801
6905
  name: "InvalidAssistantFileData",
6802
6906
  message: "File data cannot be a URL"
6803
6907
  });
@@ -6891,7 +6995,7 @@ function appendResponseMessages({
6891
6995
  }
6892
6996
 
6893
6997
  // core/registry/custom-provider.ts
6894
- var import_provider25 = require("@ai-sdk/provider");
6998
+ var import_provider26 = require("@ai-sdk/provider");
6895
6999
  function customProvider({
6896
7000
  languageModels,
6897
7001
  textEmbeddingModels,
@@ -6906,7 +7010,7 @@ function customProvider({
6906
7010
  if (fallbackProvider) {
6907
7011
  return fallbackProvider.languageModel(modelId);
6908
7012
  }
6909
- throw new import_provider25.NoSuchModelError({ modelId, modelType: "languageModel" });
7013
+ throw new import_provider26.NoSuchModelError({ modelId, modelType: "languageModel" });
6910
7014
  },
6911
7015
  textEmbeddingModel(modelId) {
6912
7016
  if (textEmbeddingModels != null && modelId in textEmbeddingModels) {
@@ -6915,7 +7019,7 @@ function customProvider({
6915
7019
  if (fallbackProvider) {
6916
7020
  return fallbackProvider.textEmbeddingModel(modelId);
6917
7021
  }
6918
- throw new import_provider25.NoSuchModelError({ modelId, modelType: "textEmbeddingModel" });
7022
+ throw new import_provider26.NoSuchModelError({ modelId, modelType: "textEmbeddingModel" });
6919
7023
  },
6920
7024
  imageModel(modelId) {
6921
7025
  if (imageModels != null && modelId in imageModels) {
@@ -6924,19 +7028,19 @@ function customProvider({
6924
7028
  if (fallbackProvider == null ? void 0 : fallbackProvider.imageModel) {
6925
7029
  return fallbackProvider.imageModel(modelId);
6926
7030
  }
6927
- throw new import_provider25.NoSuchModelError({ modelId, modelType: "imageModel" });
7031
+ throw new import_provider26.NoSuchModelError({ modelId, modelType: "imageModel" });
6928
7032
  }
6929
7033
  };
6930
7034
  }
6931
7035
  var experimental_customProvider = customProvider;
6932
7036
 
6933
7037
  // core/registry/no-such-provider-error.ts
6934
- var import_provider26 = require("@ai-sdk/provider");
7038
+ var import_provider27 = require("@ai-sdk/provider");
6935
7039
  var name16 = "AI_NoSuchProviderError";
6936
7040
  var marker16 = `vercel.ai.error.${name16}`;
6937
7041
  var symbol16 = Symbol.for(marker16);
6938
7042
  var _a16;
6939
- var NoSuchProviderError = class extends import_provider26.NoSuchModelError {
7043
+ var NoSuchProviderError = class extends import_provider27.NoSuchModelError {
6940
7044
  constructor({
6941
7045
  modelId,
6942
7046
  modelType,
@@ -6950,13 +7054,13 @@ var NoSuchProviderError = class extends import_provider26.NoSuchModelError {
6950
7054
  this.availableProviders = availableProviders;
6951
7055
  }
6952
7056
  static isInstance(error) {
6953
- return import_provider26.AISDKError.hasMarker(error, marker16);
7057
+ return import_provider27.AISDKError.hasMarker(error, marker16);
6954
7058
  }
6955
7059
  };
6956
7060
  _a16 = symbol16;
6957
7061
 
6958
7062
  // core/registry/provider-registry.ts
6959
- var import_provider27 = require("@ai-sdk/provider");
7063
+ var import_provider28 = require("@ai-sdk/provider");
6960
7064
  function createProviderRegistry(providers, {
6961
7065
  separator = ":"
6962
7066
  } = {}) {
@@ -6995,20 +7099,20 @@ var DefaultProviderRegistry = class {
6995
7099
  splitId(id, modelType) {
6996
7100
  const index = id.indexOf(this.separator);
6997
7101
  if (index === -1) {
6998
- throw new import_provider27.NoSuchModelError({
7102
+ throw new import_provider28.NoSuchModelError({
6999
7103
  modelId: id,
7000
7104
  modelType,
7001
7105
  message: `Invalid ${modelType} id for registry: ${id} (must be in the format "providerId${this.separator}modelId")`
7002
7106
  });
7003
7107
  }
7004
- return [id.slice(0, index), id.slice(index + 1)];
7108
+ return [id.slice(0, index), id.slice(index + this.separator.length)];
7005
7109
  }
7006
7110
  languageModel(id) {
7007
7111
  var _a17, _b;
7008
7112
  const [providerId, modelId] = this.splitId(id, "languageModel");
7009
7113
  const model = (_b = (_a17 = this.getProvider(providerId)).languageModel) == null ? void 0 : _b.call(_a17, modelId);
7010
7114
  if (model == null) {
7011
- throw new import_provider27.NoSuchModelError({ modelId: id, modelType: "languageModel" });
7115
+ throw new import_provider28.NoSuchModelError({ modelId: id, modelType: "languageModel" });
7012
7116
  }
7013
7117
  return model;
7014
7118
  }
@@ -7018,7 +7122,7 @@ var DefaultProviderRegistry = class {
7018
7122
  const provider = this.getProvider(providerId);
7019
7123
  const model = (_a17 = provider.textEmbeddingModel) == null ? void 0 : _a17.call(provider, modelId);
7020
7124
  if (model == null) {
7021
- throw new import_provider27.NoSuchModelError({
7125
+ throw new import_provider28.NoSuchModelError({
7022
7126
  modelId: id,
7023
7127
  modelType: "textEmbeddingModel"
7024
7128
  });
@@ -7031,7 +7135,7 @@ var DefaultProviderRegistry = class {
7031
7135
  const provider = this.getProvider(providerId);
7032
7136
  const model = (_a17 = provider.imageModel) == null ? void 0 : _a17.call(provider, modelId);
7033
7137
  if (model == null) {
7034
- throw new import_provider27.NoSuchModelError({ modelId: id, modelType: "imageModel" });
7138
+ throw new import_provider28.NoSuchModelError({ modelId: id, modelType: "imageModel" });
7035
7139
  }
7036
7140
  return model;
7037
7141
  }
@@ -8038,6 +8142,7 @@ var StreamData = class {
8038
8142
  experimental_createProviderRegistry,
8039
8143
  experimental_customProvider,
8040
8144
  experimental_generateImage,
8145
+ experimental_generateSpeech,
8041
8146
  experimental_transcribe,
8042
8147
  experimental_wrapLanguageModel,
8043
8148
  extractReasoningMiddleware,