ai 3.2.23 → 3.2.25

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/README.md CHANGED
@@ -52,12 +52,13 @@ The [AI SDK UI](https://sdk.vercel.ai/docs/ai-sdk-ui/overview) module provides a
52
52
  ###### @/app/page.tsx (Next.js App Router)
53
53
 
54
54
  ```tsx
55
- "use client"
55
+ 'use client';
56
56
 
57
- import { useChat } from 'ai/react'
57
+ import { useChat } from 'ai/react';
58
58
 
59
59
  export default function Page() {
60
- const { messages, input, handleSubmit, handleInputChange, isLoading } = useChat()
60
+ const { messages, input, handleSubmit, handleInputChange, isLoading } =
61
+ useChat();
61
62
 
62
63
  return (
63
64
  <div>
@@ -66,7 +67,7 @@ export default function Page() {
66
67
  <div>{message.role}</div>
67
68
  <div>{message.content}</div>
68
69
  </div>
69
- )}
70
+ ))}
70
71
 
71
72
  <form onSubmit={handleSubmit}>
72
73
  <input
@@ -77,7 +78,7 @@ export default function Page() {
77
78
  />
78
79
  </form>
79
80
  </div>
80
- )
81
+ );
81
82
  }
82
83
  ```
83
84
 
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { DeepPartial, JSONValue, CreateMessage, FunctionCall as FunctionCall$1, AssistantMessage, DataMessage } from '@ai-sdk/ui-utils';
1
+ import { DeepPartial, Attachment, JSONValue, CreateMessage, FunctionCall as FunctionCall$1, AssistantMessage, DataMessage } from '@ai-sdk/ui-utils';
2
2
  export { AssistantMessage, AssistantStatus, ChatRequest, ChatRequestOptions, CreateMessage, DataMessage, DeepPartial, Function, FunctionCall, FunctionCallHandler, IdGenerator, JSONValue, Message, RequestOptions, StreamPart, Tool, ToolCall, ToolCallHandler, ToolChoice, ToolInvocation, UseAssistantOptions, formatStreamPart, parseComplexResponse, parseStreamPart, readDataStream } from '@ai-sdk/ui-utils';
3
3
  import { EmbeddingModelV1, EmbeddingModelV1Embedding, LanguageModelV1, LanguageModelV1FinishReason, LanguageModelV1LogProbs, LanguageModelV1CallWarning, LanguageModelV1StreamPart } from '@ai-sdk/provider';
4
4
  export { APICallError, EmptyResponseBodyError, InvalidArgumentError, InvalidDataContentError, InvalidPromptError, InvalidResponseDataError, InvalidToolArgumentsError, JSONParseError, LoadAPIKeyError, NoObjectGeneratedError, NoSuchToolError, RetryError, ToolCallParseError, TypeValidationError, UnsupportedFunctionalityError, UnsupportedJSONSchemaError } from '@ai-sdk/provider';
@@ -310,6 +310,13 @@ Converts data content to a Uint8Array.
310
310
  @returns Uint8Array.
311
311
  */
312
312
  declare function convertDataContentToUint8Array(content: DataContent): Uint8Array;
313
+ /**
314
+ * Converts a Uint8Array to a string of text.
315
+ *
316
+ * @param uint8Array - The Uint8Array to convert.
317
+ * @returns The converted string.
318
+ */
319
+ declare function convertUint8ArrayToText(uint8Array: Uint8Array): string;
313
320
 
314
321
  /**
315
322
  Text content part of a prompt. It contains a string of text.
@@ -905,6 +912,7 @@ declare function convertToCoreMessages(messages: Array<{
905
912
  role: 'user' | 'assistant';
906
913
  content: string;
907
914
  toolInvocations?: Array<ToolResult<string, unknown, unknown>>;
915
+ experimental_attachments?: Attachment[];
908
916
  }>): CoreMessage[];
909
917
 
910
918
  declare class InvalidMessageRoleError extends Error {
@@ -1062,31 +1070,74 @@ declare class GenerateTextResult<TOOLS extends Record<string, CoreTool>> {
1062
1070
  */
1063
1071
  readonly responseMessages: Array<CoreAssistantMessage | CoreToolMessage>;
1064
1072
  /**
1073
+ Response information for every roundtrip.
1074
+ You can use this to get information about intermediate steps, such as the tool calls or the response headers.
1075
+ */
1076
+ readonly roundtrips: Array<{
1077
+ /**
1078
+ The generated text.
1079
+ */
1080
+ readonly text: string;
1081
+ /**
1082
+ The tool calls that were made during the generation.
1083
+ */
1084
+ readonly toolCalls: ToToolCallArray<TOOLS>;
1085
+ /**
1086
+ The results of the tool calls.
1087
+ */
1088
+ readonly toolResults: ToToolResultArray<TOOLS>;
1089
+ /**
1090
+ The reason why the generation finished.
1091
+ */
1092
+ readonly finishReason: FinishReason;
1093
+ /**
1094
+ The token usage of the generated text.
1095
+ */
1096
+ readonly usage: CompletionTokenUsage$1;
1097
+ /**
1098
+ Warnings from the model provider (e.g. unsupported settings)
1099
+ */
1100
+ readonly warnings: CallWarning[] | undefined;
1101
+ /**
1102
+ Logprobs for the completion.
1103
+ `undefined` if the mode does not support logprobs or if was not enabled.
1104
+ */
1105
+ readonly logprobs: LogProbs | undefined;
1106
+ /**
1107
+ Optional raw response data.
1108
+ */
1109
+ readonly rawResponse?: {
1110
+ /**
1111
+ Response headers.
1112
+ */
1113
+ readonly headers?: Record<string, string>;
1114
+ };
1115
+ }>;
1116
+ /**
1065
1117
  Optional raw response data.
1066
1118
  */
1067
- rawResponse?: {
1119
+ readonly rawResponse?: {
1068
1120
  /**
1069
1121
  Response headers.
1070
1122
  */
1071
- headers?: Record<string, string>;
1123
+ readonly headers?: Record<string, string>;
1072
1124
  };
1073
1125
  /**
1074
1126
  Logprobs for the completion.
1075
- `undefined` if the mode does not support logprobs or if was not enabled
1127
+ `undefined` if the mode does not support logprobs or if was not enabled.
1076
1128
  */
1077
1129
  readonly logprobs: LogProbs | undefined;
1078
1130
  constructor(options: {
1079
- text: string;
1080
- toolCalls: ToToolCallArray<TOOLS>;
1081
- toolResults: ToToolResultArray<TOOLS>;
1082
- finishReason: FinishReason;
1083
- usage: CompletionTokenUsage$1;
1084
- warnings: CallWarning[] | undefined;
1085
- rawResponse?: {
1086
- headers?: Record<string, string>;
1087
- };
1088
- logprobs: LogProbs | undefined;
1089
- responseMessages: Array<CoreAssistantMessage | CoreToolMessage>;
1131
+ text: GenerateTextResult<TOOLS>['text'];
1132
+ toolCalls: GenerateTextResult<TOOLS>['toolCalls'];
1133
+ toolResults: GenerateTextResult<TOOLS>['toolResults'];
1134
+ finishReason: GenerateTextResult<TOOLS>['finishReason'];
1135
+ usage: GenerateTextResult<TOOLS>['usage'];
1136
+ warnings: GenerateTextResult<TOOLS>['warnings'];
1137
+ rawResponse?: GenerateTextResult<TOOLS>['rawResponse'];
1138
+ logprobs: GenerateTextResult<TOOLS>['logprobs'];
1139
+ responseMessages: GenerateTextResult<TOOLS>['responseMessages'];
1140
+ roundtrips: GenerateTextResult<TOOLS>['roundtrips'];
1090
1141
  });
1091
1142
  }
1092
1143
  /**
@@ -2184,4 +2235,4 @@ declare const generateId: (size?: number | undefined) => string;
2184
2235
  */
2185
2236
  declare const nanoid: (size?: number | undefined) => string;
2186
2237
 
2187
- export { AIStream, AIStreamCallbacksAndOptions, AIStreamParser, AIStreamParserOptions, AWSBedrockAnthropicMessagesStream, AWSBedrockAnthropicStream, AWSBedrockCohereStream, AWSBedrockLlama2Stream, AWSBedrockStream, AnthropicStream, AssistantContent, AssistantResponse, CallWarning, CohereStream, CompletionTokenUsage, CompletionUsage, CoreAssistantMessage, CoreMessage, CoreSystemMessage, CoreTool, CoreToolChoice, CoreToolMessage, CoreUserMessage, DataContent, EmbedManyResult, EmbedResult, Embedding, EmbeddingModel, EmbeddingTokenUsage, ExperimentalAssistantMessage, ExperimentalMessage, ExperimentalTool, ExperimentalToolMessage, ExperimentalUserMessage, FinishReason, FunctionCallPayload, GenerateObjectResult, GenerateTextResult, GoogleGenerativeAIStream, HuggingFaceStream, ImagePart, InkeepAIStreamCallbacksAndOptions, InkeepChatResultCallbacks, InkeepOnFinalMetadata, InkeepStream, InvalidMessageRoleError, InvalidModelIdError, langchainAdapter as LangChainAdapter, LangChainStream, LanguageModel, LogProbs, MistralStream, NoSuchModelError, NoSuchProviderError, ObjectStreamInputPart, ObjectStreamPart, OpenAIStream, OpenAIStreamCallbacks, ReplicateStream, StreamData, StreamObjectResult, StreamTextResult, StreamingTextResponse, TextPart$1 as TextPart, TextStreamPart, TokenUsage, ToolCallPart, ToolCallPayload, ToolContent, ToolResultPart, UserContent, convertDataContentToBase64String, convertDataContentToUint8Array, convertToCoreMessages, cosineSimilarity, createCallbacksTransformer, createEventStreamTransformer, createStreamDataTransformer, embed, embedMany, experimental_AssistantResponse, experimental_ModelRegistry, experimental_ProviderRegistry, experimental_StreamData, experimental_createModelRegistry, experimental_createProviderRegistry, experimental_generateObject, experimental_generateText, experimental_streamObject, experimental_streamText, generateId, generateObject, generateText, nanoid, readableFromAsyncIterable, streamObject, streamText, streamToResponse, tool, trimStartOfStreamHelper };
2238
+ export { AIStream, AIStreamCallbacksAndOptions, AIStreamParser, AIStreamParserOptions, AWSBedrockAnthropicMessagesStream, AWSBedrockAnthropicStream, AWSBedrockCohereStream, AWSBedrockLlama2Stream, AWSBedrockStream, AnthropicStream, AssistantContent, AssistantResponse, CallWarning, CohereStream, CompletionTokenUsage, CompletionUsage, CoreAssistantMessage, CoreMessage, CoreSystemMessage, CoreTool, CoreToolChoice, CoreToolMessage, CoreUserMessage, DataContent, EmbedManyResult, EmbedResult, Embedding, EmbeddingModel, EmbeddingTokenUsage, ExperimentalAssistantMessage, ExperimentalMessage, ExperimentalTool, ExperimentalToolMessage, ExperimentalUserMessage, FinishReason, FunctionCallPayload, GenerateObjectResult, GenerateTextResult, GoogleGenerativeAIStream, HuggingFaceStream, ImagePart, InkeepAIStreamCallbacksAndOptions, InkeepChatResultCallbacks, InkeepOnFinalMetadata, InkeepStream, InvalidMessageRoleError, InvalidModelIdError, langchainAdapter as LangChainAdapter, LangChainStream, LanguageModel, LogProbs, MistralStream, NoSuchModelError, NoSuchProviderError, ObjectStreamInputPart, ObjectStreamPart, OpenAIStream, OpenAIStreamCallbacks, ReplicateStream, StreamData, StreamObjectResult, StreamTextResult, StreamingTextResponse, TextPart$1 as TextPart, TextStreamPart, TokenUsage, ToolCallPart, ToolCallPayload, ToolContent, ToolResultPart, UserContent, convertDataContentToBase64String, convertDataContentToUint8Array, convertToCoreMessages, convertUint8ArrayToText, cosineSimilarity, createCallbacksTransformer, createEventStreamTransformer, createStreamDataTransformer, embed, embedMany, experimental_AssistantResponse, experimental_ModelRegistry, experimental_ProviderRegistry, experimental_StreamData, experimental_createModelRegistry, experimental_createProviderRegistry, experimental_generateObject, experimental_generateText, experimental_streamObject, experimental_streamText, generateId, generateObject, generateText, nanoid, readableFromAsyncIterable, streamObject, streamText, streamToResponse, tool, trimStartOfStreamHelper };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { DeepPartial, JSONValue, CreateMessage, FunctionCall as FunctionCall$1, AssistantMessage, DataMessage } from '@ai-sdk/ui-utils';
1
+ import { DeepPartial, Attachment, JSONValue, CreateMessage, FunctionCall as FunctionCall$1, AssistantMessage, DataMessage } from '@ai-sdk/ui-utils';
2
2
  export { AssistantMessage, AssistantStatus, ChatRequest, ChatRequestOptions, CreateMessage, DataMessage, DeepPartial, Function, FunctionCall, FunctionCallHandler, IdGenerator, JSONValue, Message, RequestOptions, StreamPart, Tool, ToolCall, ToolCallHandler, ToolChoice, ToolInvocation, UseAssistantOptions, formatStreamPart, parseComplexResponse, parseStreamPart, readDataStream } from '@ai-sdk/ui-utils';
3
3
  import { EmbeddingModelV1, EmbeddingModelV1Embedding, LanguageModelV1, LanguageModelV1FinishReason, LanguageModelV1LogProbs, LanguageModelV1CallWarning, LanguageModelV1StreamPart } from '@ai-sdk/provider';
4
4
  export { APICallError, EmptyResponseBodyError, InvalidArgumentError, InvalidDataContentError, InvalidPromptError, InvalidResponseDataError, InvalidToolArgumentsError, JSONParseError, LoadAPIKeyError, NoObjectGeneratedError, NoSuchToolError, RetryError, ToolCallParseError, TypeValidationError, UnsupportedFunctionalityError, UnsupportedJSONSchemaError } from '@ai-sdk/provider';
@@ -310,6 +310,13 @@ Converts data content to a Uint8Array.
310
310
  @returns Uint8Array.
311
311
  */
312
312
  declare function convertDataContentToUint8Array(content: DataContent): Uint8Array;
313
+ /**
314
+ * Converts a Uint8Array to a string of text.
315
+ *
316
+ * @param uint8Array - The Uint8Array to convert.
317
+ * @returns The converted string.
318
+ */
319
+ declare function convertUint8ArrayToText(uint8Array: Uint8Array): string;
313
320
 
314
321
  /**
315
322
  Text content part of a prompt. It contains a string of text.
@@ -905,6 +912,7 @@ declare function convertToCoreMessages(messages: Array<{
905
912
  role: 'user' | 'assistant';
906
913
  content: string;
907
914
  toolInvocations?: Array<ToolResult<string, unknown, unknown>>;
915
+ experimental_attachments?: Attachment[];
908
916
  }>): CoreMessage[];
909
917
 
910
918
  declare class InvalidMessageRoleError extends Error {
@@ -1062,31 +1070,74 @@ declare class GenerateTextResult<TOOLS extends Record<string, CoreTool>> {
1062
1070
  */
1063
1071
  readonly responseMessages: Array<CoreAssistantMessage | CoreToolMessage>;
1064
1072
  /**
1073
+ Response information for every roundtrip.
1074
+ You can use this to get information about intermediate steps, such as the tool calls or the response headers.
1075
+ */
1076
+ readonly roundtrips: Array<{
1077
+ /**
1078
+ The generated text.
1079
+ */
1080
+ readonly text: string;
1081
+ /**
1082
+ The tool calls that were made during the generation.
1083
+ */
1084
+ readonly toolCalls: ToToolCallArray<TOOLS>;
1085
+ /**
1086
+ The results of the tool calls.
1087
+ */
1088
+ readonly toolResults: ToToolResultArray<TOOLS>;
1089
+ /**
1090
+ The reason why the generation finished.
1091
+ */
1092
+ readonly finishReason: FinishReason;
1093
+ /**
1094
+ The token usage of the generated text.
1095
+ */
1096
+ readonly usage: CompletionTokenUsage$1;
1097
+ /**
1098
+ Warnings from the model provider (e.g. unsupported settings)
1099
+ */
1100
+ readonly warnings: CallWarning[] | undefined;
1101
+ /**
1102
+ Logprobs for the completion.
1103
+ `undefined` if the mode does not support logprobs or if was not enabled.
1104
+ */
1105
+ readonly logprobs: LogProbs | undefined;
1106
+ /**
1107
+ Optional raw response data.
1108
+ */
1109
+ readonly rawResponse?: {
1110
+ /**
1111
+ Response headers.
1112
+ */
1113
+ readonly headers?: Record<string, string>;
1114
+ };
1115
+ }>;
1116
+ /**
1065
1117
  Optional raw response data.
1066
1118
  */
1067
- rawResponse?: {
1119
+ readonly rawResponse?: {
1068
1120
  /**
1069
1121
  Response headers.
1070
1122
  */
1071
- headers?: Record<string, string>;
1123
+ readonly headers?: Record<string, string>;
1072
1124
  };
1073
1125
  /**
1074
1126
  Logprobs for the completion.
1075
- `undefined` if the mode does not support logprobs or if was not enabled
1127
+ `undefined` if the mode does not support logprobs or if was not enabled.
1076
1128
  */
1077
1129
  readonly logprobs: LogProbs | undefined;
1078
1130
  constructor(options: {
1079
- text: string;
1080
- toolCalls: ToToolCallArray<TOOLS>;
1081
- toolResults: ToToolResultArray<TOOLS>;
1082
- finishReason: FinishReason;
1083
- usage: CompletionTokenUsage$1;
1084
- warnings: CallWarning[] | undefined;
1085
- rawResponse?: {
1086
- headers?: Record<string, string>;
1087
- };
1088
- logprobs: LogProbs | undefined;
1089
- responseMessages: Array<CoreAssistantMessage | CoreToolMessage>;
1131
+ text: GenerateTextResult<TOOLS>['text'];
1132
+ toolCalls: GenerateTextResult<TOOLS>['toolCalls'];
1133
+ toolResults: GenerateTextResult<TOOLS>['toolResults'];
1134
+ finishReason: GenerateTextResult<TOOLS>['finishReason'];
1135
+ usage: GenerateTextResult<TOOLS>['usage'];
1136
+ warnings: GenerateTextResult<TOOLS>['warnings'];
1137
+ rawResponse?: GenerateTextResult<TOOLS>['rawResponse'];
1138
+ logprobs: GenerateTextResult<TOOLS>['logprobs'];
1139
+ responseMessages: GenerateTextResult<TOOLS>['responseMessages'];
1140
+ roundtrips: GenerateTextResult<TOOLS>['roundtrips'];
1090
1141
  });
1091
1142
  }
1092
1143
  /**
@@ -2184,4 +2235,4 @@ declare const generateId: (size?: number | undefined) => string;
2184
2235
  */
2185
2236
  declare const nanoid: (size?: number | undefined) => string;
2186
2237
 
2187
- export { AIStream, AIStreamCallbacksAndOptions, AIStreamParser, AIStreamParserOptions, AWSBedrockAnthropicMessagesStream, AWSBedrockAnthropicStream, AWSBedrockCohereStream, AWSBedrockLlama2Stream, AWSBedrockStream, AnthropicStream, AssistantContent, AssistantResponse, CallWarning, CohereStream, CompletionTokenUsage, CompletionUsage, CoreAssistantMessage, CoreMessage, CoreSystemMessage, CoreTool, CoreToolChoice, CoreToolMessage, CoreUserMessage, DataContent, EmbedManyResult, EmbedResult, Embedding, EmbeddingModel, EmbeddingTokenUsage, ExperimentalAssistantMessage, ExperimentalMessage, ExperimentalTool, ExperimentalToolMessage, ExperimentalUserMessage, FinishReason, FunctionCallPayload, GenerateObjectResult, GenerateTextResult, GoogleGenerativeAIStream, HuggingFaceStream, ImagePart, InkeepAIStreamCallbacksAndOptions, InkeepChatResultCallbacks, InkeepOnFinalMetadata, InkeepStream, InvalidMessageRoleError, InvalidModelIdError, langchainAdapter as LangChainAdapter, LangChainStream, LanguageModel, LogProbs, MistralStream, NoSuchModelError, NoSuchProviderError, ObjectStreamInputPart, ObjectStreamPart, OpenAIStream, OpenAIStreamCallbacks, ReplicateStream, StreamData, StreamObjectResult, StreamTextResult, StreamingTextResponse, TextPart$1 as TextPart, TextStreamPart, TokenUsage, ToolCallPart, ToolCallPayload, ToolContent, ToolResultPart, UserContent, convertDataContentToBase64String, convertDataContentToUint8Array, convertToCoreMessages, cosineSimilarity, createCallbacksTransformer, createEventStreamTransformer, createStreamDataTransformer, embed, embedMany, experimental_AssistantResponse, experimental_ModelRegistry, experimental_ProviderRegistry, experimental_StreamData, experimental_createModelRegistry, experimental_createProviderRegistry, experimental_generateObject, experimental_generateText, experimental_streamObject, experimental_streamText, generateId, generateObject, generateText, nanoid, readableFromAsyncIterable, streamObject, streamText, streamToResponse, tool, trimStartOfStreamHelper };
2238
+ export { AIStream, AIStreamCallbacksAndOptions, AIStreamParser, AIStreamParserOptions, AWSBedrockAnthropicMessagesStream, AWSBedrockAnthropicStream, AWSBedrockCohereStream, AWSBedrockLlama2Stream, AWSBedrockStream, AnthropicStream, AssistantContent, AssistantResponse, CallWarning, CohereStream, CompletionTokenUsage, CompletionUsage, CoreAssistantMessage, CoreMessage, CoreSystemMessage, CoreTool, CoreToolChoice, CoreToolMessage, CoreUserMessage, DataContent, EmbedManyResult, EmbedResult, Embedding, EmbeddingModel, EmbeddingTokenUsage, ExperimentalAssistantMessage, ExperimentalMessage, ExperimentalTool, ExperimentalToolMessage, ExperimentalUserMessage, FinishReason, FunctionCallPayload, GenerateObjectResult, GenerateTextResult, GoogleGenerativeAIStream, HuggingFaceStream, ImagePart, InkeepAIStreamCallbacksAndOptions, InkeepChatResultCallbacks, InkeepOnFinalMetadata, InkeepStream, InvalidMessageRoleError, InvalidModelIdError, langchainAdapter as LangChainAdapter, LangChainStream, LanguageModel, LogProbs, MistralStream, NoSuchModelError, NoSuchProviderError, ObjectStreamInputPart, ObjectStreamPart, OpenAIStream, OpenAIStreamCallbacks, ReplicateStream, StreamData, StreamObjectResult, StreamTextResult, StreamingTextResponse, TextPart$1 as TextPart, TextStreamPart, TokenUsage, ToolCallPart, ToolCallPayload, ToolContent, ToolResultPart, UserContent, convertDataContentToBase64String, convertDataContentToUint8Array, convertToCoreMessages, convertUint8ArrayToText, cosineSimilarity, createCallbacksTransformer, createEventStreamTransformer, createStreamDataTransformer, embed, embedMany, experimental_AssistantResponse, experimental_ModelRegistry, experimental_ProviderRegistry, experimental_StreamData, experimental_createModelRegistry, experimental_createProviderRegistry, experimental_generateObject, experimental_generateText, experimental_streamObject, experimental_streamText, generateId, generateObject, generateText, nanoid, readableFromAsyncIterable, streamObject, streamText, streamToResponse, tool, trimStartOfStreamHelper };
package/dist/index.js CHANGED
@@ -78,6 +78,7 @@ __export(streams_exports, {
78
78
  convertDataContentToBase64String: () => convertDataContentToBase64String,
79
79
  convertDataContentToUint8Array: () => convertDataContentToUint8Array,
80
80
  convertToCoreMessages: () => convertToCoreMessages,
81
+ convertUint8ArrayToText: () => convertUint8ArrayToText,
81
82
  cosineSimilarity: () => cosineSimilarity,
82
83
  createCallbacksTransformer: () => createCallbacksTransformer,
83
84
  createEventStreamTransformer: () => createEventStreamTransformer,
@@ -296,7 +297,7 @@ function convertDataContentToUint8Array(content) {
296
297
  return (0, import_provider_utils2.convertBase64ToUint8Array)(content);
297
298
  } catch (error) {
298
299
  throw new import_provider2.InvalidDataContentError({
299
- message: "Invalid data content. Content string is not a base64-encoded image.",
300
+ message: "Invalid data content. Content string is not a base64-encoded media.",
300
301
  content,
301
302
  cause: error
302
303
  });
@@ -307,6 +308,13 @@ function convertDataContentToUint8Array(content) {
307
308
  }
308
309
  throw new import_provider2.InvalidDataContentError({ content });
309
310
  }
311
+ function convertUint8ArrayToText(uint8Array) {
312
+ try {
313
+ return new TextDecoder().decode(uint8Array);
314
+ } catch (error) {
315
+ throw new Error("Error decoding Uint8Array to text");
316
+ }
317
+ }
310
318
 
311
319
  // core/prompt/invalid-message-role-error.ts
312
320
  var InvalidMessageRoleError = class extends Error {
@@ -1428,7 +1436,7 @@ async function generateText({
1428
1436
  },
1429
1437
  tracer,
1430
1438
  fn: async (span) => {
1431
- var _a2, _b, _c;
1439
+ var _a2, _b, _c, _d;
1432
1440
  const retry = retryWithExponentialBackoff({ maxRetries });
1433
1441
  const validatedPrompt = getValidatedPrompt({
1434
1442
  system,
@@ -1444,10 +1452,11 @@ async function generateText({
1444
1452
  let currentModelResponse;
1445
1453
  let currentToolCalls = [];
1446
1454
  let currentToolResults = [];
1447
- let roundtrips = 0;
1455
+ let roundtripCount = 0;
1448
1456
  const responseMessages = [];
1457
+ const roundtrips = [];
1449
1458
  do {
1450
- const currentInputFormat = roundtrips === 0 ? validatedPrompt.type : "messages";
1459
+ const currentInputFormat = roundtripCount === 0 ? validatedPrompt.type : "messages";
1451
1460
  currentModelResponse = await retry(
1452
1461
  () => recordSpan({
1453
1462
  name: "ai.generateText.doGenerate",
@@ -1485,9 +1494,18 @@ async function generateText({
1485
1494
  tools,
1486
1495
  tracer
1487
1496
  });
1488
- const newResponseMessages = toResponseMessages({
1497
+ roundtrips.push({
1489
1498
  text: (_b = currentModelResponse.text) != null ? _b : "",
1490
1499
  toolCalls: currentToolCalls,
1500
+ toolResults: currentToolResults,
1501
+ finishReason: currentModelResponse.finishReason,
1502
+ usage: calculateCompletionTokenUsage(currentModelResponse.usage),
1503
+ warnings: currentModelResponse.warnings,
1504
+ logprobs: currentModelResponse.logprobs
1505
+ });
1506
+ const newResponseMessages = toResponseMessages({
1507
+ text: (_c = currentModelResponse.text) != null ? _c : "",
1508
+ toolCalls: currentToolCalls,
1491
1509
  toolResults: currentToolResults
1492
1510
  });
1493
1511
  responseMessages.push(...newResponseMessages);
@@ -1498,7 +1516,7 @@ async function generateText({
1498
1516
  // there are tool calls:
1499
1517
  currentToolCalls.length > 0 && // all current tool calls have results:
1500
1518
  currentToolResults.length === currentToolCalls.length && // the number of roundtrips is less than the maximum:
1501
- roundtrips++ < maxToolRoundtrips
1519
+ roundtripCount++ < maxToolRoundtrips
1502
1520
  );
1503
1521
  span.setAttributes({
1504
1522
  "ai.finishReason": currentModelResponse.finishReason,
@@ -1511,7 +1529,7 @@ async function generateText({
1511
1529
  // Always return a string so that the caller doesn't have to check for undefined.
1512
1530
  // If they need to check if the model did not return any text,
1513
1531
  // they can check the length of the string:
1514
- text: (_c = currentModelResponse.text) != null ? _c : "",
1532
+ text: (_d = currentModelResponse.text) != null ? _d : "",
1515
1533
  toolCalls: currentToolCalls,
1516
1534
  toolResults: currentToolResults,
1517
1535
  finishReason: currentModelResponse.finishReason,
@@ -1519,7 +1537,8 @@ async function generateText({
1519
1537
  warnings: currentModelResponse.warnings,
1520
1538
  rawResponse: currentModelResponse.rawResponse,
1521
1539
  logprobs: currentModelResponse.logprobs,
1522
- responseMessages
1540
+ responseMessages,
1541
+ roundtrips
1523
1542
  });
1524
1543
  }
1525
1544
  });
@@ -1577,6 +1596,7 @@ var GenerateTextResult = class {
1577
1596
  this.rawResponse = options.rawResponse;
1578
1597
  this.logprobs = options.logprobs;
1579
1598
  this.responseMessages = options.responseMessages;
1599
+ this.roundtrips = options.roundtrips;
1580
1600
  }
1581
1601
  };
1582
1602
  function toResponseMessages({
@@ -2174,13 +2194,79 @@ var StreamTextResult = class {
2174
2194
  };
2175
2195
  var experimental_streamText = streamText;
2176
2196
 
2197
+ // core/prompt/attachments-to-parts.ts
2198
+ function attachmentsToParts(attachments) {
2199
+ var _a, _b, _c;
2200
+ const parts = [];
2201
+ for (const attachment of attachments) {
2202
+ let url;
2203
+ try {
2204
+ url = new URL(attachment.url);
2205
+ } catch (error) {
2206
+ throw new Error(`Invalid URL: ${attachment.url}`);
2207
+ }
2208
+ switch (url.protocol) {
2209
+ case "http:":
2210
+ case "https:": {
2211
+ if ((_a = attachment.contentType) == null ? void 0 : _a.startsWith("image/")) {
2212
+ parts.push({ type: "image", image: url });
2213
+ }
2214
+ break;
2215
+ }
2216
+ case "data:": {
2217
+ let header;
2218
+ let base64Content;
2219
+ let mimeType;
2220
+ try {
2221
+ [header, base64Content] = attachment.url.split(",");
2222
+ mimeType = header.split(";")[0].split(":")[1];
2223
+ } catch (error) {
2224
+ throw new Error(`Error processing data URL: ${attachment.url}`);
2225
+ }
2226
+ if (mimeType == null || base64Content == null) {
2227
+ throw new Error(`Invalid data URL format: ${attachment.url}`);
2228
+ }
2229
+ if ((_b = attachment.contentType) == null ? void 0 : _b.startsWith("image/")) {
2230
+ parts.push({
2231
+ type: "image",
2232
+ image: convertDataContentToUint8Array(base64Content)
2233
+ });
2234
+ } else if ((_c = attachment.contentType) == null ? void 0 : _c.startsWith("text/")) {
2235
+ parts.push({
2236
+ type: "text",
2237
+ text: convertUint8ArrayToText(
2238
+ convertDataContentToUint8Array(base64Content)
2239
+ )
2240
+ });
2241
+ }
2242
+ break;
2243
+ }
2244
+ default: {
2245
+ throw new Error(`Unsupported URL protocol: ${url.protocol}`);
2246
+ }
2247
+ }
2248
+ }
2249
+ return parts;
2250
+ }
2251
+
2177
2252
  // core/prompt/convert-to-core-messages.ts
2178
2253
  function convertToCoreMessages(messages) {
2179
2254
  const coreMessages = [];
2180
- for (const { role, content, toolInvocations } of messages) {
2255
+ for (const {
2256
+ role,
2257
+ content,
2258
+ toolInvocations,
2259
+ experimental_attachments
2260
+ } of messages) {
2181
2261
  switch (role) {
2182
2262
  case "user": {
2183
- coreMessages.push({ role: "user", content });
2263
+ coreMessages.push({
2264
+ role: "user",
2265
+ content: experimental_attachments ? [
2266
+ { type: "text", text: content },
2267
+ ...attachmentsToParts(experimental_attachments)
2268
+ ] : content
2269
+ });
2184
2270
  break;
2185
2271
  }
2186
2272
  case "assistant": {
@@ -3524,6 +3610,7 @@ var nanoid = import_provider_utils7.generateId;
3524
3610
  convertDataContentToBase64String,
3525
3611
  convertDataContentToUint8Array,
3526
3612
  convertToCoreMessages,
3613
+ convertUint8ArrayToText,
3527
3614
  cosineSimilarity,
3528
3615
  createCallbacksTransformer,
3529
3616
  createEventStreamTransformer,