@librechat/agents 3.7.22 → 3.8.1

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.
Files changed (232) hide show
  1. package/dist/cjs/agents/AgentContext.cjs +13 -3
  2. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  3. package/dist/cjs/graphs/Graph.cjs +174 -53
  4. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  5. package/dist/cjs/graphs/MultiAgentGraph.cjs +15 -5
  6. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
  7. package/dist/cjs/langfuse.cjs +48 -2
  8. package/dist/cjs/langfuse.cjs.map +1 -1
  9. package/dist/cjs/langfuseToolOutputTracing.cjs +42 -0
  10. package/dist/cjs/langfuseToolOutputTracing.cjs.map +1 -1
  11. package/dist/cjs/langfuseTraceShaping.cjs +7 -1
  12. package/dist/cjs/langfuseTraceShaping.cjs.map +1 -1
  13. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +5 -9
  14. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  15. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs +2 -7
  16. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs.map +1 -1
  17. package/dist/cjs/llm/contextPressureMeter.cjs +51 -10
  18. package/dist/cjs/llm/contextPressureMeter.cjs.map +1 -1
  19. package/dist/cjs/llm/init.cjs +1 -1
  20. package/dist/cjs/llm/invoke.cjs +2 -2
  21. package/dist/cjs/llm/openai/index.cjs +4 -3
  22. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  23. package/dist/cjs/llm/openai/utils/index.cjs +5 -4
  24. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  25. package/dist/cjs/llm/preempt.cjs +3 -2
  26. package/dist/cjs/llm/preempt.cjs.map +1 -1
  27. package/dist/cjs/llm/prepareProviderRequest.cjs +9 -7
  28. package/dist/cjs/llm/prepareProviderRequest.cjs.map +1 -1
  29. package/dist/cjs/llm/providers.cjs +1 -1
  30. package/dist/cjs/main.cjs +11 -5
  31. package/dist/cjs/messages/alternation.cjs +1 -5
  32. package/dist/cjs/messages/alternation.cjs.map +1 -1
  33. package/dist/cjs/messages/budget.cjs +206 -7
  34. package/dist/cjs/messages/budget.cjs.map +1 -1
  35. package/dist/cjs/messages/cache.cjs +3 -9
  36. package/dist/cjs/messages/cache.cjs.map +1 -1
  37. package/dist/cjs/messages/core.cjs +25 -37
  38. package/dist/cjs/messages/core.cjs.map +1 -1
  39. package/dist/cjs/messages/format.cjs +131 -42
  40. package/dist/cjs/messages/format.cjs.map +1 -1
  41. package/dist/cjs/messages/index.cjs +2 -0
  42. package/dist/cjs/messages/prune.cjs +12 -7
  43. package/dist/cjs/messages/prune.cjs.map +1 -1
  44. package/dist/cjs/messages/reasoningTypes.cjs +21 -0
  45. package/dist/cjs/messages/reasoningTypes.cjs.map +1 -0
  46. package/dist/cjs/messages/recency.cjs +15 -94
  47. package/dist/cjs/messages/recency.cjs.map +1 -1
  48. package/dist/cjs/messages/toolHistoryProjection.cjs +243 -0
  49. package/dist/cjs/messages/toolHistoryProjection.cjs.map +1 -0
  50. package/dist/cjs/messages/toolResultTypes.cjs +145 -4
  51. package/dist/cjs/messages/toolResultTypes.cjs.map +1 -1
  52. package/dist/cjs/run.cjs +5 -4
  53. package/dist/cjs/run.cjs.map +1 -1
  54. package/dist/cjs/session/AgentSession.cjs +6 -4
  55. package/dist/cjs/session/AgentSession.cjs.map +1 -1
  56. package/dist/cjs/session/JsonlSessionStore.cjs +3 -0
  57. package/dist/cjs/session/JsonlSessionStore.cjs.map +1 -1
  58. package/dist/cjs/session/index.cjs +1 -1
  59. package/dist/cjs/session/sessionProjection.cjs +75 -0
  60. package/dist/cjs/session/sessionProjection.cjs.map +1 -0
  61. package/dist/cjs/stream.cjs +18 -17
  62. package/dist/cjs/stream.cjs.map +1 -1
  63. package/dist/cjs/summarization/index.cjs.map +1 -1
  64. package/dist/cjs/summarization/node.cjs +18 -8
  65. package/dist/cjs/summarization/node.cjs.map +1 -1
  66. package/dist/cjs/summarization/shared.cjs +9 -0
  67. package/dist/cjs/summarization/shared.cjs.map +1 -1
  68. package/dist/cjs/tools/ArtifactDelivery.cjs +27 -0
  69. package/dist/cjs/tools/ArtifactDelivery.cjs.map +1 -0
  70. package/dist/cjs/tools/BashExecutor.cjs +6 -1
  71. package/dist/cjs/tools/BashExecutor.cjs.map +1 -1
  72. package/dist/cjs/tools/CodeExecutor.cjs +6 -1
  73. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
  74. package/dist/cjs/tools/ProgrammaticToolCalling.cjs +5 -1
  75. package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
  76. package/dist/cjs/tools/local/CompileCheckTool.cjs +1 -1
  77. package/dist/cjs/tools/local/LocalCodingTools.cjs +1 -1
  78. package/dist/cjs/utils/events.cjs +13 -0
  79. package/dist/cjs/utils/events.cjs.map +1 -1
  80. package/dist/cjs/utils/tokens.cjs +105 -0
  81. package/dist/cjs/utils/tokens.cjs.map +1 -1
  82. package/dist/esm/agents/AgentContext.mjs +13 -3
  83. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  84. package/dist/esm/graphs/Graph.mjs +176 -55
  85. package/dist/esm/graphs/Graph.mjs.map +1 -1
  86. package/dist/esm/graphs/MultiAgentGraph.mjs +15 -5
  87. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  88. package/dist/esm/langfuse.mjs +49 -4
  89. package/dist/esm/langfuse.mjs.map +1 -1
  90. package/dist/esm/langfuseToolOutputTracing.mjs +41 -1
  91. package/dist/esm/langfuseToolOutputTracing.mjs.map +1 -1
  92. package/dist/esm/langfuseTraceShaping.mjs +7 -1
  93. package/dist/esm/langfuseTraceShaping.mjs.map +1 -1
  94. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +5 -9
  95. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  96. package/dist/esm/llm/bedrock/utils/message_inputs.mjs +2 -7
  97. package/dist/esm/llm/bedrock/utils/message_inputs.mjs.map +1 -1
  98. package/dist/esm/llm/contextPressureMeter.mjs +52 -11
  99. package/dist/esm/llm/contextPressureMeter.mjs.map +1 -1
  100. package/dist/esm/llm/init.mjs +1 -1
  101. package/dist/esm/llm/invoke.mjs +2 -2
  102. package/dist/esm/llm/openai/index.mjs +2 -1
  103. package/dist/esm/llm/openai/index.mjs.map +1 -1
  104. package/dist/esm/llm/openai/utils/index.mjs +5 -4
  105. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  106. package/dist/esm/llm/preempt.mjs +2 -1
  107. package/dist/esm/llm/preempt.mjs.map +1 -1
  108. package/dist/esm/llm/prepareProviderRequest.mjs +9 -7
  109. package/dist/esm/llm/prepareProviderRequest.mjs.map +1 -1
  110. package/dist/esm/llm/providers.mjs +1 -1
  111. package/dist/esm/main.mjs +10 -7
  112. package/dist/esm/messages/alternation.mjs +2 -6
  113. package/dist/esm/messages/alternation.mjs.map +1 -1
  114. package/dist/esm/messages/budget.mjs +206 -8
  115. package/dist/esm/messages/budget.mjs.map +1 -1
  116. package/dist/esm/messages/cache.mjs +3 -9
  117. package/dist/esm/messages/cache.mjs.map +1 -1
  118. package/dist/esm/messages/core.mjs +23 -33
  119. package/dist/esm/messages/core.mjs.map +1 -1
  120. package/dist/esm/messages/format.mjs +132 -43
  121. package/dist/esm/messages/format.mjs.map +1 -1
  122. package/dist/esm/messages/index.mjs +2 -0
  123. package/dist/esm/messages/prune.mjs +12 -7
  124. package/dist/esm/messages/prune.mjs.map +1 -1
  125. package/dist/esm/messages/reasoningTypes.mjs +20 -0
  126. package/dist/esm/messages/reasoningTypes.mjs.map +1 -0
  127. package/dist/esm/messages/recency.mjs +16 -95
  128. package/dist/esm/messages/recency.mjs.map +1 -1
  129. package/dist/esm/messages/toolHistoryProjection.mjs +237 -0
  130. package/dist/esm/messages/toolHistoryProjection.mjs.map +1 -0
  131. package/dist/esm/messages/toolResultTypes.mjs +141 -4
  132. package/dist/esm/messages/toolResultTypes.mjs.map +1 -1
  133. package/dist/esm/run.mjs +5 -4
  134. package/dist/esm/run.mjs.map +1 -1
  135. package/dist/esm/session/AgentSession.mjs +6 -4
  136. package/dist/esm/session/AgentSession.mjs.map +1 -1
  137. package/dist/esm/session/JsonlSessionStore.mjs +3 -0
  138. package/dist/esm/session/JsonlSessionStore.mjs.map +1 -1
  139. package/dist/esm/session/index.mjs +1 -1
  140. package/dist/esm/session/sessionProjection.mjs +72 -0
  141. package/dist/esm/session/sessionProjection.mjs.map +1 -0
  142. package/dist/esm/stream.mjs +15 -14
  143. package/dist/esm/stream.mjs.map +1 -1
  144. package/dist/esm/summarization/index.mjs.map +1 -1
  145. package/dist/esm/summarization/node.mjs +19 -9
  146. package/dist/esm/summarization/node.mjs.map +1 -1
  147. package/dist/esm/summarization/shared.mjs +9 -1
  148. package/dist/esm/summarization/shared.mjs.map +1 -1
  149. package/dist/esm/tools/ArtifactDelivery.mjs +26 -0
  150. package/dist/esm/tools/ArtifactDelivery.mjs.map +1 -0
  151. package/dist/esm/tools/BashExecutor.mjs +6 -1
  152. package/dist/esm/tools/BashExecutor.mjs.map +1 -1
  153. package/dist/esm/tools/CodeExecutor.mjs +6 -1
  154. package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
  155. package/dist/esm/tools/ProgrammaticToolCalling.mjs +5 -1
  156. package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
  157. package/dist/esm/tools/local/CompileCheckTool.mjs +1 -1
  158. package/dist/esm/tools/local/LocalCodingTools.mjs +1 -1
  159. package/dist/esm/utils/events.mjs +13 -0
  160. package/dist/esm/utils/events.mjs.map +1 -1
  161. package/dist/esm/utils/tokens.mjs +105 -1
  162. package/dist/esm/utils/tokens.mjs.map +1 -1
  163. package/dist/types/agents/AgentContext.d.ts +13 -1
  164. package/dist/types/graphs/Graph.d.ts +27 -0
  165. package/dist/types/hooks/types.d.ts +4 -2
  166. package/dist/types/index.d.ts +1 -0
  167. package/dist/types/langfuse.d.ts +10 -0
  168. package/dist/types/langfuseToolOutputTracing.d.ts +2 -0
  169. package/dist/types/llm/contextPressureMeter.d.ts +2 -1
  170. package/dist/types/llm/prepareProviderRequest.d.ts +7 -1
  171. package/dist/types/messages/budget.d.ts +15 -10
  172. package/dist/types/messages/core.d.ts +8 -17
  173. package/dist/types/messages/format.d.ts +3 -2
  174. package/dist/types/messages/index.d.ts +1 -1
  175. package/dist/types/messages/prune.d.ts +1 -1
  176. package/dist/types/messages/reasoningTypes.d.ts +7 -0
  177. package/dist/types/messages/recency.d.ts +3 -0
  178. package/dist/types/messages/toolHistoryProjection.d.ts +65 -0
  179. package/dist/types/messages/toolResultTypes.d.ts +31 -1
  180. package/dist/types/session/sessionProjection.d.ts +10 -0
  181. package/dist/types/summarization/index.d.ts +2 -1
  182. package/dist/types/summarization/node.d.ts +1 -0
  183. package/dist/types/summarization/shared.d.ts +12 -0
  184. package/dist/types/tools/ArtifactDelivery.d.ts +4 -0
  185. package/dist/types/types/graph.d.ts +28 -0
  186. package/dist/types/types/run.d.ts +4 -0
  187. package/dist/types/types/summarize.d.ts +4 -1
  188. package/dist/types/types/tools.d.ts +11 -0
  189. package/dist/types/utils/tokens.d.ts +2 -1
  190. package/package.json +1 -1
  191. package/src/agents/AgentContext.ts +34 -3
  192. package/src/graphs/Graph.ts +465 -147
  193. package/src/graphs/MultiAgentGraph.ts +28 -6
  194. package/src/hooks/types.ts +4 -1
  195. package/src/index.ts +1 -0
  196. package/src/langfuse.ts +84 -11
  197. package/src/langfuseToolOutputTracing.ts +91 -0
  198. package/src/langfuseTraceShaping.ts +17 -4
  199. package/src/llm/anthropic/utils/message_inputs.ts +5 -10
  200. package/src/llm/bedrock/utils/message_inputs.ts +2 -8
  201. package/src/llm/contextPressureMeter.ts +80 -12
  202. package/src/llm/openai/utils/index.ts +5 -4
  203. package/src/llm/prepareProviderRequest.ts +21 -16
  204. package/src/messages/alternation.ts +2 -15
  205. package/src/messages/budget.ts +439 -23
  206. package/src/messages/cache.ts +8 -9
  207. package/src/messages/core.ts +65 -95
  208. package/src/messages/format.ts +262 -78
  209. package/src/messages/index.ts +1 -1
  210. package/src/messages/prune.ts +31 -12
  211. package/src/messages/reasoningTypes.ts +23 -0
  212. package/src/messages/recency.ts +35 -179
  213. package/src/messages/toolHistoryProjection.ts +460 -0
  214. package/src/messages/toolResultTypes.ts +331 -100
  215. package/src/run.ts +10 -2
  216. package/src/session/AgentSession.ts +33 -16
  217. package/src/session/JsonlSessionStore.ts +6 -0
  218. package/src/session/sessionProjection.ts +126 -0
  219. package/src/stream.ts +14 -19
  220. package/src/summarization/index.ts +2 -0
  221. package/src/summarization/node.ts +62 -13
  222. package/src/summarization/shared.ts +23 -0
  223. package/src/tools/ArtifactDelivery.ts +50 -0
  224. package/src/tools/BashExecutor.ts +18 -1
  225. package/src/tools/CodeExecutor.ts +18 -1
  226. package/src/tools/ProgrammaticToolCalling.ts +15 -1
  227. package/src/types/graph.ts +28 -0
  228. package/src/types/run.ts +4 -0
  229. package/src/types/summarize.ts +4 -1
  230. package/src/types/tools.ts +12 -0
  231. package/src/utils/events.ts +19 -0
  232. package/src/utils/tokens.ts +183 -0
