@voltagent/core 1.1.30 → 1.1.31

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
@@ -12578,17 +12578,61 @@ var normalizeText = /* @__PURE__ */ __name((part) => {
12578
12578
  }
12579
12579
  return normalized;
12580
12580
  }, "normalizeText");
12581
+ var sanitizeReasoningProviderMetadata = /* @__PURE__ */ __name((providerMetadata) => {
12582
+ if (!isObject(providerMetadata) || Array.isArray(providerMetadata)) {
12583
+ return void 0;
12584
+ }
12585
+ const cloned = safeClone(providerMetadata);
12586
+ if (Object.keys(cloned).length === 0) {
12587
+ return void 0;
12588
+ }
12589
+ return cloned;
12590
+ }, "sanitizeReasoningProviderMetadata");
12591
+ var extractReasoningIdFromMetadata = /* @__PURE__ */ __name((metadata) => {
12592
+ const visit = /* @__PURE__ */ __name((value, hasReasoningContext) => {
12593
+ if (Array.isArray(value)) {
12594
+ for (const element of value) {
12595
+ const found = visit(element, hasReasoningContext);
12596
+ if (found) return found;
12597
+ }
12598
+ return void 0;
12599
+ }
12600
+ if (!isObject(value)) {
12601
+ return void 0;
12602
+ }
12603
+ for (const [key, child] of Object.entries(value)) {
12604
+ const keyHasReasoningContext = hasReasoningContext || /reasoning/i.test(key);
12605
+ if (typeof child === "string") {
12606
+ const trimmed = child.trim();
12607
+ if (trimmed && keyHasReasoningContext && (/(^|_)id$/i.test(key) || /trace/i.test(key) || /id$/i.test(key))) {
12608
+ return trimmed;
12609
+ }
12610
+ } else {
12611
+ const found = visit(child, keyHasReasoningContext);
12612
+ if (found) {
12613
+ return found;
12614
+ }
12615
+ }
12616
+ }
12617
+ return void 0;
12618
+ }, "visit");
12619
+ return visit(metadata, false);
12620
+ }, "extractReasoningIdFromMetadata");
12581
12621
  var normalizeReasoning = /* @__PURE__ */ __name((part) => {
12582
12622
  const text = typeof part.text === "string" ? part.text : "";
12583
- if (!text.trim()) {
12623
+ const explicitReasoningId = typeof part.reasoningId === "string" ? part.reasoningId : "";
12624
+ const providerMetadata = sanitizeReasoningProviderMetadata(part.providerMetadata);
12625
+ const metadataReasoningId = providerMetadata && isObject(providerMetadata) ? extractReasoningIdFromMetadata(providerMetadata) : void 0;
12626
+ const reasoningId = explicitReasoningId || metadataReasoningId || "";
12627
+ if (!text.trim() && !reasoningId.trim()) {
12584
12628
  return null;
12585
12629
  }
12586
12630
  const normalized = {
12587
12631
  type: "reasoning",
12588
12632
  text
12589
12633
  };
12590
- if (part.reasoningId) {
12591
- normalized.reasoningId = part.reasoningId;
12634
+ if (reasoningId) {
12635
+ normalized.reasoningId = reasoningId;
12592
12636
  }
12593
12637
  if (part.reasoningConfidence !== void 0) {
12594
12638
  normalized.reasoningConfidence = part.reasoningConfidence;
@@ -12623,6 +12667,16 @@ var normalizeToolPart = /* @__PURE__ */ __name((part) => {
12623
12667
  if (part.providerExecuted !== void 0) normalized.providerExecuted = part.providerExecuted;
12624
12668
  if (part.isError !== void 0) normalized.isError = part.isError;
12625
12669
  if (part.errorText !== void 0) normalized.errorText = part.errorText;
12670
+ const callProviderMetadata = sanitizeReasoningProviderMetadata(
12671
+ part.callProviderMetadata
12672
+ );
12673
+ if (callProviderMetadata) {
12674
+ normalized.callProviderMetadata = callProviderMetadata;
12675
+ }
12676
+ const providerMetadata = sanitizeReasoningProviderMetadata(part.providerMetadata);
12677
+ if (providerMetadata) {
12678
+ normalized.providerMetadata = providerMetadata;
12679
+ }
12626
12680
  return normalized;
12627
12681
  }, "normalizeToolPart");
12628
12682
  var sanitizeMessagesForModel = /* @__PURE__ */ __name((messages) => messages.map((message) => sanitizeMessageForModel(message)).filter((message) => Boolean(message)), "sanitizeMessagesForModel");
@@ -12636,12 +12690,16 @@ var sanitizeMessageForModel = /* @__PURE__ */ __name((message) => {
12636
12690
  sanitizedParts.push(normalized);
12637
12691
  }
12638
12692
  const pruned = collapseRedundantStepStarts(pruneEmptyToolRuns(sanitizedParts));
12639
- const effectiveParts = pruned.filter((part) => {
12693
+ const withoutDanglingTools = removeProviderExecutedToolsWithoutReasoning(pruned);
12694
+ const normalizedParts = stripReasoningLinkedProviderMetadata(withoutDanglingTools);
12695
+ const effectiveParts = normalizedParts.filter((part) => {
12640
12696
  if (part.type === "text") {
12641
12697
  return typeof part.text === "string" && part.text.trim().length > 0;
12642
12698
  }
12643
12699
  if (part.type === "reasoning") {
12644
- return typeof part.text === "string" && part.text.trim().length > 0;
12700
+ const text = typeof part.text === "string" ? part.text.trim() : "";
12701
+ const reasoningId = typeof part.reasoningId === "string" ? part.reasoningId.trim() : "";
12702
+ return text.length > 0 || reasoningId.length > 0;
12645
12703
  }
12646
12704
  if (typeof part.type === "string" && part.type.startsWith("tool-")) {
12647
12705
  return Boolean(part.toolCallId);
@@ -12696,6 +12754,70 @@ var pruneEmptyToolRuns = /* @__PURE__ */ __name((parts) => {
12696
12754
  }
12697
12755
  return cleaned;
12698
12756
  }, "pruneEmptyToolRuns");
12757
+ var removeProviderExecutedToolsWithoutReasoning = /* @__PURE__ */ __name((parts) => {
12758
+ const hasReasoning = parts.some((part) => part.type === "reasoning");
12759
+ if (hasReasoning) {
12760
+ return parts;
12761
+ }
12762
+ const hasProviderExecutedTool = parts.some(
12763
+ (part) => typeof part.type === "string" && part.type.startsWith("tool-") && part.providerExecuted === true
12764
+ );
12765
+ if (!hasProviderExecutedTool) {
12766
+ return parts;
12767
+ }
12768
+ return parts.filter(
12769
+ (part) => !(typeof part.type === "string" && part.type.startsWith("tool-") && part.providerExecuted === true)
12770
+ );
12771
+ }, "removeProviderExecutedToolsWithoutReasoning");
12772
+ var stripReasoningLinkedProviderMetadata = /* @__PURE__ */ __name((parts) => {
12773
+ const hasReasoning = parts.some((part) => part.type === "reasoning");
12774
+ if (hasReasoning) {
12775
+ return parts;
12776
+ }
12777
+ const stripMetadata = /* @__PURE__ */ __name((metadata) => {
12778
+ if (!isObject(metadata)) {
12779
+ return void 0;
12780
+ }
12781
+ const cloned = { ...metadata };
12782
+ const openaiMetadata = cloned.openai;
12783
+ if (!isObject(openaiMetadata) || !("itemId" in openaiMetadata || "reasoning_trace_id" in openaiMetadata || "reasoning" in openaiMetadata && isObject(openaiMetadata.reasoning))) {
12784
+ return metadata;
12785
+ }
12786
+ cloned.openai = void 0;
12787
+ return Object.keys(cloned).length > 0 ? cloned : void 0;
12788
+ }, "stripMetadata");
12789
+ let mutated = false;
12790
+ const result = parts.map((part) => {
12791
+ let updated = false;
12792
+ const nextPart = { ...part };
12793
+ const applyStrip = /* @__PURE__ */ __name((key) => {
12794
+ const current = part[key];
12795
+ const cleaned = stripMetadata(current);
12796
+ if (cleaned === void 0 && current === void 0) {
12797
+ return;
12798
+ }
12799
+ if (cleaned === current) {
12800
+ return;
12801
+ }
12802
+ if (!updated) {
12803
+ updated = true;
12804
+ }
12805
+ if (cleaned) {
12806
+ nextPart[key] = cleaned;
12807
+ } else {
12808
+ delete nextPart[key];
12809
+ }
12810
+ }, "applyStrip");
12811
+ applyStrip("providerMetadata");
12812
+ applyStrip("callProviderMetadata");
12813
+ if (!updated) {
12814
+ return part;
12815
+ }
12816
+ mutated = true;
12817
+ return nextPart;
12818
+ });
12819
+ return mutated ? result : parts;
12820
+ }, "stripReasoningLinkedProviderMetadata");
12699
12821
  var collapseRedundantStepStarts = /* @__PURE__ */ __name((parts) => {
12700
12822
  const result = [];
12701
12823
  for (const part of parts) {