ai 4.0.17 → 4.0.19

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
@@ -900,13 +900,39 @@ var DefaultGenerateImageResult = class {
900
900
  // core/generate-object/generate-object.ts
901
901
  var import_provider_utils6 = require("@ai-sdk/provider-utils");
902
902
 
903
- // util/download-error.ts
903
+ // errors/no-object-generated-error.ts
904
904
  var import_provider4 = require("@ai-sdk/provider");
905
- var name3 = "AI_DownloadError";
905
+ var name3 = "AI_NoObjectGeneratedError";
906
906
  var marker3 = `vercel.ai.error.${name3}`;
907
907
  var symbol3 = Symbol.for(marker3);
908
908
  var _a3;
909
- var DownloadError = class extends import_provider4.AISDKError {
909
+ var NoObjectGeneratedError = class extends import_provider4.AISDKError {
910
+ constructor({
911
+ message = "No object generated.",
912
+ cause,
913
+ text: text2,
914
+ response,
915
+ usage
916
+ }) {
917
+ super({ name: name3, message, cause });
918
+ this[_a3] = true;
919
+ this.text = text2;
920
+ this.response = response;
921
+ this.usage = usage;
922
+ }
923
+ static isInstance(error) {
924
+ return import_provider4.AISDKError.hasMarker(error, marker3);
925
+ }
926
+ };
927
+ _a3 = symbol3;
928
+
929
+ // util/download-error.ts
930
+ var import_provider5 = require("@ai-sdk/provider");
931
+ var name4 = "AI_DownloadError";
932
+ var marker4 = `vercel.ai.error.${name4}`;
933
+ var symbol4 = Symbol.for(marker4);
934
+ var _a4;
935
+ var DownloadError = class extends import_provider5.AISDKError {
910
936
  constructor({
911
937
  url,
912
938
  statusCode,
@@ -914,17 +940,17 @@ var DownloadError = class extends import_provider4.AISDKError {
914
940
  cause,
915
941
  message = cause == null ? `Failed to download ${url}: ${statusCode} ${statusText}` : `Failed to download ${url}: ${cause}`
916
942
  }) {
917
- super({ name: name3, message, cause });
918
- this[_a3] = true;
943
+ super({ name: name4, message, cause });
944
+ this[_a4] = true;
919
945
  this.url = url;
920
946
  this.statusCode = statusCode;
921
947
  this.statusText = statusText;
922
948
  }
923
949
  static isInstance(error) {
924
- return import_provider4.AISDKError.hasMarker(error, marker3);
950
+ return import_provider5.AISDKError.hasMarker(error, marker4);
925
951
  }
926
952
  };
927
- _a3 = symbol3;
953
+ _a4 = symbol4;
928
954
 
929
955
  // util/download.ts
930
956
  async function download({
@@ -974,26 +1000,26 @@ function detectImageMimeType(image) {
974
1000
  var import_provider_utils3 = require("@ai-sdk/provider-utils");
975
1001
 
976
1002
  // core/prompt/invalid-data-content-error.ts
977
- var import_provider5 = require("@ai-sdk/provider");
978
- var name4 = "AI_InvalidDataContentError";
979
- var marker4 = `vercel.ai.error.${name4}`;
980
- var symbol4 = Symbol.for(marker4);
981
- var _a4;
982
- var InvalidDataContentError = class extends import_provider5.AISDKError {
1003
+ var import_provider6 = require("@ai-sdk/provider");
1004
+ var name5 = "AI_InvalidDataContentError";
1005
+ var marker5 = `vercel.ai.error.${name5}`;
1006
+ var symbol5 = Symbol.for(marker5);
1007
+ var _a5;
1008
+ var InvalidDataContentError = class extends import_provider6.AISDKError {
983
1009
  constructor({
984
1010
  content,
985
1011
  cause,
986
1012
  message = `Invalid data content. Expected a base64 string, Uint8Array, ArrayBuffer, or Buffer, but got ${typeof content}.`
987
1013
  }) {
988
- super({ name: name4, message, cause });
989
- this[_a4] = true;
1014
+ super({ name: name5, message, cause });
1015
+ this[_a5] = true;
990
1016
  this.content = content;
991
1017
  }
992
1018
  static isInstance(error) {
993
- return import_provider5.AISDKError.hasMarker(error, marker4);
1019
+ return import_provider6.AISDKError.hasMarker(error, marker5);
994
1020
  }
995
1021
  };
996
- _a4 = symbol4;
1022
+ _a5 = symbol5;
997
1023
 
998
1024
  // core/prompt/data-content.ts
999
1025
  var import_zod = require("zod");
@@ -1048,25 +1074,25 @@ function convertUint8ArrayToText(uint8Array) {
1048
1074
  }
1049
1075
 
1050
1076
  // core/prompt/invalid-message-role-error.ts
1051
- var import_provider6 = require("@ai-sdk/provider");
1052
- var name5 = "AI_InvalidMessageRoleError";
1053
- var marker5 = `vercel.ai.error.${name5}`;
1054
- var symbol5 = Symbol.for(marker5);
1055
- var _a5;
1056
- var InvalidMessageRoleError = class extends import_provider6.AISDKError {
1077
+ var import_provider7 = require("@ai-sdk/provider");
1078
+ var name6 = "AI_InvalidMessageRoleError";
1079
+ var marker6 = `vercel.ai.error.${name6}`;
1080
+ var symbol6 = Symbol.for(marker6);
1081
+ var _a6;
1082
+ var InvalidMessageRoleError = class extends import_provider7.AISDKError {
1057
1083
  constructor({
1058
1084
  role,
1059
1085
  message = `Invalid message role: '${role}'. Must be one of: "system", "user", "assistant", "tool".`
1060
1086
  }) {
1061
- super({ name: name5, message });
1062
- this[_a5] = true;
1087
+ super({ name: name6, message });
1088
+ this[_a6] = true;
1063
1089
  this.role = role;
1064
1090
  }
1065
1091
  static isInstance(error) {
1066
- return import_provider6.AISDKError.hasMarker(error, marker5);
1092
+ return import_provider7.AISDKError.hasMarker(error, marker6);
1067
1093
  }
1068
1094
  };
1069
- _a5 = symbol5;
1095
+ _a6 = symbol6;
1070
1096
 
1071
1097
  // core/prompt/split-data-url.ts
1072
1098
  function splitDataUrl(dataUrl) {
@@ -1363,7 +1389,7 @@ function prepareCallSettings({
1363
1389
  }
1364
1390
 
1365
1391
  // core/prompt/standardize-prompt.ts
1366
- var import_provider8 = require("@ai-sdk/provider");
1392
+ var import_provider9 = require("@ai-sdk/provider");
1367
1393
  var import_provider_utils4 = require("@ai-sdk/provider-utils");
1368
1394
  var import_zod7 = require("zod");
1369
1395
 
@@ -1589,25 +1615,25 @@ function attachmentsToParts(attachments) {
1589
1615
  }
1590
1616
 
1591
1617
  // core/prompt/message-conversion-error.ts
1592
- var import_provider7 = require("@ai-sdk/provider");
1593
- var name6 = "AI_MessageConversionError";
1594
- var marker6 = `vercel.ai.error.${name6}`;
1595
- var symbol6 = Symbol.for(marker6);
1596
- var _a6;
1597
- var MessageConversionError = class extends import_provider7.AISDKError {
1618
+ var import_provider8 = require("@ai-sdk/provider");
1619
+ var name7 = "AI_MessageConversionError";
1620
+ var marker7 = `vercel.ai.error.${name7}`;
1621
+ var symbol7 = Symbol.for(marker7);
1622
+ var _a7;
1623
+ var MessageConversionError = class extends import_provider8.AISDKError {
1598
1624
  constructor({
1599
1625
  originalMessage,
1600
1626
  message
1601
1627
  }) {
1602
- super({ name: name6, message });
1603
- this[_a6] = true;
1628
+ super({ name: name7, message });
1629
+ this[_a7] = true;
1604
1630
  this.originalMessage = originalMessage;
1605
1631
  }
1606
1632
  static isInstance(error) {
1607
- return import_provider7.AISDKError.hasMarker(error, marker6);
1633
+ return import_provider8.AISDKError.hasMarker(error, marker7);
1608
1634
  }
1609
1635
  };
1610
- _a6 = symbol6;
1636
+ _a7 = symbol7;
1611
1637
 
1612
1638
  // core/prompt/convert-to-core-messages.ts
1613
1639
  function convertToCoreMessages(messages, options) {
@@ -1701,26 +1727,26 @@ function standardizePrompt({
1701
1727
  tools
1702
1728
  }) {
1703
1729
  if (prompt.prompt == null && prompt.messages == null) {
1704
- throw new import_provider8.InvalidPromptError({
1730
+ throw new import_provider9.InvalidPromptError({
1705
1731
  prompt,
1706
1732
  message: "prompt or messages must be defined"
1707
1733
  });
1708
1734
  }
1709
1735
  if (prompt.prompt != null && prompt.messages != null) {
1710
- throw new import_provider8.InvalidPromptError({
1736
+ throw new import_provider9.InvalidPromptError({
1711
1737
  prompt,
1712
1738
  message: "prompt and messages cannot be defined at the same time"
1713
1739
  });
1714
1740
  }
1715
1741
  if (prompt.system != null && typeof prompt.system !== "string") {
1716
- throw new import_provider8.InvalidPromptError({
1742
+ throw new import_provider9.InvalidPromptError({
1717
1743
  prompt,
1718
1744
  message: "system must be a string"
1719
1745
  });
1720
1746
  }
1721
1747
  if (prompt.prompt != null) {
1722
1748
  if (typeof prompt.prompt !== "string") {
1723
- throw new import_provider8.InvalidPromptError({
1749
+ throw new import_provider9.InvalidPromptError({
1724
1750
  prompt,
1725
1751
  message: "prompt must be a string"
1726
1752
  });
@@ -1739,7 +1765,7 @@ function standardizePrompt({
1739
1765
  if (prompt.messages != null) {
1740
1766
  const promptType = detectPromptType(prompt.messages);
1741
1767
  if (promptType === "other") {
1742
- throw new import_provider8.InvalidPromptError({
1768
+ throw new import_provider9.InvalidPromptError({
1743
1769
  prompt,
1744
1770
  message: "messages must be an array of CoreMessage or UIMessage"
1745
1771
  });
@@ -1752,7 +1778,7 @@ function standardizePrompt({
1752
1778
  schema: import_zod7.z.array(coreMessageSchema)
1753
1779
  });
1754
1780
  if (!validationResult.success) {
1755
- throw new import_provider8.InvalidPromptError({
1781
+ throw new import_provider9.InvalidPromptError({
1756
1782
  prompt,
1757
1783
  message: "messages must be an array of CoreMessage or UIMessage",
1758
1784
  cause: validationResult.error
@@ -1778,6 +1804,13 @@ function calculateLanguageModelUsage({
1778
1804
  totalTokens: promptTokens + completionTokens
1779
1805
  };
1780
1806
  }
1807
+ function addLanguageModelUsage(usage1, usage2) {
1808
+ return {
1809
+ promptTokens: usage1.promptTokens + usage2.promptTokens,
1810
+ completionTokens: usage1.completionTokens + usage2.completionTokens,
1811
+ totalTokens: usage1.totalTokens + usage2.totalTokens
1812
+ };
1813
+ }
1781
1814
 
1782
1815
  // core/generate-object/inject-json-instruction.ts
1783
1816
  var DEFAULT_SCHEMA_PREFIX = "JSON schema:";
@@ -1799,24 +1832,6 @@ function injectJsonInstruction({
1799
1832
  ].filter((line) => line != null).join("\n");
1800
1833
  }
1801
1834
 
1802
- // core/generate-object/no-object-generated-error.ts
1803
- var import_provider9 = require("@ai-sdk/provider");
1804
- var name7 = "AI_NoObjectGeneratedError";
1805
- var marker7 = `vercel.ai.error.${name7}`;
1806
- var symbol7 = Symbol.for(marker7);
1807
- var _a7;
1808
- var NoObjectGeneratedError = class extends import_provider9.AISDKError {
1809
- // used in isInstance
1810
- constructor({ message = "No object generated." } = {}) {
1811
- super({ name: name7, message });
1812
- this[_a7] = true;
1813
- }
1814
- static isInstance(error) {
1815
- return import_provider9.AISDKError.hasMarker(error, marker7);
1816
- }
1817
- };
1818
- _a7 = symbol7;
1819
-
1820
1835
  // core/generate-object/output-strategy.ts
1821
1836
  var import_provider10 = require("@ai-sdk/provider");
1822
1837
  var import_provider_utils5 = require("@ai-sdk/provider-utils");
@@ -1846,8 +1861,16 @@ var noSchemaOutputStrategy = {
1846
1861
  validatePartialResult({ value, textDelta }) {
1847
1862
  return { success: true, value: { partial: value, textDelta } };
1848
1863
  },
1849
- validateFinalResult(value) {
1850
- return value === void 0 ? { success: false, error: new NoObjectGeneratedError() } : { success: true, value };
1864
+ validateFinalResult(value, context) {
1865
+ return value === void 0 ? {
1866
+ success: false,
1867
+ error: new NoObjectGeneratedError({
1868
+ message: "No object generated: response did not match schema.",
1869
+ text: context.text,
1870
+ response: context.response,
1871
+ usage: context.usage
1872
+ })
1873
+ } : { success: true, value };
1851
1874
  },
1852
1875
  createElementStream() {
1853
1876
  throw new import_provider10.UnsupportedFunctionalityError({
@@ -2326,14 +2349,18 @@ async function generateObject({
2326
2349
  abortSignal,
2327
2350
  headers
2328
2351
  });
2329
- if (result2.text === void 0) {
2330
- throw new NoObjectGeneratedError();
2331
- }
2332
2352
  const responseData = {
2333
2353
  id: (_b2 = (_a14 = result2.response) == null ? void 0 : _a14.id) != null ? _b2 : generateId3(),
2334
2354
  timestamp: (_d = (_c = result2.response) == null ? void 0 : _c.timestamp) != null ? _d : currentDate(),
2335
2355
  modelId: (_f = (_e = result2.response) == null ? void 0 : _e.modelId) != null ? _f : model.modelId
2336
2356
  };
2357
+ if (result2.text === void 0) {
2358
+ throw new NoObjectGeneratedError({
2359
+ message: "No object generated: the model did not return a response.",
2360
+ response: responseData,
2361
+ usage: calculateLanguageModelUsage(result2.usage)
2362
+ });
2363
+ }
2337
2364
  span2.setAttributes(
2338
2365
  selectTelemetryAttributes({
2339
2366
  telemetry,
@@ -2430,14 +2457,18 @@ async function generateObject({
2430
2457
  headers
2431
2458
  });
2432
2459
  const objectText = (_b2 = (_a14 = result2.toolCalls) == null ? void 0 : _a14[0]) == null ? void 0 : _b2.args;
2433
- if (objectText === void 0) {
2434
- throw new NoObjectGeneratedError();
2435
- }
2436
2460
  const responseData = {
2437
2461
  id: (_d = (_c = result2.response) == null ? void 0 : _c.id) != null ? _d : generateId3(),
2438
2462
  timestamp: (_f = (_e = result2.response) == null ? void 0 : _e.timestamp) != null ? _f : currentDate(),
2439
2463
  modelId: (_h = (_g = result2.response) == null ? void 0 : _g.modelId) != null ? _h : model.modelId
2440
2464
  };
2465
+ if (objectText === void 0) {
2466
+ throw new NoObjectGeneratedError({
2467
+ message: "No object generated: the tool was not called.",
2468
+ response: responseData,
2469
+ usage: calculateLanguageModelUsage(result2.usage)
2470
+ });
2471
+ }
2441
2472
  span2.setAttributes(
2442
2473
  selectTelemetryAttributes({
2443
2474
  telemetry,
@@ -2485,13 +2516,30 @@ async function generateObject({
2485
2516
  }
2486
2517
  const parseResult = (0, import_provider_utils6.safeParseJSON)({ text: result });
2487
2518
  if (!parseResult.success) {
2488
- throw parseResult.error;
2519
+ throw new NoObjectGeneratedError({
2520
+ message: "No object generated: could not parse the response.",
2521
+ cause: parseResult.error,
2522
+ text: result,
2523
+ response,
2524
+ usage: calculateLanguageModelUsage(usage)
2525
+ });
2489
2526
  }
2490
2527
  const validationResult = outputStrategy.validateFinalResult(
2491
- parseResult.value
2528
+ parseResult.value,
2529
+ {
2530
+ text: result,
2531
+ response,
2532
+ usage: calculateLanguageModelUsage(usage)
2533
+ }
2492
2534
  );
2493
2535
  if (!validationResult.success) {
2494
- throw validationResult.error;
2536
+ throw new NoObjectGeneratedError({
2537
+ message: "No object generated: response did not match schema.",
2538
+ cause: validationResult.error,
2539
+ text: result,
2540
+ response,
2541
+ usage: calculateLanguageModelUsage(usage)
2542
+ });
2495
2543
  }
2496
2544
  span.setAttributes(
2497
2545
  selectTelemetryAttributes({
@@ -3026,12 +3074,25 @@ var DefaultStreamObjectResult = class {
3026
3074
  ...response,
3027
3075
  headers: rawResponse == null ? void 0 : rawResponse.headers
3028
3076
  });
3029
- const validationResult = outputStrategy.validateFinalResult(latestObjectJson);
3077
+ const validationResult = outputStrategy.validateFinalResult(
3078
+ latestObjectJson,
3079
+ {
3080
+ text: accumulatedText,
3081
+ response,
3082
+ usage
3083
+ }
3084
+ );
3030
3085
  if (validationResult.success) {
3031
3086
  object2 = validationResult.value;
3032
3087
  self.objectPromise.resolve(object2);
3033
3088
  } else {
3034
- error = validationResult.error;
3089
+ error = new NoObjectGeneratedError({
3090
+ message: "No object generated: response did not match schema.",
3091
+ cause: validationResult.error,
3092
+ text: accumulatedText,
3093
+ response,
3094
+ usage
3095
+ });
3035
3096
  self.objectPromise.reject(error);
3036
3097
  }
3037
3098
  break;
@@ -3568,7 +3629,7 @@ async function generateText({
3568
3629
  const responseMessages = [];
3569
3630
  let text2 = "";
3570
3631
  const steps = [];
3571
- const usage = {
3632
+ let usage = {
3572
3633
  completionTokens: 0,
3573
3634
  promptTokens: 0,
3574
3635
  totalTokens: 0
@@ -3695,9 +3756,7 @@ async function generateText({
3695
3756
  const currentUsage = calculateLanguageModelUsage(
3696
3757
  currentModelResponse.usage
3697
3758
  );
3698
- usage.completionTokens += currentUsage.completionTokens;
3699
- usage.promptTokens += currentUsage.promptTokens;
3700
- usage.totalTokens += currentUsage.totalTokens;
3759
+ usage = addLanguageModelUsage(usage, currentUsage);
3701
3760
  let nextStepType = "done";
3702
3761
  if (++stepCount < maxSteps) {
3703
3762
  if (continueSteps && currentModelResponse.finishReason === "length" && // only use continue when there are no tool calls:
@@ -3777,7 +3836,13 @@ async function generateText({
3777
3836
  );
3778
3837
  return new DefaultGenerateTextResult({
3779
3838
  text: text2,
3780
- output: output == null ? void 0 : output.parseOutput({ text: text2 }),
3839
+ output: output == null ? void 0 : output.parseOutput(
3840
+ { text: text2 },
3841
+ {
3842
+ response: currentModelResponse.response,
3843
+ usage
3844
+ }
3845
+ ),
3781
3846
  toolCalls: currentToolCalls,
3782
3847
  toolResults: currentToolResults,
3783
3848
  finishReason: currentModelResponse.finishReason,
@@ -3920,8 +3985,31 @@ var object = ({
3920
3985
  schema: schema.jsonSchema
3921
3986
  });
3922
3987
  },
3923
- parseOutput({ text: text2 }) {
3924
- return (0, import_provider_utils10.parseJSON)({ text: text2, schema });
3988
+ parseOutput({ text: text2 }, context) {
3989
+ const parseResult = (0, import_provider_utils10.safeParseJSON)({ text: text2 });
3990
+ if (!parseResult.success) {
3991
+ throw new NoObjectGeneratedError({
3992
+ message: "No object generated: could not parse the response.",
3993
+ cause: parseResult.error,
3994
+ text: text2,
3995
+ response: context.response,
3996
+ usage: context.usage
3997
+ });
3998
+ }
3999
+ const validationResult = (0, import_provider_utils10.safeValidateTypes)({
4000
+ value: parseResult.value,
4001
+ schema
4002
+ });
4003
+ if (!validationResult.success) {
4004
+ throw new NoObjectGeneratedError({
4005
+ message: "No object generated: response did not match schema.",
4006
+ cause: validationResult.error,
4007
+ text: text2,
4008
+ response: context.response,
4009
+ usage: context.usage
4010
+ });
4011
+ }
4012
+ return validationResult.value;
3925
4013
  }
3926
4014
  };
3927
4015
  };
@@ -4326,10 +4414,168 @@ var DefaultStreamTextResult = class {
4326
4414
  message: "maxSteps must be at least 1"
4327
4415
  });
4328
4416
  }
4417
+ let recordedStepText = "";
4418
+ let recordedContinuationText = "";
4419
+ let recordedFullText = "";
4420
+ let recordedRequest = void 0;
4421
+ const recordedResponse = {
4422
+ id: generateId3(),
4423
+ timestamp: currentDate(),
4424
+ modelId: model.modelId,
4425
+ messages: []
4426
+ };
4427
+ let recordedToolCalls = [];
4428
+ let recordedToolResults = [];
4429
+ let recordedFinishReason = void 0;
4430
+ let recordedUsage = void 0;
4431
+ let recordedProviderMetadata = void 0;
4432
+ let stepType = "initial";
4433
+ const recordedSteps = [];
4434
+ let rootSpan;
4435
+ const eventProcessor = new TransformStream({
4436
+ async transform(chunk, controller) {
4437
+ controller.enqueue(chunk);
4438
+ if (chunk.type === "text-delta" || chunk.type === "tool-call" || chunk.type === "tool-result" || chunk.type === "tool-call-streaming-start" || chunk.type === "tool-call-delta") {
4439
+ await (onChunk == null ? void 0 : onChunk({ chunk }));
4440
+ }
4441
+ if (chunk.type === "text-delta") {
4442
+ recordedStepText += chunk.textDelta;
4443
+ recordedContinuationText += chunk.textDelta;
4444
+ recordedFullText += chunk.textDelta;
4445
+ }
4446
+ if (chunk.type === "tool-call") {
4447
+ recordedToolCalls.push(chunk);
4448
+ }
4449
+ if (chunk.type === "tool-result") {
4450
+ recordedToolResults.push(chunk);
4451
+ }
4452
+ if (chunk.type === "step-finish") {
4453
+ const stepMessages = toResponseMessages({
4454
+ text: recordedContinuationText,
4455
+ tools: tools != null ? tools : {},
4456
+ toolCalls: recordedToolCalls,
4457
+ toolResults: recordedToolResults
4458
+ });
4459
+ const currentStep = recordedSteps.length;
4460
+ let nextStepType = "done";
4461
+ if (currentStep + 1 < maxSteps) {
4462
+ if (continueSteps && chunk.finishReason === "length" && // only use continue when there are no tool calls:
4463
+ recordedToolCalls.length === 0) {
4464
+ nextStepType = "continue";
4465
+ } else if (
4466
+ // there are tool calls:
4467
+ recordedToolCalls.length > 0 && // all current tool calls have results:
4468
+ recordedToolResults.length === recordedToolCalls.length
4469
+ ) {
4470
+ nextStepType = "tool-result";
4471
+ }
4472
+ }
4473
+ const currentStepResult = {
4474
+ stepType,
4475
+ text: recordedStepText,
4476
+ toolCalls: recordedToolCalls,
4477
+ toolResults: recordedToolResults,
4478
+ finishReason: chunk.finishReason,
4479
+ usage: chunk.usage,
4480
+ warnings: chunk.warnings,
4481
+ logprobs: chunk.logprobs,
4482
+ request: chunk.request,
4483
+ response: {
4484
+ ...chunk.response,
4485
+ messages: [...recordedResponse.messages, ...stepMessages]
4486
+ },
4487
+ experimental_providerMetadata: chunk.experimental_providerMetadata,
4488
+ isContinued: chunk.isContinued
4489
+ };
4490
+ await (onStepFinish == null ? void 0 : onStepFinish(currentStepResult));
4491
+ recordedSteps.push(currentStepResult);
4492
+ recordedToolCalls = [];
4493
+ recordedToolResults = [];
4494
+ recordedStepText = "";
4495
+ recordedRequest = chunk.request;
4496
+ if (nextStepType !== "done") {
4497
+ stepType = nextStepType;
4498
+ }
4499
+ if (nextStepType !== "continue") {
4500
+ recordedResponse.messages.push(...stepMessages);
4501
+ recordedContinuationText = "";
4502
+ }
4503
+ }
4504
+ if (chunk.type === "finish") {
4505
+ recordedResponse.id = chunk.response.id;
4506
+ recordedResponse.timestamp = chunk.response.timestamp;
4507
+ recordedResponse.modelId = chunk.response.modelId;
4508
+ recordedResponse.headers = chunk.response.headers;
4509
+ recordedUsage = chunk.usage;
4510
+ recordedFinishReason = chunk.finishReason;
4511
+ recordedProviderMetadata = chunk.experimental_providerMetadata;
4512
+ }
4513
+ },
4514
+ async flush(controller) {
4515
+ var _a13;
4516
+ try {
4517
+ const lastStep = recordedSteps[recordedSteps.length - 1];
4518
+ if (lastStep) {
4519
+ self.warningsPromise.resolve(lastStep.warnings);
4520
+ self.requestPromise.resolve(lastStep.request);
4521
+ self.responsePromise.resolve(lastStep.response);
4522
+ self.toolCallsPromise.resolve(lastStep.toolCalls);
4523
+ self.toolResultsPromise.resolve(lastStep.toolResults);
4524
+ self.providerMetadataPromise.resolve(
4525
+ lastStep.experimental_providerMetadata
4526
+ );
4527
+ }
4528
+ const finishReason = recordedFinishReason != null ? recordedFinishReason : "unknown";
4529
+ const usage = recordedUsage != null ? recordedUsage : {
4530
+ completionTokens: NaN,
4531
+ promptTokens: NaN,
4532
+ totalTokens: NaN
4533
+ };
4534
+ self.finishReasonPromise.resolve(finishReason);
4535
+ self.usagePromise.resolve(usage);
4536
+ self.textPromise.resolve(recordedFullText);
4537
+ self.stepsPromise.resolve(recordedSteps);
4538
+ await (onFinish == null ? void 0 : onFinish({
4539
+ finishReason,
4540
+ logprobs: void 0,
4541
+ usage,
4542
+ text: recordedFullText,
4543
+ toolCalls: lastStep.toolCalls,
4544
+ toolResults: lastStep.toolResults,
4545
+ request: (_a13 = lastStep.request) != null ? _a13 : {},
4546
+ response: lastStep.response,
4547
+ warnings: lastStep.warnings,
4548
+ experimental_providerMetadata: lastStep.experimental_providerMetadata,
4549
+ steps: recordedSteps
4550
+ }));
4551
+ rootSpan.setAttributes(
4552
+ selectTelemetryAttributes({
4553
+ telemetry,
4554
+ attributes: {
4555
+ "ai.response.finishReason": finishReason,
4556
+ "ai.response.text": { output: () => recordedFullText },
4557
+ "ai.response.toolCalls": {
4558
+ output: () => {
4559
+ var _a14;
4560
+ return ((_a14 = lastStep.toolCalls) == null ? void 0 : _a14.length) ? JSON.stringify(lastStep.toolCalls) : void 0;
4561
+ }
4562
+ },
4563
+ "ai.usage.promptTokens": usage.promptTokens,
4564
+ "ai.usage.completionTokens": usage.completionTokens
4565
+ }
4566
+ })
4567
+ );
4568
+ } catch (error) {
4569
+ controller.error(error);
4570
+ } finally {
4571
+ rootSpan.end();
4572
+ }
4573
+ }
4574
+ });
4329
4575
  const stitchableStream = createStitchableStream();
4330
4576
  this.addStream = stitchableStream.addStream;
4331
4577
  this.closeStream = stitchableStream.close;
4332
- this.baseStream = transform ? stitchableStream.stream.pipeThrough(transform) : stitchableStream.stream;
4578
+ this.baseStream = (transform ? stitchableStream.stream.pipeThrough(transform) : stitchableStream.stream).pipeThrough(eventProcessor);
4333
4579
  const { maxRetries, retry } = prepareRetries({
4334
4580
  maxRetries: maxRetriesArg
4335
4581
  });
@@ -4361,13 +4607,13 @@ var DefaultStreamTextResult = class {
4361
4607
  }),
4362
4608
  tracer,
4363
4609
  endWhenDone: false,
4364
- fn: async (rootSpan) => {
4365
- const stepResults = [];
4610
+ fn: async (rootSpanArg) => {
4611
+ rootSpan = rootSpanArg;
4366
4612
  async function streamStep({
4367
4613
  currentStep,
4368
4614
  responseMessages,
4369
4615
  usage,
4370
- stepType,
4616
+ stepType: stepType2,
4371
4617
  previousStepText,
4372
4618
  hasLeadingWhitespace
4373
4619
  }) {
@@ -4473,7 +4719,7 @@ var DefaultStreamTextResult = class {
4473
4719
  let stepProviderMetadata;
4474
4720
  let stepFirstChunk = true;
4475
4721
  let stepText = "";
4476
- let fullStepText = stepType === "continue" ? previousStepText : "";
4722
+ let fullStepText = stepType2 === "continue" ? previousStepText : "";
4477
4723
  let stepLogProbs;
4478
4724
  let stepResponse = {
4479
4725
  id: generateId3(),
@@ -4493,7 +4739,6 @@ var DefaultStreamTextResult = class {
4493
4739
  fullStepText += chunk.textDelta;
4494
4740
  chunkTextPublished = true;
4495
4741
  hasWhitespaceSuffix = chunk.textDelta.trimEnd() !== chunk.textDelta;
4496
- await (onChunk == null ? void 0 : onChunk({ chunk }));
4497
4742
  }
4498
4743
  self.addStream(
4499
4744
  transformedStream.pipeThrough(
@@ -4542,13 +4787,11 @@ var DefaultStreamTextResult = class {
4542
4787
  case "tool-call": {
4543
4788
  controller.enqueue(chunk);
4544
4789
  stepToolCalls.push(chunk);
4545
- await (onChunk == null ? void 0 : onChunk({ chunk }));
4546
4790
  break;
4547
4791
  }
4548
4792
  case "tool-result": {
4549
4793
  controller.enqueue(chunk);
4550
4794
  stepToolResults.push(chunk);
4551
- await (onChunk == null ? void 0 : onChunk({ chunk }));
4552
4795
  break;
4553
4796
  }
4554
4797
  case "response-metadata": {
@@ -4575,7 +4818,6 @@ var DefaultStreamTextResult = class {
4575
4818
  case "tool-call-streaming-start":
4576
4819
  case "tool-call-delta": {
4577
4820
  controller.enqueue(chunk);
4578
- await (onChunk == null ? void 0 : onChunk({ chunk }));
4579
4821
  break;
4580
4822
  }
4581
4823
  case "error": {
@@ -4606,7 +4848,7 @@ var DefaultStreamTextResult = class {
4606
4848
  }
4607
4849
  }
4608
4850
  if (continueSteps && chunkBuffer.length > 0 && (nextStepType !== "continue" || // when the next step is a regular step, publish the buffer
4609
- stepType === "continue" && !chunkTextPublished)) {
4851
+ stepType2 === "continue" && !chunkTextPublished)) {
4610
4852
  await publishTextChunk({
4611
4853
  controller,
4612
4854
  chunk: {
@@ -4650,69 +4892,16 @@ var DefaultStreamTextResult = class {
4650
4892
  usage: stepUsage,
4651
4893
  experimental_providerMetadata: stepProviderMetadata,
4652
4894
  logprobs: stepLogProbs,
4653
- response: {
4654
- ...stepResponse
4655
- },
4656
- isContinued: nextStepType === "continue"
4657
- });
4658
- if (stepType === "continue") {
4659
- const lastMessage = responseMessages[responseMessages.length - 1];
4660
- if (typeof lastMessage.content === "string") {
4661
- lastMessage.content += stepText;
4662
- } else {
4663
- lastMessage.content.push({
4664
- text: stepText,
4665
- type: "text"
4666
- });
4667
- }
4668
- } else {
4669
- responseMessages.push(
4670
- ...toResponseMessages({
4671
- text: stepText,
4672
- tools: tools != null ? tools : {},
4673
- toolCalls: stepToolCalls,
4674
- toolResults: stepToolResults
4675
- })
4676
- );
4677
- }
4678
- const currentStepResult = {
4679
- stepType,
4680
- text: stepText,
4681
- toolCalls: stepToolCalls,
4682
- toolResults: stepToolResults,
4683
- finishReason: stepFinishReason,
4684
- usage: stepUsage,
4685
- warnings,
4686
- logprobs: stepLogProbs,
4687
4895
  request: stepRequest,
4688
4896
  response: {
4689
4897
  ...stepResponse,
4690
- headers: rawResponse == null ? void 0 : rawResponse.headers,
4691
- // deep clone msgs to avoid mutating past messages in multi-step:
4692
- messages: JSON.parse(JSON.stringify(responseMessages))
4898
+ headers: rawResponse == null ? void 0 : rawResponse.headers
4693
4899
  },
4694
- experimental_providerMetadata: stepProviderMetadata,
4900
+ warnings,
4695
4901
  isContinued: nextStepType === "continue"
4696
- };
4697
- stepResults.push(currentStepResult);
4698
- await (onStepFinish == null ? void 0 : onStepFinish(currentStepResult));
4699
- const combinedUsage = {
4700
- promptTokens: usage.promptTokens + stepUsage.promptTokens,
4701
- completionTokens: usage.completionTokens + stepUsage.completionTokens,
4702
- totalTokens: usage.totalTokens + stepUsage.totalTokens
4703
- };
4704
- if (nextStepType !== "done") {
4705
- await streamStep({
4706
- currentStep: currentStep + 1,
4707
- responseMessages,
4708
- usage: combinedUsage,
4709
- stepType: nextStepType,
4710
- previousStepText: fullStepText,
4711
- hasLeadingWhitespace: hasWhitespaceSuffix
4712
- });
4713
- return;
4714
- }
4715
- try {
4902
+ });
4903
+ const combinedUsage = addLanguageModelUsage(usage, stepUsage);
4904
+ if (nextStepType === "done") {
4716
4905
  controller.enqueue({
4717
4906
  type: "finish",
4718
4907
  finishReason: stepFinishReason,
@@ -4720,63 +4909,40 @@ var DefaultStreamTextResult = class {
4720
4909
  experimental_providerMetadata: stepProviderMetadata,
4721
4910
  logprobs: stepLogProbs,
4722
4911
  response: {
4723
- ...stepResponse
4912
+ ...stepResponse,
4913
+ headers: rawResponse == null ? void 0 : rawResponse.headers
4724
4914
  }
4725
4915
  });
4726
4916
  self.closeStream();
4727
- rootSpan.setAttributes(
4728
- selectTelemetryAttributes({
4729
- telemetry,
4730
- attributes: {
4731
- "ai.response.finishReason": stepFinishReason,
4732
- "ai.response.text": { output: () => fullStepText },
4733
- "ai.response.toolCalls": {
4734
- output: () => stepToolCallsJson
4735
- },
4736
- "ai.usage.promptTokens": combinedUsage.promptTokens,
4737
- "ai.usage.completionTokens": combinedUsage.completionTokens
4738
- }
4739
- })
4740
- );
4741
- self.usagePromise.resolve(combinedUsage);
4742
- self.finishReasonPromise.resolve(stepFinishReason);
4743
- self.textPromise.resolve(fullStepText);
4744
- self.toolCallsPromise.resolve(stepToolCalls);
4745
- self.providerMetadataPromise.resolve(stepProviderMetadata);
4746
- self.toolResultsPromise.resolve(stepToolResults);
4747
- self.requestPromise.resolve(stepRequest);
4748
- self.responsePromise.resolve({
4749
- ...stepResponse,
4750
- headers: rawResponse == null ? void 0 : rawResponse.headers,
4751
- messages: responseMessages
4752
- });
4753
- self.stepsPromise.resolve(stepResults);
4754
- self.warningsPromise.resolve(warnings != null ? warnings : []);
4755
- await (onFinish == null ? void 0 : onFinish({
4756
- finishReason: stepFinishReason,
4757
- logprobs: stepLogProbs,
4917
+ } else {
4918
+ if (stepType2 === "continue") {
4919
+ const lastMessage = responseMessages[responseMessages.length - 1];
4920
+ if (typeof lastMessage.content === "string") {
4921
+ lastMessage.content += stepText;
4922
+ } else {
4923
+ lastMessage.content.push({
4924
+ text: stepText,
4925
+ type: "text"
4926
+ });
4927
+ }
4928
+ } else {
4929
+ responseMessages.push(
4930
+ ...toResponseMessages({
4931
+ text: stepText,
4932
+ tools: tools != null ? tools : {},
4933
+ toolCalls: stepToolCalls,
4934
+ toolResults: stepToolResults
4935
+ })
4936
+ );
4937
+ }
4938
+ await streamStep({
4939
+ currentStep: currentStep + 1,
4940
+ responseMessages,
4758
4941
  usage: combinedUsage,
4759
- text: fullStepText,
4760
- toolCalls: stepToolCalls,
4761
- // The tool results are inferred as a never[] type, because they are
4762
- // optional and the execute method with an inferred result type is
4763
- // optional as well. Therefore we need to cast the toolResults to any.
4764
- // The type exposed to the users will be correctly inferred.
4765
- toolResults: stepToolResults,
4766
- request: stepRequest,
4767
- response: {
4768
- ...stepResponse,
4769
- headers: rawResponse == null ? void 0 : rawResponse.headers,
4770
- messages: responseMessages
4771
- },
4772
- warnings,
4773
- experimental_providerMetadata: stepProviderMetadata,
4774
- steps: stepResults
4775
- }));
4776
- } catch (error) {
4777
- controller.error(error);
4778
- } finally {
4779
- rootSpan.end();
4942
+ stepType: nextStepType,
4943
+ previousStepText: fullStepText,
4944
+ hasLeadingWhitespace: hasWhitespaceSuffix
4945
+ });
4780
4946
  }
4781
4947
  }
4782
4948
  })