@voltagent/core 1.1.30 → 1.1.32

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) {
@@ -14158,6 +14280,20 @@ function toContextMap(context8) {
14158
14280
  return context8 instanceof Map ? context8 : new Map(Object.entries(context8));
14159
14281
  }
14160
14282
  __name(toContextMap, "toContextMap");
14283
+ function stripExcessiveFieldsInUIMessages(uiMessages) {
14284
+ function isTextUIPart(p) {
14285
+ return typeof p === "object" && p !== null && p.type === "text";
14286
+ }
14287
+ __name(isTextUIPart, "isTextUIPart");
14288
+ return uiMessages.map((msg) => {
14289
+ if (!Array.isArray(msg.parts)) return msg;
14290
+ const parts = msg.parts?.map(
14291
+ (part) => isTextUIPart(part) ? { type: "text", text: part.text } : part
14292
+ );
14293
+ return { ...msg, parts };
14294
+ });
14295
+ }
14296
+ __name(stripExcessiveFieldsInUIMessages, "stripExcessiveFieldsInUIMessages");
14161
14297
  function cloneGenerateTextResultWithContext(result, overrides) {
14162
14298
  const prototype = Object.getPrototypeOf(result);
14163
14299
  const clone = Object.create(prototype);
@@ -15211,7 +15347,7 @@ var Agent = class {
15211
15347
  const buffer = this.getConversationBuffer(oc);
15212
15348
  const uiMessages = await this.prepareMessages(input, oc, options, buffer);
15213
15349
  const hooks = this.getMergedHooks(options);
15214
- let messages = (0, import_ai4.convertToModelMessages)(uiMessages);
15350
+ let messages = (0, import_ai4.convertToModelMessages)(stripExcessiveFieldsInUIMessages(uiMessages));
15215
15351
  if (hooks.onPrepareModelMessages) {
15216
15352
  const result = await hooks.onPrepareModelMessages({
15217
15353
  modelMessages: messages,
@@ -15846,7 +15982,7 @@ ${toolkit.instructions}`;
15846
15982
  }
15847
15983
  });
15848
15984
  try {
15849
- const retrieverInput = typeof input === "string" ? input : Array.isArray(input) && input[0]?.content !== void 0 ? input : (0, import_ai4.convertToModelMessages)(input);
15985
+ const retrieverInput = typeof input === "string" ? input : Array.isArray(input) && input[0]?.content !== void 0 ? input : (0, import_ai4.convertToModelMessages)(stripExcessiveFieldsInUIMessages(input));
15850
15986
  const retrievedContent = await oc.traceContext.withSpan(retrieverSpan, async () => {
15851
15987
  if (!this.retriever) return null;
15852
15988
  return await this.retriever.retrieve(retrieverInput, {