@librechat/agents 2.3.1 → 2.3.2
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/graphs/Graph.cjs +6 -6
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/llm.cjs +7 -7
- package/dist/cjs/llm/anthropic/llm.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +6 -6
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +24 -24
- package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -1
- package/dist/cjs/llm/fake.cjs.map +1 -1
- package/dist/cjs/llm/text.cjs.map +1 -1
- package/dist/cjs/main.cjs +3 -0
- package/dist/cjs/main.cjs.map +1 -1
- package/dist/cjs/messages/core.cjs +5 -5
- package/dist/cjs/messages/core.cjs.map +1 -1
- package/dist/cjs/messages/format.cjs +11 -9
- package/dist/cjs/messages/format.cjs.map +1 -1
- package/dist/cjs/messages/prune.cjs +155 -205
- package/dist/cjs/messages/prune.cjs.map +1 -1
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/stream.cjs +3 -4
- package/dist/cjs/stream.cjs.map +1 -1
- package/dist/cjs/tools/ToolNode.cjs +1 -1
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/utils/tokens.cjs +3 -3
- package/dist/cjs/utils/tokens.cjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +6 -6
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/llm/anthropic/llm.mjs +7 -7
- package/dist/esm/llm/anthropic/llm.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs +6 -6
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_outputs.mjs +24 -24
- package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -1
- package/dist/esm/llm/fake.mjs.map +1 -1
- package/dist/esm/llm/text.mjs.map +1 -1
- package/dist/esm/main.mjs +1 -1
- package/dist/esm/messages/core.mjs +5 -5
- package/dist/esm/messages/core.mjs.map +1 -1
- package/dist/esm/messages/format.mjs +11 -9
- package/dist/esm/messages/format.mjs.map +1 -1
- package/dist/esm/messages/prune.mjs +153 -206
- package/dist/esm/messages/prune.mjs.map +1 -1
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/stream.mjs +3 -4
- package/dist/esm/stream.mjs.map +1 -1
- package/dist/esm/tools/ToolNode.mjs +1 -1
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/utils/tokens.mjs +3 -3
- package/dist/esm/utils/tokens.mjs.map +1 -1
- package/dist/types/messages/format.d.ts +1 -2
- package/dist/types/messages/prune.d.ts +31 -2
- package/dist/types/types/stream.d.ts +2 -2
- package/dist/types/utils/tokens.d.ts +1 -1
- package/package.json +4 -3
- package/src/graphs/Graph.ts +8 -8
- package/src/llm/anthropic/llm.ts +7 -8
- package/src/llm/anthropic/types.ts +4 -4
- package/src/llm/anthropic/utils/message_inputs.ts +6 -6
- package/src/llm/anthropic/utils/message_outputs.ts +39 -39
- package/src/llm/fake.ts +2 -2
- package/src/llm/text.ts +1 -1
- package/src/messages/core.ts +6 -6
- package/src/messages/format.ts +43 -42
- package/src/messages/formatAgentMessages.test.ts +35 -35
- package/src/messages/formatAgentMessages.tools.test.ts +30 -30
- package/src/messages/prune.ts +182 -255
- package/src/messages/shiftIndexTokenCountMap.test.ts +18 -18
- package/src/mockStream.ts +1 -1
- package/src/run.ts +2 -2
- package/src/specs/prune.test.ts +89 -89
- package/src/specs/reasoning.test.ts +1 -1
- package/src/specs/thinking-prune.test.ts +265 -261
- package/src/specs/tool-error.test.ts +16 -17
- package/src/stream.ts +13 -14
- package/src/tools/ToolNode.ts +1 -1
- package/src/types/stream.ts +4 -3
- package/src/utils/tokens.ts +12 -12
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { HumanMessage, AIMessage,
|
|
1
|
+
import { HumanMessage, AIMessage, ToolMessage } from '@langchain/core/messages';
|
|
2
2
|
import type { TPayload } from '@/types';
|
|
3
3
|
import { formatAgentMessages } from './format';
|
|
4
4
|
import { ContentTypes } from '@/common';
|
|
@@ -27,9 +27,9 @@ describe('formatAgentMessages with tools parameter', () => {
|
|
|
27
27
|
],
|
|
28
28
|
},
|
|
29
29
|
];
|
|
30
|
-
|
|
30
|
+
|
|
31
31
|
const result = formatAgentMessages(payload);
|
|
32
|
-
|
|
32
|
+
|
|
33
33
|
expect(result.messages).toHaveLength(3);
|
|
34
34
|
expect(result.messages[0]).toBeInstanceOf(HumanMessage);
|
|
35
35
|
expect(result.messages[1]).toBeInstanceOf(AIMessage);
|
|
@@ -61,17 +61,17 @@ describe('formatAgentMessages with tools parameter', () => {
|
|
|
61
61
|
],
|
|
62
62
|
},
|
|
63
63
|
];
|
|
64
|
-
|
|
64
|
+
|
|
65
65
|
// Provide an empty set of allowed tools
|
|
66
66
|
const allowedTools = new Set<string>();
|
|
67
|
-
|
|
67
|
+
|
|
68
68
|
const result = formatAgentMessages(payload, undefined, allowedTools);
|
|
69
|
-
|
|
69
|
+
|
|
70
70
|
// Should convert to a single AIMessage with string content
|
|
71
71
|
expect(result.messages).toHaveLength(2);
|
|
72
72
|
expect(result.messages[0]).toBeInstanceOf(HumanMessage);
|
|
73
73
|
expect(result.messages[1]).toBeInstanceOf(AIMessage);
|
|
74
|
-
|
|
74
|
+
|
|
75
75
|
// The content should be a string representation of both messages
|
|
76
76
|
expect(typeof result.messages[1].content).toBe('string');
|
|
77
77
|
expect(result.messages[1].content).toEqual('AI: Let me check the weather for you.\nTool: check_weather, Sunny, 75°F');
|
|
@@ -100,17 +100,17 @@ describe('formatAgentMessages with tools parameter', () => {
|
|
|
100
100
|
],
|
|
101
101
|
},
|
|
102
102
|
];
|
|
103
|
-
|
|
103
|
+
|
|
104
104
|
// Provide a set of allowed tools that doesn't include 'check_weather'
|
|
105
105
|
const allowedTools = new Set(['search', 'calculator']);
|
|
106
|
-
|
|
106
|
+
|
|
107
107
|
const result = formatAgentMessages(payload, undefined, allowedTools);
|
|
108
|
-
|
|
108
|
+
|
|
109
109
|
// Should convert to a single AIMessage with string content
|
|
110
110
|
expect(result.messages).toHaveLength(2);
|
|
111
111
|
expect(result.messages[0]).toBeInstanceOf(HumanMessage);
|
|
112
112
|
expect(result.messages[1]).toBeInstanceOf(AIMessage);
|
|
113
|
-
|
|
113
|
+
|
|
114
114
|
// The content should be a string representation of both messages
|
|
115
115
|
expect(typeof result.messages[1].content).toBe('string');
|
|
116
116
|
expect(result.messages[1].content).toEqual('AI: Let me check the weather for you.\nTool: check_weather, Sunny, 75°F');
|
|
@@ -139,12 +139,12 @@ describe('formatAgentMessages with tools parameter', () => {
|
|
|
139
139
|
],
|
|
140
140
|
},
|
|
141
141
|
];
|
|
142
|
-
|
|
142
|
+
|
|
143
143
|
// Provide a set of allowed tools that includes 'check_weather'
|
|
144
144
|
const allowedTools = new Set(['check_weather', 'search']);
|
|
145
|
-
|
|
145
|
+
|
|
146
146
|
const result = formatAgentMessages(payload, undefined, allowedTools);
|
|
147
|
-
|
|
147
|
+
|
|
148
148
|
// Should keep the original structure
|
|
149
149
|
expect(result.messages).toHaveLength(3);
|
|
150
150
|
expect(result.messages[0]).toBeInstanceOf(HumanMessage);
|
|
@@ -189,17 +189,17 @@ describe('formatAgentMessages with tools parameter', () => {
|
|
|
189
189
|
],
|
|
190
190
|
},
|
|
191
191
|
];
|
|
192
|
-
|
|
192
|
+
|
|
193
193
|
// Allow calculator but not check_weather
|
|
194
194
|
const allowedTools = new Set(['calculator', 'search']);
|
|
195
|
-
|
|
195
|
+
|
|
196
196
|
const result = formatAgentMessages(payload, undefined, allowedTools);
|
|
197
|
-
|
|
197
|
+
|
|
198
198
|
// Should convert the entire sequence to a single AIMessage
|
|
199
199
|
expect(result.messages).toHaveLength(2);
|
|
200
200
|
expect(result.messages[0]).toBeInstanceOf(HumanMessage);
|
|
201
201
|
expect(result.messages[1]).toBeInstanceOf(AIMessage);
|
|
202
|
-
|
|
202
|
+
|
|
203
203
|
// The content should include all parts
|
|
204
204
|
expect(typeof result.messages[1].content).toBe('string');
|
|
205
205
|
expect(result.messages[1].content).toContain('Let me check the weather first.');
|
|
@@ -231,24 +231,24 @@ describe('formatAgentMessages with tools parameter', () => {
|
|
|
231
231
|
],
|
|
232
232
|
},
|
|
233
233
|
];
|
|
234
|
-
|
|
234
|
+
|
|
235
235
|
const indexTokenCountMap = {
|
|
236
236
|
0: 10, // 10 tokens for user message
|
|
237
237
|
1: 40, // 40 tokens for assistant message with tool call
|
|
238
238
|
};
|
|
239
|
-
|
|
239
|
+
|
|
240
240
|
// Provide a set of allowed tools that doesn't include 'check_weather'
|
|
241
241
|
const allowedTools = new Set(['search', 'calculator']);
|
|
242
|
-
|
|
242
|
+
|
|
243
243
|
const result = formatAgentMessages(payload, indexTokenCountMap, allowedTools);
|
|
244
|
-
|
|
244
|
+
|
|
245
245
|
// Should have 2 messages and 2 entries in the token count map
|
|
246
246
|
expect(result.messages).toHaveLength(2);
|
|
247
247
|
expect(Object.keys(result.indexTokenCountMap || {}).length).toBe(2);
|
|
248
|
-
|
|
248
|
+
|
|
249
249
|
// User message token count should be unchanged
|
|
250
250
|
expect(result.indexTokenCountMap?.[0]).toBe(10);
|
|
251
|
-
|
|
251
|
+
|
|
252
252
|
// All assistant message tokens should be assigned to the single AIMessage
|
|
253
253
|
expect(result.indexTokenCountMap?.[1]).toBe(40);
|
|
254
254
|
});
|
|
@@ -315,27 +315,27 @@ describe('formatAgentMessages with tools parameter', () => {
|
|
|
315
315
|
},
|
|
316
316
|
{ role: 'assistant', content: 'Here\'s your answer based on all that information.' },
|
|
317
317
|
];
|
|
318
|
-
|
|
318
|
+
|
|
319
319
|
// Allow search and calculator but not check_weather
|
|
320
320
|
const allowedTools = new Set(['search', 'calculator']);
|
|
321
|
-
|
|
321
|
+
|
|
322
322
|
const result = formatAgentMessages(payload, undefined, allowedTools);
|
|
323
|
-
|
|
323
|
+
|
|
324
324
|
// Should have the user message, search tool sequence (2 messages),
|
|
325
325
|
// a combined message for weather and calculator (since one has an invalid tool),
|
|
326
326
|
// and final message
|
|
327
327
|
expect(result.messages).toHaveLength(5);
|
|
328
|
-
|
|
328
|
+
|
|
329
329
|
// Check the types of messages
|
|
330
330
|
expect(result.messages[0]).toBeInstanceOf(HumanMessage);
|
|
331
331
|
expect(result.messages[1]).toBeInstanceOf(AIMessage); // Search message
|
|
332
332
|
expect(result.messages[2]).toBeInstanceOf(ToolMessage); // Search tool response
|
|
333
333
|
expect(result.messages[3]).toBeInstanceOf(AIMessage); // Converted weather+calculator message
|
|
334
334
|
expect(result.messages[4]).toBeInstanceOf(AIMessage); // Final message
|
|
335
|
-
|
|
335
|
+
|
|
336
336
|
// Check that the combined message was converted to a string
|
|
337
337
|
expect(typeof result.messages[3].content).toBe('string');
|
|
338
|
-
|
|
338
|
+
|
|
339
339
|
// The format might vary based on the getBufferString implementation
|
|
340
340
|
// but we should check that all the key information is present
|
|
341
341
|
const content = result.messages[3].content as string;
|