@@ -12,13 +12,15 @@ import { shouldTraceToolNodeForLangfuse } from "../langfuseToolOutputTracing.mjs
12
12
  import { getToolContentCharLength, serializeToolContentBounded } from "../utils/toolContent.mjs";
13
13
  import { stampSyntheticProviderMessage } from "../messages/provenance.mjs";
14
14
  import { addBedrockTailCacheControl, addTailCacheControl, cloneMessage, resolveBedrockPromptCacheTtl, resolvePromptCacheTtl } from "../messages/cache.mjs";
15
+ import { providerRequiresStrictAlternation } from "../llm/providerRegistry.mjs";
16
+ import "../llm/providers.mjs";
17
+ import { createToolHistoryPreparation } from "../messages/toolHistoryProjection.mjs";
15
18
  import { convertMessagesToContent, projectAnthropicArtifactContent, projectArtifactPayload } from "../messages/core.mjs";
16
19
  import { resolveMaxSeals } from "../llm/preempt.mjs";
17
- import { createLangfuseHandler, createLangfuseTraceMetadata, disposeLangfuseHandler, isLangfuseCallbackHandler } from "../langfuse.mjs";
18
20
  import { appendCallbacks, findCallback } from "../utils/callbacks.mjs";
21
+ import { createLangfuseHandler, createLangfuseTraceMetadata, disposeLangfuseHandler, isLangfuseCallbackHandler } from "../langfuse.mjs";
19
22
  import { applyGraphRuntimeConfig } from "./applyGraphRuntimeConfig.mjs";
