ai 4.1.31 → 4.1.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # ai
2
2
 
3
+ ## 4.1.33
4
+
5
+ ### Patch Changes
6
+
7
+ - 74f0f0e: chore (ai/core): move providerMetadata to stable
8
+
9
+ ## 4.1.32
10
+
11
+ ### Patch Changes
12
+
13
+ - c128ca5: fix (ai/core): fix streamText onFinish messages with structured output
14
+
3
15
  ## 4.1.31
4
16
 
5
17
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -901,6 +901,10 @@ interface GenerateObjectResult<OBJECT> {
901
901
  from the provider to the AI SDK and enable provider-specific
902
902
  results that can be fully encapsulated in the provider.
903
903
  */
904
+ readonly providerMetadata: ProviderMetadata | undefined;
905
+ /**
906
+ @deprecated Use `providerMetadata` instead.
907
+ */
904
908
  readonly experimental_providerMetadata: ProviderMetadata | undefined;
905
909
  /**
906
910
  Converts the object to a JSON response.
@@ -1155,6 +1159,10 @@ interface StreamObjectResult<PARTIAL, RESULT, ELEMENT_STREAM> {
1155
1159
  from the provider to the AI SDK and enable provider-specific
1156
1160
  results that can be fully encapsulated in the provider.
1157
1161
  */
1162
+ readonly providerMetadata: Promise<ProviderMetadata | undefined>;
1163
+ /**
1164
+ @deprecated Use `providerMetadata` instead.
1165
+ */
1158
1166
  readonly experimental_providerMetadata: Promise<ProviderMetadata | undefined>;
1159
1167
  /**
1160
1168
  Additional request information from the last step.
@@ -1264,6 +1272,10 @@ type StreamObjectOnFinishCallback<RESULT> = (event: {
1264
1272
  Additional provider-specific metadata. They are passed through
1265
1273
  to the provider from the AI SDK and enable provider-specific
1266
1274
  functionality that can be fully encapsulated in the provider.
1275
+ */
1276
+ providerMetadata: ProviderMetadata | undefined;
1277
+ /**
1278
+ @deprecated Use `providerMetadata` instead.
1267
1279
  */
1268
1280
  experimental_providerMetadata?: ProviderMetadata;
1269
1281
  }) => Promise<void> | void;
@@ -1719,6 +1731,10 @@ type StepResult<TOOLS extends ToolSet> = {
1719
1731
  from the provider to the AI SDK and enable provider-specific
1720
1732
  results that can be fully encapsulated in the provider.
1721
1733
  */
1734
+ readonly providerMetadata: ProviderMetadata | undefined;
1735
+ /**
1736
+ @deprecated Use `providerMetadata` instead.
1737
+ */
1722
1738
  readonly experimental_providerMetadata: ProviderMetadata | undefined;
1723
1739
  /**
1724
1740
  The type of step that this result is for. The first step is always
@@ -1837,6 +1853,10 @@ interface GenerateTextResult<TOOLS extends ToolSet, OUTPUT> {
1837
1853
  from the provider to the AI SDK and enable provider-specific
1838
1854
  results that can be fully encapsulated in the provider.
1839
1855
  */
1856
+ readonly providerMetadata: ProviderMetadata | undefined;
1857
+ /**
1858
+ @deprecated Use `providerMetadata` instead.
1859
+ */
1840
1860
  readonly experimental_providerMetadata: ProviderMetadata | undefined;
1841
1861
  }
1842
1862
 
