@librechat/agents 3.1.67-dev.4 → 3.1.68

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 (162) hide show
  1. package/dist/cjs/agents/AgentContext.cjs +3 -23
  2. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  3. package/dist/cjs/common/enum.cjs +0 -16
  4. package/dist/cjs/common/enum.cjs.map +1 -1
  5. package/dist/cjs/graphs/Graph.cjs +0 -91
  6. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  7. package/dist/cjs/graphs/MultiAgentGraph.cjs +36 -0
  8. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
  9. package/dist/cjs/main.cjs +1 -53
  10. package/dist/cjs/main.cjs.map +1 -1
  11. package/dist/cjs/messages/format.cjs +12 -74
  12. package/dist/cjs/messages/format.cjs.map +1 -1
  13. package/dist/cjs/run.cjs +0 -111
  14. package/dist/cjs/run.cjs.map +1 -1
  15. package/dist/cjs/summarization/index.cjs +41 -0
  16. package/dist/cjs/summarization/index.cjs.map +1 -1
  17. package/dist/cjs/summarization/node.cjs +121 -63
  18. package/dist/cjs/summarization/node.cjs.map +1 -1
  19. package/dist/cjs/tools/ToolNode.cjs +140 -304
  20. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  21. package/dist/esm/agents/AgentContext.mjs +3 -23
  22. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  23. package/dist/esm/common/enum.mjs +1 -15
  24. package/dist/esm/common/enum.mjs.map +1 -1
  25. package/dist/esm/graphs/Graph.mjs +0 -91
  26. package/dist/esm/graphs/Graph.mjs.map +1 -1
  27. package/dist/esm/graphs/MultiAgentGraph.mjs +36 -0
  28. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  29. package/dist/esm/main.mjs +2 -13
  30. package/dist/esm/main.mjs.map +1 -1
  31. package/dist/esm/messages/format.mjs +4 -66
  32. package/dist/esm/messages/format.mjs.map +1 -1
  33. package/dist/esm/run.mjs +0 -111
  34. package/dist/esm/run.mjs.map +1 -1
  35. package/dist/esm/summarization/index.mjs +41 -1
  36. package/dist/esm/summarization/index.mjs.map +1 -1
  37. package/dist/esm/summarization/node.mjs +121 -63
  38. package/dist/esm/summarization/node.mjs.map +1 -1
  39. package/dist/esm/tools/ToolNode.mjs +142 -306
  40. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  41. package/dist/types/agents/AgentContext.d.ts +0 -6
  42. package/dist/types/common/enum.d.ts +1 -10
  43. package/dist/types/graphs/Graph.d.ts +0 -2
  44. package/dist/types/graphs/MultiAgentGraph.d.ts +12 -0
  45. package/dist/types/index.d.ts +0 -8
  46. package/dist/types/messages/format.d.ts +1 -2
  47. package/dist/types/run.d.ts +0 -1
  48. package/dist/types/summarization/index.d.ts +2 -0
  49. package/dist/types/summarization/node.d.ts +0 -2
  50. package/dist/types/tools/ToolNode.d.ts +2 -24
  51. package/dist/types/types/graph.d.ts +2 -61
  52. package/dist/types/types/index.d.ts +0 -1
  53. package/dist/types/types/run.d.ts +0 -20
  54. package/dist/types/types/tools.d.ts +1 -38
  55. package/package.json +1 -5
  56. package/src/agents/AgentContext.ts +2 -26
  57. package/src/common/enum.ts +0 -15
  58. package/src/graphs/Graph.ts +0 -113
  59. package/src/graphs/MultiAgentGraph.ts +39 -0
  60. package/src/graphs/__tests__/MultiAgentGraph.test.ts +91 -0
  61. package/src/index.ts +0 -10
  62. package/src/messages/format.ts +4 -74
  63. package/src/run.ts +0 -126
  64. package/src/summarization/__tests__/node.test.ts +42 -0
  65. package/src/summarization/__tests__/trigger.test.ts +100 -1
  66. package/src/summarization/index.ts +47 -0
  67. package/src/summarization/node.ts +149 -77
  68. package/src/tools/ToolNode.ts +169 -391
  69. package/src/tools/__tests__/ToolNode.session.test.ts +12 -12
  70. package/src/types/graph.ts +1 -80
  71. package/src/types/index.ts +0 -1
  72. package/src/types/run.ts +0 -20
  73. package/src/types/tools.ts +1 -41
  74. package/dist/cjs/hooks/HookRegistry.cjs +0 -162
  75. package/dist/cjs/hooks/HookRegistry.cjs.map +0 -1
  76. package/dist/cjs/hooks/executeHooks.cjs +0 -276
  77. package/dist/cjs/hooks/executeHooks.cjs.map +0 -1
  78. package/dist/cjs/hooks/matchers.cjs +0 -256
  79. package/dist/cjs/hooks/matchers.cjs.map +0 -1
  80. package/dist/cjs/hooks/types.cjs +0 -27
  81. package/dist/cjs/hooks/types.cjs.map +0 -1
  82. package/dist/cjs/tools/BashExecutor.cjs +0 -175
  83. package/dist/cjs/tools/BashExecutor.cjs.map +0 -1
  84. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs +0 -296
  85. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs.map +0 -1
  86. package/dist/cjs/tools/ReadFile.cjs +0 -43
  87. package/dist/cjs/tools/ReadFile.cjs.map +0 -1
  88. package/dist/cjs/tools/SkillTool.cjs +0 -50
  89. package/dist/cjs/tools/SkillTool.cjs.map +0 -1
  90. package/dist/cjs/tools/SubagentTool.cjs +0 -92
  91. package/dist/cjs/tools/SubagentTool.cjs.map +0 -1
  92. package/dist/cjs/tools/skillCatalog.cjs +0 -84
  93. package/dist/cjs/tools/skillCatalog.cjs.map +0 -1
  94. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +0 -511
  95. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +0 -1
  96. package/dist/esm/hooks/HookRegistry.mjs +0 -160
  97. package/dist/esm/hooks/HookRegistry.mjs.map +0 -1
  98. package/dist/esm/hooks/executeHooks.mjs +0 -273
  99. package/dist/esm/hooks/executeHooks.mjs.map +0 -1
  100. package/dist/esm/hooks/matchers.mjs +0 -251
  101. package/dist/esm/hooks/matchers.mjs.map +0 -1
  102. package/dist/esm/hooks/types.mjs +0 -25
  103. package/dist/esm/hooks/types.mjs.map +0 -1
  104. package/dist/esm/tools/BashExecutor.mjs +0 -169
  105. package/dist/esm/tools/BashExecutor.mjs.map +0 -1
  106. package/dist/esm/tools/BashProgrammaticToolCalling.mjs +0 -287
  107. package/dist/esm/tools/BashProgrammaticToolCalling.mjs.map +0 -1
  108. package/dist/esm/tools/ReadFile.mjs +0 -38
  109. package/dist/esm/tools/ReadFile.mjs.map +0 -1
  110. package/dist/esm/tools/SkillTool.mjs +0 -45
  111. package/dist/esm/tools/SkillTool.mjs.map +0 -1
  112. package/dist/esm/tools/SubagentTool.mjs +0 -85
  113. package/dist/esm/tools/SubagentTool.mjs.map +0 -1
  114. package/dist/esm/tools/skillCatalog.mjs +0 -82
  115. package/dist/esm/tools/skillCatalog.mjs.map +0 -1
  116. package/dist/esm/tools/subagent/SubagentExecutor.mjs +0 -505
  117. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +0 -1
  118. package/dist/types/hooks/HookRegistry.d.ts +0 -56
  119. package/dist/types/hooks/executeHooks.d.ts +0 -79
  120. package/dist/types/hooks/index.d.ts +0 -6
  121. package/dist/types/hooks/matchers.d.ts +0 -95
  122. package/dist/types/hooks/types.d.ts +0 -320
  123. package/dist/types/tools/BashExecutor.d.ts +0 -45
  124. package/dist/types/tools/BashProgrammaticToolCalling.d.ts +0 -72
  125. package/dist/types/tools/ReadFile.d.ts +0 -28
  126. package/dist/types/tools/SkillTool.d.ts +0 -40
  127. package/dist/types/tools/SubagentTool.d.ts +0 -36
  128. package/dist/types/tools/skillCatalog.d.ts +0 -19
  129. package/dist/types/tools/subagent/SubagentExecutor.d.ts +0 -137
  130. package/dist/types/tools/subagent/index.d.ts +0 -2
  131. package/dist/types/types/skill.d.ts +0 -9
  132. package/src/hooks/HookRegistry.ts +0 -208
  133. package/src/hooks/__tests__/HookRegistry.test.ts +0 -190
  134. package/src/hooks/__tests__/compactHooks.test.ts +0 -214
  135. package/src/hooks/__tests__/executeHooks.test.ts +0 -1013
  136. package/src/hooks/__tests__/integration.test.ts +0 -337
  137. package/src/hooks/__tests__/matchers.test.ts +0 -238
  138. package/src/hooks/__tests__/toolHooks.test.ts +0 -669
  139. package/src/hooks/executeHooks.ts +0 -375
  140. package/src/hooks/index.ts +0 -57
  141. package/src/hooks/matchers.ts +0 -280
  142. package/src/hooks/types.ts +0 -404
  143. package/src/messages/formatAgentMessages.skills.test.ts +0 -334
  144. package/src/scripts/multi-agent-subagent.ts +0 -246
  145. package/src/scripts/subagent-event-driven-debug.ts +0 -190
  146. package/src/scripts/subagent-tools-debug.ts +0 -160
  147. package/src/specs/subagent.test.ts +0 -305
  148. package/src/tools/BashExecutor.ts +0 -205
  149. package/src/tools/BashProgrammaticToolCalling.ts +0 -397
  150. package/src/tools/ReadFile.ts +0 -39
  151. package/src/tools/SkillTool.ts +0 -46
  152. package/src/tools/SubagentTool.ts +0 -100
  153. package/src/tools/__tests__/ReadFile.test.ts +0 -44
  154. package/src/tools/__tests__/SkillTool.test.ts +0 -442
  155. package/src/tools/__tests__/SubagentExecutor.test.ts +0 -1148
  156. package/src/tools/__tests__/SubagentTool.test.ts +0 -149
  157. package/src/tools/__tests__/skillCatalog.test.ts +0 -161
  158. package/src/tools/__tests__/subagentHooks.test.ts +0 -215
  159. package/src/tools/skillCatalog.ts +0 -126
  160. package/src/tools/subagent/SubagentExecutor.ts +0 -676
  161. package/src/tools/subagent/index.ts +0 -13
  162. package/src/types/skill.ts +0 -11