20
23
  import { apportionTokenCounts } from "../utils/tokens.mjs";
21
- import { providerRequiresStrictAlternation } from "../llm/providerRegistry.mjs";
22
24
  import { isAnthropicLike, isGoogleLike, isOpenAILike } from "../utils/llm.mjs";
23
25
  import { executeHooks } from "../hooks/executeHooks.mjs";
24
26
  import "../hooks/index.mjs";
@@ -27,15 +29,15 @@ import { initializeLangfuseTracing } from "../instrumentation.mjs";
27
29
  import { isThinkingEnabled } from "../llm/request.mjs";
28
30
  import { getMessageId } from "../messages/ids.mjs";
29
31
  import { createPruneMessages, projectToolMessagesForProvider, sanitizeOrphanToolBlocks } from "../messages/prune.mjs";
32
+ import { emitAgentLog, safeDispatchCustomEvent } from "../utils/events.mjs";
30
33
  import { syncBudgetDerivedFields } from "../messages/budget.mjs";
31
34
  import { formatContentStrings } from "../messages/content.mjs";
32
- import { emitAgentLog, safeDispatchCustomEvent } from "../utils/events.mjs";
33
35
  import { compactSyntheticProviderContextMessage, ensureThinkingBlockInMessages, foldToolBlocksForToollessAgent, isSyntheticProviderContextMessage } from "../messages/format.mjs";
34
36
  import { makeIsDeferred } from "../messages/anthropicToolCache.mjs";
35
37
  import { extractToolDiscoveries } from "../messages/tools.mjs";
