@librechat/agents 3.1.57 → 3.1.60
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/cjs/agents/AgentContext.cjs +326 -62
- package/dist/cjs/agents/AgentContext.cjs.map +1 -1
- package/dist/cjs/common/enum.cjs +13 -0
- package/dist/cjs/common/enum.cjs.map +1 -1
- package/dist/cjs/events.cjs +7 -27
- package/dist/cjs/events.cjs.map +1 -1
- package/dist/cjs/graphs/Graph.cjs +303 -222
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +4 -4
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/utils/message_inputs.cjs +6 -2
- package/dist/cjs/llm/bedrock/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/init.cjs +60 -0
- package/dist/cjs/llm/init.cjs.map +1 -0
- package/dist/cjs/llm/invoke.cjs +90 -0
- package/dist/cjs/llm/invoke.cjs.map +1 -0
- package/dist/cjs/llm/openai/index.cjs +2 -0
- package/dist/cjs/llm/openai/index.cjs.map +1 -1
- package/dist/cjs/llm/request.cjs +41 -0
- package/dist/cjs/llm/request.cjs.map +1 -0
- package/dist/cjs/main.cjs +40 -0
- package/dist/cjs/main.cjs.map +1 -1
- package/dist/cjs/messages/cache.cjs +76 -89
- package/dist/cjs/messages/cache.cjs.map +1 -1
- package/dist/cjs/messages/contextPruning.cjs +156 -0
- package/dist/cjs/messages/contextPruning.cjs.map +1 -0
- package/dist/cjs/messages/contextPruningSettings.cjs +53 -0
- package/dist/cjs/messages/contextPruningSettings.cjs.map +1 -0
- package/dist/cjs/messages/core.cjs +23 -37
- package/dist/cjs/messages/core.cjs.map +1 -1
- package/dist/cjs/messages/format.cjs +156 -11
- package/dist/cjs/messages/format.cjs.map +1 -1
- package/dist/cjs/messages/prune.cjs +1161 -49
- package/dist/cjs/messages/prune.cjs.map +1 -1
- package/dist/cjs/messages/reducer.cjs +87 -0
- package/dist/cjs/messages/reducer.cjs.map +1 -0
- package/dist/cjs/run.cjs +81 -42
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/stream.cjs +54 -7
- package/dist/cjs/stream.cjs.map +1 -1
- package/dist/cjs/summarization/index.cjs +75 -0
- package/dist/cjs/summarization/index.cjs.map +1 -0
- package/dist/cjs/summarization/node.cjs +663 -0
- package/dist/cjs/summarization/node.cjs.map +1 -0
- package/dist/cjs/tools/ToolNode.cjs +16 -8
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/handlers.cjs +2 -0
- package/dist/cjs/tools/handlers.cjs.map +1 -1
- package/dist/cjs/utils/errors.cjs +115 -0
- package/dist/cjs/utils/errors.cjs.map +1 -0
- package/dist/cjs/utils/events.cjs +17 -0
- package/dist/cjs/utils/events.cjs.map +1 -1
- package/dist/cjs/utils/handlers.cjs +16 -0
- package/dist/cjs/utils/handlers.cjs.map +1 -1
- package/dist/cjs/utils/llm.cjs +10 -0
- package/dist/cjs/utils/llm.cjs.map +1 -1
- package/dist/cjs/utils/tokens.cjs +247 -14
- package/dist/cjs/utils/tokens.cjs.map +1 -1
- package/dist/cjs/utils/truncation.cjs +107 -0
- package/dist/cjs/utils/truncation.cjs.map +1 -0
- package/dist/esm/agents/AgentContext.mjs +325 -61
- package/dist/esm/agents/AgentContext.mjs.map +1 -1
- package/dist/esm/common/enum.mjs +13 -0
- package/dist/esm/common/enum.mjs.map +1 -1
- package/dist/esm/events.mjs +8 -28
- package/dist/esm/events.mjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +307 -226
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs +4 -4
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/bedrock/utils/message_inputs.mjs +6 -2
- package/dist/esm/llm/bedrock/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/init.mjs +58 -0
- package/dist/esm/llm/init.mjs.map +1 -0
- package/dist/esm/llm/invoke.mjs +87 -0
- package/dist/esm/llm/invoke.mjs.map +1 -0
- package/dist/esm/llm/openai/index.mjs +2 -0
- package/dist/esm/llm/openai/index.mjs.map +1 -1
- package/dist/esm/llm/request.mjs +38 -0
- package/dist/esm/llm/request.mjs.map +1 -0
- package/dist/esm/main.mjs +13 -3
- package/dist/esm/main.mjs.map +1 -1
- package/dist/esm/messages/cache.mjs +76 -89
- package/dist/esm/messages/cache.mjs.map +1 -1
- package/dist/esm/messages/contextPruning.mjs +154 -0
- package/dist/esm/messages/contextPruning.mjs.map +1 -0
- package/dist/esm/messages/contextPruningSettings.mjs +50 -0
- package/dist/esm/messages/contextPruningSettings.mjs.map +1 -0
- package/dist/esm/messages/core.mjs +23 -37
- package/dist/esm/messages/core.mjs.map +1 -1
- package/dist/esm/messages/format.mjs +156 -11
- package/dist/esm/messages/format.mjs.map +1 -1
- package/dist/esm/messages/prune.mjs +1158 -52
- package/dist/esm/messages/prune.mjs.map +1 -1
- package/dist/esm/messages/reducer.mjs +83 -0
- package/dist/esm/messages/reducer.mjs.map +1 -0
- package/dist/esm/run.mjs +82 -43
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/stream.mjs +54 -7
- package/dist/esm/stream.mjs.map +1 -1
- package/dist/esm/summarization/index.mjs +73 -0
- package/dist/esm/summarization/index.mjs.map +1 -0
- package/dist/esm/summarization/node.mjs +659 -0
- package/dist/esm/summarization/node.mjs.map +1 -0
- package/dist/esm/tools/ToolNode.mjs +16 -8
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/handlers.mjs +2 -0
- package/dist/esm/tools/handlers.mjs.map +1 -1
- package/dist/esm/utils/errors.mjs +111 -0
- package/dist/esm/utils/errors.mjs.map +1 -0
- package/dist/esm/utils/events.mjs +17 -1
- package/dist/esm/utils/events.mjs.map +1 -1
- package/dist/esm/utils/handlers.mjs +16 -0
- package/dist/esm/utils/handlers.mjs.map +1 -1
- package/dist/esm/utils/llm.mjs +10 -1
- package/dist/esm/utils/llm.mjs.map +1 -1
- package/dist/esm/utils/tokens.mjs +245 -15
- package/dist/esm/utils/tokens.mjs.map +1 -1
- package/dist/esm/utils/truncation.mjs +102 -0
- package/dist/esm/utils/truncation.mjs.map +1 -0
- package/dist/types/agents/AgentContext.d.ts +124 -6
- package/dist/types/common/enum.d.ts +14 -1
- package/dist/types/graphs/Graph.d.ts +22 -27
- package/dist/types/index.d.ts +5 -0
- package/dist/types/llm/init.d.ts +18 -0
- package/dist/types/llm/invoke.d.ts +48 -0
- package/dist/types/llm/request.d.ts +14 -0
- package/dist/types/messages/contextPruning.d.ts +42 -0
- package/dist/types/messages/contextPruningSettings.d.ts +44 -0
- package/dist/types/messages/core.d.ts +1 -1
- package/dist/types/messages/format.d.ts +17 -1
- package/dist/types/messages/index.d.ts +3 -0
- package/dist/types/messages/prune.d.ts +162 -1
- package/dist/types/messages/reducer.d.ts +18 -0
- package/dist/types/run.d.ts +12 -1
- package/dist/types/summarization/index.d.ts +20 -0
- package/dist/types/summarization/node.d.ts +29 -0
- package/dist/types/tools/ToolNode.d.ts +3 -1
- package/dist/types/types/graph.d.ts +44 -6
- package/dist/types/types/index.d.ts +1 -0
- package/dist/types/types/run.d.ts +30 -0
- package/dist/types/types/stream.d.ts +31 -4
- package/dist/types/types/summarize.d.ts +47 -0
- package/dist/types/types/tools.d.ts +7 -0
- package/dist/types/utils/errors.d.ts +28 -0
- package/dist/types/utils/events.d.ts +13 -0
- package/dist/types/utils/index.d.ts +2 -0
- package/dist/types/utils/llm.d.ts +4 -0
- package/dist/types/utils/tokens.d.ts +14 -1
- package/dist/types/utils/truncation.d.ts +49 -0
- package/package.json +1 -1
- package/src/agents/AgentContext.ts +388 -58
- package/src/agents/__tests__/AgentContext.test.ts +265 -5
- package/src/common/enum.ts +13 -0
- package/src/events.ts +9 -39
- package/src/graphs/Graph.ts +468 -331
- package/src/index.ts +7 -0
- package/src/llm/anthropic/llm.spec.ts +3 -3
- package/src/llm/anthropic/utils/message_inputs.ts +6 -4
- package/src/llm/bedrock/llm.spec.ts +1 -1
- package/src/llm/bedrock/utils/message_inputs.ts +6 -2
- package/src/llm/init.ts +63 -0
- package/src/llm/invoke.ts +144 -0
- package/src/llm/request.ts +55 -0
- package/src/messages/__tests__/observationMasking.test.ts +221 -0
- package/src/messages/cache.ts +77 -102
- package/src/messages/contextPruning.ts +191 -0
- package/src/messages/contextPruningSettings.ts +90 -0
- package/src/messages/core.ts +32 -53
- package/src/messages/ensureThinkingBlock.test.ts +39 -39
- package/src/messages/format.ts +227 -15
- package/src/messages/formatAgentMessages.test.ts +511 -1
- package/src/messages/index.ts +3 -0
- package/src/messages/prune.ts +1548 -62
- package/src/messages/reducer.ts +22 -0
- package/src/run.ts +104 -51
- package/src/scripts/bedrock-merge-test.ts +1 -1
- package/src/scripts/test-thinking-handoff-bedrock.ts +1 -1
- package/src/scripts/test-thinking-handoff.ts +1 -1
- package/src/scripts/thinking-bedrock.ts +1 -1
- package/src/scripts/thinking.ts +1 -1
- package/src/specs/anthropic.simple.test.ts +1 -1
- package/src/specs/multi-agent-summarization.test.ts +396 -0
- package/src/specs/prune.test.ts +1196 -23
- package/src/specs/summarization-unit.test.ts +868 -0
- package/src/specs/summarization.test.ts +3810 -0
- package/src/specs/summarize-prune.test.ts +376 -0
- package/src/specs/thinking-handoff.test.ts +10 -10
- package/src/specs/thinking-prune.test.ts +7 -4
- package/src/specs/token-accounting-e2e.test.ts +1034 -0
- package/src/specs/token-accounting-pipeline.test.ts +882 -0
- package/src/specs/token-distribution-edge-case.test.ts +25 -26
- package/src/splitStream.test.ts +42 -33
- package/src/stream.ts +64 -11
- package/src/summarization/__tests__/aggregator.test.ts +153 -0
- package/src/summarization/__tests__/node.test.ts +708 -0
- package/src/summarization/__tests__/trigger.test.ts +50 -0
- package/src/summarization/index.ts +102 -0
- package/src/summarization/node.ts +982 -0
- package/src/tools/ToolNode.ts +25 -3
- package/src/types/graph.ts +62 -7
- package/src/types/index.ts +1 -0
- package/src/types/run.ts +32 -0
- package/src/types/stream.ts +45 -5
- package/src/types/summarize.ts +58 -0
- package/src/types/tools.ts +7 -0
- package/src/utils/errors.ts +117 -0
- package/src/utils/events.ts +31 -0
- package/src/utils/handlers.ts +18 -0
- package/src/utils/index.ts +2 -0
- package/src/utils/llm.ts +12 -0
- package/src/utils/tokens.ts +336 -18
- package/src/utils/truncation.ts +124 -0
- package/src/scripts/image.ts +0 -180
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { shouldTriggerSummarization } from '@/summarization';
|
|
2
|
+
|
|
3
|
+
describe('shouldTriggerSummarization', () => {
|
|
4
|
+
it('uses pre-prune pressure for token_ratio triggers when messages were pruned', () => {
|
|
5
|
+
const result = shouldTriggerSummarization({
|
|
6
|
+
trigger: { type: 'token_ratio', value: 0.8 },
|
|
7
|
+
maxContextTokens: 2500,
|
|
8
|
+
prePruneContextTokens: 3200,
|
|
9
|
+
remainingContextTokens: 1200,
|
|
10
|
+
messagesToRefineCount: 4,
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
expect(result).toBe(true);
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it('uses pre-prune remaining tokens for remaining_tokens triggers when available', () => {
|
|
17
|
+
const result = shouldTriggerSummarization({
|
|
18
|
+
trigger: { type: 'remaining_tokens', value: 500 },
|
|
19
|
+
maxContextTokens: 2500,
|
|
20
|
+
prePruneContextTokens: 2300,
|
|
21
|
+
remainingContextTokens: 1400,
|
|
22
|
+
messagesToRefineCount: 2,
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
expect(result).toBe(true);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('falls back to post-prune remaining tokens when pre-prune totals are unavailable', () => {
|
|
29
|
+
const result = shouldTriggerSummarization({
|
|
30
|
+
trigger: { type: 'token_ratio', value: 0.6 },
|
|
31
|
+
maxContextTokens: 2500,
|
|
32
|
+
remainingContextTokens: 1200,
|
|
33
|
+
messagesToRefineCount: 2,
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
expect(result).toBe(false);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('does not trigger when there is nothing to refine', () => {
|
|
40
|
+
const result = shouldTriggerSummarization({
|
|
41
|
+
trigger: { type: 'token_ratio', value: 0.1 },
|
|
42
|
+
maxContextTokens: 2500,
|
|
43
|
+
prePruneContextTokens: 2400,
|
|
44
|
+
remainingContextTokens: 100,
|
|
45
|
+
messagesToRefineCount: 0,
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
expect(result).toBe(false);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import type { SummarizationTrigger } from '@/types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Determines whether summarization should be triggered based on the configured trigger
|
|
5
|
+
* and current context state.
|
|
6
|
+
*
|
|
7
|
+
* Default behavior (no trigger configured): returns `true` whenever messages were pruned.
|
|
8
|
+
* This is intentional — when an admin enables summarization without specifying a trigger,
|
|
9
|
+
* summarization fires on any context overflow that causes pruning.
|
|
10
|
+
*
|
|
11
|
+
* When a trigger IS configured but required runtime data is missing (e.g., maxContextTokens
|
|
12
|
+
* unavailable for a token_ratio trigger), returns `false` — we cannot evaluate the condition,
|
|
13
|
+
* so we do not fire.
|
|
14
|
+
*/
|
|
15
|
+
export function shouldTriggerSummarization(params: {
|
|
16
|
+
trigger?: SummarizationTrigger;
|
|
17
|
+
maxContextTokens?: number;
|
|
18
|
+
prePruneContextTokens?: number;
|
|
19
|
+
remainingContextTokens?: number;
|
|
20
|
+
messagesToRefineCount: number;
|
|
21
|
+
}): boolean {
|
|
22
|
+
const {
|
|
23
|
+
trigger,
|
|
24
|
+
maxContextTokens,
|
|
25
|
+
prePruneContextTokens,
|
|
26
|
+
remainingContextTokens,
|
|
27
|
+
messagesToRefineCount,
|
|
28
|
+
} = params;
|
|
29
|
+
if (messagesToRefineCount <= 0) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// No trigger configured: default to always summarize when pruning occurs.
|
|
34
|
+
if (!trigger || typeof trigger.type !== 'string') {
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const triggerValue =
|
|
39
|
+
typeof trigger.value === 'number' && Number.isFinite(trigger.value)
|
|
40
|
+
? trigger.value
|
|
41
|
+
: undefined;
|
|
42
|
+
|
|
43
|
+
// Trigger configured but value is invalid: cannot evaluate, do not fire.
|
|
44
|
+
if (triggerValue == null) {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (trigger.type === 'token_ratio') {
|
|
49
|
+
const prePruneRemainingContextTokens =
|
|
50
|
+
maxContextTokens != null &&
|
|
51
|
+
Number.isFinite(maxContextTokens) &&
|
|
52
|
+
maxContextTokens > 0 &&
|
|
53
|
+
prePruneContextTokens != null &&
|
|
54
|
+
Number.isFinite(prePruneContextTokens)
|
|
55
|
+
? maxContextTokens - prePruneContextTokens
|
|
56
|
+
: undefined;
|
|
57
|
+
const effectiveRemainingContextTokens =
|
|
58
|
+
prePruneRemainingContextTokens ?? remainingContextTokens;
|
|
59
|
+
|
|
60
|
+
// Required runtime data missing: cannot evaluate token_ratio, do not fire.
|
|
61
|
+
if (
|
|
62
|
+
maxContextTokens == null ||
|
|
63
|
+
!Number.isFinite(maxContextTokens) ||
|
|
64
|
+
maxContextTokens <= 0 ||
|
|
65
|
+
effectiveRemainingContextTokens == null ||
|
|
66
|
+
!Number.isFinite(effectiveRemainingContextTokens)
|
|
67
|
+
) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
const usedRatio = 1 - effectiveRemainingContextTokens / maxContextTokens;
|
|
71
|
+
return usedRatio >= triggerValue;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (trigger.type === 'remaining_tokens') {
|
|
75
|
+
const prePruneRemainingContextTokens =
|
|
76
|
+
maxContextTokens != null &&
|
|
77
|
+
Number.isFinite(maxContextTokens) &&
|
|
78
|
+
maxContextTokens > 0 &&
|
|
79
|
+
prePruneContextTokens != null &&
|
|
80
|
+
Number.isFinite(prePruneContextTokens)
|
|
81
|
+
? maxContextTokens - prePruneContextTokens
|
|
82
|
+
: undefined;
|
|
83
|
+
const effectiveRemainingContextTokens =
|
|
84
|
+
prePruneRemainingContextTokens ?? remainingContextTokens;
|
|
85
|
+
|
|
86
|
+
// Required runtime data missing: cannot evaluate remaining_tokens, do not fire.
|
|
87
|
+
if (
|
|
88
|
+
effectiveRemainingContextTokens == null ||
|
|
89
|
+
!Number.isFinite(effectiveRemainingContextTokens)
|
|
90
|
+
) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
return effectiveRemainingContextTokens <= triggerValue;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (trigger.type === 'messages_to_refine') {
|
|
97
|
+
return messagesToRefineCount >= triggerValue;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Unrecognized trigger type: cannot evaluate, do not fire.
|
|
101
|
+
return false;
|
|
102
|
+
}
|