@librechat/agents 3.8.0 → 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 (209) 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 +42 -0
  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/local/CompileCheckTool.cjs +1 -1
  69. package/dist/cjs/tools/local/LocalCodingTools.cjs +1 -1
  70. package/dist/cjs/utils/events.cjs +13 -0
  71. package/dist/cjs/utils/events.cjs.map +1 -1
  72. package/dist/cjs/utils/tokens.cjs +105 -0
  73. package/dist/cjs/utils/tokens.cjs.map +1 -1
  74. package/dist/esm/agents/AgentContext.mjs +13 -3
  75. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  76. package/dist/esm/graphs/Graph.mjs +176 -55
  77. package/dist/esm/graphs/Graph.mjs.map +1 -1
  78. package/dist/esm/graphs/MultiAgentGraph.mjs +15 -5
  79. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  80. package/dist/esm/langfuse.mjs +43 -2
  81. package/dist/esm/langfuse.mjs.map +1 -1
  82. package/dist/esm/langfuseToolOutputTracing.mjs +41 -1
  83. package/dist/esm/langfuseToolOutputTracing.mjs.map +1 -1
  84. package/dist/esm/langfuseTraceShaping.mjs +7 -1
  85. package/dist/esm/langfuseTraceShaping.mjs.map +1 -1
  86. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +5 -9
  87. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  88. package/dist/esm/llm/bedrock/utils/message_inputs.mjs +2 -7
  89. package/dist/esm/llm/bedrock/utils/message_inputs.mjs.map +1 -1
  90. package/dist/esm/llm/contextPressureMeter.mjs +52 -11
  91. package/dist/esm/llm/contextPressureMeter.mjs.map +1 -1
  92. package/dist/esm/llm/init.mjs +1 -1
  93. package/dist/esm/llm/invoke.mjs +2 -2
  94. package/dist/esm/llm/openai/index.mjs +2 -1
  95. package/dist/esm/llm/openai/index.mjs.map +1 -1
  96. package/dist/esm/llm/openai/utils/index.mjs +5 -4
  97. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  98. package/dist/esm/llm/preempt.mjs +2 -1
  99. package/dist/esm/llm/preempt.mjs.map +1 -1
  100. package/dist/esm/llm/prepareProviderRequest.mjs +9 -7
  101. package/dist/esm/llm/prepareProviderRequest.mjs.map +1 -1
  102. package/dist/esm/llm/providers.mjs +1 -1
  103. package/dist/esm/main.mjs +10 -7
  104. package/dist/esm/messages/alternation.mjs +2 -6
  105. package/dist/esm/messages/alternation.mjs.map +1 -1
  106. package/dist/esm/messages/budget.mjs +206 -8
  107. package/dist/esm/messages/budget.mjs.map +1 -1
  108. package/dist/esm/messages/cache.mjs +3 -9
  109. package/dist/esm/messages/cache.mjs.map +1 -1
  110. package/dist/esm/messages/core.mjs +23 -33
  111. package/dist/esm/messages/core.mjs.map +1 -1
  112. package/dist/esm/messages/format.mjs +132 -43
  113. package/dist/esm/messages/format.mjs.map +1 -1
  114. package/dist/esm/messages/index.mjs +2 -0
  115. package/dist/esm/messages/prune.mjs +12 -7
  116. package/dist/esm/messages/prune.mjs.map +1 -1
  117. package/dist/esm/messages/reasoningTypes.mjs +20 -0
  118. package/dist/esm/messages/reasoningTypes.mjs.map +1 -0
  119. package/dist/esm/messages/recency.mjs +16 -95
  120. package/dist/esm/messages/recency.mjs.map +1 -1
  121. package/dist/esm/messages/toolHistoryProjection.mjs +237 -0
  122. package/dist/esm/messages/toolHistoryProjection.mjs.map +1 -0
  123. package/dist/esm/messages/toolResultTypes.mjs +141 -4
  124. package/dist/esm/messages/toolResultTypes.mjs.map +1 -1
  125. package/dist/esm/run.mjs +5 -4
  126. package/dist/esm/run.mjs.map +1 -1
  127. package/dist/esm/session/AgentSession.mjs +6 -4
  128. package/dist/esm/session/AgentSession.mjs.map +1 -1
  129. package/dist/esm/session/JsonlSessionStore.mjs +3 -0
  130. package/dist/esm/session/JsonlSessionStore.mjs.map +1 -1
  131. package/dist/esm/session/index.mjs +1 -1
  132. package/dist/esm/session/sessionProjection.mjs +72 -0
  133. package/dist/esm/session/sessionProjection.mjs.map +1 -0
  134. package/dist/esm/stream.mjs +15 -14
  135. package/dist/esm/stream.mjs.map +1 -1
  136. package/dist/esm/summarization/index.mjs.map +1 -1
  137. package/dist/esm/summarization/node.mjs +19 -9
  138. package/dist/esm/summarization/node.mjs.map +1 -1
  139. package/dist/esm/summarization/shared.mjs +9 -1
  140. package/dist/esm/summarization/shared.mjs.map +1 -1
  141. package/dist/esm/tools/local/CompileCheckTool.mjs +1 -1
  142. package/dist/esm/tools/local/LocalCodingTools.mjs +1 -1
  143. package/dist/esm/utils/events.mjs +13 -0
  144. package/dist/esm/utils/events.mjs.map +1 -1
  145. package/dist/esm/utils/tokens.mjs +105 -1
  146. package/dist/esm/utils/tokens.mjs.map +1 -1
  147. package/dist/types/agents/AgentContext.d.ts +13 -1
  148. package/dist/types/graphs/Graph.d.ts +27 -0
  149. package/dist/types/hooks/types.d.ts +4 -2
  150. package/dist/types/index.d.ts +1 -0
  151. package/dist/types/langfuse.d.ts +5 -0
  152. package/dist/types/langfuseToolOutputTracing.d.ts +2 -0
  153. package/dist/types/llm/contextPressureMeter.d.ts +2 -1
  154. package/dist/types/llm/prepareProviderRequest.d.ts +7 -1
  155. package/dist/types/messages/budget.d.ts +15 -10
  156. package/dist/types/messages/core.d.ts +8 -17
  157. package/dist/types/messages/format.d.ts +3 -2
  158. package/dist/types/messages/index.d.ts +1 -1
  159. package/dist/types/messages/prune.d.ts +1 -1
  160. package/dist/types/messages/reasoningTypes.d.ts +7 -0
  161. package/dist/types/messages/recency.d.ts +3 -0
  162. package/dist/types/messages/toolHistoryProjection.d.ts +65 -0
  163. package/dist/types/messages/toolResultTypes.d.ts +31 -1
  164. package/dist/types/session/sessionProjection.d.ts +10 -0
  165. package/dist/types/summarization/index.d.ts +2 -1
  166. package/dist/types/summarization/node.d.ts +1 -0
  167. package/dist/types/summarization/shared.d.ts +12 -0
  168. package/dist/types/types/graph.d.ts +20 -0
  169. package/dist/types/types/run.d.ts +4 -0
  170. package/dist/types/types/summarize.d.ts +4 -1
  171. package/dist/types/utils/tokens.d.ts +2 -1
  172. package/package.json +1 -1
  173. package/src/agents/AgentContext.ts +34 -3
  174. package/src/graphs/Graph.ts +465 -147
  175. package/src/graphs/MultiAgentGraph.ts +28 -6
  176. package/src/hooks/types.ts +4 -1
  177. package/src/index.ts +1 -0
  178. package/src/langfuse.ts +67 -9
  179. package/src/langfuseToolOutputTracing.ts +91 -0
  180. package/src/langfuseTraceShaping.ts +17 -4
  181. package/src/llm/anthropic/utils/message_inputs.ts +5 -10
  182. package/src/llm/bedrock/utils/message_inputs.ts +2 -8
  183. package/src/llm/contextPressureMeter.ts +80 -12
  184. package/src/llm/openai/utils/index.ts +5 -4
  185. package/src/llm/prepareProviderRequest.ts +21 -16
  186. package/src/messages/alternation.ts +2 -15
  187. package/src/messages/budget.ts +439 -23
  188. package/src/messages/cache.ts +8 -9
  189. package/src/messages/core.ts +65 -95
  190. package/src/messages/format.ts +262 -78
  191. package/src/messages/index.ts +1 -1
  192. package/src/messages/prune.ts +31 -12
  193. package/src/messages/reasoningTypes.ts +23 -0
  194. package/src/messages/recency.ts +35 -179
  195. package/src/messages/toolHistoryProjection.ts +460 -0
  196. package/src/messages/toolResultTypes.ts +331 -100
  197. package/src/run.ts +10 -2
  198. package/src/session/AgentSession.ts +33 -16
  199. package/src/session/JsonlSessionStore.ts +6 -0
  200. package/src/session/sessionProjection.ts +126 -0
  201. package/src/stream.ts +14 -19
  202. package/src/summarization/index.ts +2 -0
  203. package/src/summarization/node.ts +62 -13
  204. package/src/summarization/shared.ts +23 -0
  205. package/src/types/graph.ts +20 -0
  206. package/src/types/run.ts +4 -0
  207. package/src/types/summarize.ts +4 -1
  208. package/src/utils/events.ts +19 -0
  209. package/src/utils/tokens.ts +183 -0