@@ -1,214 +0,0 @@
1
- // src/hooks/__tests__/compactHooks.test.ts
2
- import { HumanMessage, AIMessage } from '@langchain/core/messages';
3
- import { FakeListChatModel } from '@langchain/core/utils/testing';
4
- import { HookRegistry } from '../HookRegistry';
5
- import { Run } from '@/run';
6
- import * as providers from '@/llm/providers';
7
- import { ToolEndHandler, ModelEndHandler } from '@/events';
8
- import { createTokenCounter } from '@/utils/tokens';
9
- import { Providers, GraphEvents } from '@/common';
10
- import type * as t from '@/types';
11
- import type {
12
- HookCallback,
13
- PreCompactHookInput,
14
- PreCompactHookOutput,
15
- PostCompactHookInput,
16
- PostCompactHookOutput,
17
- } from '../types';
18
-
19
- const SUMMARY_RESPONSE = '## Summary\nUser asked a question and got an answer.';
20
-
21
- const callerConfig = {
22
- configurable: { thread_id: 'compact-test' },
23
- streamMode: 'values' as const,
24
- version: 'v2' as const,
25
- };
26
-
27
- let getChatModelClassSpy: jest.SpyInstance;
28
- const originalGetChatModelClass = providers.getChatModelClass;
29
-
30
- function mockSummarizationModel(): void {
31
- getChatModelClassSpy = jest
32
- .spyOn(providers, 'getChatModelClass')
33
- .mockImplementation(((provider: Providers) => {
34
- if (provider === Providers.OPENAI) {
35
- return class extends FakeListChatModel {
36
- constructor(
37
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
38
- _options: any
39
- ) {
40
- super({ responses: [SUMMARY_RESPONSE] });
41
- }
42
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
43
- } as any;
44
- }
45
- return originalGetChatModelClass(provider);
46
- }) as typeof providers.getChatModelClass);
47
- }
48
-
49
- function buildConversation(): t.IState {
50
- const messages: import('@langchain/core/messages').BaseMessage[] = [];
51
- for (let i = 0; i < 20; i++) {
52
- messages.push(new HumanMessage(`Question ${i}: ` + 'padding '.repeat(50)));
53
- messages.push(new AIMessage(`Answer ${i}: ` + 'response '.repeat(50)));
54
- }
55
- return { messages };
56
- }
57
-
58
- async function createCompactingRun(
59
- tokenCounter: t.TokenCounter,
60
- hooks?: HookRegistry,
61
- runId = 'compact-run'
62
- ): Promise<Run<t.IState>> {
63
- const conversation = buildConversation();
64
- const indexTokenCountMap: Record<string, number> = {};
65
- for (let i = 0; i < conversation.messages.length; i++) {
66
- indexTokenCountMap[String(i)] = tokenCounter(conversation.messages[i]);
67
- }
68
- return Run.create<t.IState>({
69
- runId,
70
- graphConfig: {
71
- type: 'standard',
72
- llmConfig: {
73
- provider: Providers.OPENAI,
74
- streaming: true,
75
- streamUsage: false,
76
- },
77
- instructions: 'Be concise.',
78
- maxContextTokens: 200,
79
- summarizationEnabled: true,
80
- summarizationConfig: {
81
- provider: Providers.OPENAI,
82
- },
83
- },
84
- returnContent: true,
85
- skipCleanup: true,
86
- customHandlers: {
87
- [GraphEvents.TOOL_END]: new ToolEndHandler(),
88
- [GraphEvents.CHAT_MODEL_END]: new ModelEndHandler(),
89
- },
90
- hooks,
91
- tokenCounter,
92
- indexTokenCountMap,
93
- });
94
- }
95
-
96
- describe('Compaction hook integration', () => {
97
- jest.setTimeout(30_000);
98
-
99
- let tokenCounter: t.TokenCounter;
100
-
101
- beforeAll(async () => {
102
- tokenCounter = await createTokenCounter();
103
- });
104
-
105
- beforeEach(() => {
106
- mockSummarizationModel();
107
- });
108
-
109
- afterEach(() => {
110
- getChatModelClassSpy.mockRestore();
111
- });
112
-
113
- describe('PreCompact', () => {
114
- it('fires with messagesBeforeCount and trigger', async () => {
115
- const registry = new HookRegistry();
116
- let captured: PreCompactHookInput | undefined;
117
- const hook: HookCallback<'PreCompact'> = async (
118
- input
119
- ): Promise<PreCompactHookOutput> => {
120
- captured = input;
121
- return {};
122
- };
123
- registry.register('PreCompact', { hooks: [hook] });
124
-
125
- const run = await createCompactingRun(tokenCounter, registry);
126
- run.Graph!.overrideTestModel(['Final answer after compaction.']);
127
- const inputs = buildConversation();
128
- await run.processStream(inputs, callerConfig);
129
-
130
- expect(captured).toBeDefined();
131
- expect(captured!.hook_event_name).toBe('PreCompact');
132
- expect(captured!.messagesBeforeCount).toBeGreaterThan(0);
133
- expect(captured!.runId).toBe('compact-run');
134
- expect(captured!.threadId).toBe('compact-test');
135
- expect(captured!.trigger).toBe('default');
136
- expect(captured!.agentId).toBeDefined();
137
- });
138
- });
139
-
140
- describe('PostCompact', () => {
141
- it('fires with summary text after compaction', async () => {
142
- const registry = new HookRegistry();
143
- let captured: PostCompactHookInput | undefined;
144
- const hook: HookCallback<'PostCompact'> = async (
145
- input
146
- ): Promise<PostCompactHookOutput> => {
147
- captured = input;
148
- return {};
149
- };
150
- registry.register('PostCompact', { hooks: [hook] });
151
-
152
- const run = await createCompactingRun(tokenCounter, registry);
153
- run.Graph!.overrideTestModel(['Final answer after compaction.']);
154
- const inputs = buildConversation();
155
- await run.processStream(inputs, callerConfig);
156
-
157
- expect(captured).toBeDefined();
158
- expect(captured!.hook_event_name).toBe('PostCompact');
159
- expect(captured!.threadId).toBe('compact-test');
160
- expect(captured!.summary).toBe(SUMMARY_RESPONSE);
161
- expect(captured!.messagesAfterCount).toBe(0);
162
- expect(captured!.agentId).toBeDefined();
163
- });
164
- });
165
-
166
- describe('error resilience', () => {
167
- it('throwing PreCompact hook does not crash compaction', async () => {
168
- const registry = new HookRegistry();
169
- const throwingHook: HookCallback<
170
- 'PreCompact'
171
- > = async (): Promise<PreCompactHookOutput> => {
172
- throw new Error('pre hook crash');
173
- };
174
- registry.register('PreCompact', { hooks: [throwingHook] });
175
-
176
- const run = await createCompactingRun(tokenCounter, registry);
177
- run.Graph!.overrideTestModel(['Answer after compaction.']);
178
- const inputs = buildConversation();
179
-
180
- await expect(
181
- run.processStream(inputs, callerConfig)
182
- ).resolves.not.toThrow();
183
- });
184
-
185
- it('throwing PostCompact hook does not crash compaction', async () => {
186
- const registry = new HookRegistry();
187
- const throwingHook: HookCallback<
188
- 'PostCompact'
189
- > = async (): Promise<PostCompactHookOutput> => {
190
- throw new Error('post hook crash');
191
- };
192
- registry.register('PostCompact', { hooks: [throwingHook] });
193
-
194
- const run = await createCompactingRun(tokenCounter, registry);
195
- run.Graph!.overrideTestModel(['Answer after compaction.']);
196
- const inputs = buildConversation();
197
-
198
- await expect(
199
- run.processStream(inputs, callerConfig)
200
- ).resolves.not.toThrow();
201
- });
202
- });
203
-
204
- describe('no-hooks baseline', () => {
205
- it('summarization works identically without hooks', async () => {
206
- const run = await createCompactingRun(tokenCounter);
207
- run.Graph!.overrideTestModel(['Answer.']);
208
- const inputs = buildConversation();
209
- const result = await run.processStream(inputs, callerConfig);
210
-
211
- expect(result).toBeDefined();
212
- });
213
- });
214
- });