ai 4.1.19 → 4.1.21

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/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # ai
2
2
 
3
+ ## 4.1.21
4
+
5
+ ### Patch Changes
6
+
7
+ - d387989: feat (ai/core): re-export zodSchema
8
+
9
+ ## 4.1.20
10
+
11
+ ### Patch Changes
12
+
13
+ - bcc61d4: feat (ui): introduce message parts for useChat
14
+ - Updated dependencies [bcc61d4]
15
+ - @ai-sdk/ui-utils@1.1.10
16
+ - @ai-sdk/react@1.1.10
17
+
3
18
  ## 4.1.19
4
19
 
5
20
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { IDGenerator } from '@ai-sdk/provider-utils';
2
2
  export { CoreToolCall, CoreToolResult, IDGenerator, ToolCall, ToolResult, createIdGenerator, generateId } from '@ai-sdk/provider-utils';
3
- import { DataStreamString, ToolInvocation, Attachment, Schema, DeepPartial, Message, JSONValue as JSONValue$1, AssistantMessage, DataMessage } from '@ai-sdk/ui-utils';
4
- export { AssistantMessage, AssistantStatus, Attachment, ChatRequest, ChatRequestOptions, CreateMessage, DataMessage, DataStreamPart, DeepPartial, IdGenerator, JSONValue, Message, RequestOptions, Schema, ToolInvocation, UseAssistantOptions, formatAssistantStreamPart, formatDataStreamPart, jsonSchema, parseAssistantStreamPart, parseDataStreamPart, processDataStream, processTextStream } from '@ai-sdk/ui-utils';
3
+ import { DataStreamString, Message, Schema, DeepPartial, JSONValue as JSONValue$1, AssistantMessage, DataMessage } from '@ai-sdk/ui-utils';
4
+ export { AssistantMessage, AssistantStatus, Attachment, ChatRequest, ChatRequestOptions, CreateMessage, DataMessage, DataStreamPart, DeepPartial, IdGenerator, JSONValue, Message, RequestOptions, Schema, ToolInvocation, UseAssistantOptions, formatAssistantStreamPart, formatDataStreamPart, jsonSchema, parseAssistantStreamPart, parseDataStreamPart, processDataStream, processTextStream, zodSchema } from '@ai-sdk/ui-utils';
5
5
  import { JSONValue, EmbeddingModelV1, EmbeddingModelV1Embedding, ImageModelV1, ImageModelV1CallWarning, LanguageModelV1, LanguageModelV1FinishReason, LanguageModelV1LogProbs, LanguageModelV1CallWarning, LanguageModelV1ProviderMetadata, LanguageModelV1CallOptions, AISDKError, LanguageModelV1FunctionToolCall, JSONSchema7, ProviderV1, NoSuchModelError } from '@ai-sdk/provider';
6
6
  export { AISDKError, APICallError, EmptyResponseBodyError, InvalidPromptError, InvalidResponseDataError, JSONParseError, LanguageModelV1, LanguageModelV1CallOptions, LanguageModelV1Prompt, LanguageModelV1StreamPart, LoadAPIKeyError, NoContentGeneratedError, NoSuchModelError, TypeValidationError, UnsupportedFunctionalityError } from '@ai-sdk/provider';
7
7
  import { ServerResponse } from 'node:http';
@@ -838,13 +838,6 @@ It can be a user message, an assistant message, or a tool message.
838
838
  type CoreMessage = CoreSystemMessage | CoreUserMessage | CoreAssistantMessage | CoreToolMessage;
839
839
  declare const coreMessageSchema: z.ZodType<CoreMessage>;
840
840
 
841
- type UIMessage = {
842
- role: 'system' | 'user' | 'assistant' | 'data';
843
- content: string;
844
- toolInvocations?: ToolInvocation[];
845
- experimental_attachments?: Attachment[];
846
- };
847
-
848
841
  /**
849
842
  Prompt part of the AI function options.
850
843
  It contains a system message, a simple text prompt, or a list of messages.
@@ -861,7 +854,7 @@ type Prompt = {
861
854
  /**
862
855
  A list of messages. You can either use `prompt` or `messages` but not both.
863
856
  */
864
- messages?: Array<CoreMessage> | Array<UIMessage>;
857
+ messages?: Array<CoreMessage> | Array<Omit<Message, 'id'>>;
865
858
  };
866
859
 
