ai 5.0.0-alpha.3 → 5.0.0-alpha.4

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
@@ -1586,18 +1586,18 @@ var SerialJobExecutor = class {
1586
1586
  function shouldResubmitMessages({
1587
1587
  originalMaxToolInvocationStep,
1588
1588
  originalMessageCount,
1589
- maxSteps: maxSteps2,
1589
+ maxSteps,
1590
1590
  messages
1591
1591
  }) {
1592
1592
  var _a17;
1593
1593
  const lastMessage = messages[messages.length - 1];
1594
1594
  return (
1595
1595
  // check if the feature is enabled:
1596
- maxSteps2 > 1 && // ensure there is a last message:
1596
+ maxSteps > 1 && // ensure there is a last message:
1597
1597
  lastMessage != null && // ensure we actually have new steps (to prevent infinite loops in case of errors):
1598
1598
  (messages.length > originalMessageCount || extractMaxToolInvocationStep(getToolInvocations(lastMessage)) !== originalMaxToolInvocationStep) && // check that next step is possible:
1599
1599
  isAssistantMessageWithCompletedToolCalls(lastMessage) && // limit the number of automatic steps:
1600
- ((_a17 = extractMaxToolInvocationStep(getToolInvocations(lastMessage))) != null ? _a17 : 0) < maxSteps2
1600
+ ((_a17 = extractMaxToolInvocationStep(getToolInvocations(lastMessage))) != null ? _a17 : 0) < maxSteps
1601
1601
  );
1602
1602
  }
1603
1603
  function isAssistantMessageWithCompletedToolCalls(message) {
@@ -1637,7 +1637,7 @@ var ChatStore = class {
1637
1637
  chats = {},
1638
1638
  generateId: generateId3,
1639
1639
  transport,
1640
- maxSteps: maxSteps2 = 1,
1640
+ maxSteps = 1,
1641
1641
  messageMetadataSchema,
1642
1642
  dataPartSchemas
1643
1643
  }) {
@@ -1653,7 +1653,7 @@ var ChatStore = class {
1653
1653
  }
1654
1654
  ])
1655
1655
  );
1656
- this.maxSteps = maxSteps2;
1656
+ this.maxSteps = maxSteps;
1657
1657
  this.transport = transport;
1658
1658
  this.subscribers = /* @__PURE__ */ new Set();
1659
1659
  this.generateId = generateId3 != null ? generateId3 : generateIdFunc;