36
38
  import { coalesceAdjacentUserTurns } from "../messages/alternation.mjs";
37
39
  import { appendPredecessorHandoffCue } from "../messages/handoffCue.mjs";
38
- import { messagesStateReducer as messagesStateReducer$1 } from "../messages/reducer.mjs";
40
+ import { createRemoveAllMessage, messagesStateReducer as messagesStateReducer$1 } from "../messages/reducer.mjs";
39
41
  import { resolveIntraTurnRetainTokens, splitAtRecencyBoundary } from "../messages/recency.mjs";
40
42
  import { getMessageCreationContentMetadata, splitAssistantTextContentByPhase } from "../messages/assistantPhase.mjs";
41
43
  import "../messages/index.mjs";
@@ -51,8 +53,7 @@ import { isGraphSubagentConfig, normalizeSubagentConfigEntries } from "../tools/
51
53
  import { DEFAULT_SUBAGENT_DESCRIPTION, SubagentExecutor } from "../tools/subagent/SubagentExecutor.mjs";
52
54
  import "../tools/subagent/index.mjs";
53
55
  import { getBlindRecoveryBudget, planContextOverflowRecovery, translateRecoveryBudget } from "../llm/contextOverflowRecovery.mjs";
54
- import "../llm/providers.mjs";
55
- import { prepareProviderRequest } from "../llm/prepareProviderRequest.mjs";
56
+ import { prepareProviderRequest, usesNativeOpenAIResponses } from "../llm/prepareProviderRequest.mjs";
56
57
  import { getTruncationStopReason } from "../llm/truncation.mjs";
57
58
  import { initializeModel } from "../llm/init.mjs";
58
59
  import { attemptInvoke, getFallbackErrorContext, getFallbackOverflowCandidates, tryFallbackProviders } from "../llm/invoke.mjs";
@@ -65,6 +66,7 @@ import { ToolNode, toolsCondition } from "../tools/ToolNode.mjs";
65
66
  import { createContextPressureMeter } from "../llm/contextPressureMeter.mjs";
66
67
  import { prepareToolsForPromptCache } from "../llm/promptCacheTools.mjs";
67
68
  import { buildSubagentToolParams } from "../tools/SubagentTool.mjs";
69
+ import { ManualSummarizationSkippedError } from "../summarization/shared.mjs";
68
70
  import { shouldTriggerSummarization } from "../summarization/index.mjs";
69
71
  import { createSummarizeNode } from "../summarization/node.mjs";
70
72
  import { createSchemaOnlyTools } from "../tools/schema.mjs";