867
860
  /**
@@ -1711,16 +1704,22 @@ type StepResult<TOOLS extends ToolSet> = {
1711
1704
  *
1712
1705
  * @returns A new Message[] with the response messages appended.
1713
1706
  */
1714
- declare function appendResponseMessages({ messages, responseMessages, }: {
1707
+ declare function appendResponseMessages({ messages, responseMessages, _internal: { currentDate }, }: {
1715
1708
  messages: Message[];
1716
1709
  responseMessages: ResponseMessage[];
1710
+ /**
1711
+ Internal. For test use only. May change without notice.
1712
+ */
1713
+ _internal?: {
1714
+ currentDate?: () => Date;
1715
+ };
1717
1716
  }): Message[];
1718
1717
 
1719
1718
  /**
1720
1719
  Converts an array of messages from useChat into an array of CoreMessages that can be used
1721
1720
  with the AI core functions (e.g. `streamText`).
1722
1721
  */
1723
- declare function convertToCoreMessages<TOOLS extends ToolSet = never>(messages: Array<UIMessage>, options?: {
1722
+ declare function convertToCoreMessages<TOOLS extends ToolSet = never>(messages: Array<Omit<Message, 'id'>>, options?: {
1724
1723
  tools?: TOOLS;
1725
1724
  }): CoreMessage[];
1726
1725
 
@@ -2750,9 +2749,9 @@ declare class InvalidMessageRoleError extends AISDKError {
2750
2749
  declare const symbol$2: unique symbol;
2751
2750
  declare class MessageConversionError extends AISDKError {
2752
2751
  private readonly [symbol$2];
2753
- readonly originalMessage: UIMessage;
2752
+ readonly originalMessage: Omit<Message, 'id'>;
2754
2753
  constructor({ originalMessage, message, }: {
2755
- originalMessage: UIMessage;
2754
+ originalMessage: Omit<Message, 'id'>;
2756
2755
  message: string;
2757
2756
  });
2758
2757
  static isInstance(error: unknown): error is MessageConversionError;
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { IDGenerator } from '@ai-sdk/provider-utils';
2
2
  export { CoreToolCall, CoreToolResult, IDGenerator, ToolCall, ToolResult, createIdGenerator, generateId } from '@ai-sdk/provider-utils';
3
- import { DataStreamString, ToolInvocation, Attachment, Schema, DeepPartial, Message, JSONValue as JSONValue$1, AssistantMessage, DataMessage } from '@ai-sdk/ui-utils';
4
- export { AssistantMessage, AssistantStatus, Attachment, ChatRequest, ChatRequestOptions, CreateMessage, DataMessage, DataStreamPart, DeepPartial, IdGenerator, JSONValue, Message, RequestOptions, Schema, ToolInvocation, UseAssistantOptions, formatAssistantStreamPart, formatDataStreamPart, jsonSchema, parseAssistantStreamPart, parseDataStreamPart, processDataStream, processTextStream } from '@ai-sdk/ui-utils';
3
+ import { DataStreamString, Message, Schema, DeepPartial, JSONValue as JSONValue$1, AssistantMessage, DataMessage } from '@ai-sdk/ui-utils';
4
+ export { AssistantMessage, AssistantStatus, Attachment, ChatRequest, ChatRequestOptions, CreateMessage, DataMessage, DataStreamPart, DeepPartial, IdGenerator, JSONValue, Message, RequestOptions, Schema, ToolInvocation, UseAssistantOptions, formatAssistantStreamPart, formatDataStreamPart, jsonSchema, parseAssistantStreamPart, parseDataStreamPart, processDataStream, processTextStream, zodSchema } from '@ai-sdk/ui-utils';
5
5
  import { JSONValue, EmbeddingModelV1, EmbeddingModelV1Embedding, ImageModelV1, ImageModelV1CallWarning, LanguageModelV1, LanguageModelV1FinishReason, LanguageModelV1LogProbs, LanguageModelV1CallWarning, LanguageModelV1ProviderMetadata, LanguageModelV1CallOptions, AISDKError, LanguageModelV1FunctionToolCall, JSONSchema7, ProviderV1, NoSuchModelError } from '@ai-sdk/provider';
6
6
  export { AISDKError, APICallError, EmptyResponseBodyError, InvalidPromptError, InvalidResponseDataError, JSONParseError, LanguageModelV1, LanguageModelV1CallOptions, LanguageModelV1Prompt, LanguageModelV1StreamPart, LoadAPIKeyError, NoContentGeneratedError, NoSuchModelError, TypeValidationError, UnsupportedFunctionalityError } from '@ai-sdk/provider';
7
7
  import { ServerResponse } from 'node:http';
@@ -838,13 +838,6 @@ It can be a user message, an assistant message, or a tool message.
838
838
  type CoreMessage = CoreSystemMessage | CoreUserMessage | CoreAssistantMessage | CoreToolMessage;
839
839
  declare const coreMessageSchema: z.ZodType<CoreMessage>;
840
840
 
841
- type UIMessage = {
842
- role: 'system' | 'user' | 'assistant' | 'data';
843
- content: string;
844
- toolInvocations?: ToolInvocation[];
845
- experimental_attachments?: Attachment[];
846
- };
847
-
848
841
  /**
849
842
  Prompt part of the AI function options.
850
843
  It contains a system message, a simple text prompt, or a list of messages.
@@ -861,7 +854,7 @@ type Prompt = {
861
854
  /**
862
855
  A list of messages. You can either use `prompt` or `messages` but not both.
863
856
  */
864
- messages?: Array<CoreMessage> | Array<UIMessage>;
857
+ messages?: Array<CoreMessage> | Array<Omit<Message, 'id'>>;
865
858
  };
866
859
 
867
860
  /**
@@ -1711,16 +1704,22 @@ type StepResult<TOOLS extends ToolSet> = {
1711
1704
  *
1712
1705
  * @returns A new Message[] with the response messages appended.
1713
1706
  */
1714
- declare function appendResponseMessages({ messages, responseMessages, }: {
1707
+ declare function appendResponseMessages({ messages, responseMessages, _internal: { currentDate }, }: {
1715
1708
  messages: Message[];
1716
1709
  responseMessages: ResponseMessage[];
1710
+ /**
1711
+ Internal. For test use only. May change without notice.
1712
+ */
1713
+ _internal?: {
1714
+ currentDate?: () => Date;
1715
+ };
1717
1716
  }): Message[];
1718
1717
 
1719
1718
  /**
1720
1719
  Converts an array of messages from useChat into an array of CoreMessages that can be used
1721
1720
  with the AI core functions (e.g. `streamText`).
1722
1721
  */
1723
- declare function convertToCoreMessages<TOOLS extends ToolSet = never>(messages: Array<UIMessage>, options?: {
1722
+ declare function convertToCoreMessages<TOOLS extends ToolSet = never>(messages: Array<Omit<Message, 'id'>>, options?: {
1724
1723
  tools?: TOOLS;
1725
1724
  }): CoreMessage[];
1726
1725
 
@@ -2750,9 +2749,9 @@ declare class InvalidMessageRoleError extends AISDKError {
2750
2749
  declare const symbol$2: unique symbol;
2751
2750
  declare class MessageConversionError extends AISDKError {
2752
2751
  private readonly [symbol$2];
2753
- readonly originalMessage: UIMessage;
2752
+ readonly originalMessage: Omit<Message, 'id'>;
2754
2753
  constructor({ originalMessage, message, }: {
2755
- originalMessage: UIMessage;
2754
+ originalMessage: Omit<Message, 'id'>;
2756
2755
  message: string;
2757
2756
  });
2758
2757
  static isInstance(error: unknown): error is MessageConversionError;
package/dist/index.js CHANGED
@@ -86,7 +86,8 @@ __export(streams_exports, {
86
86
  streamObject: () => streamObject,
87
87
  streamText: () => streamText,
88
88
  tool: () => tool,
89
- wrapLanguageModel: () => wrapLanguageModel
89
+ wrapLanguageModel: () => wrapLanguageModel,
90
+ zodSchema: () => import_ui_utils10.zodSchema
90
91
  });
91
92
  module.exports = __toCommonJS(streams_exports);
92
93
 
@@ -1594,13 +1595,13 @@ _a8 = symbol8;
1594
1595
 
1595
1596
  // core/prompt/convert-to-core-messages.ts
1596
1597
  function convertToCoreMessages(messages, options) {
1597
- var _a15;
1598
+ var _a15, _b;
1598
1599
  const tools = (_a15 = options == null ? void 0 : options.tools) != null ? _a15 : {};
1599
1600
  const coreMessages = [];
1600
1601
  for (let i = 0; i < messages.length; i++) {
1601
1602
  const message = messages[i];
1602
1603
  const isLastMessage = i === messages.length - 1;
1603
- const { role, content, toolInvocations, experimental_attachments } = message;
1604
+ const { role, content, experimental_attachments } = message;
1604
1605
  switch (role) {
1605
1606
  case "system": {
1606
1607
  coreMessages.push({
@@ -1620,6 +1621,92 @@ function convertToCoreMessages(messages, options) {
1620
1621
  break;
1621
1622
  }
1622
1623
  case "assistant": {
1624
+ if (message.parts != null) {
1625
+ let processBlock2 = function() {
1626
+ coreMessages.push({
1627
+ role: "assistant",
1628
+ content: block.map((part) => {
1629
+ switch (part.type) {
1630
+ case "text":
1631
+ return {
1632
+ type: "text",
1633
+ text: part.text
1634
+ };
1635
+ default:
1636
+ return {
1637
+ type: "tool-call",
1638
+ toolCallId: part.toolInvocation.toolCallId,
1639
+ toolName: part.toolInvocation.toolName,
1640
+ args: part.toolInvocation.args
1641
+ };
1642
+ }
1643
+ })
1644
+ });
1645
+ const stepInvocations = block.filter(
1646
+ (part) => part.type === "tool-invocation"
1647
+ ).map((part) => part.toolInvocation);
1648
+ if (stepInvocations.length > 0) {
1649
+ coreMessages.push({
1650
+ role: "tool",
1651
+ content: stepInvocations.map(
1652
+ (toolInvocation) => {
1653
+ if (!("result" in toolInvocation)) {
1654
+ throw new MessageConversionError({
1655
+ originalMessage: message,
1656
+ message: "ToolInvocation must have a result: " + JSON.stringify(toolInvocation)
1657
+ });
1658
+ }
1659
+ const { toolCallId, toolName, result } = toolInvocation;
1660
+ const tool2 = tools[toolName];
1661
+ return (tool2 == null ? void 0 : tool2.experimental_toToolResultContent) != null ? {
1662
+ type: "tool-result",
1663
+ toolCallId,
1664
+ toolName,
1665
+ result: tool2.experimental_toToolResultContent(result),
1666
+ experimental_content: tool2.experimental_toToolResultContent(result)
1667
+ } : {
1668
+ type: "tool-result",
1669
+ toolCallId,
1670
+ toolName,
1671
+ result
1672
+ };
1673
+ }
1674
+ )
1675
+ });
1676
+ }
1677
+ block = [];
1678
+ blockHasToolInvocations = false;
1679
+ currentStep++;
1680
+ };
1681
+ var processBlock = processBlock2;
1682
+ let currentStep = 0;
1683
+ let blockHasToolInvocations = false;
1684
+ let block = [];
1685
+ for (const part of message.parts) {
1686
+ switch (part.type) {
1687
+ case "reasoning":
1688
+ break;
1689
+ case "text": {
1690
+ if (blockHasToolInvocations) {
1691
+ processBlock2();
1692
+ }
1693
+ block.push(part);
1694
+ break;
1695
+ }
1696
+ case "tool-invocation": {
1697
+ if (((_b = part.toolInvocation.step) != null ? _b : 0) !== currentStep) {
1698
+ processBlock2();
1699
+ }
1700
+ block.push(part);
1701
+ blockHasToolInvocations = true;
1702
+ break;
1703
+ }
1704
+ }
1705
+ }
1706
+ processBlock2();
1707
+ break;
1708
+ }
1709
+ const toolInvocations = message.toolInvocations;
1623
1710
  if (toolInvocations == null || toolInvocations.length === 0) {
1624
1711
  coreMessages.push({ role: "assistant", content });
1625
1712
  break;
@@ -5816,16 +5903,17 @@ function appendClientMessage({
5816
5903
  var import_ui_utils9 = require("@ai-sdk/ui-utils");
5817
5904
  function appendResponseMessages({
5818
5905
  messages,
5819
- responseMessages
5906
+ responseMessages,
5907
+ _internal: { currentDate = () => /* @__PURE__ */ new Date() } = {}
5820
5908
  }) {
5821
- var _a15, _b;
5909
+ var _a15, _b, _c, _d;
5822
5910
  const clonedMessages = structuredClone(messages);
5823
5911
  for (const message of responseMessages) {
5824
5912
  const role = message.role;
5825
5913
  const lastMessage = clonedMessages[clonedMessages.length - 1];
5826
5914
  const isLastMessageAssistant = lastMessage.role === "assistant";
5827
5915
  switch (role) {
5828
- case "assistant": {
5916
+ case "assistant":
5829
5917
  let getToolInvocations2 = function(step) {
5830
5918
  return (typeof message.content === "string" ? [] : message.content.filter((part) => part.type === "tool-call")).map((call) => ({
5831
5919
  state: "call",
@@ -5841,40 +5929,71 @@ function appendResponseMessages({
5841
5929
  const maxStep = (0, import_ui_utils9.extractMaxToolInvocationStep)(
5842
5930
  lastMessage.toolInvocations
5843
5931
  );
5932
+ (_a15 = lastMessage.parts) != null ? _a15 : lastMessage.parts = [];
5844
5933
  lastMessage.content = textContent;
5934
+ if (textContent.length > 0) {
5935
+ lastMessage.parts.push({
5936
+ type: "text",
5937
+ text: textContent
5938
+ });
5939
+ }
5845
5940
  lastMessage.toolInvocations = [
5846
- ...(_a15 = lastMessage.toolInvocations) != null ? _a15 : [],
5941
+ ...(_b = lastMessage.toolInvocations) != null ? _b : [],
5847
5942
  ...getToolInvocations2(maxStep === void 0 ? 0 : maxStep + 1)
5848
5943
  ];
5944
+ getToolInvocations2(maxStep === void 0 ? 0 : maxStep + 1).map((call) => ({
5945
+ type: "tool-invocation",
5946
+ toolInvocation: call
5947
+ })).forEach((part) => {
5948
+ lastMessage.parts.push(part);
5949
+ });
5849
5950
  } else {
5850
5951
  clonedMessages.push({
5851
5952
  role: "assistant",
5852
5953
  id: message.id,
5853
- createdAt: /* @__PURE__ */ new Date(),
5954
+ createdAt: currentDate(),
5854
5955
  // generate a createdAt date for the message, will be overridden by the client
5855
5956
  content: textContent,
5856
- toolInvocations: getToolInvocations2(0)
5957
+ toolInvocations: getToolInvocations2(0),
5958
+ parts: [
5959
+ ...textContent.length > 0 ? [{ type: "text", text: textContent }] : [],
5960
+ ...getToolInvocations2(0).map((call) => ({
5961
+ type: "tool-invocation",
5962
+ toolInvocation: call
5963
+ }))
5964
+ ]
5857
5965
  });
5858
5966
  }
5859
5967
  break;
5860
- }
5861
5968
  case "tool": {
5862
- (_b = lastMessage.toolInvocations) != null ? _b : lastMessage.toolInvocations = [];
5969
+ (_c = lastMessage.toolInvocations) != null ? _c : lastMessage.toolInvocations = [];
5863
5970
  if (lastMessage.role !== "assistant") {
5864
5971
  throw new Error(
5865
5972
  `Tool result must follow an assistant message: ${lastMessage.role}`
5866
5973
  );
5867
5974
  }
5868
- for (const part of message.content) {
5975
+ (_d = lastMessage.parts) != null ? _d : lastMessage.parts = [];
5976
+ for (const contentPart of message.content) {
5869
5977
  const toolCall = lastMessage.toolInvocations.find(
5870
- (call) => call.toolCallId === part.toolCallId
5978
+ (call) => call.toolCallId === contentPart.toolCallId
5979
+ );
5980
+ const toolCallPart = lastMessage.parts.find(
5981
+ (part) => part.type === "tool-invocation" && part.toolInvocation.toolCallId === contentPart.toolCallId
5871
5982
  );
5872
5983
  if (!toolCall) {
5873
5984
  throw new Error("Tool call not found in previous message");
5874
5985
  }
5875
5986
  toolCall.state = "result";
5876
5987
  const toolResult = toolCall;
5877
- toolResult.result = part.result;
5988
+ toolResult.result = contentPart.result;
5989
+ if (toolCallPart) {
5990
+ toolCallPart.toolInvocation = toolResult;
5991
+ } else {
5992
+ lastMessage.parts.push({
5993
+ type: "tool-invocation",
5994
+ toolInvocation: toolResult
5995
+ });
5996
+ }
5878
5997
  }
5879
5998
  break;
5880
5999
  }
@@ -6496,6 +6615,7 @@ var StreamData = class {
6496
6615
  streamObject,
6497
6616
  streamText,
6498
6617
  tool,
6499
- wrapLanguageModel
6618
+ wrapLanguageModel,
6619
+ zodSchema
6500
6620
  });
6501
6621
  //# sourceMappingURL=index.js.map