@@ -2244,7 +2244,7 @@ function defaultChatStore({
2244
2244
  generateId: generateId3 = generateIdFunc2,
2245
2245
  dataPartSchemas,
2246
2246
  messageMetadataSchema,
2247
- maxSteps: maxSteps2 = 1,
2247
+ maxSteps = 1,
2248
2248
  chats
2249
2249
  }) {
2250
2250
  return new ChatStore({
@@ -2259,7 +2259,7 @@ function defaultChatStore({
2259
2259
  generateId: generateId3,
2260
2260
  messageMetadataSchema,
2261
2261
  dataPartSchemas,
2262
- maxSteps: maxSteps2,
2262
+ maxSteps,
2263
2263
  chats
2264
2264
  });
2265
2265
  }
@@ -5403,6 +5403,11 @@ var DefaultSpeechResult = class {
5403
5403
  // core/generate-text/generate-text.ts
5404
5404
  import { createIdGenerator as createIdGenerator3 } from "@ai-sdk/provider-utils";
5405
5405
 
5406
+ // src/util/as-array.ts
5407
+ function asArray(value) {
5408
+ return value === void 0 ? [] : Array.isArray(value) ? value : [value];
5409
+ }
5410
+
5406
5411
  // core/prompt/prepare-tools-and-tool-choice.ts
5407
5412
  import { asSchema as asSchema2 } from "@ai-sdk/provider-utils";
5408
5413
 
@@ -5624,8 +5629,8 @@ var DefaultStepResult = class {
5624
5629
  };
5625
5630
 
5626
5631
  // core/generate-text/stop-condition.ts
5627
- function maxSteps(maxSteps2) {
5628
- return ({ steps }) => steps.length >= maxSteps2;
5632
+ function stepCountIs(stepCount) {
5633
+ return ({ steps }) => steps.length === stepCount;
5629
5634
  }
5630
5635
  function hasToolCall(toolName) {
5631
5636
  return ({ steps }) => {
@@ -5635,6 +5640,12 @@ function hasToolCall(toolName) {
5635
5640
  )) != null ? _c : false;
5636
5641
  };
5637
5642
  }
5643
+ async function isStopConditionMet({
5644
+ stopConditions,
5645
+ steps
5646
+ }) {
5647
+ return (await Promise.all(stopConditions.map((condition) => condition({ steps })))).some((result) => result);
5648
+ }
5638
5649
 
5639
5650
  // core/generate-text/to-response-messages.ts
5640
5651
  function toResponseMessages({
@@ -5709,12 +5720,14 @@ async function generateText({
5709
5720
  maxRetries: maxRetriesArg,
5710
5721
  abortSignal,
5711
5722
  headers,
5712
- continueUntil = maxSteps(1),
5723
+ stopWhen = stepCountIs(1),
5713
5724
  experimental_output: output,
5714
5725
  experimental_telemetry: telemetry,
5715
5726
  providerOptions,
5716
- experimental_activeTools: activeTools,
5717
- experimental_prepareStep: prepareStep,
5727
+ experimental_activeTools,
5728
+ activeTools = experimental_activeTools,
5729
+ experimental_prepareStep,
5730
+ prepareStep = experimental_prepareStep,
5718
5731
  experimental_repairToolCall: repairToolCall,
5719
5732
  _internal: {
5720
5733
  generateId: generateId3 = originalGenerateId3,
@@ -5723,6 +5736,7 @@ async function generateText({
5723
5736
  onStepFinish,
5724
5737
  ...settings
5725
5738
  }) {
5739
+ const stopConditions = asArray(stopWhen);
5726
5740
  const { maxRetries, retry } = prepareRetries({ maxRetries: maxRetriesArg });
5727
5741
  const callSettings = prepareCallSettings(settings);
5728
5742
  const baseTelemetryAttributes = getBaseTelemetryAttributes({
@@ -5786,7 +5800,7 @@ async function generateText({
5786
5800
  const { toolChoice: stepToolChoice, tools: stepTools } = prepareToolsAndToolChoice({
5787
5801
  tools,
5788
5802
  toolChoice: (_b = prepareStepResult == null ? void 0 : prepareStepResult.toolChoice) != null ? _b : toolChoice,
5789
- activeTools: (_c = prepareStepResult == null ? void 0 : prepareStepResult.experimental_activeTools) != null ? _c : activeTools
5803
+ activeTools: (_c = prepareStepResult == null ? void 0 : prepareStepResult.activeTools) != null ? _c : activeTools
5790
5804
  });
5791
5805
  currentModelResponse = await retry(
5792
5806
  () => {
@@ -5931,8 +5945,8 @@ async function generateText({
5931
5945
  } while (
5932
5946
  // there are tool calls:
5933
5947
  currentToolCalls.length > 0 && // all current tool calls have results:
5934
- currentToolResults.length === currentToolCalls.length && // continue until the stop condition is met:
5935
- !await continueUntil({ steps })
5948
+ currentToolResults.length === currentToolCalls.length && // continue until a stop condition is met:
5949
+ !await isStopConditionMet({ stopConditions, steps })
5936
5950
  );
5937
5951
  span.setAttributes(
5938
5952
  selectTelemetryAttributes({
@@ -6282,11 +6296,6 @@ function smoothStream({
6282
6296
  // core/generate-text/stream-text.ts
6283
6297
  import { createIdGenerator as createIdGenerator4 } from "@ai-sdk/provider-utils";
6284
6298
 
6285
- // src/util/as-array.ts
6286
- function asArray(value) {
6287
- return value === void 0 ? [] : Array.isArray(value) ? value : [value];
6288
- }
6289
-
6290
6299
  // core/generate-text/run-tools-transformation.ts
6291
6300
  import { generateId } from "@ai-sdk/provider-utils";
6292
6301
  function runToolsTransformation({
@@ -6497,13 +6506,15 @@ function streamText({
6497
6506
  maxRetries,
6498
6507
  abortSignal,
6499
6508
  headers,
6500
- continueUntil = maxSteps(1),
6509
+ stopWhen = stepCountIs(1),
6501
6510
  experimental_output: output,
6502
6511
  experimental_telemetry: telemetry,
6512
+ prepareStep,
6503
6513
  providerOptions,
6504
6514
  experimental_toolCallStreaming = false,
6505
6515
  toolCallStreaming = experimental_toolCallStreaming,
6506
- experimental_activeTools: activeTools,
6516
+ experimental_activeTools,
6517
+ activeTools = experimental_activeTools,
6507
6518
  experimental_repairToolCall: repairToolCall,
6508
6519
  experimental_transform: transform,
6509
6520
  onChunk,
@@ -6533,9 +6544,10 @@ function streamText({
6533
6544
  transforms: asArray(transform),
6534
6545
  activeTools,
6535
6546
  repairToolCall,
6536
- continueUntil,
6547
+ stopConditions: asArray(stopWhen),
6537
6548
  output,
6538
6549
  providerOptions,
6550
+ prepareStep,
6539
6551
  onChunk,
6540
6552
  onError,
6541
6553
  onFinish,
@@ -6610,9 +6622,10 @@ var DefaultStreamTextResult = class {
6610
6622
  transforms,
6611
6623
  activeTools,
6612
6624
  repairToolCall,
6613
- continueUntil,
6625
+ stopConditions,
6614
6626
  output,
6615
6627
  providerOptions,
6628
+ prepareStep,
6616
6629
  now: now2,
6617
6630
  currentDate,
6618
6631
  generateId: generateId3,
@@ -6831,6 +6844,7 @@ var DefaultStreamTextResult = class {
6831
6844
  responseMessages,
6832
6845
  usage
6833
6846
  }) {
6847
+ var _a17, _b, _c;
6834
6848
  stepFinish = new DelayedPromise();
6835
6849
  const initialPrompt = await standardizePrompt({
6836
6850
  system,
@@ -6841,6 +6855,11 @@ var DefaultStreamTextResult = class {
6841
6855
  ...initialPrompt.messages,
6842
6856
  ...responseMessages
6843
6857
  ];
6858
+ const prepareStepResult = await (prepareStep == null ? void 0 : prepareStep({
6859
+ model,
6860
+ steps: recordedSteps,
6861
+ stepNumber: recordedSteps.length
6862
+ }));
6844
6863
  const promptMessages = await convertToLanguageModelPrompt({
6845
6864
  prompt: {
6846
6865
  system: initialPrompt.system,
@@ -6848,9 +6867,12 @@ var DefaultStreamTextResult = class {
6848
6867
  },
6849
6868
  supportedUrls: await model.supportedUrls
6850
6869
  });
6851
- const toolsAndToolChoice = {
6852
- ...prepareToolsAndToolChoice({ tools, toolChoice, activeTools })
6853
- };
6870
+ const stepModel = (_a17 = prepareStepResult == null ? void 0 : prepareStepResult.model) != null ? _a17 : model;
6871
+ const { toolChoice: stepToolChoice, tools: stepTools } = prepareToolsAndToolChoice({
6872
+ tools,
6873
+ toolChoice: (_b = prepareStepResult == null ? void 0 : prepareStepResult.toolChoice) != null ? _b : toolChoice,
6874
+ activeTools: (_c = prepareStepResult == null ? void 0 : prepareStepResult.activeTools) != null ? _c : activeTools
6875
+ });
6854
6876
  const {
6855
6877
  result: { stream: stream2, response, request },
6856
6878
  doStreamSpan,
@@ -6866,24 +6888,23 @@ var DefaultStreamTextResult = class {
6866
6888
  telemetry
6867
6889
  }),
6868
6890
  ...baseTelemetryAttributes,
6891
+ // model:
6892
+ "ai.model.provider": stepModel.provider,
6893
+ "ai.model.id": stepModel.modelId,
6894
+ // prompt:
6869
6895
  "ai.prompt.messages": {
6870
6896
  input: () => JSON.stringify(promptMessages)
6871
6897
  },
6872
6898
  "ai.prompt.tools": {
6873
6899
  // convert the language model level tools:
6874
- input: () => {
6875
- var _a17;
6876
- return (_a17 = toolsAndToolChoice.tools) == null ? void 0 : _a17.map(
6877
- (tool2) => JSON.stringify(tool2)
6878
- );
6879
- }
6900
+ input: () => stepTools == null ? void 0 : stepTools.map((tool2) => JSON.stringify(tool2))
6880
6901
  },
6881
6902
  "ai.prompt.toolChoice": {
6882
- input: () => toolsAndToolChoice.toolChoice != null ? JSON.stringify(toolsAndToolChoice.toolChoice) : void 0
6903
+ input: () => stepToolChoice != null ? JSON.stringify(stepToolChoice) : void 0
6883
6904
  },
6884
6905
  // standardized gen-ai llm span attributes:
6885
- "gen_ai.system": model.provider,
6886
- "gen_ai.request.model": model.modelId,
6906
+ "gen_ai.system": stepModel.provider,
6907
+ "gen_ai.request.model": stepModel.modelId,
6887
6908
  "gen_ai.request.frequency_penalty": callSettings.frequencyPenalty,
6888
6909
  "gen_ai.request.max_tokens": callSettings.maxOutputTokens,
6889
6910
  "gen_ai.request.presence_penalty": callSettings.presencePenalty,
@@ -6900,9 +6921,10 @@ var DefaultStreamTextResult = class {
6900
6921
  startTimestampMs: now2(),
6901
6922
  // get before the call
6902
6923
  doStreamSpan: doStreamSpan2,
6903
- result: await model.doStream({
6924
+ result: await stepModel.doStream({
6904
6925
  ...callSettings,
6905
- ...toolsAndToolChoice,
6926
+ tools: stepTools,
6927
+ toolChoice: stepToolChoice,
6906
6928
  responseFormat: output == null ? void 0 : output.responseFormat,
6907
6929
  prompt: promptMessages,
6908
6930
  providerOptions,
@@ -6955,7 +6977,7 @@ var DefaultStreamTextResult = class {
6955
6977
  streamWithToolResults.pipeThrough(
6956
6978
  new TransformStream({
6957
6979
  async transform(chunk, controller) {
6958
- var _a17, _b, _c, _d;
6980
+ var _a18, _b2, _c2, _d;
6959
6981
  if (chunk.type === "stream-start") {
6960
6982
  warnings = chunk.warnings;
6961
6983
  return;
@@ -7018,9 +7040,9 @@ var DefaultStreamTextResult = class {
7018
7040
  }
7019
7041
  case "response-metadata": {
7020
7042
  stepResponse = {
7021
- id: (_a17 = chunk.id) != null ? _a17 : stepResponse.id,
7022
- timestamp: (_b = chunk.timestamp) != null ? _b : stepResponse.timestamp,
7023
- modelId: (_c = chunk.modelId) != null ? _c : stepResponse.modelId
7043
+ id: (_a18 = chunk.id) != null ? _a18 : stepResponse.id,
7044
+ timestamp: (_b2 = chunk.timestamp) != null ? _b2 : stepResponse.timestamp,
7045
+ modelId: (_c2 = chunk.modelId) != null ? _c2 : stepResponse.modelId
7024
7046
  };
7025
7047
  break;
7026
7048
  }
@@ -7109,7 +7131,11 @@ var DefaultStreamTextResult = class {
7109
7131
  const combinedUsage = addLanguageModelUsage(usage, stepUsage);
7110
7132
  await stepFinish.promise;
7111
7133
  if (stepToolCalls.length > 0 && // all current tool calls have results:
7112
- stepToolResults.length === stepToolCalls.length && !await continueUntil({ steps: recordedSteps })) {
7134
+ stepToolResults.length === stepToolCalls.length && // continue until a stop condition is met:
7135
+ !await isStopConditionMet({
7136
+ stopConditions,
7137
+ steps: recordedSteps
7138
+ })) {
7113
7139
  responseMessages.push(
7114
7140
  ...toResponseMessages({
7115
7141
  content: stepContent,
@@ -8601,7 +8627,6 @@ export {
8601
8627
  isAssistantMessageWithCompletedToolCalls,
8602
8628
  isDeepEqualData,
8603
8629
  jsonSchema2 as jsonSchema,
8604
- maxSteps,
8605
8630
  modelMessageSchema,
8606
8631
  parsePartialJson,
8607
8632
  pipeTextStreamToResponse,
@@ -8610,6 +8635,7 @@ export {
8610
8635
  simulateReadableStream,
8611
8636
  simulateStreamingMiddleware,
8612
8637
  smoothStream,
8638
+ stepCountIs,
8613
8639
  streamObject,
8614
8640
  streamText,
8615
8641
  systemModelMessageSchema,