@@ -30,6 +30,13 @@ export type SystemCallbacks = {
30
30
  export type BaseGraphState = {
31
31
  messages: BaseMessage[];
32
32
  runStepState?: RunStepResumeState;
33
+ /**
34
+ * The summary a summarize-only run produced. Kept in state because such a
35
+ * run has no assistant reply: trace roots report it as the run's output
36
+ * instead of the retained tail or the raw state. Empty once any later run
37
+ * on the same checkpointed thread starts, so it never outlives its run.
38
+ */
39
+ manualSummary?: string;
33
40
  };
34
41
  export type AgentSubgraphState = BaseGraphState & {
35
42
  summarizationRequest?: SummarizationNodeInput;
@@ -725,6 +732,19 @@ interface AgentInputFields {
725
732
  */
726
733
  discoveredTools?: string[];
727
734
  summarizationEnabled?: boolean;
735
+ /**
736
+ * Runs this agent as a summarize-only pass: the first model step requests
737
+ * summarization outright instead of consulting the trigger, and the step
738
+ * after the summary emits its context snapshot and ends the run without a
739
+ * model call. Hosts use it for user-initiated compaction, where the summary
740
+ * is the whole response. Requires `summarizationEnabled`: a run that cannot
741
+ * attempt the summary rejects with `ManualSummarizationSkippedError`
742
+ * rather than ending with nothing, and one whose provider calls all fail
743
+ * keeps the history and reports the failure on the summary step. A
744
+ * multi-agent workflow compiles to the agent that opted in alone; no other
745
+ * agent runs.
746
+ */
747
+ summarizeOnly?: boolean;
728
748
  summarizationConfig?: SummarizationConfig;
729
749
  /**
730
750
  * Optional host-supplied, user-visible guidance for compaction. The SDK
@@ -453,6 +453,10 @@ export type TokenBudgetBreakdown = {
453
453
  toolTokenCounts?: Record<string, number>;
454
454
  /** Names of counted tools that are deferred (`defer_loading`) and discovered. */
455
455
  deferredToolNames?: string[];
456
+ /** Calibrated retained tool traffic: tool results plus assistant turns made only of tool calls, inline provider tool results and reasoning. A subset of messageTokens, not an additional budget category. */
457
+ toolMessageTokens?: number;
458
+ /** Per-tool result-message share; excludes assistant invocation overhead. */
459
+ toolMessageTokenCounts?: Record<string, number>;
456
460
  };
457
461
  export type EventStreamOptions = {
458
462
  callbacks?: g.ClientCallbacks;
@@ -104,8 +104,11 @@ export interface SummarizationNodeInput {
104
104
  * is compacting to recover. When summarization is not enabled, this
105
105
  * variant performs no model call — the corrected budget alone is what the
106
106
  * retry needs.
107
+ * - `manual`: the host asked for a summary outright (a summarize-only run).
108
+ * The recency window is not applied unless the host configured
109
+ * `retainRecent` explicitly, so the summary replaces the whole history.
107
110
  */
108
- reason?: 'trigger' | 'overflow';
111
+ reason?: 'trigger' | 'overflow' | 'manual';
109
112
  /**
110
113
  * Whether an overflow recovery may spend a summarization model call.
111
114
  *
@@ -1,6 +1,6 @@
1
1
  import type { BaseMessage } from '@langchain/core/messages';
2
2
  export type EncodingName = 'o200k_base' | 'claude';
3
- export type UnsafeTokenMeasurementReason = 'message_proxy' | 'content_proxy' | 'metadata_proxy' | 'metadata_accessor' | 'invalid_count';
3
+ export type UnsafeTokenMeasurementReason = 'message_proxy' | 'content_proxy' | 'metadata_proxy' | 'metadata_accessor' | 'metadata_limit' | 'invalid_count';
4
4
  export declare class UnsafeTokenMeasurementError extends Error {
5
5
  readonly type = "unsafe_token_measurement";
6
6
  readonly reason: UnsafeTokenMeasurementReason;
@@ -61,6 +61,7 @@ export declare function encodingForModel(model: string): EncodingName;
61
61
  * unsafe so the caller can normalize or reject them conservatively.
62
62
  */
63
63
  export declare function hasUnsafeStructuredSerialization(value: unknown): boolean;
64
+ export declare function readTokenMetadataProperty(value: object, key: PropertyKey, path: string): unknown;
64
65
  export declare function getTokenCountForMessage(message: BaseMessage, getTokenCount: (text: string) => number, encoding?: EncodingName): number;
65
66
  /**
66
67
  * Largest-remainder apportionment: scales each count by `multiplier` and
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@librechat/agents",
3
- "version": "3.8.0",
3
+ "version": "3.8.1",
4
4
  "reova": {
5
5
  "enabled": true,
6
6
  "endpoint": "https://telemetry.reo.dev/data"
@@ -123,6 +123,7 @@ export class AgentContext {
123
123
  useLegacyContent,
124
124
  discoveredTools,
125
125
  summarizationEnabled,
126
+ summarizeOnly,
126
127
  summarizationConfig,
127
128
  compactionSemanticIndex,
128
129
  initialSummary,
@@ -158,6 +159,7 @@ export class AgentContext {
158
159
  useLegacyContent,
159
160
  discoveredTools,
160
161
  summarizationEnabled,
162
+ summarizeOnly,
161
163
  summarizationConfig,
162
164
  compactionSemanticIndex,
163
165
  contextPruningConfig,
@@ -383,6 +385,10 @@ export class AgentContext {
383
385
  useLegacyContent: boolean = false;
384
386
  /** Enables graph-level summarization for this agent */
385
387
  summarizationEnabled?: boolean;
388
+ /** Summarize-only run: request a summary on the first model step and end after it */
389
+ summarizeOnly?: boolean;
390
+ /** Whether the summarize-only run has already issued its one request */
391
+ private _manualSummarizationRequested: boolean = false;
386
392
  /** Summarization runtime settings used by graph pruning hooks */
387
393
  summarizationConfig?: t.SummarizationConfig;
388
394
  /** Host-supplied advisory guidance consumed only when compaction runs. */
@@ -480,6 +486,7 @@ export class AgentContext {
480
486
  useLegacyContent,
481
487
  discoveredTools,
482
488
  summarizationEnabled,
489
+ summarizeOnly,
483
490
  summarizationConfig,
484
491
  compactionSemanticIndex,
485
492
  contextPruningConfig,
@@ -508,6 +515,7 @@ export class AgentContext {
508
515
  useLegacyContent?: boolean;
509
516
  discoveredTools?: string[];
510
517
  summarizationEnabled?: boolean;
518
+ summarizeOnly?: boolean;
511
519
  summarizationConfig?: t.SummarizationConfig;
512
520
  compactionSemanticIndex?: t.CompactionSemanticIndex;
513
521
  contextPruningConfig?: t.ContextPruningConfig;
@@ -549,6 +557,7 @@ export class AgentContext {
549
557
 
550
558
  this.useLegacyContent = useLegacyContent ?? false;
551
559
  this.summarizationEnabled = summarizationEnabled;
560
+ this.summarizeOnly = summarizeOnly;
552
561
  this.summarizationConfig = summarizationConfig;
553
562
  if (compactionSemanticIndex != null) {
554
563
  this.compactionSemanticIndex = snapshotCompactionSemanticIndex(
@@ -1268,6 +1277,7 @@ export class AgentContext {
1268
1277
  this.summaryPrecedesMessages = this.durableSummaryPrecedesMessages;
1269
1278
  this._lastSummarizationMsgCount = 0;
1270
1279
  this._summarizationFailures = 0;
1280
+ this._manualSummarizationRequested = false;
1271
1281
  this.lastCallUsage = undefined;
1272
1282
  this.totalTokensFresh = false;
1273
1283
  this.restoreContextBudgetAfterOverflow();
@@ -1617,6 +1627,20 @@ export class AgentContext {
1617
1627
  this._lastSummarizationMsgCount = msgCount;
1618
1628
  }
1619
1629
 
1630
+ /**
1631
+ * Claims the single summarization request a summarize-only run makes.
1632
+ * True exactly once per run, on the first model step; the step that gets
1633
+ * `false` is the one after the summary, which reports usage and ends
1634
+ * without a model call. Always false when `summarizeOnly` is off.
1635
+ */
1636
+ claimManualSummarization(): boolean {
1637
+ if (this.summarizeOnly !== true || this._manualSummarizationRequested) {
1638
+ return false;
1639
+ }
1640
+ this._manualSummarizationRequested = true;
1641
+ return true;
1642
+ }
1643
+
1620
1644
  /**
1621
1645
  * Records a summarization attempt that produced no usable summary — an
1622
1646
  * empty model response, or a provider failure the run declined to paper
@@ -1767,8 +1791,9 @@ export class AgentContext {
1767
1791
  const recounted: Record<string, number> = {};
1768
1792
  for (let i = 0; i < messages.length; i++) {
1769
1793
  const localCount = this.tokenCounter(messages[i]);
1770
- const conservativeFloor =
1771
- this.providerProjectionRecountFloors?.get(messages[i]);
1794
+ const conservativeFloor = this.providerProjectionRecountFloors?.get(
1795
+ messages[i]
1796
+ );
1772
1797
  recounted[i] =
1773
1798
  conservativeFloor == null
1774
1799
  ? localCount
@@ -2112,7 +2137,13 @@ export class AgentContext {
2112
2137
  remainingContextTokens,
2113
2138
  calibrationRatio,
2114
2139
  };
2115
- syncBudgetDerivedFields(usage);
2140
+ syncBudgetDerivedFields(
2141
+ usage,
2142
+ context,
2143
+ this.contextPressureTokenCounts?.count ?? tokenCounter,
2144
+ undefined,
2145
+ this.provider
2146
+ );
2116
2147
  return usage;
2117
2148
  }
2118
2149