ai 3.4.32 → 3.4.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,11 @@
1
1
  # ai
2
2
 
3
+ ## 3.4.33
4
+
5
+ ### Patch Changes
6
+
7
+ - ac380e3: fix (provider/anthropic): continuation mode with 3+ steps
8
+
3
9
  ## 3.4.32
4
10
 
5
11
  ### Patch Changes
package/dist/index.js CHANGED
@@ -3395,7 +3395,7 @@ async function generateText({
3395
3395
  }),
3396
3396
  tracer,
3397
3397
  fn: async (span) => {
3398
- var _a11, _b, _c, _d, _e, _f, _g;
3398
+ var _a11, _b, _c, _d, _e, _f;
3399
3399
  const retry = retryWithExponentialBackoff({ maxRetries });
3400
3400
  const mode = {
3401
3401
  type: "regular",
@@ -3549,12 +3549,15 @@ async function generateText({
3549
3549
  nextStepType = "tool-result";
3550
3550
  }
3551
3551
  }
3552
- const stepText = nextStepType === "continue" ? removeTextAfterLastWhitespace((_b = currentModelResponse.text) != null ? _b : "") : (_c = currentModelResponse.text) != null ? _c : "";
3552
+ const originalText = (_b = currentModelResponse.text) != null ? _b : "";
3553
+ const stepTextLeadingWhitespaceTrimmed = stepType === "continue" && // only for continue steps
3554
+ text.trimEnd() !== text ? originalText.trimStart() : originalText;
3555
+ const stepText = nextStepType === "continue" ? removeTextAfterLastWhitespace(stepTextLeadingWhitespaceTrimmed) : stepTextLeadingWhitespaceTrimmed;
3553
3556
  text = nextStepType === "continue" || stepType === "continue" ? text + stepText : stepText;
3554
3557
  if (stepType === "continue") {
3555
3558
  const lastMessage = responseMessages[responseMessages.length - 1];
3556
3559
  if (typeof lastMessage.content === "string") {
3557
- lastMessage.content = text;
3560
+ lastMessage.content += stepText;
3558
3561
  } else {
3559
3562
  lastMessage.content.push({
3560
3563
  text: stepText,
@@ -3580,10 +3583,10 @@ async function generateText({
3580
3583
  usage: currentUsage,
3581
3584
  warnings: currentModelResponse.warnings,
3582
3585
  logprobs: currentModelResponse.logprobs,
3583
- request: (_d = currentModelResponse.request) != null ? _d : {},
3586
+ request: (_c = currentModelResponse.request) != null ? _c : {},
3584
3587
  response: {
3585
3588
  ...currentModelResponse.response,
3586
- headers: (_e = currentModelResponse.rawResponse) == null ? void 0 : _e.headers,
3589
+ headers: (_d = currentModelResponse.rawResponse) == null ? void 0 : _d.headers,
3587
3590
  // deep clone msgs to avoid mutating past messages in multi-step:
3588
3591
  messages: JSON.parse(JSON.stringify(responseMessages))
3589
3592
  },
@@ -3625,10 +3628,10 @@ async function generateText({
3625
3628
  finishReason: currentModelResponse.finishReason,
3626
3629
  usage,
3627
3630
  warnings: currentModelResponse.warnings,
3628
- request: (_f = currentModelResponse.request) != null ? _f : {},
3631
+ request: (_e = currentModelResponse.request) != null ? _e : {},
3629
3632
  response: {
3630
3633
  ...currentModelResponse.response,
3631
- headers: (_g = currentModelResponse.rawResponse) == null ? void 0 : _g.headers,
3634
+ headers: (_f = currentModelResponse.rawResponse) == null ? void 0 : _f.headers,
3632
3635
  messages: responseMessages
3633
3636
  },
3634
3637
  logprobs: currentModelResponse.logprobs,
@@ -4328,7 +4331,8 @@ var DefaultStreamTextResult = class {
4328
4331
  },
4329
4332
  stepType,
4330
4333
  previousStepText = "",
4331
- stepRequest
4334
+ stepRequest,
4335
+ hasLeadingWhitespace
4332
4336
  }) {
4333
4337
  const stepToolCalls = [];
4334
4338
  const stepToolResults = [];
@@ -4350,6 +4354,8 @@ var DefaultStreamTextResult = class {
4350
4354
  };
4351
4355
  let chunkBuffer = "";
4352
4356
  let chunkTextPublished = false;
4357
+ let inWhitespacePrefix = true;
4358
+ let hasWhitespaceSuffix = false;
4353
4359
  async function publishTextChunk({
4354
4360
  controller,
4355
4361
  chunk
@@ -4358,6 +4364,7 @@ var DefaultStreamTextResult = class {
4358
4364
  stepText += chunk.textDelta;
4359
4365
  fullStepText += chunk.textDelta;
4360
4366
  chunkTextPublished = true;
4367
+ hasWhitespaceSuffix = chunk.textDelta.trimEnd() !== chunk.textDelta;
4361
4368
  await (onChunk == null ? void 0 : onChunk({ chunk }));
4362
4369
  }
4363
4370
  addStream(
@@ -4386,7 +4393,12 @@ var DefaultStreamTextResult = class {
4386
4393
  switch (chunkType) {
4387
4394
  case "text-delta": {
4388
4395
  if (continueSteps) {
4389
- chunkBuffer += chunk.textDelta;
4396
+ const trimmedChunkText = inWhitespacePrefix && hasLeadingWhitespace ? chunk.textDelta.trimStart() : chunk.textDelta;
4397
+ if (trimmedChunkText.length === 0) {
4398
+ break;
4399
+ }
4400
+ inWhitespacePrefix = false;
4401
+ chunkBuffer += trimmedChunkText;
4390
4402
  const split = splitOnLastWhitespace(chunkBuffer);
4391
4403
  if (split != null) {
4392
4404
  chunkBuffer = split.suffix;
@@ -4529,7 +4541,7 @@ var DefaultStreamTextResult = class {
4529
4541
  if (stepType === "continue") {
4530
4542
  const lastMessage = responseMessages[responseMessages.length - 1];
4531
4543
  if (typeof lastMessage.content === "string") {
4532
- lastMessage.content = stepText;
4544
+ lastMessage.content += stepText;
4533
4545
  } else {
4534
4546
  lastMessage.content.push({
4535
4547
  text: stepText,
@@ -4590,7 +4602,8 @@ var DefaultStreamTextResult = class {
4590
4602
  usage: combinedUsage,
4591
4603
  stepType: nextStepType,
4592
4604
  previousStepText: fullStepText,
4593
- stepRequest: result.request
4605
+ stepRequest: result.request,
4606
+ hasLeadingWhitespace: hasWhitespaceSuffix
4594
4607
  });
4595
4608
  return;
4596
4609
  }
@@ -4681,7 +4694,8 @@ var DefaultStreamTextResult = class {
4681
4694
  responseMessages: [],
4682
4695
  usage: void 0,
4683
4696
  stepType: "initial",
4684
- stepRequest: request
4697
+ stepRequest: request,
4698
+ hasLeadingWhitespace: false
4685
4699
  });
4686
4700
  }
4687
4701
  /**