@@ -2102,6 +2122,10 @@ interface StreamTextResult<TOOLS extends ToolSet, PARTIAL_OUTPUT> {
2102
2122
  Metadata is passed through from the provider to the AI SDK and
2103
2123
  enables provider-specific results that can be fully encapsulated in the provider.
2104
2124
  */
2125
+ readonly providerMetadata: Promise<ProviderMetadata | undefined>;
2126
+ /**
2127
+ @deprecated Use `providerMetadata` instead.
2128
+ */
2105
2129
  readonly experimental_providerMetadata: Promise<ProviderMetadata | undefined>;
2106
2130
  /**
2107
2131
  The full text that has been generated by the last step.
@@ -2293,12 +2317,20 @@ type TextStreamPart<TOOLS extends ToolSet> = {
2293
2317
  response: LanguageModelResponseMetadata;
2294
2318
  usage: LanguageModelUsage;
2295
2319
  finishReason: FinishReason;
2320
+ providerMetadata: ProviderMetadata | undefined;
2321
+ /**
2322
+ * @deprecated Use `providerMetadata` instead.
2323
+ */
2296
2324
  experimental_providerMetadata?: ProviderMetadata;
2297
2325
  isContinued: boolean;
2298
2326
  } | {
2299
2327
  type: 'finish';
2300
2328
  finishReason: FinishReason;
2301
2329
  usage: LanguageModelUsage;
2330
+ providerMetadata: ProviderMetadata | undefined;
2331
+ /**
2332
+ * @deprecated Use `providerMetadata` instead.
2333
+ */
2302
2334
  experimental_providerMetadata?: ProviderMetadata;
2303
2335
  /**
2304
2336
  * @deprecated will be moved into provider metadata
package/dist/index.d.ts CHANGED
@@ -901,6 +901,10 @@ interface GenerateObjectResult<OBJECT> {
901
901
  from the provider to the AI SDK and enable provider-specific
902
902
  results that can be fully encapsulated in the provider.
903
903
  */
904
+ readonly providerMetadata: ProviderMetadata | undefined;
905
+ /**
906
+ @deprecated Use `providerMetadata` instead.
907
+ */
904
908
  readonly experimental_providerMetadata: ProviderMetadata | undefined;
905
909
  /**
906
910
  Converts the object to a JSON response.
@@ -1155,6 +1159,10 @@ interface StreamObjectResult<PARTIAL, RESULT, ELEMENT_STREAM> {
1155
1159
  from the provider to the AI SDK and enable provider-specific
1156
1160
  results that can be fully encapsulated in the provider.
1157
1161
  */
1162
+ readonly providerMetadata: Promise<ProviderMetadata | undefined>;
1163
+ /**
1164
+ @deprecated Use `providerMetadata` instead.
1165
+ */
1158
1166
  readonly experimental_providerMetadata: Promise<ProviderMetadata | undefined>;
1159
1167
  /**
1160
1168
  Additional request information from the last step.
@@ -1264,6 +1272,10 @@ type StreamObjectOnFinishCallback<RESULT> = (event: {
1264
1272
  Additional provider-specific metadata. They are passed through
1265
1273
  to the provider from the AI SDK and enable provider-specific
1266
1274
  functionality that can be fully encapsulated in the provider.
1275
+ */
1276
+ providerMetadata: ProviderMetadata | undefined;
1277
+ /**
1278
+ @deprecated Use `providerMetadata` instead.
1267
1279
  */
1268
1280
  experimental_providerMetadata?: ProviderMetadata;
1269
1281
  }) => Promise<void> | void;
@@ -1719,6 +1731,10 @@ type StepResult<TOOLS extends ToolSet> = {
1719
1731
  from the provider to the AI SDK and enable provider-specific
1720
1732
  results that can be fully encapsulated in the provider.
1721
1733
  */
1734
+ readonly providerMetadata: ProviderMetadata | undefined;
1735
+ /**
1736
+ @deprecated Use `providerMetadata` instead.
1737
+ */
1722
1738
  readonly experimental_providerMetadata: ProviderMetadata | undefined;
1723
1739
  /**
1724
1740
  The type of step that this result is for. The first step is always
@@ -1837,6 +1853,10 @@ interface GenerateTextResult<TOOLS extends ToolSet, OUTPUT> {
1837
1853
  from the provider to the AI SDK and enable provider-specific
1838
1854
  results that can be fully encapsulated in the provider.
1839
1855
  */
1856
+ readonly providerMetadata: ProviderMetadata | undefined;
1857
+ /**
1858
+ @deprecated Use `providerMetadata` instead.
1859
+ */
1840
1860
  readonly experimental_providerMetadata: ProviderMetadata | undefined;
1841
1861
  }
1842
1862
 
