ai 4.1.10 → 4.1.12

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
@@ -1150,13 +1150,14 @@ async function convertToLanguageModelPrompt({
1150
1150
  ];
1151
1151
  }
1152
1152
  function convertToLanguageModelMessage(message, downloadedAssets) {
1153
+ var _a15, _b, _c, _d, _e, _f;
1153
1154
  const role = message.role;
1154
1155
  switch (role) {
1155
1156
  case "system": {
1156
1157
  return {
1157
1158
  role: "system",
1158
1159
  content: message.content,
1159
- providerMetadata: message.experimental_providerMetadata
1160
+ providerMetadata: (_a15 = message.providerOptions) != null ? _a15 : message.experimental_providerMetadata
1160
1161
  };
1161
1162
  }
1162
1163
  case "user": {
@@ -1164,13 +1165,13 @@ function convertToLanguageModelMessage(message, downloadedAssets) {
1164
1165
  return {
1165
1166
  role: "user",
1166
1167
  content: [{ type: "text", text: message.content }],
1167
- providerMetadata: message.experimental_providerMetadata
1168
+ providerMetadata: (_b = message.providerOptions) != null ? _b : message.experimental_providerMetadata
1168
1169
  };
1169
1170
  }
1170
1171
  return {
1171
1172
  role: "user",
1172
1173
  content: message.content.map((part) => convertPartToLanguageModelPart(part, downloadedAssets)).filter((part) => part.type !== "text" || part.text !== ""),
1173
- providerMetadata: message.experimental_providerMetadata
1174
+ providerMetadata: (_c = message.providerOptions) != null ? _c : message.experimental_providerMetadata
1174
1175
  };
1175
1176
  }
1176
1177
  case "assistant": {
@@ -1178,7 +1179,7 @@ function convertToLanguageModelMessage(message, downloadedAssets) {
1178
1179
  return {
1179
1180
  role: "assistant",
1180
1181
  content: [{ type: "text", text: message.content }],
1181
- providerMetadata: message.experimental_providerMetadata
1182
+ providerMetadata: (_d = message.providerOptions) != null ? _d : message.experimental_providerMetadata
1182
1183
  };
1183
1184
  }
1184
1185
  return {
@@ -1187,28 +1188,31 @@ function convertToLanguageModelMessage(message, downloadedAssets) {
1187
1188
  // remove empty text parts:
1188
1189
  (part) => part.type !== "text" || part.text !== ""
1189
1190
  ).map((part) => {
1190
- const { experimental_providerMetadata, ...rest } = part;
1191
+ const { experimental_providerMetadata, providerOptions, ...rest } = part;
1191
1192
  return {
1192
1193
  ...rest,
1193
- providerMetadata: experimental_providerMetadata
1194
+ providerMetadata: providerOptions != null ? providerOptions : experimental_providerMetadata
1194
1195
  };
1195
1196
  }),
1196
- providerMetadata: message.experimental_providerMetadata
1197
+ providerMetadata: (_e = message.providerOptions) != null ? _e : message.experimental_providerMetadata
1197
1198
  };
1198
1199
  }
1199
1200
  case "tool": {
1200
1201
  return {
1201
1202
  role: "tool",
1202
- content: message.content.map((part) => ({
1203
- type: "tool-result",
1204
- toolCallId: part.toolCallId,
1205
- toolName: part.toolName,
1206
- result: part.result,
1207
- content: part.experimental_content,
1208
- isError: part.isError,
1209
- providerMetadata: part.experimental_providerMetadata
1210
- })),
1211
- providerMetadata: message.experimental_providerMetadata
1203
+ content: message.content.map((part) => {
1204
+ var _a16;
1205
+ return {
1206
+ type: "tool-result",
1207
+ toolCallId: part.toolCallId,
1208
+ toolName: part.toolName,
1209
+ result: part.result,
1210
+ content: part.experimental_content,
1211
+ isError: part.isError,
1212
+ providerMetadata: (_a16 = part.providerOptions) != null ? _a16 : part.experimental_providerMetadata
1213
+ };
1214
+ }),
1215
+ providerMetadata: (_f = message.providerOptions) != null ? _f : message.experimental_providerMetadata
1212
1216
  };
1213
1217
  }
1214
1218
  default: {
@@ -1543,45 +1547,62 @@ function convertToCoreMessages(messages, options) {
1543
1547
  coreMessages.push({ role: "assistant", content });
1544
1548
  break;
1545
1549
  }
1546
- coreMessages.push({
1547
- role: "assistant",
1548
- content: [
1549
- { type: "text", text: content },
1550
- ...toolInvocations.map(
1551
- ({ toolCallId, toolName, args }) => ({
1552
- type: "tool-call",
1550
+ const maxStep = toolInvocations.reduce((max, toolInvocation) => {
1551
+ var _a16;
1552
+ return Math.max(max, (_a16 = toolInvocation.step) != null ? _a16 : 0);
1553
+ }, 0);
1554
+ for (let i = 0; i <= maxStep; i++) {
1555
+ const stepInvocations = toolInvocations.filter(
1556
+ (toolInvocation) => {
1557
+ var _a16;
1558
+ return ((_a16 = toolInvocation.step) != null ? _a16 : 0) === i;
1559
+ }
1560
+ );
1561
+ if (stepInvocations.length === 0) {
1562
+ continue;
1563
+ }
1564
+ coreMessages.push({
1565
+ role: "assistant",
1566
+ content: [
1567
+ ...stepInvocations.map(
1568
+ ({ toolCallId, toolName, args }) => ({
1569
+ type: "tool-call",
1570
+ toolCallId,
1571
+ toolName,
1572
+ args
1573
+ })
1574
+ )
1575
+ ]
1576
+ });
1577
+ coreMessages.push({
1578
+ role: "tool",
1579
+ content: stepInvocations.map((toolInvocation) => {
1580
+ if (!("result" in toolInvocation)) {
1581
+ throw new MessageConversionError({
1582
+ originalMessage: message,
1583
+ message: "ToolInvocation must have a result: " + JSON.stringify(toolInvocation)
1584
+ });
1585
+ }
1586
+ const { toolCallId, toolName, result } = toolInvocation;
1587
+ const tool2 = tools[toolName];
1588
+ return (tool2 == null ? void 0 : tool2.experimental_toToolResultContent) != null ? {
1589
+ type: "tool-result",
1553
1590
  toolCallId,
1554
1591
  toolName,
1555
- args
1556
- })
1557
- )
1558
- ]
1559
- });
1560
- coreMessages.push({
1561
- role: "tool",
1562
- content: toolInvocations.map((toolInvocation) => {
1563
- if (!("result" in toolInvocation)) {
1564
- throw new MessageConversionError({
1565
- originalMessage: message,
1566
- message: "ToolInvocation must have a result: " + JSON.stringify(toolInvocation)
1567
- });
1568
- }
1569
- const { toolCallId, toolName, result } = toolInvocation;
1570
- const tool2 = tools[toolName];
1571
- return (tool2 == null ? void 0 : tool2.experimental_toToolResultContent) != null ? {
1572
- type: "tool-result",
1573
- toolCallId,
1574
- toolName,
1575
- result: tool2.experimental_toToolResultContent(result),
1576
- experimental_content: tool2.experimental_toToolResultContent(result)
1577
- } : {
1578
- type: "tool-result",
1579
- toolCallId,
1580
- toolName,
1581
- result
1582
- };
1583
- })
1584
- });
1592
+ result: tool2.experimental_toToolResultContent(result),
1593
+ experimental_content: tool2.experimental_toToolResultContent(result)
1594
+ } : {
1595
+ type: "tool-result",
1596
+ toolCallId,
1597
+ toolName,
1598
+ result
1599
+ };
1600
+ })
1601
+ });
1602
+ }
1603
+ if (content) {
1604
+ coreMessages.push({ role: "assistant", content });
1605
+ }
1585
1606
  break;
1586
1607
  }
1587
1608
  case "data": {
@@ -1625,7 +1646,7 @@ function detectSingleMessageCharacteristics(message) {
1625
1646
  "experimental_attachments" in message)) {
1626
1647
  return "has-ui-specific-parts";
1627
1648
  } else if (typeof message === "object" && message !== null && "content" in message && (Array.isArray(message.content) || // Core messages can have array content
1628
- "experimental_providerMetadata" in message)) {
1649
+ "experimental_providerMetadata" in message || "providerOptions" in message)) {
1629
1650
  return "has-core-specific-parts";
1630
1651
  } else if (typeof message === "object" && message !== null && "role" in message && "content" in message && typeof message.content === "string" && ["system", "user", "assistant", "tool"].includes(message.role)) {
1631
1652
  return "message";
@@ -1679,25 +1700,30 @@ var toolResultContentSchema = z4.array(
1679
1700
  var textPartSchema = z5.object({
1680
1701
  type: z5.literal("text"),
1681
1702
  text: z5.string(),
1703
+ providerOptions: providerMetadataSchema.optional(),
1682
1704
  experimental_providerMetadata: providerMetadataSchema.optional()
1683
1705
  });
1684
1706
  var imagePartSchema = z5.object({
1685
1707
  type: z5.literal("image"),
1686
1708
  image: z5.union([dataContentSchema, z5.instanceof(URL)]),
1687
1709
  mimeType: z5.string().optional(),
1710
+ providerOptions: providerMetadataSchema.optional(),
1688
1711
  experimental_providerMetadata: providerMetadataSchema.optional()
1689
1712
  });
1690
1713
  var filePartSchema = z5.object({
1691
1714
  type: z5.literal("file"),
1692
1715
  data: z5.union([dataContentSchema, z5.instanceof(URL)]),
1693
1716
  mimeType: z5.string(),
1717
+ providerOptions: providerMetadataSchema.optional(),
1694
1718
  experimental_providerMetadata: providerMetadataSchema.optional()
1695
1719
  });
1696
1720
  var toolCallPartSchema = z5.object({
1697
1721
  type: z5.literal("tool-call"),
1698
1722
  toolCallId: z5.string(),
1699
1723
  toolName: z5.string(),
1700
- args: z5.unknown()
1724
+ args: z5.unknown(),
1725
+ providerOptions: providerMetadataSchema.optional(),
1726
+ experimental_providerMetadata: providerMetadataSchema.optional()
1701
1727
  });
1702
1728
  var toolResultPartSchema = z5.object({
1703
1729
  type: z5.literal("tool-result"),
@@ -1706,6 +1732,7 @@ var toolResultPartSchema = z5.object({
1706
1732
  result: z5.unknown(),
1707
1733
  content: toolResultContentSchema.optional(),
1708
1734
  isError: z5.boolean().optional(),
1735
+ providerOptions: providerMetadataSchema.optional(),
1709
1736
  experimental_providerMetadata: providerMetadataSchema.optional()
1710
1737
  });
1711
1738
 
@@ -1713,6 +1740,7 @@ var toolResultPartSchema = z5.object({
1713
1740
  var coreSystemMessageSchema = z6.object({
1714
1741
  role: z6.literal("system"),
1715
1742
  content: z6.string(),
1743
+ providerOptions: providerMetadataSchema.optional(),
1716
1744
  experimental_providerMetadata: providerMetadataSchema.optional()
1717
1745
  });
1718
1746
  var coreUserMessageSchema = z6.object({
@@ -1721,6 +1749,7 @@ var coreUserMessageSchema = z6.object({
1721
1749
  z6.string(),
1722
1750
  z6.array(z6.union([textPartSchema, imagePartSchema, filePartSchema]))
1723
1751
  ]),
1752
+ providerOptions: providerMetadataSchema.optional(),
1724
1753
  experimental_providerMetadata: providerMetadataSchema.optional()
1725
1754
  });
1726
1755
  var coreAssistantMessageSchema = z6.object({
@@ -1729,11 +1758,13 @@ var coreAssistantMessageSchema = z6.object({
1729
1758
  z6.string(),
1730
1759
  z6.array(z6.union([textPartSchema, toolCallPartSchema]))
1731
1760
  ]),
1761
+ providerOptions: providerMetadataSchema.optional(),
1732
1762
  experimental_providerMetadata: providerMetadataSchema.optional()
1733
1763
  });
1734
1764
  var coreToolMessageSchema = z6.object({
1735
1765
  role: z6.literal("tool"),
1736
1766
  content: z6.array(toolResultPartSchema),
1767
+ providerOptions: providerMetadataSchema.optional(),
1737
1768
  experimental_providerMetadata: providerMetadataSchema.optional()
1738
1769
  });
1739
1770
  var coreMessageSchema = z6.union([
@@ -2249,7 +2280,8 @@ async function generateObject({
2249
2280
  abortSignal,
2250
2281
  headers,
2251
2282
  experimental_telemetry: telemetry,
2252
- experimental_providerMetadata: providerMetadata,
2283
+ experimental_providerMetadata,
2284
+ providerOptions = experimental_providerMetadata,
2253
2285
  _internal: {
2254
2286
  generateId: generateId3 = originalGenerateId,
2255
2287
  currentDate = () => /* @__PURE__ */ new Date()
@@ -2376,7 +2408,7 @@ async function generateObject({
2376
2408
  ...prepareCallSettings(settings),
2377
2409
  inputFormat: standardizedPrompt.type,
2378
2410
  prompt: promptMessages,
2379
- providerMetadata,
2411
+ providerMetadata: providerOptions,
2380
2412
  abortSignal,
2381
2413
  headers
2382
2414
  });
@@ -2483,7 +2515,7 @@ async function generateObject({
2483
2515
  ...prepareCallSettings(settings),
2484
2516
  inputFormat,
2485
2517
  prompt: promptMessages,
2486
- providerMetadata,
2518
+ providerMetadata: providerOptions,
2487
2519
  abortSignal,
2488
2520
  headers
2489
2521
  });
@@ -2787,7 +2819,8 @@ function streamObject({
2787
2819
  abortSignal,
2788
2820
  headers,
2789
2821
  experimental_telemetry: telemetry,
2790
- experimental_providerMetadata: providerMetadata,
2822
+ experimental_providerMetadata,
2823
+ providerOptions = experimental_providerMetadata,
2791
2824
  onFinish,
2792
2825
  _internal: {
2793
2826
  generateId: generateId3 = originalGenerateId2,
@@ -2820,7 +2853,7 @@ function streamObject({
2820
2853
  messages,
2821
2854
  schemaName,
2822
2855
  schemaDescription,
2823
- inputProviderMetadata: providerMetadata,
2856
+ providerOptions,
2824
2857
  mode,
2825
2858
  onFinish,
2826
2859
  generateId: generateId3,
@@ -2842,7 +2875,7 @@ var DefaultStreamObjectResult = class {
2842
2875
  messages,
2843
2876
  schemaName,
2844
2877
  schemaDescription,
2845
- inputProviderMetadata,
2878
+ providerOptions,
2846
2879
  mode,
2847
2880
  onFinish,
2848
2881
  generateId: generateId3,
@@ -2923,7 +2956,7 @@ var DefaultStreamObjectResult = class {
2923
2956
  modelSupportsImageUrls: model.supportsImageUrls,
2924
2957
  modelSupportsUrl: model.supportsUrl
2925
2958
  }),
2926
- providerMetadata: inputProviderMetadata,
2959
+ providerMetadata: providerOptions,
2927
2960
  abortSignal,
2928
2961
  headers
2929
2962
  };
@@ -2965,7 +2998,7 @@ var DefaultStreamObjectResult = class {
2965
2998
  modelSupportsImageUrls: model.supportsImageUrls,
2966
2999
  modelSupportsUrl: model.supportsUrl
2967
3000
  }),
2968
- providerMetadata: inputProviderMetadata,
3001
+ providerMetadata: providerOptions,
2969
3002
  abortSignal,
2970
3003
  headers
2971
3004
  };
@@ -3647,7 +3680,8 @@ async function generateText({
3647
3680
  experimental_output: output,
3648
3681
  experimental_continueSteps: continueSteps = false,
3649
3682
  experimental_telemetry: telemetry,
3650
- experimental_providerMetadata: providerMetadata,
3683
+ experimental_providerMetadata,
3684
+ providerOptions = experimental_providerMetadata,
3651
3685
  experimental_activeTools: activeTools,
3652
3686
  experimental_repairToolCall: repairToolCall,
3653
3687
  _internal: {
@@ -3780,7 +3814,7 @@ async function generateText({
3780
3814
  inputFormat: promptFormat,
3781
3815
  responseFormat: output == null ? void 0 : output.responseFormat({ model }),
3782
3816
  prompt: promptMessages,
3783
- providerMetadata,
3817
+ providerMetadata: providerOptions,
3784
3818
  abortSignal,
3785
3819
  headers
3786
3820
  });
@@ -4511,7 +4545,8 @@ function streamText({
4511
4545
  experimental_output: output,
4512
4546
  experimental_continueSteps: continueSteps = false,
4513
4547
  experimental_telemetry: telemetry,
4514
- experimental_providerMetadata: providerMetadata,
4548
+ experimental_providerMetadata,
4549
+ providerOptions = experimental_providerMetadata,
4515
4550
  experimental_toolCallStreaming = false,
4516
4551
  toolCallStreaming = experimental_toolCallStreaming,
4517
4552
  experimental_activeTools: activeTools,
@@ -4546,7 +4581,7 @@ function streamText({
4546
4581
  maxSteps,
4547
4582
  output,
4548
4583
  continueSteps,
4549
- providerMetadata,
4584
+ providerOptions,
4550
4585
  onChunk,
4551
4586
  onFinish,
4552
4587
  onStepFinish,
@@ -4627,7 +4662,7 @@ var DefaultStreamTextResult = class {
4627
4662
  maxSteps,
4628
4663
  output,
4629
4664
  continueSteps,
4630
- providerMetadata,
4665
+ providerOptions,
4631
4666
  onChunk,
4632
4667
  onFinish,
4633
4668
  onStepFinish,
@@ -4955,7 +4990,7 @@ var DefaultStreamTextResult = class {
4955
4990
  inputFormat: promptFormat,
4956
4991
  responseFormat: output == null ? void 0 : output.responseFormat({ model }),
4957
4992
  prompt: promptMessages,
4958
- providerMetadata,
4993
+ providerMetadata: providerOptions,
4959
4994
  abortSignal,
4960
4995
  headers
4961
4996
  })
@@ -5705,41 +5740,62 @@ function appendClientMessage({
5705
5740
  }
5706
5741
 
5707
5742
  // core/prompt/append-response-messages.ts
5743
+ import {
5744
+ extractMaxToolInvocationStep
5745
+ } from "@ai-sdk/ui-utils";
5708
5746
  function appendResponseMessages({
5709
5747
  messages,
5710
5748
  responseMessages
5711
5749
  }) {
5712
- var _a15;
5750
+ var _a15, _b;
5713
5751
  const clonedMessages = structuredClone(messages);
5714
5752
  for (const message of responseMessages) {
5715
5753
  const role = message.role;
5754
+ const lastMessage = clonedMessages[clonedMessages.length - 1];
5755
+ const isLastMessageAssistant = lastMessage.role === "assistant";
5716
5756
  switch (role) {
5717
5757
  case "assistant": {
5718
- clonedMessages.push({
5719
- role: "assistant",
5720
- id: message.id,
5721
- createdAt: /* @__PURE__ */ new Date(),
5722
- // generate a createdAt date for the message, will be overridden by the client
5723
- // only include text in the content:
5724
- content: typeof message.content === "string" ? message.content : message.content.filter((part) => part.type === "text").map((part) => part.text).join(""),
5725
- // separate tool calls from the content:
5726
- toolInvocations: (typeof message.content === "string" ? [] : message.content.filter((part) => part.type === "tool-call")).map((call) => ({
5758
+ let getToolInvocations2 = function(step) {
5759
+ return (typeof message.content === "string" ? [] : message.content.filter((part) => part.type === "tool-call")).map((call) => ({
5727
5760
  state: "call",
5728
- ...call
5729
- }))
5730
- });
5761
+ step,
5762
+ args: call.args,
5763
+ toolCallId: call.toolCallId,
5764
+ toolName: call.toolName
5765
+ }));
5766
+ };
5767
+ var getToolInvocations = getToolInvocations2;
5768
+ const textContent = typeof message.content === "string" ? message.content : message.content.filter((part) => part.type === "text").map((part) => part.text).join("");
5769
+ if (isLastMessageAssistant) {
5770
+ const maxStep = extractMaxToolInvocationStep(
5771
+ lastMessage.toolInvocations
5772
+ );
5773
+ lastMessage.content = textContent;
5774
+ lastMessage.toolInvocations = [
5775
+ ...(_a15 = lastMessage.toolInvocations) != null ? _a15 : [],
5776
+ ...getToolInvocations2(maxStep === void 0 ? 0 : maxStep + 1)
5777
+ ];
5778
+ } else {
5779
+ clonedMessages.push({
5780
+ role: "assistant",
5781
+ id: message.id,
5782
+ createdAt: /* @__PURE__ */ new Date(),
5783
+ // generate a createdAt date for the message, will be overridden by the client
5784
+ content: textContent,
5785
+ toolInvocations: getToolInvocations2(0)
5786
+ });
5787
+ }
5731
5788
  break;
5732
5789
  }
5733
5790
  case "tool": {
5734
- const previousMessage = clonedMessages[clonedMessages.length - 1];
5735
- (_a15 = previousMessage.toolInvocations) != null ? _a15 : previousMessage.toolInvocations = [];
5736
- if (previousMessage.role !== "assistant") {
5791
+ (_b = lastMessage.toolInvocations) != null ? _b : lastMessage.toolInvocations = [];
5792
+ if (lastMessage.role !== "assistant") {
5737
5793
  throw new Error(
5738
- `Tool result must follow an assistant message: ${previousMessage.role}`
5794
+ `Tool result must follow an assistant message: ${lastMessage.role}`
5739
5795
  );
5740
5796
  }
5741
5797
  for (const part of message.content) {
5742
- const toolCall = previousMessage.toolInvocations.find(
5798
+ const toolCall = lastMessage.toolInvocations.find(
5743
5799
  (call) => call.toolCallId === part.toolCallId
5744
5800
  );
5745
5801
  if (!toolCall) {