@librechat/agents 3.3.2 → 3.3.4
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 +2 -1
- package/dist/cjs/agents/AgentContext.cjs.map +1 -1
- package/dist/cjs/graphs/Graph.cjs +342 -109
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/graphs/MultiAgentGraph.cjs +3 -1
- package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
- package/dist/cjs/langfuse.cjs +6 -0
- package/dist/cjs/langfuse.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +79 -6
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/utils/message_inputs.cjs +37 -10
- package/dist/cjs/llm/bedrock/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/google/utils/common.cjs +19 -7
- package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
- package/dist/cjs/llm/invoke.cjs +64 -3
- package/dist/cjs/llm/invoke.cjs.map +1 -1
- package/dist/cjs/llm/openai/index.cjs +41 -5
- package/dist/cjs/llm/openai/index.cjs.map +1 -1
- package/dist/cjs/llm/openai/utils/index.cjs +25 -4
- package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
- package/dist/cjs/llm/openrouter/index.cjs +4 -1
- package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
- package/dist/cjs/main.cjs +19 -2
- package/dist/cjs/messages/cache.cjs +54 -33
- package/dist/cjs/messages/cache.cjs.map +1 -1
- package/dist/cjs/messages/contextPruning.cjs +17 -43
- package/dist/cjs/messages/contextPruning.cjs.map +1 -1
- package/dist/cjs/messages/core.cjs +315 -23
- package/dist/cjs/messages/core.cjs.map +1 -1
- package/dist/cjs/messages/format.cjs +218 -60
- package/dist/cjs/messages/format.cjs.map +1 -1
- package/dist/cjs/messages/index.cjs +1 -1
- package/dist/cjs/messages/prune.cjs +503 -127
- package/dist/cjs/messages/prune.cjs.map +1 -1
- package/dist/cjs/stream.cjs +7 -3
- package/dist/cjs/stream.cjs.map +1 -1
- package/dist/cjs/summarization/node.cjs +28 -14
- package/dist/cjs/summarization/node.cjs.map +1 -1
- package/dist/cjs/tools/ToolNode.cjs +54 -41
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/toolOutputReferences.cjs +6 -0
- package/dist/cjs/tools/toolOutputReferences.cjs.map +1 -1
- package/dist/cjs/utils/index.cjs +1 -1
- package/dist/cjs/utils/llm.cjs +1 -1
- package/dist/cjs/utils/llm.cjs.map +1 -1
- package/dist/cjs/utils/tokens.cjs +307 -20
- package/dist/cjs/utils/tokens.cjs.map +1 -1
- package/dist/cjs/utils/toolContent.cjs +1514 -0
- package/dist/cjs/utils/toolContent.cjs.map +1 -0
- package/dist/esm/agents/AgentContext.mjs +2 -1
- package/dist/esm/agents/AgentContext.mjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +349 -116
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/graphs/MultiAgentGraph.mjs +3 -1
- package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
- package/dist/esm/langfuse.mjs +6 -0
- package/dist/esm/langfuse.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs +79 -6
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/bedrock/utils/message_inputs.mjs +37 -10
- package/dist/esm/llm/bedrock/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/google/utils/common.mjs +19 -7
- package/dist/esm/llm/google/utils/common.mjs.map +1 -1
- package/dist/esm/llm/invoke.mjs +65 -5
- package/dist/esm/llm/invoke.mjs.map +1 -1
- package/dist/esm/llm/openai/index.mjs +41 -5
- package/dist/esm/llm/openai/index.mjs.map +1 -1
- package/dist/esm/llm/openai/utils/index.mjs +25 -4
- package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
- package/dist/esm/llm/openrouter/index.mjs +4 -1
- package/dist/esm/llm/openrouter/index.mjs.map +1 -1
- package/dist/esm/main.mjs +7 -7
- package/dist/esm/messages/cache.mjs +55 -34
- package/dist/esm/messages/cache.mjs.map +1 -1
- package/dist/esm/messages/contextPruning.mjs +17 -43
- package/dist/esm/messages/contextPruning.mjs.map +1 -1
- package/dist/esm/messages/core.mjs +305 -24
- package/dist/esm/messages/core.mjs.map +1 -1
- package/dist/esm/messages/format.mjs +218 -61
- package/dist/esm/messages/format.mjs.map +1 -1
- package/dist/esm/messages/index.mjs +1 -1
- package/dist/esm/messages/prune.mjs +500 -128
- package/dist/esm/messages/prune.mjs.map +1 -1
- package/dist/esm/stream.mjs +7 -3
- package/dist/esm/stream.mjs.map +1 -1
- package/dist/esm/summarization/node.mjs +28 -14
- package/dist/esm/summarization/node.mjs.map +1 -1
- package/dist/esm/tools/ToolNode.mjs +54 -41
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/toolOutputReferences.mjs +6 -0
- package/dist/esm/tools/toolOutputReferences.mjs.map +1 -1
- package/dist/esm/utils/index.mjs +1 -1
- package/dist/esm/utils/llm.mjs +1 -1
- package/dist/esm/utils/llm.mjs.map +1 -1
- package/dist/esm/utils/tokens.mjs +307 -21
- package/dist/esm/utils/tokens.mjs.map +1 -1
- package/dist/esm/utils/toolContent.mjs +1503 -0
- package/dist/esm/utils/toolContent.mjs.map +1 -0
- package/dist/types/graphs/Graph.d.ts +1 -1
- package/dist/types/llm/invoke.d.ts +27 -1
- package/dist/types/llm/openai/index.d.ts +4 -0
- package/dist/types/llm/openai/utils/index.d.ts +2 -0
- package/dist/types/llm/openrouter/index.d.ts +5 -0
- package/dist/types/messages/contextPruning.d.ts +2 -1
- package/dist/types/messages/core.d.ts +36 -0
- package/dist/types/messages/format.d.ts +6 -0
- package/dist/types/messages/prune.d.ts +16 -12
- package/dist/types/types/stream.d.ts +1 -1
- package/dist/types/utils/tokens.d.ts +7 -0
- package/dist/types/utils/toolContent.d.ts +107 -0
- package/package.json +13 -9
- package/src/__tests__/stream.eagerEventExecution.test.ts +74 -0
- package/src/agents/AgentContext.ts +1 -0
- package/src/graphs/Graph.ts +698 -200
- package/src/graphs/MultiAgentGraph.ts +6 -1
- package/src/graphs/__tests__/Graph.contextOverflow.test.ts +1128 -4
- package/src/langfuse.ts +15 -0
- package/src/llm/anthropic/utils/message_inputs.ts +158 -12
- package/src/llm/anthropic/utils/tool-id-normalization.test.ts +109 -0
- package/src/llm/bedrock/utils/message_inputs.test.ts +49 -1
- package/src/llm/bedrock/utils/message_inputs.ts +86 -13
- package/src/llm/google/utils/common.test.ts +75 -9
- package/src/llm/google/utils/common.ts +34 -3
- package/src/llm/invoke.test.ts +488 -0
- package/src/llm/invoke.ts +196 -2
- package/src/llm/openai/index.ts +106 -6
- package/src/llm/openai/utils/index.ts +109 -53
- package/src/llm/openai/utils/messages.test.ts +330 -1
- package/src/llm/openrouter/index.ts +12 -2
- package/src/llm/openrouter/reasoning.test.ts +314 -0
- package/src/messages/__tests__/observationMasking.test.ts +93 -2
- package/src/messages/cache.tail.test.ts +193 -0
- package/src/messages/cache.test.ts +113 -0
- package/src/messages/cache.ts +92 -60
- package/src/messages/contextPruning.test.ts +184 -0
- package/src/messages/contextPruning.ts +49 -42
- package/src/messages/core.ts +653 -40
- package/src/messages/ensureThinkingBlock.test.ts +49 -1
- package/src/messages/foldToollessToolBlocks.test.ts +163 -5
- package/src/messages/format.ts +363 -91
- package/src/messages/formatAgentMessages.test.ts +604 -14
- package/src/messages/formatAgentMessages.tools.test.ts +103 -0
- package/src/messages/prune.ts +996 -183
- package/src/specs/langfuse-callbacks.test.ts +203 -1
- package/src/specs/prune.test.ts +1083 -6
- package/src/specs/summarization-unit.test.ts +105 -0
- package/src/specs/tokens.test.ts +609 -32
- package/src/stream.ts +23 -15
- package/src/summarization/__tests__/node.test.ts +77 -0
- package/src/summarization/node.ts +46 -18
- package/src/tools/ToolNode.ts +147 -68
- package/src/tools/__tests__/ToolNode.onResultCompletion.test.ts +148 -1
- package/src/tools/__tests__/ToolNode.outputReferences.test.ts +112 -3
- package/src/tools/__tests__/annotateMessagesForLLM.test.ts +32 -0
- package/src/tools/__tests__/directToolHooks.test.ts +255 -7
- package/src/tools/toolOutputReferences.ts +6 -0
- package/src/types/stream.ts +1 -1
- package/src/utils/llm.test.ts +18 -0
- package/src/utils/llm.ts +4 -1
- package/src/utils/tokens.ts +586 -31
- package/src/utils/toolContent.test.ts +1432 -0
- package/src/utils/toolContent.ts +2707 -0
|
@@ -188,6 +188,111 @@ describe('preFlightTruncateToolResults', () => {
|
|
|
188
188
|
expect(indexTokenCountMap[2]).toBeLessThan(originalTokenCount);
|
|
189
189
|
});
|
|
190
190
|
|
|
191
|
+
it('truncates structured tool results and preserves message metadata', () => {
|
|
192
|
+
const toolMsg = new ToolMessage({
|
|
193
|
+
content: [
|
|
194
|
+
{
|
|
195
|
+
type: 'json',
|
|
196
|
+
rows: Array.from({ length: 20 }, (_, index) => ({
|
|
197
|
+
id: index,
|
|
198
|
+
value: `${'x'.repeat(100)}-${index}`,
|
|
199
|
+
})),
|
|
200
|
+
},
|
|
201
|
+
],
|
|
202
|
+
tool_call_id: 'tc-structured',
|
|
203
|
+
name: 'run_select_query',
|
|
204
|
+
status: 'success',
|
|
205
|
+
artifact: { source: 'clickhouse' },
|
|
206
|
+
metadata: { requestId: 'request-1' },
|
|
207
|
+
additional_kwargs: { traceId: 'trace-1' },
|
|
208
|
+
});
|
|
209
|
+
const messages: BaseMessage[] = [toolMsg];
|
|
210
|
+
const indexTokenCountMap: Record<string, number | undefined> = { 0: 0 };
|
|
211
|
+
|
|
212
|
+
const count = preFlightTruncateToolResults({
|
|
213
|
+
messages,
|
|
214
|
+
maxContextTokens: 200,
|
|
215
|
+
indexTokenCountMap,
|
|
216
|
+
tokenCounter,
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
expect(count).toBe(1);
|
|
220
|
+
expect(typeof messages[0].content).toBe('string');
|
|
221
|
+
expect(messages[0].content).toContain('truncated');
|
|
222
|
+
expect(messages[0].content).toContain('"id":0');
|
|
223
|
+
const truncated = messages[0] as ToolMessage;
|
|
224
|
+
expect(truncated.tool_call_id).toBe('tc-structured');
|
|
225
|
+
expect(truncated.name).toBe('run_select_query');
|
|
226
|
+
expect(truncated.status).toBe('success');
|
|
227
|
+
expect(truncated.artifact).toEqual({ source: 'clickhouse' });
|
|
228
|
+
expect(truncated.metadata).toEqual({ requestId: 'request-1' });
|
|
229
|
+
expect(truncated.additional_kwargs).toEqual({ traceId: 'trace-1' });
|
|
230
|
+
expect(indexTokenCountMap[0]).toBe(tokenCounter(truncated));
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
it('does not truncate indivisible native computer screenshots', () => {
|
|
234
|
+
const screenshot = `data:image/png;base64,${'A'.repeat(2_000)}`;
|
|
235
|
+
const stringOutput = new ToolMessage({
|
|
236
|
+
content: screenshot,
|
|
237
|
+
tool_call_id: 'computer-string',
|
|
238
|
+
additional_kwargs: { type: 'computer_call_output' },
|
|
239
|
+
});
|
|
240
|
+
const structuredOutput = new ToolMessage({
|
|
241
|
+
content: [{ type: 'computer_screenshot', image_url: screenshot }],
|
|
242
|
+
tool_call_id: 'computer-structured',
|
|
243
|
+
additional_kwargs: { type: 'computer_call_output' },
|
|
244
|
+
});
|
|
245
|
+
const messages: BaseMessage[] = [stringOutput, structuredOutput];
|
|
246
|
+
const indexTokenCountMap: Record<string, number | undefined> = {
|
|
247
|
+
0: tokenCounter(stringOutput),
|
|
248
|
+
1: tokenCounter(structuredOutput),
|
|
249
|
+
};
|
|
250
|
+
|
|
251
|
+
const count = preFlightTruncateToolResults({
|
|
252
|
+
messages,
|
|
253
|
+
maxContextTokens: 50,
|
|
254
|
+
indexTokenCountMap,
|
|
255
|
+
tokenCounter,
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
expect(count).toBe(0);
|
|
259
|
+
expect(messages[0]).toBe(stringOutput);
|
|
260
|
+
expect(messages[0].content).toBe(screenshot);
|
|
261
|
+
expect(messages[1]).toBe(structuredOutput);
|
|
262
|
+
expect(messages[1].content).toBe(structuredOutput.content);
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
it('compacts text in multipart results without slicing media blocks', () => {
|
|
266
|
+
const imageBlock = {
|
|
267
|
+
type: 'image_url',
|
|
268
|
+
image_url: { url: 'data:image/png;base64,AAAA' },
|
|
269
|
+
};
|
|
270
|
+
const toolMsg = new ToolMessage({
|
|
271
|
+
content: [{ type: 'text', text: 'x'.repeat(1_000) }, imageBlock],
|
|
272
|
+
tool_call_id: 'tc-multipart',
|
|
273
|
+
name: 'screenshot',
|
|
274
|
+
});
|
|
275
|
+
const messages: BaseMessage[] = [toolMsg];
|
|
276
|
+
const indexTokenCountMap: Record<string, number | undefined> = {
|
|
277
|
+
0: tokenCounter(toolMsg),
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
const count = preFlightTruncateToolResults({
|
|
281
|
+
messages,
|
|
282
|
+
maxContextTokens: 200,
|
|
283
|
+
indexTokenCountMap,
|
|
284
|
+
tokenCounter,
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
expect(count).toBe(1);
|
|
288
|
+
expect(Array.isArray(messages[0].content)).toBe(true);
|
|
289
|
+
const content = messages[0].content as Array<Record<string, unknown>>;
|
|
290
|
+
expect(content).toHaveLength(2);
|
|
291
|
+
expect(content[0].type).toBe('text');
|
|
292
|
+
expect(content[0].text).toContain('truncated');
|
|
293
|
+
expect(content[1]).toBe(imageBlock);
|
|
294
|
+
});
|
|
295
|
+
|
|
191
296
|
it('does not truncate results that fit within budget', () => {
|
|
192
297
|
const toolMsg = new ToolMessage({
|
|
193
298
|
content: 'OK',
|