@@ -2102,6 +2122,10 @@ interface StreamTextResult<TOOLS extends ToolSet, PARTIAL_OUTPUT> {
2102
2122
  Metadata is passed through from the provider to the AI SDK and
2103
2123
  enables provider-specific results that can be fully encapsulated in the provider.
2104
2124
  */
2125
+ readonly providerMetadata: Promise<ProviderMetadata | undefined>;
2126
+ /**
2127
+ @deprecated Use `providerMetadata` instead.
2128
+ */
2105
2129
  readonly experimental_providerMetadata: Promise<ProviderMetadata | undefined>;
2106
2130
  /**
2107
2131
  The full text that has been generated by the last step.
@@ -2293,12 +2317,20 @@ type TextStreamPart<TOOLS extends ToolSet> = {
2293
2317
  response: LanguageModelResponseMetadata;
2294
2318
  usage: LanguageModelUsage;
2295
2319
  finishReason: FinishReason;
2320
+ providerMetadata: ProviderMetadata | undefined;
2321
+ /**
2322
+ * @deprecated Use `providerMetadata` instead.
2323
+ */
2296
2324
  experimental_providerMetadata?: ProviderMetadata;
2297
2325
  isContinued: boolean;
2298
2326
  } | {
2299
2327
  type: 'finish';
2300
2328
  finishReason: FinishReason;
2301
2329
  usage: LanguageModelUsage;
2330
+ providerMetadata: ProviderMetadata | undefined;
2331
+ /**
2332
+ * @deprecated Use `providerMetadata` instead.
2333
+ */
2302
2334
  experimental_providerMetadata?: ProviderMetadata;
2303
2335
  /**
2304
2336
  * @deprecated will be moved into provider metadata
package/dist/index.js CHANGED
@@ -2799,6 +2799,7 @@ var DefaultGenerateObjectResult = class {
2799
2799
  this.finishReason = options.finishReason;
2800
2800
  this.usage = options.usage;
2801
2801
  this.warnings = options.warnings;
2802
+ this.providerMetadata = options.providerMetadata;
2802
2803
  this.experimental_providerMetadata = options.providerMetadata;
2803
2804
  this.response = options.response;
2804
2805
  this.request = options.request;
@@ -3409,6 +3410,7 @@ var DefaultStreamObjectResult = class {
3409
3410
  headers: rawResponse == null ? void 0 : rawResponse.headers
3410
3411
  },
3411
3412
  warnings,
3413
+ providerMetadata,
3412
3414
  experimental_providerMetadata: providerMetadata
3413
3415
  }));
3414
3416
  } catch (error2) {
@@ -3444,6 +3446,9 @@ var DefaultStreamObjectResult = class {
3444
3446
  get experimental_providerMetadata() {
3445
3447
  return this.providerMetadataPromise.value;
3446
3448
  }
3449
+ get providerMetadata() {
3450
+ return this.providerMetadataPromise.value;
3451
+ }
3447
3452
  get warnings() {
3448
3453
  return this.warningsPromise.value;
3449
3454
  }
@@ -4103,6 +4108,7 @@ async function generateText({
4103
4108
  // deep clone msgs to avoid mutating past messages in multi-step:
4104
4109
  messages: structuredClone(responseMessages)
4105
4110
  },
4111
+ providerMetadata: currentModelResponse.providerMetadata,
4106
4112
  experimental_providerMetadata: currentModelResponse.providerMetadata,
4107
4113
  isContinued: nextStepType === "continue"
4108
4114
  };
@@ -4245,6 +4251,7 @@ var DefaultGenerateTextResult = class {
4245
4251
  this.response = options.response;
4246
4252
  this.steps = options.steps;
4247
4253
  this.experimental_providerMetadata = options.providerMetadata;
4254
+ this.providerMetadata = options.providerMetadata;
4248
4255
  this.logprobs = options.logprobs;
4249
4256
  this.outputResolver = options.outputResolver;
4250
4257
  this.sources = options.sources;
@@ -4763,13 +4770,23 @@ function createOutputTransformStream(output) {
4763
4770
  let text2 = "";
4764
4771
  let textChunk = "";
4765
4772
  let lastPublishedJson = "";
4773
+ function publishTextChunk({
4774
+ controller,
4775
+ partialOutput = void 0
4776
+ }) {
4777
+ controller.enqueue({
4778
+ part: { type: "text-delta", textDelta: textChunk },
4779
+ partialOutput
4780
+ });
4781
+ textChunk = "";
4782
+ }
4766
4783
  return new TransformStream({
4767
4784
  transform(chunk, controller) {
4785
+ if (chunk.type === "step-finish") {
4786
+ publishTextChunk({ controller });
4787
+ }
4768
4788
  if (chunk.type !== "text-delta") {
4769
- controller.enqueue({
4770
- part: chunk,
4771
- partialOutput: void 0
4772
- });
4789
+ controller.enqueue({ part: chunk, partialOutput: void 0 });
4773
4790
  return;
4774
4791
  }
4775
4792
  text2 += chunk.textDelta;
@@ -4778,27 +4795,14 @@ function createOutputTransformStream(output) {
4778
4795
  if (result != null) {
4779
4796
  const currentJson = JSON.stringify(result.partial);
4780
4797
  if (currentJson !== lastPublishedJson) {
4781
- controller.enqueue({
4782
- part: {
4783
- type: "text-delta",
4784
- textDelta: textChunk
4785
- },
4786
- partialOutput: result.partial
4787
- });
4798
+ publishTextChunk({ controller, partialOutput: result.partial });
4788
4799
  lastPublishedJson = currentJson;
4789
- textChunk = "";
4790
4800
  }
4791
4801
  }
4792
4802
  },
4793
4803
  flush(controller) {
4794
4804
  if (textChunk.length > 0) {
4795
- controller.enqueue({
4796
- part: {
4797
- type: "text-delta",
4798
- textDelta: textChunk
4799
- },
4800
- partialOutput: void 0
4801
- });
4805
+ publishTextChunk({ controller });
4802
4806
  }
4803
4807
  }
4804
4808
  });
@@ -4940,6 +4944,7 @@ var DefaultStreamTextResult = class {
4940
4944
  ...part.response,
4941
4945
  messages: [...recordedResponse.messages, ...stepMessages]
4942
4946
  },
4947
+ providerMetadata: part.experimental_providerMetadata,
4943
4948
  experimental_providerMetadata: part.experimental_providerMetadata,
4944
4949
  isContinued: part.isContinued
4945
4950
  };
@@ -5005,6 +5010,7 @@ var DefaultStreamTextResult = class {
5005
5010
  request: (_a16 = lastStep.request) != null ? _a16 : {},
5006
5011
  response: lastStep.response,
5007
5012
  warnings: lastStep.warnings,
5013
+ providerMetadata: lastStep.providerMetadata,
5008
5014
  experimental_providerMetadata: lastStep.experimental_providerMetadata,
5009
5015
  steps: recordedSteps
5010
5016
  }));
@@ -5385,6 +5391,7 @@ var DefaultStreamTextResult = class {
5385
5391
  type: "step-finish",
5386
5392
  finishReason: stepFinishReason,
5387
5393
  usage: stepUsage,
5394
+ providerMetadata: stepProviderMetadata,
5388
5395
  experimental_providerMetadata: stepProviderMetadata,
5389
5396
  logprobs: stepLogProbs,
5390
5397
  request: stepRequest,
@@ -5402,6 +5409,7 @@ var DefaultStreamTextResult = class {
5402
5409
  type: "finish",
5403
5410
  finishReason: stepFinishReason,
5404
5411
  usage: combinedUsage,
5412
+ providerMetadata: stepProviderMetadata,
5405
5413
  experimental_providerMetadata: stepProviderMetadata,
5406
5414
  logprobs: stepLogProbs,
5407
5415
  response: {
@@ -5489,6 +5497,9 @@ var DefaultStreamTextResult = class {
5489
5497
  get experimental_providerMetadata() {
5490
5498
  return this.providerMetadataPromise.value;
5491
5499
  }
5500
+ get providerMetadata() {
5501
+ return this.providerMetadataPromise.value;
5502
+ }
5492
5503
  get text() {
5493
5504
  return this.textPromise.value;
5494
5505
  }
@@ -5577,118 +5588,110 @@ var DefaultStreamTextResult = class {
5577
5588
  sendUsage = true,
5578
5589
  sendReasoning = false
5579
5590
  }) {
5580
- let aggregatedResponse = "";
5581
- const callbackTransformer = new TransformStream({
5582
- async transform(chunk, controller) {
5583
- controller.enqueue(chunk);
5584
- if (chunk.type === "text-delta") {
5585
- aggregatedResponse += chunk.textDelta;
5586
- }
5587
- }
5588
- });
5589
- const streamPartsTransformer = new TransformStream({
5590
- transform: async (chunk, controller) => {
5591
- const chunkType = chunk.type;
5592
- switch (chunkType) {
5593
- case "text-delta": {
5594
- controller.enqueue((0, import_ui_utils8.formatDataStreamPart)("text", chunk.textDelta));
5595
- break;
5596
- }
5597
- case "reasoning": {
5598
- if (sendReasoning) {
5591
+ return this.fullStream.pipeThrough(
5592
+ new TransformStream({
5593
+ transform: async (chunk, controller) => {
5594
+ const chunkType = chunk.type;
5595
+ switch (chunkType) {
5596
+ case "text-delta": {
5597
+ controller.enqueue((0, import_ui_utils8.formatDataStreamPart)("text", chunk.textDelta));
5598
+ break;
5599
+ }
5600
+ case "reasoning": {
5601
+ if (sendReasoning) {
5602
+ controller.enqueue(
5603
+ (0, import_ui_utils8.formatDataStreamPart)("reasoning", chunk.textDelta)
5604
+ );
5605
+ }
5606
+ break;
5607
+ }
5608
+ case "source": {
5609
+ break;
5610
+ }
5611
+ case "tool-call-streaming-start": {
5599
5612
  controller.enqueue(
5600
- (0, import_ui_utils8.formatDataStreamPart)("reasoning", chunk.textDelta)
5613
+ (0, import_ui_utils8.formatDataStreamPart)("tool_call_streaming_start", {
5614
+ toolCallId: chunk.toolCallId,
5615
+ toolName: chunk.toolName
5616
+ })
5601
5617
  );
5618
+ break;
5619
+ }
5620
+ case "tool-call-delta": {
5621
+ controller.enqueue(
5622
+ (0, import_ui_utils8.formatDataStreamPart)("tool_call_delta", {
5623
+ toolCallId: chunk.toolCallId,
5624
+ argsTextDelta: chunk.argsTextDelta
5625
+ })
5626
+ );
5627
+ break;
5628
+ }
5629
+ case "tool-call": {
5630
+ controller.enqueue(
5631
+ (0, import_ui_utils8.formatDataStreamPart)("tool_call", {
5632
+ toolCallId: chunk.toolCallId,
5633
+ toolName: chunk.toolName,
5634
+ args: chunk.args
5635
+ })
5636
+ );
5637
+ break;
5638
+ }
5639
+ case "tool-result": {
5640
+ controller.enqueue(
5641
+ (0, import_ui_utils8.formatDataStreamPart)("tool_result", {
5642
+ toolCallId: chunk.toolCallId,
5643
+ result: chunk.result
5644
+ })
5645
+ );
5646
+ break;
5647
+ }
5648
+ case "error": {
5649
+ controller.enqueue(
5650
+ (0, import_ui_utils8.formatDataStreamPart)("error", getErrorMessage5(chunk.error))
5651
+ );
5652
+ break;
5653
+ }
5654
+ case "step-start": {
5655
+ controller.enqueue(
5656
+ (0, import_ui_utils8.formatDataStreamPart)("start_step", {
5657
+ messageId: chunk.messageId
5658
+ })
5659
+ );
5660
+ break;
5661
+ }
5662
+ case "step-finish": {
5663
+ controller.enqueue(
5664
+ (0, import_ui_utils8.formatDataStreamPart)("finish_step", {
5665
+ finishReason: chunk.finishReason,
5666
+ usage: sendUsage ? {
5667
+ promptTokens: chunk.usage.promptTokens,
5668
+ completionTokens: chunk.usage.completionTokens
5669
+ } : void 0,
5670
+ isContinued: chunk.isContinued
5671
+ })
5672
+ );
5673
+ break;
5674
+ }
5675
+ case "finish": {
5676
+ controller.enqueue(
5677
+ (0, import_ui_utils8.formatDataStreamPart)("finish_message", {
5678
+ finishReason: chunk.finishReason,
5679
+ usage: sendUsage ? {
5680
+ promptTokens: chunk.usage.promptTokens,
5681
+ completionTokens: chunk.usage.completionTokens
5682
+ } : void 0
5683
+ })
5684
+ );
5685
+ break;
5686
+ }
5687
+ default: {
5688
+ const exhaustiveCheck = chunkType;
5689
+ throw new Error(`Unknown chunk type: ${exhaustiveCheck}`);
5602
5690
  }
5603
- break;
5604
- }
5605
- case "source": {
5606
- break;
5607
- }
5608
- case "tool-call-streaming-start": {
5609
- controller.enqueue(
5610
- (0, import_ui_utils8.formatDataStreamPart)("tool_call_streaming_start", {
5611
- toolCallId: chunk.toolCallId,
5612
- toolName: chunk.toolName
5613
- })
5614
- );
5615
- break;
5616
- }
5617
- case "tool-call-delta": {
5618
- controller.enqueue(
5619
- (0, import_ui_utils8.formatDataStreamPart)("tool_call_delta", {
5620
- toolCallId: chunk.toolCallId,
5621
- argsTextDelta: chunk.argsTextDelta
5622
- })
5623
- );
5624
- break;
5625
- }
5626
- case "tool-call": {
5627
- controller.enqueue(
5628
- (0, import_ui_utils8.formatDataStreamPart)("tool_call", {
5629
- toolCallId: chunk.toolCallId,
5630
- toolName: chunk.toolName,
5631
- args: chunk.args
5632
- })
5633
- );
5634
- break;
5635
- }
5636
- case "tool-result": {
5637
- controller.enqueue(
5638
- (0, import_ui_utils8.formatDataStreamPart)("tool_result", {
5639
- toolCallId: chunk.toolCallId,
5640
- result: chunk.result
5641
- })
5642
- );
5643
- break;
5644
- }
5645
- case "error": {
5646
- controller.enqueue(
5647
- (0, import_ui_utils8.formatDataStreamPart)("error", getErrorMessage5(chunk.error))
5648
- );
5649
- break;
5650
- }
5651
- case "step-start": {
5652
- controller.enqueue(
5653
- (0, import_ui_utils8.formatDataStreamPart)("start_step", {
5654
- messageId: chunk.messageId
5655
- })
5656
- );
5657
- break;
5658
- }
5659
- case "step-finish": {
5660
- controller.enqueue(
5661
- (0, import_ui_utils8.formatDataStreamPart)("finish_step", {
5662
- finishReason: chunk.finishReason,
5663
- usage: sendUsage ? {
5664
- promptTokens: chunk.usage.promptTokens,
5665
- completionTokens: chunk.usage.completionTokens
5666
- } : void 0,
5667
- isContinued: chunk.isContinued
5668
- })
5669
- );
5670
- break;
5671
- }
5672
- case "finish": {
5673
- controller.enqueue(
5674
- (0, import_ui_utils8.formatDataStreamPart)("finish_message", {
5675
- finishReason: chunk.finishReason,
5676
- usage: sendUsage ? {
5677
- promptTokens: chunk.usage.promptTokens,
5678
- completionTokens: chunk.usage.completionTokens
5679
- } : void 0
5680
- })
5681
- );
5682
- break;
5683
- }
5684
- default: {
5685
- const exhaustiveCheck = chunkType;
5686
- throw new Error(`Unknown chunk type: ${exhaustiveCheck}`);
5687
5691
  }
5688
5692
  }
5689
- }
5690
- });
5691
- return this.fullStream.pipeThrough(callbackTransformer).pipeThrough(streamPartsTransformer);
5693
+ })
5694
+ );
5692
5695
  }
5693
5696
  pipeDataStreamToResponse(response, {
5694
5697
  status,