ai 5.0.230 → 5.0.232

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -727,7 +727,7 @@ import {
727
727
  } from "@ai-sdk/provider-utils";
728
728
 
729
729
  // src/version.ts
730
- var VERSION = true ? "5.0.230" : "0.0.0-test";
730
+ var VERSION = true ? "5.0.232" : "0.0.0-test";
731
731
 
732
732
  // src/util/download/download.ts
733
733
  var download = async ({
@@ -1631,7 +1631,8 @@ function recordSpan({
1631
1631
  tracer,
1632
1632
  attributes,
1633
1633
  fn,
1634
- endWhenDone = true
1634
+ endWhenDone = true,
1635
+ endOnError = endWhenDone
1635
1636
  }) {
1636
1637
  return tracer.startActiveSpan(name16, { attributes }, async (span) => {
1637
1638
  try {
@@ -1644,7 +1645,9 @@ function recordSpan({
1644
1645
  try {
1645
1646
  recordErrorOnSpan(span, error);
1646
1647
  } finally {
1647
- span.end();
1648
+ if (endOnError) {
1649
+ span.end();
1650
+ }
1648
1651
  }
1649
1652
  throw error;
1650
1653
  }
@@ -4221,9 +4224,20 @@ function createAsyncIterableStream(source) {
4221
4224
  // src/util/consume-stream.ts
4222
4225
  async function consumeStream({
4223
4226
  stream,
4224
- onError
4227
+ onError,
4228
+ abortSignal
4225
4229
  }) {
4226
4230
  const reader = stream.getReader();
4231
+ let cancelPromise;
4232
+ const cancelOnAbort = () => {
4233
+ cancelPromise != null ? cancelPromise : cancelPromise = reader.cancel().catch(() => {
4234
+ });
4235
+ };
4236
+ if (abortSignal == null ? void 0 : abortSignal.aborted) {
4237
+ cancelOnAbort();
4238
+ } else {
4239
+ abortSignal == null ? void 0 : abortSignal.addEventListener("abort", cancelOnAbort, { once: true });
4240
+ }
4227
4241
  try {
4228
4242
  while (true) {
4229
4243
  const { done } = await reader.read();
@@ -4233,6 +4247,8 @@ async function consumeStream({
4233
4247
  } catch (error) {
4234
4248
  onError == null ? void 0 : onError(error);
4235
4249
  } finally {
4250
+ await cancelPromise;
4251
+ abortSignal == null ? void 0 : abortSignal.removeEventListener("abort", cancelOnAbort);
4236
4252
  reader.releaseLock();
4237
4253
  }
4238
4254
  }
@@ -5186,6 +5202,7 @@ var DefaultStreamTextResult = class {
5186
5202
  }),
5187
5203
  tracer,
5188
5204
  endWhenDone: false,
5205
+ endOnError: true,
5189
5206
  fn: async (doStreamSpan2) => {
5190
5207
  return {
5191
5208
  startTimestampMs: now2(),
@@ -7701,6 +7718,7 @@ var DefaultStreamObjectResult = class {
7701
7718
  }),
7702
7719
  tracer,
7703
7720
  endWhenDone: false,
7721
+ endOnError: true,
7704
7722
  fn: async (rootSpan) => {
7705
7723
  const standardizedPrompt = await standardizePrompt({
7706
7724
  system,
@@ -7772,6 +7790,7 @@ var DefaultStreamObjectResult = class {
7772
7790
  }),
7773
7791
  tracer,
7774
7792
  endWhenDone: false,
7793
+ endOnError: true,
7775
7794
  fn: async (doStreamSpan2) => ({
7776
7795
  startTimestampMs: now2(),
7777
7796
  doStreamSpan: doStreamSpan2,
@@ -9307,7 +9326,8 @@ var HttpChatTransport = class {
9307
9326
  const response = await fetch2(api, {
9308
9327
  method: "GET",
9309
9328
  headers,
9310
- credentials
9329
+ credentials,
9330
+ signal: options.abortSignal
9311
9331
  });
9312
9332
  if (response.status === 204) {
9313
9333
  return null;
@@ -9362,6 +9382,7 @@ var AbstractChat = class {
9362
9382
  sendAutomaticallyWhen
9363
9383
  }) {
9364
9384
  this.activeResponse = void 0;
9385
+ this.activeResumeRequest = void 0;
9365
9386
  this.jobExecutor = new SerialJobExecutor();
9366
9387
  /**
9367
9388
  * Appends or replaces a user message to the chat list. This triggers the API call to fetch
@@ -9501,12 +9522,9 @@ var AbstractChat = class {
9501
9522
  * Abort the current request immediately, keep the generated tokens if any.
9502
9523
  */
9503
9524
  this.stop = async () => {
9504
- var _a16;
9505
- if (this.status !== "streaming" && this.status !== "submitted")
9506
- return;
9507
- if ((_a16 = this.activeResponse) == null ? void 0 : _a16.abortController) {
9508
- this.activeResponse.abortController.abort();
9509
- }
9525
+ var _a16, _b;
9526
+ (_a16 = this.activeResumeRequest) == null ? void 0 : _a16.abortController.abort();
9527
+ (_b = this.activeResponse) == null ? void 0 : _b.abortController.abort();
9510
9528
  };
9511
9529
  this.id = id;
9512
9530
  this.transport = transport;
@@ -9559,7 +9577,19 @@ var AbstractChat = class {
9559
9577
  body,
9560
9578
  messageId
9561
9579
  }) {
9562
- var _a16, _b, _c;
9580
+ var _a16, _b, _c, _d;
9581
+ const abortController = new AbortController();
9582
+ const activeResumeRequest = trigger === "resume-stream" ? { abortController } : void 0;
9583
+ if (activeResumeRequest) {
9584
+ (_a16 = this.activeResumeRequest) == null ? void 0 : _a16.abortController.abort();
9585
+ this.activeResumeRequest = activeResumeRequest;
9586
+ }
9587
+ const isCurrentRequest = () => activeResumeRequest == null || this.activeResumeRequest === activeResumeRequest;
9588
+ const clearActiveResumeRequest = () => {
9589
+ if (this.activeResumeRequest === activeResumeRequest) {
9590
+ this.activeResumeRequest = void 0;
9591
+ }
9592
+ };
9563
9593
  this.setStatus({ status: "submitted", error: void 0 });
9564
9594
  const lastMessage = this.lastMessage;
9565
9595
  let isAbort = false;
@@ -9572,7 +9602,7 @@ var AbstractChat = class {
9572
9602
  lastMessage: this.state.snapshot(lastMessage),
9573
9603
  messageId: this.generateId()
9574
9604
  }),
9575
- abortController: new AbortController()
9605
+ abortController
9576
9606
  };
9577
9607
  activeResponse = response;
9578
9608
  response.abortController.signal.addEventListener("abort", () => {
@@ -9583,12 +9613,23 @@ var AbstractChat = class {
9583
9613
  if (trigger === "resume-stream") {
9584
9614
  const reconnect = await this.transport.reconnectToStream({
9585
9615
  chatId: this.id,
9616
+ abortSignal: abortController.signal,
9586
9617
  metadata,
9587
9618
  headers,
9588
9619
  body
9589
9620
  });
9621
+ if (abortController.signal.aborted || !isCurrentRequest()) {
9622
+ await (reconnect == null ? void 0 : reconnect.cancel().catch(() => {
9623
+ }));
9624
+ if (isCurrentRequest()) {
9625
+ this.setStatus({ status: "ready" });
9626
+ }
9627
+ return;
9628
+ }
9590
9629
  if (reconnect == null) {
9591
- this.setStatus({ status: "ready" });
9630
+ if (isCurrentRequest()) {
9631
+ this.setStatus({ status: "ready" });
9632
+ }
9592
9633
  return;
9593
9634
  }
9594
9635
  stream = reconnect;
@@ -9606,11 +9647,17 @@ var AbstractChat = class {
9606
9647
  }
9607
9648
  const runUpdateMessageJob = (job) => (
9608
9649
  // serialize the job execution to avoid race conditions:
9609
- this.jobExecutor.run(
9610
- () => job({
9650
+ this.jobExecutor.run(() => {
9651
+ if (response.abortController.signal.aborted) {
9652
+ return Promise.resolve();
9653
+ }
9654
+ return job({
9611
9655
  state: response.state,
9612
9656
  write: () => {
9613
9657
  var _a17;
9658
+ if (response.abortController.signal.aborted) {
9659
+ return;
9660
+ }
9614
9661
  this.setStatus({ status: "streaming" });
9615
9662
  const replaceLastMessage = response.state.message.id === ((_a17 = this.lastMessage) == null ? void 0 : _a17.id);
9616
9663
  if (replaceLastMessage) {
@@ -9622,8 +9669,8 @@ var AbstractChat = class {
9622
9669
  this.state.pushMessage(response.state.message);
9623
9670
  }
9624
9671
  }
9625
- })
9626
- )
9672
+ });
9673
+ })
9627
9674
  );
9628
9675
  await consumeStream({
9629
9676
  stream: processUIMessageStream({
@@ -9637,15 +9684,29 @@ var AbstractChat = class {
9637
9684
  throw error;
9638
9685
  }
9639
9686
  }),
9687
+ abortSignal: response.abortController.signal,
9640
9688
  onError: (error) => {
9641
9689
  throw error;
9642
9690
  }
9643
9691
  });
9644
- this.setStatus({ status: "ready" });
9692
+ if (isAbort) {
9693
+ if (isCurrentRequest()) {
9694
+ this.setStatus({ status: "ready" });
9695
+ }
9696
+ return null;
9697
+ }
9698
+ if (isCurrentRequest()) {
9699
+ this.setStatus({ status: "ready" });
9700
+ }
9645
9701
  } catch (err) {
9646
9702
  if (isAbort || err.name === "AbortError") {
9647
9703
  isAbort = true;
9648
- this.setStatus({ status: "ready" });
9704
+ if (isCurrentRequest()) {
9705
+ this.setStatus({ status: "ready" });
9706
+ }
9707
+ return null;
9708
+ }
9709
+ if (!isCurrentRequest()) {
9649
9710
  return null;
9650
9711
  }
9651
9712
  isError = true;
@@ -9659,7 +9720,7 @@ var AbstractChat = class {
9659
9720
  } finally {
9660
9721
  try {
9661
9722
  if (activeResponse) {
9662
- (_a16 = this.onFinish) == null ? void 0 : _a16.call(this, {
9723
+ (_b = this.onFinish) == null ? void 0 : _b.call(this, {
9663
9724
  message: activeResponse.state.message,
9664
9725
  messages: this.state.messages,
9665
9726
  isAbort,
@@ -9674,11 +9735,12 @@ var AbstractChat = class {
9674
9735
  if (this.activeResponse === activeResponse) {
9675
9736
  this.activeResponse = void 0;
9676
9737
  }
9738
+ clearActiveResumeRequest();
9677
9739
  }
9678
- if (((_b = this.sendAutomaticallyWhen) == null ? void 0 : _b.call(this, { messages: this.state.messages })) && !isError) {
9740
+ if (((_c = this.sendAutomaticallyWhen) == null ? void 0 : _c.call(this, { messages: this.state.messages })) && !isError) {
9679
9741
  await this.makeRequest({
9680
9742
  trigger: "submit-message",
9681
- messageId: (_c = this.lastMessage) == null ? void 0 : _c.id,
9743
+ messageId: (_d = this.lastMessage) == null ? void 0 : _d.id,
9682
9744
  metadata,
9683
9745
  headers,
9684
9746
  body