@@ -574,6 +576,7 @@ var StandardGraph = class StandardGraph extends Graph {
574
576
  preemptSealInFlight = false;
575
577
  preemptIncomplete = false;
576
578
  outputTruncatedIncomplete = false;
579
+ summarizeOnlyAgentId;
577
580
  preemptHaltReason;
578
581
  pendingPreemptReturn = /* @__PURE__ */ new Set();
579
582
  preemptRestartPending = /* @__PURE__ */ new Set();
@@ -598,6 +601,7 @@ var StandardGraph = class StandardGraph extends Graph {
598
601
  if (agents.length === 0) throw new Error("At least one agent configuration is required");
599
602
  for (const agentConfig of agents) {
600
603
  const agentContext = AgentContext.fromConfig(agentConfig, tokenCounter, indexTokenCountMap, toolExecution);
604
+ if (agentConfig.summarizeOnly === true) this.summarizeOnlyAgentId ??= agentContext.agentId;
601
605
  if (calibrationRatio != null && calibrationRatio > 0) agentContext.calibrationRatio = calibrationRatio;
602
606
  let restoredFadingTier;
603
607
  if (fadingTiers != null && Object.prototype.hasOwnProperty.call(fadingTiers, agentConfig.agentId)) restoredFadingTier = fadingTiers[agentConfig.agentId];
@@ -605,7 +609,14 @@ var StandardGraph = class StandardGraph extends Graph {
605
609
  if (isFadingTier(restoredFadingTier)) agentContext.fadingTier = { ...restoredFadingTier };
606
610
  this.agentContexts.set(agentConfig.agentId, agentContext);
607
611
  }
608
- this.defaultAgentId = agents[0].agentId;
612
+ this.defaultAgentId = this.summarizeOnlyAgentId ?? agents[0].agentId;
613
+ }
614
+ propagateManualCompaction(result) {
615
+ if (this.summarizeOnlyAgentId == null || result.manualSummary == null || result.manualSummary.length === 0) return result;
616
+ return {
617
+ ...result,
618
+ messages: [createRemoveAllMessage(), ...result.messages]
619
+ };
609
620
  }
610
621
  startFreshLangfuseExecution() {
611
622
  this.langfuseTraceAnchor = {};
@@ -1279,6 +1290,32 @@ var StandardGraph = class StandardGraph extends Graph {
1279
1290
  isDeferred: makeIsDeferred(agentContext.getEffectiveToolDefinitions())
1280
1291
  });
1281
1292
  }
1293
+ async summarizeOnlyStep({ agentContext, agentId, messageCount, contextUsage, config }) {
1294
+ if (agentContext.summarizeOnly !== true) return null;
1295
+ const meta = {
1296
+ runId: this.runId,
1297
+ agentId
1298
+ };
1299
+ if (agentContext.claimManualSummarization()) {
1300
+ if (agentContext.summarizationEnabled !== true) throw new ManualSummarizationSkippedError("disabled", "Compaction skipped: summarization is not enabled for this agent");
1301
+ emitAgentLog(config, "info", "graph", "Manual summarization requested", {
1302
+ totalMessages: messageCount,
1303
+ summaryVersion: agentContext.summaryVersion + 1
1304
+ }, meta);
1305
+ agentContext.markSummarizationTriggered(messageCount);
1306
+ return {
1307
+ summarizationRequest: {
1308
+ remainingContextTokens: contextUsage?.remainingContextTokens ?? 0,
1309
+ agentId: agentId || agentContext.agentId,
1310
+ reason: "manual"
1311
+ },
1312
+ manualSummary: ""
1313
+ };
1314
+ }
1315
+ if (contextUsage != null) await safeDispatchCustomEvent("on_context_usage", contextUsage, config);
1316
+ emitAgentLog(config, "debug", "graph", "Summarize-only run complete — ending without a model call", { summaryVersion: agentContext.summaryVersion }, meta);
1317
+ return { messages: [] };
1318
+ }
1282
1319
  createCallModel(agentId = "default") {
1283
1320
  return async (state, config) => {
1284
1321
  const attemptBreaker = this.breakerAbort;
@@ -1292,13 +1329,6 @@ var StandardGraph = class StandardGraph extends Graph {
1292
1329
  const { messages } = state;
1293
1330
  const discoveredNames = extractToolDiscoveries(messages);
1294
1331
  if (discoveredNames.length > 0) agentContext.markToolsAsDiscovered(discoveredNames);
1295
- const toolsForBinding = this.getPreparedToolsForBinding(agentContext);
1296
- let model = this.overrideModel ?? initializeModel({
1297
- tools: toolsForBinding,
1298
- provider: agentContext.provider,
1299
- clientOptions: agentContext.clientOptions
1300
- });
1301
- if (agentContext.systemRunnable) model = agentContext.systemRunnable.pipe(model).withConfig({ runName: AGENT_MODEL_CALL_RUN_NAME });
1302
1332
  if (agentContext.tokenCalculationPromise) await agentContext.tokenCalculationPromise;
1303
1333
  if (!config.signal) config.signal = this.signal;
1304
1334
  this.config = config;
@@ -1365,6 +1395,14 @@ var StandardGraph = class StandardGraph extends Graph {
1365
1395
  calibrationRatio: agentContext.calibrationRatio
1366
1396
  };
1367
1397
  syncBudgetDerivedFields(contextUsage);
1398
+ const summarizeOnlyStep = await this.summarizeOnlyStep({
1399
+ agentContext,
1400
+ agentId,
1401
+ messageCount: messages.length,
1402
+ contextUsage,
1403
+ config
1404
+ });
1405
+ if (summarizeOnlyStep != null) return summarizeOnlyStep;
1368
1406
  if (agentContext.summarizationEnabled === true && Array.isArray(messagesToRefine) && messagesToRefine.length > 0) {
1369
1407
  const shouldSkip = agentContext.summarizationExhausted || agentContext.shouldSkipSummarization(messages.length);
1370
1408
  if (!shouldSkip && shouldTriggerSummarization({
@@ -1406,9 +1444,27 @@ var StandardGraph = class StandardGraph extends Graph {
1406
1444
  agentId
1407
1445
  });
1408
1446
  }
1447
+ } else {
1448
+ const summarizeOnlyStep = await this.summarizeOnlyStep({
1449
+ agentContext,
1450
+ agentId,
1451
+ messageCount: messages.length,
1452
+ contextUsage: null,
1453
+ config
1454
+ });
1455
+ if (summarizeOnlyStep != null) return summarizeOnlyStep;
1409
1456
  }
1457
+ const toolsForBinding = this.getPreparedToolsForBinding(agentContext);
1458
+ let model = this.overrideModel ?? initializeModel({
1459
+ tools: toolsForBinding,
1460
+ provider: agentContext.provider,
1461
+ clientOptions: agentContext.clientOptions
1462
+ });
1463
+ if (agentContext.systemRunnable) model = agentContext.systemRunnable.pipe(model).withConfig({ runName: AGENT_MODEL_CALL_RUN_NAME });
1410
1464
  let finalMessages = messagesToUse;
1465
+ const fallbackBaseMessages = messagesToUse;
1411
1466
  const contextPressure = createContextPressureMeter({
1467
+ provider: agentContext.provider,
1412
1468
  tokenCounter: agentContext.tokenCounter,
1413
1469
  tokenCountCache: agentContext.contextPressureTokenCounts,
1414
1470
  sourceMessages: messages,
@@ -1419,13 +1475,14 @@ var StandardGraph = class StandardGraph extends Graph {
1419
1475
  calibrationRatio: agentContext.calibrationRatio
1420
1476
  });
1421
1477
  const trackProviderMessageOrigins = contextPressure.trackProjection;
1478
+ const toolHistory = createToolHistoryPreparation();
1422
1479
  if (agentContext.useLegacyContent) {
1423
1480
  const before = finalMessages;
1424
1481
  finalMessages = trackProviderMessageOrigins(before, formatContentStrings(before));
1425
1482
  }
1426
1483
  const maxProviderToolResultChars = agentContext.maxToolResultChars ?? calculateMaxToolResultChars(agentContext.maxContextTokens);
1427
1484
  const beforeToolInputProjection = finalMessages;
1428
- finalMessages = trackProviderMessageOrigins(beforeToolInputProjection, projectToolMessagesForProvider(beforeToolInputProjection, calculateMaxToolCallInputChars(agentContext.maxContextTokens)));
1485
+ finalMessages = trackProviderMessageOrigins(beforeToolInputProjection, projectToolMessagesForProvider(beforeToolInputProjection, calculateMaxToolCallInputChars(agentContext.maxContextTokens), agentContext.provider));
1429
1486
  const lastMessageX = finalMessages.length >= 2 ? finalMessages[finalMessages.length - 2] : null;
1430
1487
  const lastMessageY = finalMessages.length >= 1 ? finalMessages[finalMessages.length - 1] : null;
1431
1488
  const anthropicLike = isAnthropicLike(agentContext.provider, agentContext.clientOptions);
@@ -1455,21 +1512,26 @@ var StandardGraph = class StandardGraph extends Graph {
1455
1512
  });
1456
1513
  return error;
1457
1514
  };
1458
- const applyProviderMessageTransforms = (candidate) => {
1515
+ const applyProviderMessageTransforms = (candidate, serving) => {
1516
+ const provider = serving?.provider ?? agentContext.provider;
1517
+ const clientOptions = serving == null ? agentContext.clientOptions : serving.clientOptions;
1518
+ const callConfig = serving == null ? config : serving.config;
1519
+ const history = serving?.history ?? toolHistory;
1520
+ const servingModel = serving?.model ?? this.overrideModel ?? model;
1459
1521
  let transformed = candidate;
1460
- if (isThinkingEnabled(agentContext.provider, agentContext.clientOptions)) {
1522
+ if (isThinkingEnabled(provider, clientOptions)) {
1461
1523
  const before = transformed;
1462
- transformed = trackProviderMessageOrigins(before, ensureThinkingBlockInMessages(before, agentContext.provider, config, this.startIndex));
1524
+ transformed = trackProviderMessageOrigins(before, ensureThinkingBlockInMessages(before, provider, callConfig, this.startIndex, history));
1463
1525
  }
1464
1526
  if (toolsForBinding == null || toolsForBinding.length === 0) {
1465
1527
  const before = transformed;
1466
- transformed = trackProviderMessageOrigins(before, foldToolBlocksForToollessAgent(before, config));
1528
+ transformed = trackProviderMessageOrigins(before, foldToolBlocksForToollessAgent(before, callConfig, usesNativeOpenAIResponses(servingModel, provider, callConfig), history));
1467
1529
  if (agentContext.useLegacyContent) {
1468
1530
  const beforeLegacyFormat = transformed;
1469
1531
  transformed = trackProviderMessageOrigins(beforeLegacyFormat, formatContentStrings(beforeLegacyFormat));
1470
1532
  }
1471
1533
  }
1472
- if (isAnthropicLike(agentContext.provider, agentContext.clientOptions)) {
1534
+ if (isAnthropicLike(provider, clientOptions)) {
1473
1535
  const before = transformed;
1474
1536
  transformed = trackProviderMessageOrigins(before, appendPredecessorHandoffCue(before, (message) => this.isRunProducedMessage(message)));
1475
1537
  }
@@ -1478,7 +1540,7 @@ var StandardGraph = class StandardGraph extends Graph {
1478
1540
  const toolOutputRegistry = this.getOrCreateToolOutputRegistry();
1479
1541
  const providerRunId = config.configurable?.run_id;
1480
1542
  const projectProviderReferences = (candidate) => trackProviderMessageOrigins(candidate, annotateMessagesForLLM(candidate, toolOutputRegistry, providerRunId));
1481
- const compactSyntheticProviderContext = (candidate) => {
1543
+ const compactSyntheticProviderContext = (candidate, measure = measureProviderPayload) => {
1482
1544
  const synthetic = [];
1483
1545
  for (let i = 0; i < candidate.length; i++) {
1484
1546
  const message = candidate[i];
@@ -1497,24 +1559,37 @@ var StandardGraph = class StandardGraph extends Graph {
1497
1559
  return compacted;
1498
1560
  };
1499
1561
  let best = buildCandidate(0);
1500
- if (!measureProviderPayload(best).fits) return candidate;
1562
+ if (!measure(best).fits) return candidate;
1501
1563
  let low = 0;
1502
1564
  let high = 1;
1503
1565
  for (let i = 0; i < 12; i++) {
1504
1566
  const scale = (low + high) / 2;
1505
1567
  const attempt = buildCandidate(scale);
1506
- if (measureProviderPayload(attempt).fits) {
1568
+ if (measure(attempt).fits) {
1507
1569
  best = attempt;
1508
1570
  low = scale;
1509
1571
  } else high = scale;
1510
1572
  }
1511
1573
  return best;
1512
1574
  };
1575
+ const projectServingArtifacts = (candidate, provider, clientOptions, maxChars) => {
1576
+ if (!(candidate[candidate.length - 1] instanceof ToolMessage)) return candidate;
1577
+ if (isAnthropicLike(provider, clientOptions)) return trackProviderMessageOrigins(candidate, projectAnthropicArtifactContent(candidate, maxChars));
1578
+ if (isOpenAILike(provider) && provider !== "deepseek" || isGoogleLike(provider)) return trackProviderMessageOrigins(candidate, projectArtifactPayload(candidate, maxChars));
1579
+ return candidate;
1580
+ };
1581
+ const applyServingTailCache = (candidate, provider, clientOptions, systemOwnsTail = false) => {
1582
+ if (provider === "bedrock") {
1583
+ const options = clientOptions;
1584
+ return options?.promptCache === true ? trackProviderMessageOrigins(candidate, addBedrockTailCacheControl(candidate, resolveBedrockPromptCacheTtl(options.promptCacheTtl, options.model))) : candidate;
1585
+ }
1586
+ if (systemOwnsTail || provider !== "anthropic" && provider !== "openrouter") return candidate;
1587
+ const options = clientOptions;
1588
+ return options?.promptCache === true ? trackProviderMessageOrigins(candidate, addTailCacheControl(candidate, resolvePromptCacheTtl(options.promptCacheTtl))) : candidate;
1589
+ };
1513
1590
  let artifactBaseMessages;
1514
1591
  if (lastMessageY instanceof ToolMessage) {
1515
- let artifactCandidate = finalMessages;
1516
- if (anthropicLike) artifactCandidate = trackProviderMessageOrigins(finalMessages, projectAnthropicArtifactContent(finalMessages, maxProviderToolResultChars));
1517
- else if (isOpenAILike(agentContext.provider) && agentContext.provider !== "deepseek" || isGoogleLike(agentContext.provider)) artifactCandidate = trackProviderMessageOrigins(finalMessages, projectArtifactPayload(finalMessages, maxProviderToolResultChars));
1592
+ const artifactCandidate = projectServingArtifacts(finalMessages, agentContext.provider, agentContext.clientOptions, maxProviderToolResultChars);
1518
1593
  if (artifactCandidate !== finalMessages) {
1519
1594
  const projection = measureProviderPayload(artifactCandidate);
1520
1595
  if (projection.fits) {
@@ -1581,16 +1656,8 @@ var StandardGraph = class StandardGraph extends Graph {
1581
1656
  agentId
1582
1657
  });
1583
1658
  }
1584
- if ((anthropicPromptCacheEnabled || openRouterPromptCacheEnabled) && !agentContext.systemRunnable) {
1585
- const beforeCacheControl = finalMessages;
1586
- finalMessages = trackProviderMessageOrigins(beforeCacheControl, addTailCacheControl(beforeCacheControl, resolvePromptCacheTtl(anthropicPromptCacheEnabled ? agentContext.clientOptions?.promptCacheTtl : agentContext.clientOptions?.promptCacheTtl)));
1587
- } else if (bedrockPromptCacheEnabled) {
1588
- const bedrockOptions = agentContext.clientOptions;
1589
- const beforeCacheControl = finalMessages;
1590
- finalMessages = trackProviderMessageOrigins(beforeCacheControl, addBedrockTailCacheControl(beforeCacheControl, resolveBedrockPromptCacheTtl(bedrockOptions?.promptCacheTtl, bedrockOptions?.model)));
1591
- }
1592
- const fallbackBaseMessages = finalMessages;
1593
- const beforeFinalProviderProjection = fallbackBaseMessages;
1659
+ finalMessages = applyServingTailCache(finalMessages, agentContext.provider, agentContext.clientOptions, agentContext.systemRunnable != null);
1660
+ const beforeFinalProviderProjection = finalMessages;
1594
1661
  const preparedRequest = prepareProviderRequest({
1595
1662
  model: this.overrideModel ?? model,
1596
1663
  messages: beforeFinalProviderProjection,
@@ -1598,6 +1665,7 @@ var StandardGraph = class StandardGraph extends Graph {
1598
1665
  context: this,
1599
1666
  config,
1600
1667
  maxToolResultChars: maxProviderToolResultChars,
1668
+ toolHistory,
1601
1669
  measure: (preparedMessages) => measureProviderPayload(trackProviderMessageOrigins(beforeFinalProviderProjection, preparedMessages))
1602
1670
  });
1603
1671
  finalMessages = preparedRequest.messages;
@@ -1643,7 +1711,9 @@ var StandardGraph = class StandardGraph extends Graph {
1643
1711
  contextUsage.breakdown.messageCount = finalMessages.length;
1644
1712
  contextUsage.remainingContextTokens = Math.max(0, finalProjection.availableMessageTokens - finalProjection.projectedMessageTokens);
1645
1713
  }
1646
- syncBudgetDerivedFields(contextUsage);
1714
+ contextUsage.breakdown.toolMessageTokens = finalProjection.toolMessageTokens;
1715
+ contextUsage.breakdown.toolMessageTokenCounts = finalProjection.toolMessageTokenCounts;
1716
+ syncBudgetDerivedFields(contextUsage, void 0, void 0, config, agentContext.provider, finalProjection.toolMessageUsageError);
1647
1717
  await safeDispatchCustomEvent("on_context_usage", contextUsage, config);
1648
1718
  }
1649
1719
  const invokeStart = Date.now();
@@ -1731,6 +1801,7 @@ var StandardGraph = class StandardGraph extends Graph {
1731
1801
  const estimatedPromptTokens = getEstimatedPromptTokens(contextUsage);
1732
1802
  const recencyTokenCounter = agentContext.contextPressureTokenCounts?.count ?? agentContext.tokenCounter;
1733
1803
  const canSummarizeOverflow = agentContext.summarizationEnabled === true && splitAtRecencyBoundary(messages, {
1804
+ provider: agentContext.provider,
1734
1805
  turns: agentContext.summarizationConfig?.retainRecent?.turns ?? 2,
1735
1806
  tokens: agentContext.summarizationConfig?.retainRecent?.tokens,
1736
1807
  tokenCounter: recencyTokenCounter,
@@ -1799,32 +1870,68 @@ var StandardGraph = class StandardGraph extends Graph {
1799
1870
  estimatedPromptTokens: getEstimatedPromptTokens(contextUsage),
1800
1871
  maxContextTokens: agentContext.maxContextTokens
1801
1872
  },
1802
- prepareProviderRequest: ({ model: fallbackModel, messages: fallbackMessages, provider: fallbackProvider, maxContextTokens: fallbackMaxContextTokens, config: fallbackConfig }) => {
1873
+ prepareProviderRequest: ({ model: fallbackModel, messages: fallbackMessages, provider: fallbackProvider, clientOptions: fallbackClientOptions, maxContextTokens: fallbackMaxContextTokens, config: fallbackConfig }) => {
1874
+ const fallbackToolHistory = createToolHistoryPreparation();
1803
1875
  const fallbackToolResultChars = agentContext.maxToolResultChars ?? calculateMaxToolResultChars(fallbackMaxContextTokens ?? agentContext.maxContextTokens);
1804
1876
  const primaryContextBudget = contextUsage?.contextBudget;
1805
1877
  const fallbackContextBudget = fallbackMaxContextTokens == null ? primaryContextBudget : Math.min(primaryContextBudget ?? fallbackMaxContextTokens, fallbackMaxContextTokens);
1806
- const preparedFallbackRequest = prepareProviderRequest({
1807
- model: fallbackModel,
1808
- messages: fallbackMessages,
1809
- provider: fallbackProvider,
1810
- context: this,
1811
- config: fallbackConfig,
1812
- maxToolResultChars: fallbackToolResultChars,
1813
- measure: (preparedMessages) => measureProviderPayload(trackProviderMessageOrigins(fallbackMessages, preparedMessages), {
1814
- contextBudget: fallbackContextBudget,
1815
- forceRawRecount: true
1816
- })
1817
- });
1818
- const projection = preparedFallbackRequest.measurement ?? measureProviderPayload(preparedFallbackRequest.messages, {
1878
+ const measureFallback = (candidate) => measureProviderPayload(candidate, {
1819
1879
  contextBudget: fallbackContextBudget,
1820
1880
  forceRawRecount: true
1821
1881
  });
1882
+ const source = agentContext.useLegacyContent ? trackProviderMessageOrigins(fallbackMessages, formatContentStrings(fallbackMessages)) : fallbackMessages;
1883
+ const boundedSource = trackProviderMessageOrigins(source, projectToolMessagesForProvider(source, calculateMaxToolCallInputChars(fallbackMaxContextTokens), fallbackProvider));
1884
+ const artifactSource = projectServingArtifacts(boundedSource, fallbackProvider, fallbackClientOptions, fallbackToolResultChars);
1885
+ const transformFallback = (candidate) => applyProviderMessageTransforms(candidate, {
1886
+ provider: fallbackProvider,
1887
+ clientOptions: fallbackClientOptions,
1888
+ model: fallbackModel,
1889
+ config: fallbackConfig,
1890
+ history: fallbackToolHistory
1891
+ });
1892
+ const prepareFallback = (candidate) => {
1893
+ const cached = applyServingTailCache(isAnthropicLike(fallbackProvider, fallbackClientOptions) ? trackProviderMessageOrigins(candidate, sanitizeOrphanToolBlocks(candidate, (original, clone) => contextPressure.trackClone(original, clone))) : candidate, fallbackProvider, fallbackClientOptions);
1894
+ let projection;
1895
+ const request = prepareProviderRequest({
1896
+ model: fallbackModel,
1897
+ messages: cached,
1898
+ provider: fallbackProvider,
1899
+ context: this,
1900
+ config: fallbackConfig,
1901
+ maxToolResultChars: fallbackToolResultChars,
1902
+ toolHistory: fallbackToolHistory,
1903
+ measure: (prepared) => {
1904
+ projection = measureFallback(trackProviderMessageOrigins(cached, prepared));
1905
+ return projection;
1906
+ }
1907
+ });
1908
+ if (projection == null) throw new Error("Fallback preparation did not measure its payload");
1909
+ return {
1910
+ request,
1911
+ projection
1912
+ };
1913
+ };
1914
+ let servingFallbackMessages = transformFallback(artifactSource);
1915
+ let preparedFallbackRequest = prepareFallback(servingFallbackMessages);
1916
+ let projection = preparedFallbackRequest.projection;
1917
+ if (!projection.fits && artifactSource !== boundedSource) {
1918
+ servingFallbackMessages = transformFallback(boundedSource);
1919
+ preparedFallbackRequest = prepareFallback(servingFallbackMessages);
1920
+ projection = preparedFallbackRequest.projection;
1921
+ }
1922
+ if (!projection.fits) {
1923
+ const compacted = compactSyntheticProviderContext(servingFallbackMessages, (candidate) => prepareFallback(candidate).projection);
1924
+ if (compacted !== servingFallbackMessages) {
1925
+ preparedFallbackRequest = prepareFallback(compacted);
1926
+ projection = preparedFallbackRequest.projection;
1927
+ }
1928
+ }
1822
1929
  if (!projection.fits) throw createProviderPayloadOverflowError({
1823
1930
  projection,
1824
1931
  provider: fallbackProvider,
1825
1932
  info: "Fallback provider message formatting exceeded the context budget before invocation."
1826
1933
  });
1827
- return preparedFallbackRequest;
1934
+ return preparedFallbackRequest.request;
1828
1935
  }
1829
1936
  }));
1830
1937
  } catch (fallbackError) {
@@ -2161,8 +2268,11 @@ var StandardGraph = class StandardGraph extends Graph {
2161
2268
  const invokeWithRunStepState = async (state, config, invoke) => {
2162
2269
  this.config = config;
2163
2270
  this.restoreRunStepResumeState(state.runStepState);
2271
+ const result = await invoke();
2272
+ const clearsManualSummary = this.summarizeOnlyAgentId == null && typeof state.manualSummary === "string" && state.manualSummary.length > 0;
2164
2273
  return {
2165
- ...await invoke(),
2274
+ ...result,
2275
+ ...clearsManualSummary ? { manualSummary: "" } : {},
2166
2276
  runStepState: this.createRunStepResumeState()
2167
2277
  };
2168
2278
  };
@@ -2170,6 +2280,7 @@ var StandardGraph = class StandardGraph extends Graph {
2170
2280
  this.config = config;
2171
2281
  if (this.pendingPreemptReturn.delete(agentId)) return agentNode;
2172
2282
  if (state.summarizationRequest != null) return summarizeNode;
2283
+ if (this.summarizeOnlyAgentId != null) return END;
2173
2284
  const decision = toolsCondition(state, toolNode, this.invokedToolIds);
2174
2285
  if (decision === END) {
2175
2286
  const { messages } = state;
@@ -2190,6 +2301,10 @@ var StandardGraph = class StandardGraph extends Graph {
2190
2301
  reducer: (_, b) => b,
2191
2302
  default: () => void 0
2192
2303
  }),
2304
+ manualSummary: Annotation({
2305
+ reducer: (_, b) => b,
2306
+ default: () => void 0
2307
+ }),
2193
2308
  runStepState: this.createRunStepStateAnnotation()
2194
2309
  });
2195
2310
  const readChargeCredits = () => this.streamLimitChargeCredits;
@@ -2280,7 +2395,7 @@ var StandardGraph = class StandardGraph extends Graph {
2280
2395
  createWorkflow() {
2281
2396
  this.hasCompiledCheckpointer = this.compileOptions?.checkpointer != null;
2282
2397
  const agentNode = this.createAgentNode(this.defaultAgentId);
2283
- return new StateGraph(Annotation.Root({
2398
+ const StateAnnotation = Annotation.Root({
2284
2399
  messages: Annotation({
2285
2400
  reducer: (a, b) => {
2286
2401
  if (!this.messages.length && !this.hasRestoredCheckpointMessages) this.startIndex = a.length + b.length;
@@ -2290,8 +2405,14 @@ var StandardGraph = class StandardGraph extends Graph {
2290
2405
  },
2291
2406
  default: () => []
2292
2407
  }),
2408
+ manualSummary: Annotation({
2409
+ reducer: (_, b) => b,
2410
+ default: () => void 0
2411
+ }),
2293
2412
  runStepState: this.createRunStepStateAnnotation()
2294
- })).addNode(this.defaultAgentId, agentNode, { ends: [END] }).addEdge(START, this.defaultAgentId).compile({
2413
+ });
2414
+ const compactingAgentNode = async (state, config) => this.propagateManualCompaction(await agentNode.invoke(state, config));
2415
+ return new StateGraph(StateAnnotation).addNode(this.defaultAgentId, this.summarizeOnlyAgentId != null ? compactingAgentNode : agentNode, { ends: [END] }).addEdge(START, this.defaultAgentId).compile({
2295
2416
  ...this.compileOptions,
2296
2417
  name: STANDARD_GRAPH_RUN_NAME
2297
2418
  });