ai 3.3.35 → 3.3.37

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
@@ -20,9 +20,9 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // streams/index.ts
21
21
  var streams_exports = {};
22
22
  __export(streams_exports, {
23
- AISDKError: () => import_provider16.AISDKError,
23
+ AISDKError: () => import_provider13.AISDKError,
24
24
  AIStream: () => AIStream,
25
- APICallError: () => import_provider16.APICallError,
25
+ APICallError: () => import_provider13.APICallError,
26
26
  AWSBedrockAnthropicMessagesStream: () => AWSBedrockAnthropicMessagesStream,
27
27
  AWSBedrockAnthropicStream: () => AWSBedrockAnthropicStream,
28
28
  AWSBedrockCohereStream: () => AWSBedrockCohereStream,
@@ -32,25 +32,25 @@ __export(streams_exports, {
32
32
  AssistantResponse: () => AssistantResponse,
33
33
  CohereStream: () => CohereStream,
34
34
  DownloadError: () => DownloadError,
35
- EmptyResponseBodyError: () => import_provider16.EmptyResponseBodyError,
35
+ EmptyResponseBodyError: () => import_provider13.EmptyResponseBodyError,
36
36
  GoogleGenerativeAIStream: () => GoogleGenerativeAIStream,
37
37
  HuggingFaceStream: () => HuggingFaceStream,
38
38
  InkeepStream: () => InkeepStream,
39
39
  InvalidArgumentError: () => InvalidArgumentError,
40
40
  InvalidDataContentError: () => InvalidDataContentError,
41
41
  InvalidMessageRoleError: () => InvalidMessageRoleError,
42
- InvalidPromptError: () => import_provider16.InvalidPromptError,
43
- InvalidResponseDataError: () => import_provider16.InvalidResponseDataError,
42
+ InvalidPromptError: () => import_provider13.InvalidPromptError,
43
+ InvalidResponseDataError: () => import_provider13.InvalidResponseDataError,
44
44
  InvalidToolArgumentsError: () => InvalidToolArgumentsError,
45
- JSONParseError: () => import_provider16.JSONParseError,
45
+ JSONParseError: () => import_provider13.JSONParseError,
46
46
  LangChainAdapter: () => langchain_adapter_exports,
47
47
  LangChainStream: () => LangChainStream,
48
- LoadAPIKeyError: () => import_provider16.LoadAPIKeyError,
48
+ LoadAPIKeyError: () => import_provider13.LoadAPIKeyError,
49
49
  MessageConversionError: () => MessageConversionError,
50
50
  MistralStream: () => MistralStream,
51
- NoContentGeneratedError: () => import_provider16.NoContentGeneratedError,
51
+ NoContentGeneratedError: () => import_provider13.NoContentGeneratedError,
52
52
  NoObjectGeneratedError: () => NoObjectGeneratedError,
53
- NoSuchModelError: () => import_provider16.NoSuchModelError,
53
+ NoSuchModelError: () => import_provider13.NoSuchModelError,
54
54
  NoSuchProviderError: () => NoSuchProviderError,
55
55
  NoSuchToolError: () => NoSuchToolError,
56
56
  OpenAIStream: () => OpenAIStream,
@@ -58,8 +58,8 @@ __export(streams_exports, {
58
58
  RetryError: () => RetryError,
59
59
  StreamData: () => StreamData2,
60
60
  StreamingTextResponse: () => StreamingTextResponse,
61
- TypeValidationError: () => import_provider16.TypeValidationError,
62
- UnsupportedFunctionalityError: () => import_provider16.UnsupportedFunctionalityError,
61
+ TypeValidationError: () => import_provider13.TypeValidationError,
62
+ UnsupportedFunctionalityError: () => import_provider13.UnsupportedFunctionalityError,
63
63
  convertToCoreMessages: () => convertToCoreMessages,
64
64
  cosineSimilarity: () => cosineSimilarity,
65
65
  createCallbacksTransformer: () => createCallbacksTransformer,
@@ -1148,6 +1148,7 @@ function prepareCallSettings({
1148
1148
  maxTokens,
1149
1149
  temperature,
1150
1150
  topP,
1151
+ topK,
1151
1152
  presencePenalty,
1152
1153
  frequencyPenalty,
1153
1154
  stopSequences,
@@ -1188,6 +1189,15 @@ function prepareCallSettings({
1188
1189
  });
1189
1190
  }
1190
1191
  }
1192
+ if (topK != null) {
1193
+ if (typeof topK !== "number") {
1194
+ throw new InvalidArgumentError({
1195
+ parameter: "topK",
1196
+ value: topK,
1197
+ message: "topK must be a number"
1198
+ });
1199
+ }
1200
+ }
1191
1201
  if (presencePenalty != null) {
1192
1202
  if (typeof presencePenalty !== "number") {
1193
1203
  throw new InvalidArgumentError({
@@ -1235,6 +1245,7 @@ function prepareCallSettings({
1235
1245
  maxTokens,
1236
1246
  temperature: temperature != null ? temperature : 0,
1237
1247
  topP,
1248
+ topK,
1238
1249
  presencePenalty,
1239
1250
  frequencyPenalty,
1240
1251
  stopSequences: stopSequences != null && stopSequences.length > 0 ? stopSequences : void 0,
@@ -1833,7 +1844,7 @@ function validateObjectGenerationInput({
1833
1844
  }
1834
1845
 
1835
1846
  // core/generate-object/generate-object.ts
1836
- var originalGenerateId = (0, import_provider_utils6.createIdGenerator)({ prefix: "aiobj-", length: 24 });
1847
+ var originalGenerateId = (0, import_provider_utils6.createIdGenerator)({ prefix: "aiobj-", size: 24 });
1837
1848
  async function generateObject({
1838
1849
  model,
1839
1850
  enum: enumValues,
@@ -2319,7 +2330,7 @@ function writeToServerResponse({
2319
2330
  }
2320
2331
 
2321
2332
  // core/generate-object/stream-object.ts
2322
- var originalGenerateId2 = (0, import_provider_utils7.createIdGenerator)({ prefix: "aiobj-", length: 24 });
2333
+ var originalGenerateId2 = (0, import_provider_utils7.createIdGenerator)({ prefix: "aiobj-", size: 24 });
2323
2334
  async function streamObject({
2324
2335
  model,
2325
2336
  schema: inputSchema,
@@ -2825,64 +2836,8 @@ var experimental_streamObject = streamObject;
2825
2836
  // core/generate-text/generate-text.ts
2826
2837
  var import_provider_utils9 = require("@ai-sdk/provider-utils");
2827
2838
 
2828
- // core/prompt/prepare-tools-and-tool-choice.ts
2829
- var import_ui_utils3 = require("@ai-sdk/ui-utils");
2830
-
2831
- // core/util/is-non-empty-object.ts
2832
- function isNonEmptyObject(object) {
2833
- return object != null && Object.keys(object).length > 0;
2834
- }
2835
-
2836
- // core/prompt/prepare-tools-and-tool-choice.ts
2837
- function prepareToolsAndToolChoice({
2838
- tools,
2839
- toolChoice
2840
- }) {
2841
- if (!isNonEmptyObject(tools)) {
2842
- return {
2843
- tools: void 0,
2844
- toolChoice: void 0
2845
- };
2846
- }
2847
- return {
2848
- tools: Object.entries(tools).map(([name11, tool2]) => ({
2849
- type: "function",
2850
- name: name11,
2851
- description: tool2.description,
2852
- parameters: (0, import_ui_utils3.asSchema)(tool2.parameters).jsonSchema
2853
- })),
2854
- toolChoice: toolChoice == null ? { type: "auto" } : typeof toolChoice === "string" ? { type: toolChoice } : { type: "tool", toolName: toolChoice.toolName }
2855
- };
2856
- }
2857
-
2858
- // core/generate-text/to-response-messages.ts
2859
- function toResponseMessages({
2860
- text = "",
2861
- toolCalls,
2862
- toolResults
2863
- }) {
2864
- const responseMessages = [];
2865
- responseMessages.push({
2866
- role: "assistant",
2867
- content: [{ type: "text", text }, ...toolCalls]
2868
- });
2869
- if (toolResults.length > 0) {
2870
- responseMessages.push({
2871
- role: "tool",
2872
- content: toolResults.map((result) => ({
2873
- type: "tool-result",
2874
- toolCallId: result.toolCallId,
2875
- toolName: result.toolName,
2876
- result: result.result
2877
- }))
2878
- });
2879
- }
2880
- return responseMessages;
2881
- }
2882
-
2883
- // core/generate-text/tool-call.ts
2884
- var import_provider_utils8 = require("@ai-sdk/provider-utils");
2885
- var import_ui_utils4 = require("@ai-sdk/ui-utils");
2839
+ // errors/index.ts
2840
+ var import_provider13 = require("@ai-sdk/provider");
2886
2841
 
2887
2842
  // errors/invalid-tool-arguments-error.ts
2888
2843
  var import_provider10 = require("@ai-sdk/provider");
@@ -2970,7 +2925,85 @@ var NoSuchToolError = class extends import_provider11.AISDKError {
2970
2925
  };
2971
2926
  _a8 = symbol8;
2972
2927
 
2928
+ // core/prompt/message-conversion-error.ts
2929
+ var import_provider12 = require("@ai-sdk/provider");
2930
+ var name9 = "AI_MessageConversionError";
2931
+ var marker9 = `vercel.ai.error.${name9}`;
2932
+ var symbol9 = Symbol.for(marker9);
2933
+ var _a9;
2934
+ var MessageConversionError = class extends import_provider12.AISDKError {
2935
+ constructor({
2936
+ originalMessage,
2937
+ message
2938
+ }) {
2939
+ super({ name: name9, message });
2940
+ this[_a9] = true;
2941
+ this.originalMessage = originalMessage;
2942
+ }
2943
+ static isInstance(error) {
2944
+ return import_provider12.AISDKError.hasMarker(error, marker9);
2945
+ }
2946
+ };
2947
+ _a9 = symbol9;
2948
+
2949
+ // core/prompt/prepare-tools-and-tool-choice.ts
2950
+ var import_ui_utils3 = require("@ai-sdk/ui-utils");
2951
+
2952
+ // core/util/is-non-empty-object.ts
2953
+ function isNonEmptyObject(object) {
2954
+ return object != null && Object.keys(object).length > 0;
2955
+ }
2956
+
2957
+ // core/prompt/prepare-tools-and-tool-choice.ts
2958
+ function prepareToolsAndToolChoice({
2959
+ tools,
2960
+ toolChoice
2961
+ }) {
2962
+ if (!isNonEmptyObject(tools)) {
2963
+ return {
2964
+ tools: void 0,
2965
+ toolChoice: void 0
2966
+ };
2967
+ }
2968
+ return {
2969
+ tools: Object.entries(tools).map(([name11, tool2]) => ({
2970
+ type: "function",
2971
+ name: name11,
2972
+ description: tool2.description,
2973
+ parameters: (0, import_ui_utils3.asSchema)(tool2.parameters).jsonSchema
2974
+ })),
2975
+ toolChoice: toolChoice == null ? { type: "auto" } : typeof toolChoice === "string" ? { type: toolChoice } : { type: "tool", toolName: toolChoice.toolName }
2976
+ };
2977
+ }
2978
+
2979
+ // core/generate-text/to-response-messages.ts
2980
+ function toResponseMessages({
2981
+ text = "",
2982
+ toolCalls,
2983
+ toolResults
2984
+ }) {
2985
+ const responseMessages = [];
2986
+ responseMessages.push({
2987
+ role: "assistant",
2988
+ content: [{ type: "text", text }, ...toolCalls]
2989
+ });
2990
+ if (toolResults.length > 0) {
2991
+ responseMessages.push({
2992
+ role: "tool",
2993
+ content: toolResults.map((result) => ({
2994
+ type: "tool-result",
2995
+ toolCallId: result.toolCallId,
2996
+ toolName: result.toolName,
2997
+ result: result.result
2998
+ }))
2999
+ });
3000
+ }
3001
+ return responseMessages;
3002
+ }
3003
+
2973
3004
  // core/generate-text/tool-call.ts
3005
+ var import_provider_utils8 = require("@ai-sdk/provider-utils");
3006
+ var import_ui_utils4 = require("@ai-sdk/ui-utils");
2974
3007
  function parseToolCall({
2975
3008
  toolCall,
2976
3009
  tools
@@ -3006,7 +3039,7 @@ function parseToolCall({
3006
3039
  }
3007
3040
 
3008
3041
  // core/generate-text/generate-text.ts
3009
- var originalGenerateId3 = (0, import_provider_utils9.createIdGenerator)({ prefix: "aitxt-", length: 24 });
3042
+ var originalGenerateId3 = (0, import_provider_utils9.createIdGenerator)({ prefix: "aitxt-", size: 24 });
3010
3043
  async function generateText({
3011
3044
  model,
3012
3045
  tools,
@@ -3019,6 +3052,7 @@ async function generateText({
3019
3052
  headers,
3020
3053
  maxAutomaticRoundtrips = 0,
3021
3054
  maxToolRoundtrips = maxAutomaticRoundtrips,
3055
+ maxSteps = maxToolRoundtrips != null ? maxToolRoundtrips + 1 : 1,
3022
3056
  experimental_telemetry: telemetry,
3023
3057
  experimental_providerMetadata: providerMetadata,
3024
3058
  _internal: {
@@ -3028,6 +3062,13 @@ async function generateText({
3028
3062
  ...settings
3029
3063
  }) {
3030
3064
  var _a11;
3065
+ if (maxSteps < 1) {
3066
+ throw new InvalidArgumentError({
3067
+ parameter: "maxSteps",
3068
+ value: maxSteps,
3069
+ message: "maxSteps must be at least 1"
3070
+ });
3071
+ }
3031
3072
  const baseTelemetryAttributes = getBaseTelemetryAttributes({
3032
3073
  model,
3033
3074
  telemetry,
@@ -3049,7 +3090,7 @@ async function generateText({
3049
3090
  "ai.prompt": {
3050
3091
  input: () => JSON.stringify({ system, prompt, messages })
3051
3092
  },
3052
- "ai.settings.maxToolRoundtrips": maxToolRoundtrips
3093
+ "ai.settings.maxSteps": maxSteps
3053
3094
  }
3054
3095
  }),
3055
3096
  tracer,
@@ -3073,16 +3114,16 @@ async function generateText({
3073
3114
  let currentModelResponse;
3074
3115
  let currentToolCalls = [];
3075
3116
  let currentToolResults = [];
3076
- let roundtripCount = 0;
3117
+ let stepCount = 0;
3077
3118
  const responseMessages = [];
3078
- const roundtrips = [];
3119
+ const steps = [];
3079
3120
  const usage = {
3080
3121
  completionTokens: 0,
3081
3122
  promptTokens: 0,
3082
3123
  totalTokens: 0
3083
3124
  };
3084
3125
  do {
3085
- const currentInputFormat = roundtripCount === 0 ? validatedPrompt.type : "messages";
3126
+ const currentInputFormat = stepCount === 0 ? validatedPrompt.type : "messages";
3086
3127
  currentModelResponse = await retry(
3087
3128
  () => recordSpan({
3088
3129
  name: "ai.generateText.doGenerate",
@@ -3179,7 +3220,7 @@ async function generateText({
3179
3220
  usage.completionTokens += currentUsage.completionTokens;
3180
3221
  usage.promptTokens += currentUsage.promptTokens;
3181
3222
  usage.totalTokens += currentUsage.totalTokens;
3182
- roundtrips.push({
3223
+ steps.push({
3183
3224
  text: (_b = currentModelResponse.text) != null ? _b : "",
3184
3225
  toolCalls: currentToolCalls,
3185
3226
  toolResults: currentToolResults,
@@ -3206,8 +3247,8 @@ async function generateText({
3206
3247
  } while (
3207
3248
  // there are tool calls:
3208
3249
  currentToolCalls.length > 0 && // all current tool calls have results:
3209
- currentToolResults.length === currentToolCalls.length && // the number of roundtrips is less than the maximum:
3210
- roundtripCount++ < maxToolRoundtrips
3250
+ currentToolResults.length === currentToolCalls.length && // the number of steps is less than the maximum:
3251
+ ++stepCount < maxSteps
3211
3252
  );
3212
3253
  span.setAttributes(
3213
3254
  selectTelemetryAttributes({
@@ -3249,7 +3290,7 @@ async function generateText({
3249
3290
  },
3250
3291
  logprobs: currentModelResponse.logprobs,
3251
3292
  responseMessages,
3252
- roundtrips,
3293
+ steps,
3253
3294
  providerMetadata: currentModelResponse.providerMetadata
3254
3295
  });
3255
3296
  }
@@ -3324,7 +3365,8 @@ var DefaultGenerateTextResult = class {
3324
3365
  this.warnings = options.warnings;
3325
3366
  this.response = options.response;
3326
3367
  this.responseMessages = options.responseMessages;
3327
- this.roundtrips = options.roundtrips;
3368
+ this.roundtrips = options.steps;
3369
+ this.steps = options.steps;
3328
3370
  this.experimental_providerMetadata = options.providerMetadata;
3329
3371
  this.rawResponse = {
3330
3372
  headers: options.response.headers
@@ -3677,7 +3719,7 @@ function runToolsTransformation({
3677
3719
  }
3678
3720
 
3679
3721
  // core/generate-text/stream-text.ts
3680
- var originalGenerateId4 = (0, import_provider_utils10.createIdGenerator)({ prefix: "aitxt-", length: 24 });
3722
+ var originalGenerateId4 = (0, import_provider_utils10.createIdGenerator)({ prefix: "aitxt-", size: 24 });
3681
3723
  async function streamText({
3682
3724
  model,
3683
3725
  tools,
@@ -3689,6 +3731,7 @@ async function streamText({
3689
3731
  abortSignal,
3690
3732
  headers,
3691
3733
  maxToolRoundtrips = 0,
3734
+ maxSteps = maxToolRoundtrips != null ? maxToolRoundtrips + 1 : 1,
3692
3735
  experimental_telemetry: telemetry,
3693
3736
  experimental_providerMetadata: providerMetadata,
3694
3737
  experimental_toolCallStreaming: toolCallStreaming = false,
@@ -3702,6 +3745,13 @@ async function streamText({
3702
3745
  ...settings
3703
3746
  }) {
3704
3747
  var _a11;
3748
+ if (maxSteps < 1) {
3749
+ throw new InvalidArgumentError({
3750
+ parameter: "maxSteps",
3751
+ value: maxSteps,
3752
+ message: "maxSteps must be at least 1"
3753
+ });
3754
+ }
3705
3755
  const baseTelemetryAttributes = getBaseTelemetryAttributes({
3706
3756
  model,
3707
3757
  telemetry,
@@ -3719,14 +3769,15 @@ async function streamText({
3719
3769
  // specific settings that only make sense on the outer level:
3720
3770
  "ai.prompt": {
3721
3771
  input: () => JSON.stringify({ system, prompt, messages })
3722
- }
3772
+ },
3773
+ "ai.settings.maxSteps": maxSteps
3723
3774
  }
3724
3775
  }),
3725
3776
  tracer,
3726
3777
  endWhenDone: false,
3727
3778
  fn: async (rootSpan) => {
3728
3779
  const retry = retryWithExponentialBackoff({ maxRetries });
3729
- const startRoundtrip = async ({
3780
+ const startStep = async ({
3730
3781
  promptMessages: promptMessages2,
3731
3782
  promptType
3732
3783
  }) => {
@@ -3808,7 +3859,7 @@ async function streamText({
3808
3859
  result: { stream, warnings, rawResponse },
3809
3860
  doStreamSpan,
3810
3861
  startTimestampMs
3811
- } = await startRoundtrip({
3862
+ } = await startStep({
3812
3863
  promptType: validatePrompt({ system, prompt, messages }).type,
3813
3864
  promptMessages
3814
3865
  });
@@ -3822,8 +3873,8 @@ async function streamText({
3822
3873
  doStreamSpan,
3823
3874
  telemetry,
3824
3875
  startTimestampMs,
3825
- maxToolRoundtrips,
3826
- startRoundtrip,
3876
+ maxSteps,
3877
+ startStep,
3827
3878
  promptMessages,
3828
3879
  modelId: model.modelId,
3829
3880
  now: now2,
@@ -3844,8 +3895,8 @@ var DefaultStreamTextResult = class {
3844
3895
  doStreamSpan,
3845
3896
  telemetry,
3846
3897
  startTimestampMs,
3847
- maxToolRoundtrips,
3848
- startRoundtrip,
3898
+ maxSteps,
3899
+ startStep,
3849
3900
  promptMessages,
3850
3901
  modelId,
3851
3902
  now: now2,
@@ -3864,6 +3915,8 @@ var DefaultStreamTextResult = class {
3864
3915
  this.toolCalls = toolCallsPromise;
3865
3916
  const { resolve: resolveToolResults, promise: toolResultsPromise } = createResolvablePromise();
3866
3917
  this.toolResults = toolResultsPromise;
3918
+ const { resolve: resolveSteps, promise: stepsPromise } = createResolvablePromise();
3919
+ this.steps = stepsPromise;
3867
3920
  const {
3868
3921
  resolve: resolveProviderMetadata,
3869
3922
  promise: providerMetadataPromise
@@ -3877,12 +3930,13 @@ var DefaultStreamTextResult = class {
3877
3930
  close: closeStitchableStream
3878
3931
  } = createStitchableStream();
3879
3932
  this.originalStream = stitchableStream;
3933
+ const stepResults = [];
3880
3934
  const self = this;
3881
- function addRoundtripStream({
3935
+ function addStepStream({
3882
3936
  stream: stream2,
3883
3937
  startTimestamp,
3884
3938
  doStreamSpan: doStreamSpan2,
3885
- currentToolRoundtrip,
3939
+ currentStep,
3886
3940
  promptMessages: promptMessages2,
3887
3941
  usage = {
3888
3942
  promptTokens: 0,
@@ -3890,19 +3944,19 @@ var DefaultStreamTextResult = class {
3890
3944
  totalTokens: 0
3891
3945
  }
3892
3946
  }) {
3893
- const roundtripToolCalls = [];
3894
- const roundtripToolResults = [];
3895
- let roundtripFinishReason = "unknown";
3896
- let roundtripUsage = {
3947
+ const stepToolCalls = [];
3948
+ const stepToolResults = [];
3949
+ let stepFinishReason = "unknown";
3950
+ let stepUsage = {
3897
3951
  promptTokens: 0,
3898
3952
  completionTokens: 0,
3899
3953
  totalTokens: 0
3900
3954
  };
3901
- let roundtripProviderMetadata;
3902
- let roundtripFirstChunk = true;
3903
- let roundtripText = "";
3904
- let roundtripLogProbs;
3905
- let roundtripResponse = {
3955
+ let stepProviderMetadata;
3956
+ let stepFirstChunk = true;
3957
+ let stepText = "";
3958
+ let stepLogProbs;
3959
+ let stepResponse = {
3906
3960
  id: generateId3(),
3907
3961
  timestamp: currentDate(),
3908
3962
  modelId
@@ -3912,9 +3966,9 @@ var DefaultStreamTextResult = class {
3912
3966
  new TransformStream({
3913
3967
  async transform(chunk, controller) {
3914
3968
  var _a11, _b, _c;
3915
- if (roundtripFirstChunk) {
3969
+ if (stepFirstChunk) {
3916
3970
  const msToFirstChunk = now2() - startTimestamp;
3917
- roundtripFirstChunk = false;
3971
+ stepFirstChunk = false;
3918
3972
  doStreamSpan2.addEvent("ai.stream.firstChunk", {
3919
3973
  "ai.response.msToFirstChunk": msToFirstChunk,
3920
3974
  // deprecated:
@@ -3933,40 +3987,40 @@ var DefaultStreamTextResult = class {
3933
3987
  switch (chunkType) {
3934
3988
  case "text-delta": {
3935
3989
  controller.enqueue(chunk);
3936
- roundtripText += chunk.textDelta;
3990
+ stepText += chunk.textDelta;
3937
3991
  await (onChunk == null ? void 0 : onChunk({ chunk }));
3938
3992
  break;
3939
3993
  }
3940
3994
  case "tool-call": {
3941
3995
  controller.enqueue(chunk);
3942
- roundtripToolCalls.push(chunk);
3996
+ stepToolCalls.push(chunk);
3943
3997
  await (onChunk == null ? void 0 : onChunk({ chunk }));
3944
3998
  break;
3945
3999
  }
3946
4000
  case "tool-result": {
3947
4001
  controller.enqueue(chunk);
3948
- roundtripToolResults.push(chunk);
4002
+ stepToolResults.push(chunk);
3949
4003
  await (onChunk == null ? void 0 : onChunk({ chunk }));
3950
4004
  break;
3951
4005
  }
3952
4006
  case "response-metadata": {
3953
- roundtripResponse = {
3954
- id: (_a11 = chunk.id) != null ? _a11 : roundtripResponse.id,
3955
- timestamp: (_b = chunk.timestamp) != null ? _b : roundtripResponse.timestamp,
3956
- modelId: (_c = chunk.modelId) != null ? _c : roundtripResponse.modelId
4007
+ stepResponse = {
4008
+ id: (_a11 = chunk.id) != null ? _a11 : stepResponse.id,
4009
+ timestamp: (_b = chunk.timestamp) != null ? _b : stepResponse.timestamp,
4010
+ modelId: (_c = chunk.modelId) != null ? _c : stepResponse.modelId
3957
4011
  };
3958
4012
  break;
3959
4013
  }
3960
4014
  case "finish": {
3961
- roundtripUsage = chunk.usage;
3962
- roundtripFinishReason = chunk.finishReason;
3963
- roundtripProviderMetadata = chunk.experimental_providerMetadata;
3964
- roundtripLogProbs = chunk.logprobs;
4015
+ stepUsage = chunk.usage;
4016
+ stepFinishReason = chunk.finishReason;
4017
+ stepProviderMetadata = chunk.experimental_providerMetadata;
4018
+ stepLogProbs = chunk.logprobs;
3965
4019
  const msToFinish = now2() - startTimestamp;
3966
4020
  doStreamSpan2.addEvent("ai.stream.finish");
3967
4021
  doStreamSpan2.setAttributes({
3968
4022
  "ai.response.msToFinish": msToFinish,
3969
- "ai.response.avgCompletionTokensPerSecond": 1e3 * roundtripUsage.completionTokens / msToFinish
4023
+ "ai.response.avgCompletionTokensPerSecond": 1e3 * stepUsage.completionTokens / msToFinish
3970
4024
  });
3971
4025
  break;
3972
4026
  }
@@ -3978,7 +4032,7 @@ var DefaultStreamTextResult = class {
3978
4032
  }
3979
4033
  case "error": {
3980
4034
  controller.enqueue(chunk);
3981
- roundtripFinishReason = "error";
4035
+ stepFinishReason = "error";
3982
4036
  break;
3983
4037
  }
3984
4038
  default: {
@@ -3990,41 +4044,52 @@ var DefaultStreamTextResult = class {
3990
4044
  // invoke onFinish callback and resolve toolResults promise when the stream is about to close:
3991
4045
  async flush(controller) {
3992
4046
  controller.enqueue({
3993
- type: "roundtrip-finish",
3994
- finishReason: roundtripFinishReason,
3995
- usage: roundtripUsage,
3996
- experimental_providerMetadata: roundtripProviderMetadata,
3997
- logprobs: roundtripLogProbs,
3998
- response: roundtripResponse
4047
+ type: "step-finish",
4048
+ finishReason: stepFinishReason,
4049
+ usage: stepUsage,
4050
+ experimental_providerMetadata: stepProviderMetadata,
4051
+ logprobs: stepLogProbs,
4052
+ response: stepResponse
3999
4053
  });
4000
- const telemetryToolCalls = roundtripToolCalls.length > 0 ? JSON.stringify(roundtripToolCalls) : void 0;
4054
+ stepResults.push({
4055
+ text: stepText,
4056
+ toolCalls: stepToolCalls,
4057
+ toolResults: stepToolResults,
4058
+ finishReason: stepFinishReason,
4059
+ usage: stepUsage,
4060
+ warnings: self.warnings,
4061
+ logprobs: stepLogProbs,
4062
+ response: stepResponse,
4063
+ rawResponse: self.rawResponse
4064
+ });
4065
+ const telemetryToolCalls = stepToolCalls.length > 0 ? JSON.stringify(stepToolCalls) : void 0;
4001
4066
  try {
4002
4067
  doStreamSpan2.setAttributes(
4003
4068
  selectTelemetryAttributes({
4004
4069
  telemetry,
4005
4070
  attributes: {
4006
- "ai.response.finishReason": roundtripFinishReason,
4007
- "ai.response.text": { output: () => roundtripText },
4071
+ "ai.response.finishReason": stepFinishReason,
4072
+ "ai.response.text": { output: () => stepText },
4008
4073
  "ai.response.toolCalls": {
4009
4074
  output: () => telemetryToolCalls
4010
4075
  },
4011
- "ai.response.id": roundtripResponse.id,
4012
- "ai.response.model": roundtripResponse.modelId,
4013
- "ai.response.timestamp": roundtripResponse.timestamp.toISOString(),
4014
- "ai.usage.promptTokens": roundtripUsage.promptTokens,
4015
- "ai.usage.completionTokens": roundtripUsage.completionTokens,
4076
+ "ai.response.id": stepResponse.id,
4077
+ "ai.response.model": stepResponse.modelId,
4078
+ "ai.response.timestamp": stepResponse.timestamp.toISOString(),
4079
+ "ai.usage.promptTokens": stepUsage.promptTokens,
4080
+ "ai.usage.completionTokens": stepUsage.completionTokens,
4016
4081
  // deprecated
4017
- "ai.finishReason": roundtripFinishReason,
4018
- "ai.result.text": { output: () => roundtripText },
4082
+ "ai.finishReason": stepFinishReason,
4083
+ "ai.result.text": { output: () => stepText },
4019
4084
  "ai.result.toolCalls": {
4020
4085
  output: () => telemetryToolCalls
4021
4086
  },
4022
4087
  // standardized gen-ai llm span attributes:
4023
- "gen_ai.response.finish_reasons": [roundtripFinishReason],
4024
- "gen_ai.response.id": roundtripResponse.id,
4025
- "gen_ai.response.model": roundtripResponse.modelId,
4026
- "gen_ai.usage.input_tokens": roundtripUsage.promptTokens,
4027
- "gen_ai.usage.output_tokens": roundtripUsage.completionTokens
4088
+ "gen_ai.response.finish_reasons": [stepFinishReason],
4089
+ "gen_ai.response.id": stepResponse.id,
4090
+ "gen_ai.response.model": stepResponse.modelId,
4091
+ "gen_ai.usage.input_tokens": stepUsage.promptTokens,
4092
+ "gen_ai.usage.output_tokens": stepUsage.completionTokens
4028
4093
  }
4029
4094
  })
4030
4095
  );
@@ -4033,21 +4098,21 @@ var DefaultStreamTextResult = class {
4033
4098
  doStreamSpan2.end();
4034
4099
  }
4035
4100
  const combinedUsage = {
4036
- promptTokens: usage.promptTokens + roundtripUsage.promptTokens,
4037
- completionTokens: usage.completionTokens + roundtripUsage.completionTokens,
4038
- totalTokens: usage.totalTokens + roundtripUsage.totalTokens
4101
+ promptTokens: usage.promptTokens + stepUsage.promptTokens,
4102
+ completionTokens: usage.completionTokens + stepUsage.completionTokens,
4103
+ totalTokens: usage.totalTokens + stepUsage.totalTokens
4039
4104
  };
4040
4105
  if (
4041
4106
  // there are tool calls:
4042
- roundtripToolCalls.length > 0 && // all current tool calls have results:
4043
- roundtripToolResults.length === roundtripToolCalls.length && // the number of roundtrips is less than the maximum:
4044
- currentToolRoundtrip < maxToolRoundtrips
4107
+ stepToolCalls.length > 0 && // all current tool calls have results:
4108
+ stepToolResults.length === stepToolCalls.length && // the number of steps is less than the maximum:
4109
+ currentStep + 1 < maxSteps
4045
4110
  ) {
4046
4111
  promptMessages2.push(
4047
4112
  ...toResponseMessages({
4048
- text: roundtripText,
4049
- toolCalls: roundtripToolCalls,
4050
- toolResults: roundtripToolResults
4113
+ text: stepText,
4114
+ toolCalls: stepToolCalls,
4115
+ toolResults: stepToolResults
4051
4116
  }).map(
4052
4117
  (message) => convertToLanguageModelMessage(message, null)
4053
4118
  )
@@ -4056,17 +4121,17 @@ var DefaultStreamTextResult = class {
4056
4121
  result,
4057
4122
  doStreamSpan: doStreamSpan3,
4058
4123
  startTimestampMs: startTimestamp2
4059
- } = await startRoundtrip({
4124
+ } = await startStep({
4060
4125
  promptType: "messages",
4061
4126
  promptMessages: promptMessages2
4062
4127
  });
4063
4128
  self.warnings = result.warnings;
4064
4129
  self.rawResponse = result.rawResponse;
4065
- addRoundtripStream({
4130
+ addStepStream({
4066
4131
  stream: result.stream,
4067
4132
  startTimestamp: startTimestamp2,
4068
4133
  doStreamSpan: doStreamSpan3,
4069
- currentToolRoundtrip: currentToolRoundtrip + 1,
4134
+ currentStep: currentStep + 1,
4070
4135
  promptMessages: promptMessages2,
4071
4136
  usage: combinedUsage
4072
4137
  });
@@ -4075,27 +4140,27 @@ var DefaultStreamTextResult = class {
4075
4140
  try {
4076
4141
  controller.enqueue({
4077
4142
  type: "finish",
4078
- finishReason: roundtripFinishReason,
4143
+ finishReason: stepFinishReason,
4079
4144
  usage: combinedUsage,
4080
- experimental_providerMetadata: roundtripProviderMetadata,
4081
- logprobs: roundtripLogProbs,
4082
- response: roundtripResponse
4145
+ experimental_providerMetadata: stepProviderMetadata,
4146
+ logprobs: stepLogProbs,
4147
+ response: stepResponse
4083
4148
  });
4084
4149
  closeStitchableStream();
4085
4150
  rootSpan.setAttributes(
4086
4151
  selectTelemetryAttributes({
4087
4152
  telemetry,
4088
4153
  attributes: {
4089
- "ai.response.finishReason": roundtripFinishReason,
4090
- "ai.response.text": { output: () => roundtripText },
4154
+ "ai.response.finishReason": stepFinishReason,
4155
+ "ai.response.text": { output: () => stepText },
4091
4156
  "ai.response.toolCalls": {
4092
4157
  output: () => telemetryToolCalls
4093
4158
  },
4094
4159
  "ai.usage.promptTokens": combinedUsage.promptTokens,
4095
4160
  "ai.usage.completionTokens": combinedUsage.completionTokens,
4096
4161
  // deprecated
4097
- "ai.finishReason": roundtripFinishReason,
4098
- "ai.result.text": { output: () => roundtripText },
4162
+ "ai.finishReason": stepFinishReason,
4163
+ "ai.result.text": { output: () => stepText },
4099
4164
  "ai.result.toolCalls": {
4100
4165
  output: () => telemetryToolCalls
4101
4166
  }
@@ -4103,32 +4168,35 @@ var DefaultStreamTextResult = class {
4103
4168
  })
4104
4169
  );
4105
4170
  resolveUsage(combinedUsage);
4106
- resolveFinishReason(roundtripFinishReason);
4107
- resolveText(roundtripText);
4108
- resolveToolCalls(roundtripToolCalls);
4109
- resolveProviderMetadata(roundtripProviderMetadata);
4110
- resolveToolResults(roundtripToolResults);
4171
+ resolveFinishReason(stepFinishReason);
4172
+ resolveText(stepText);
4173
+ resolveToolCalls(stepToolCalls);
4174
+ resolveProviderMetadata(stepProviderMetadata);
4175
+ resolveToolResults(stepToolResults);
4111
4176
  resolveResponse({
4112
- ...roundtripResponse,
4177
+ ...stepResponse,
4113
4178
  headers: rawResponse == null ? void 0 : rawResponse.headers
4114
4179
  });
4180
+ resolveSteps(stepResults);
4115
4181
  await (onFinish == null ? void 0 : onFinish({
4116
- finishReason: roundtripFinishReason,
4182
+ finishReason: stepFinishReason,
4117
4183
  usage: combinedUsage,
4118
- text: roundtripText,
4119
- toolCalls: roundtripToolCalls,
4184
+ text: stepText,
4185
+ toolCalls: stepToolCalls,
4120
4186
  // The tool results are inferred as a never[] type, because they are
4121
4187
  // optional and the execute method with an inferred result type is
4122
4188
  // optional as well. Therefore we need to cast the toolResults to any.
4123
4189
  // The type exposed to the users will be correctly inferred.
4124
- toolResults: roundtripToolResults,
4190
+ toolResults: stepToolResults,
4125
4191
  rawResponse,
4126
4192
  response: {
4127
- ...roundtripResponse,
4193
+ ...stepResponse,
4128
4194
  headers: rawResponse == null ? void 0 : rawResponse.headers
4129
4195
  },
4130
4196
  warnings,
4131
- experimental_providerMetadata: roundtripProviderMetadata
4197
+ experimental_providerMetadata: stepProviderMetadata,
4198
+ steps: stepResults
4199
+ // see tool results comment above
4132
4200
  }));
4133
4201
  } catch (error) {
4134
4202
  controller.error(error);
@@ -4140,11 +4208,11 @@ var DefaultStreamTextResult = class {
4140
4208
  )
4141
4209
  );
4142
4210
  }
4143
- addRoundtripStream({
4211
+ addStepStream({
4144
4212
  stream,
4145
4213
  startTimestamp: startTimestampMs,
4146
4214
  doStreamSpan,
4147
- currentToolRoundtrip: 0,
4215
+ currentStep: 0,
4148
4216
  promptMessages,
4149
4217
  usage: void 0
4150
4218
  });
@@ -4217,10 +4285,11 @@ var DefaultStreamTextResult = class {
4217
4285
  transform: async (chunk, controller) => {
4218
4286
  const chunkType = chunk.type;
4219
4287
  switch (chunkType) {
4220
- case "text-delta":
4288
+ case "text-delta": {
4221
4289
  controller.enqueue((0, import_ui_utils10.formatStreamPart)("text", chunk.textDelta));
4222
4290
  break;
4223
- case "tool-call-streaming-start":
4291
+ }
4292
+ case "tool-call-streaming-start": {
4224
4293
  controller.enqueue(
4225
4294
  (0, import_ui_utils10.formatStreamPart)("tool_call_streaming_start", {
4226
4295
  toolCallId: chunk.toolCallId,
@@ -4228,7 +4297,8 @@ var DefaultStreamTextResult = class {
4228
4297
  })
4229
4298
  );
4230
4299
  break;
4231
- case "tool-call-delta":
4300
+ }
4301
+ case "tool-call-delta": {
4232
4302
  controller.enqueue(
4233
4303
  (0, import_ui_utils10.formatStreamPart)("tool_call_delta", {
4234
4304
  toolCallId: chunk.toolCallId,
@@ -4236,7 +4306,8 @@ var DefaultStreamTextResult = class {
4236
4306
  })
4237
4307
  );
4238
4308
  break;
4239
- case "tool-call":
4309
+ }
4310
+ case "tool-call": {
4240
4311
  controller.enqueue(
4241
4312
  (0, import_ui_utils10.formatStreamPart)("tool_call", {
4242
4313
  toolCallId: chunk.toolCallId,
@@ -4245,7 +4316,8 @@ var DefaultStreamTextResult = class {
4245
4316
  })
4246
4317
  );
4247
4318
  break;
4248
- case "tool-result":
4319
+ }
4320
+ case "tool-result": {
4249
4321
  controller.enqueue(
4250
4322
  (0, import_ui_utils10.formatStreamPart)("tool_result", {
4251
4323
  toolCallId: chunk.toolCallId,
@@ -4253,14 +4325,16 @@ var DefaultStreamTextResult = class {
4253
4325
  })
4254
4326
  );
4255
4327
  break;
4256
- case "error":
4328
+ }
4329
+ case "error": {
4257
4330
  controller.enqueue(
4258
4331
  (0, import_ui_utils10.formatStreamPart)("error", getErrorMessage4(chunk.error))
4259
4332
  );
4260
4333
  break;
4261
- case "roundtrip-finish":
4334
+ }
4335
+ case "step-finish": {
4262
4336
  controller.enqueue(
4263
- (0, import_ui_utils10.formatStreamPart)("finish_roundtrip", {
4337
+ (0, import_ui_utils10.formatStreamPart)("finish_step", {
4264
4338
  finishReason: chunk.finishReason,
4265
4339
  usage: sendUsage ? {
4266
4340
  promptTokens: chunk.usage.promptTokens,
@@ -4269,7 +4343,8 @@ var DefaultStreamTextResult = class {
4269
4343
  })
4270
4344
  );
4271
4345
  break;
4272
- case "finish":
4346
+ }
4347
+ case "finish": {
4273
4348
  controller.enqueue(
4274
4349
  (0, import_ui_utils10.formatStreamPart)("finish_message", {
4275
4350
  finishReason: chunk.finishReason,
@@ -4280,6 +4355,7 @@ var DefaultStreamTextResult = class {
4280
4355
  })
4281
4356
  );
4282
4357
  break;
4358
+ }
4283
4359
  default: {
4284
4360
  const exhaustiveCheck = chunkType;
4285
4361
  throw new Error(`Unknown chunk type: ${exhaustiveCheck}`);
@@ -4455,27 +4531,6 @@ function attachmentsToParts(attachments) {
4455
4531
  return parts;
4456
4532
  }
4457
4533
 
4458
- // core/prompt/message-conversion-error.ts
4459
- var import_provider12 = require("@ai-sdk/provider");
4460
- var name9 = "AI_MessageConversionError";
4461
- var marker9 = `vercel.ai.error.${name9}`;
4462
- var symbol9 = Symbol.for(marker9);
4463
- var _a9;
4464
- var MessageConversionError = class extends import_provider12.AISDKError {
4465
- constructor({
4466
- originalMessage,
4467
- message
4468
- }) {
4469
- super({ name: name9, message });
4470
- this[_a9] = true;
4471
- this.originalMessage = originalMessage;
4472
- }
4473
- static isInstance(error) {
4474
- return import_provider12.AISDKError.hasMarker(error, marker9);
4475
- }
4476
- };
4477
- _a9 = symbol9;
4478
-
4479
4534
  // core/prompt/convert-to-core-messages.ts
4480
4535
  function convertToCoreMessages(messages) {
4481
4536
  const coreMessages = [];
@@ -4555,7 +4610,7 @@ function convertToCoreMessages(messages) {
4555
4610
  }
4556
4611
 
4557
4612
  // core/registry/custom-provider.ts
4558
- var import_provider13 = require("@ai-sdk/provider");
4613
+ var import_provider14 = require("@ai-sdk/provider");
4559
4614
  function experimental_customProvider({
4560
4615
  languageModels,
4561
4616
  textEmbeddingModels,
@@ -4569,7 +4624,7 @@ function experimental_customProvider({
4569
4624
  if (fallbackProvider) {
4570
4625
  return fallbackProvider.languageModel(modelId);
4571
4626
  }
4572
- throw new import_provider13.NoSuchModelError({ modelId, modelType: "languageModel" });
4627
+ throw new import_provider14.NoSuchModelError({ modelId, modelType: "languageModel" });
4573
4628
  },
4574
4629
  textEmbeddingModel(modelId) {
4575
4630
  if (textEmbeddingModels != null && modelId in textEmbeddingModels) {
@@ -4578,18 +4633,18 @@ function experimental_customProvider({
4578
4633
  if (fallbackProvider) {
4579
4634
  return fallbackProvider.textEmbeddingModel(modelId);
4580
4635
  }
4581
- throw new import_provider13.NoSuchModelError({ modelId, modelType: "textEmbeddingModel" });
4636
+ throw new import_provider14.NoSuchModelError({ modelId, modelType: "textEmbeddingModel" });
4582
4637
  }
4583
4638
  };
4584
4639
  }
4585
4640
 
4586
4641
  // core/registry/no-such-provider-error.ts
4587
- var import_provider14 = require("@ai-sdk/provider");
4642
+ var import_provider15 = require("@ai-sdk/provider");
4588
4643
  var name10 = "AI_NoSuchProviderError";
4589
4644
  var marker10 = `vercel.ai.error.${name10}`;
4590
4645
  var symbol10 = Symbol.for(marker10);
4591
4646
  var _a10;
4592
- var NoSuchProviderError = class extends import_provider14.NoSuchModelError {
4647
+ var NoSuchProviderError = class extends import_provider15.NoSuchModelError {
4593
4648
  constructor({
4594
4649
  modelId,
4595
4650
  modelType,
@@ -4603,7 +4658,7 @@ var NoSuchProviderError = class extends import_provider14.NoSuchModelError {
4603
4658
  this.availableProviders = availableProviders;
4604
4659
  }
4605
4660
  static isInstance(error) {
4606
- return import_provider14.AISDKError.hasMarker(error, marker10);
4661
+ return import_provider15.AISDKError.hasMarker(error, marker10);
4607
4662
  }
4608
4663
  /**
4609
4664
  * @deprecated use `isInstance` instead
@@ -4629,7 +4684,7 @@ var NoSuchProviderError = class extends import_provider14.NoSuchModelError {
4629
4684
  _a10 = symbol10;
4630
4685
 
4631
4686
  // core/registry/provider-registry.ts
4632
- var import_provider15 = require("@ai-sdk/provider");
4687
+ var import_provider16 = require("@ai-sdk/provider");
4633
4688
  function experimental_createProviderRegistry(providers) {
4634
4689
  const registry = new DefaultProviderRegistry();
4635
4690
  for (const [id, provider] of Object.entries(providers)) {
@@ -4663,7 +4718,7 @@ var DefaultProviderRegistry = class {
4663
4718
  splitId(id, modelType) {
4664
4719
  const index = id.indexOf(":");
4665
4720
  if (index === -1) {
4666
- throw new import_provider15.NoSuchModelError({
4721
+ throw new import_provider16.NoSuchModelError({
4667
4722
  modelId: id,
4668
4723
  modelType,
4669
4724
  message: `Invalid ${modelType} id for registry: ${id} (must be in the format "providerId:modelId")`
@@ -4676,7 +4731,7 @@ var DefaultProviderRegistry = class {
4676
4731
  const [providerId, modelId] = this.splitId(id, "languageModel");
4677
4732
  const model = (_b = (_a11 = this.getProvider(providerId)).languageModel) == null ? void 0 : _b.call(_a11, modelId);
4678
4733
  if (model == null) {
4679
- throw new import_provider15.NoSuchModelError({ modelId: id, modelType: "languageModel" });
4734
+ throw new import_provider16.NoSuchModelError({ modelId: id, modelType: "languageModel" });
4680
4735
  }
4681
4736
  return model;
4682
4737
  }
@@ -4686,7 +4741,7 @@ var DefaultProviderRegistry = class {
4686
4741
  const provider = this.getProvider(providerId);
4687
4742
  const model = (_c = (_a11 = provider.textEmbeddingModel) == null ? void 0 : _a11.call(provider, modelId)) != null ? _c : "textEmbedding" in provider ? (_b = provider.textEmbedding) == null ? void 0 : _b.call(provider, modelId) : void 0;
4688
4743
  if (model == null) {
4689
- throw new import_provider15.NoSuchModelError({
4744
+ throw new import_provider16.NoSuchModelError({
4690
4745
  modelId: id,
4691
4746
  modelType: "textEmbeddingModel"
4692
4747
  });
@@ -4725,9 +4780,6 @@ function magnitude(vector) {
4725
4780
  return Math.sqrt(dotProduct(vector, vector));
4726
4781
  }
4727
4782
 
4728
- // errors/index.ts
4729
- var import_provider16 = require("@ai-sdk/provider");
4730
-
4731
4783
  // streams/ai-stream.ts
4732
4784
  var import_eventsource_parser = require("eventsource-parser");
4733
4785
  function createEventStreamTransformer(customParser) {