@librechat/agents 3.1.75 → 3.1.77-dev.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.
- package/dist/cjs/graphs/Graph.cjs +22 -3
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/hitl/askUserQuestion.cjs +67 -0
- package/dist/cjs/hitl/askUserQuestion.cjs.map +1 -0
- package/dist/cjs/hooks/HookRegistry.cjs +54 -0
- package/dist/cjs/hooks/HookRegistry.cjs.map +1 -1
- package/dist/cjs/hooks/createToolPolicyHook.cjs +115 -0
- package/dist/cjs/hooks/createToolPolicyHook.cjs.map +1 -0
- package/dist/cjs/hooks/executeHooks.cjs +40 -1
- package/dist/cjs/hooks/executeHooks.cjs.map +1 -1
- package/dist/cjs/hooks/types.cjs +1 -0
- package/dist/cjs/hooks/types.cjs.map +1 -1
- package/dist/cjs/langchain/google-common.cjs +3 -0
- package/dist/cjs/langchain/google-common.cjs.map +1 -0
- package/dist/cjs/langchain/index.cjs +86 -0
- package/dist/cjs/langchain/index.cjs.map +1 -0
- package/dist/cjs/langchain/language_models/chat_models.cjs +3 -0
- package/dist/cjs/langchain/language_models/chat_models.cjs.map +1 -0
- package/dist/cjs/langchain/messages/tool.cjs +3 -0
- package/dist/cjs/langchain/messages/tool.cjs.map +1 -0
- package/dist/cjs/langchain/messages.cjs +51 -0
- package/dist/cjs/langchain/messages.cjs.map +1 -0
- package/dist/cjs/langchain/openai.cjs +3 -0
- package/dist/cjs/langchain/openai.cjs.map +1 -0
- package/dist/cjs/langchain/prompts.cjs +11 -0
- package/dist/cjs/langchain/prompts.cjs.map +1 -0
- package/dist/cjs/langchain/runnables.cjs +19 -0
- package/dist/cjs/langchain/runnables.cjs.map +1 -0
- package/dist/cjs/langchain/tools.cjs +23 -0
- package/dist/cjs/langchain/tools.cjs.map +1 -0
- package/dist/cjs/langchain/utils/env.cjs +11 -0
- package/dist/cjs/langchain/utils/env.cjs.map +1 -0
- package/dist/cjs/llm/anthropic/index.cjs +145 -52
- package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/types.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +21 -14
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +84 -70
- package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/index.cjs +1 -1
- package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/utils/message_inputs.cjs +213 -3
- package/dist/cjs/llm/bedrock/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/utils/message_outputs.cjs +2 -1
- package/dist/cjs/llm/bedrock/utils/message_outputs.cjs.map +1 -1
- package/dist/cjs/llm/google/utils/common.cjs +5 -4
- package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
- package/dist/cjs/llm/openai/index.cjs +519 -655
- package/dist/cjs/llm/openai/index.cjs.map +1 -1
- package/dist/cjs/llm/openai/utils/index.cjs +20 -458
- package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
- package/dist/cjs/llm/openrouter/index.cjs +57 -175
- package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
- package/dist/cjs/llm/vertexai/index.cjs +5 -3
- package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
- package/dist/cjs/main.cjs +112 -3
- package/dist/cjs/main.cjs.map +1 -1
- package/dist/cjs/messages/cache.cjs +2 -1
- package/dist/cjs/messages/cache.cjs.map +1 -1
- package/dist/cjs/messages/core.cjs +7 -6
- package/dist/cjs/messages/core.cjs.map +1 -1
- package/dist/cjs/messages/format.cjs +73 -15
- package/dist/cjs/messages/format.cjs.map +1 -1
- package/dist/cjs/messages/langchain.cjs +26 -0
- package/dist/cjs/messages/langchain.cjs.map +1 -0
- package/dist/cjs/messages/prune.cjs +7 -6
- package/dist/cjs/messages/prune.cjs.map +1 -1
- package/dist/cjs/run.cjs +400 -42
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/tools/ToolNode.cjs +556 -56
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/search/search.cjs +55 -66
- package/dist/cjs/tools/search/search.cjs.map +1 -1
- package/dist/cjs/tools/search/tavily-scraper.cjs +189 -0
- package/dist/cjs/tools/search/tavily-scraper.cjs.map +1 -0
- package/dist/cjs/tools/search/tavily-search.cjs +372 -0
- package/dist/cjs/tools/search/tavily-search.cjs.map +1 -0
- package/dist/cjs/tools/search/tool.cjs +26 -4
- package/dist/cjs/tools/search/tool.cjs.map +1 -1
- package/dist/cjs/tools/search/utils.cjs +10 -3
- package/dist/cjs/tools/search/utils.cjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +22 -3
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/hitl/askUserQuestion.mjs +65 -0
- package/dist/esm/hitl/askUserQuestion.mjs.map +1 -0
- package/dist/esm/hooks/HookRegistry.mjs +54 -0
- package/dist/esm/hooks/HookRegistry.mjs.map +1 -1
- package/dist/esm/hooks/createToolPolicyHook.mjs +113 -0
- package/dist/esm/hooks/createToolPolicyHook.mjs.map +1 -0
- package/dist/esm/hooks/executeHooks.mjs +40 -1
- package/dist/esm/hooks/executeHooks.mjs.map +1 -1
- package/dist/esm/hooks/types.mjs +1 -0
- package/dist/esm/hooks/types.mjs.map +1 -1
- package/dist/esm/langchain/google-common.mjs +2 -0
- package/dist/esm/langchain/google-common.mjs.map +1 -0
- package/dist/esm/langchain/index.mjs +5 -0
- package/dist/esm/langchain/index.mjs.map +1 -0
- package/dist/esm/langchain/language_models/chat_models.mjs +2 -0
- package/dist/esm/langchain/language_models/chat_models.mjs.map +1 -0
- package/dist/esm/langchain/messages/tool.mjs +2 -0
- package/dist/esm/langchain/messages/tool.mjs.map +1 -0
- package/dist/esm/langchain/messages.mjs +2 -0
- package/dist/esm/langchain/messages.mjs.map +1 -0
- package/dist/esm/langchain/openai.mjs +2 -0
- package/dist/esm/langchain/openai.mjs.map +1 -0
- package/dist/esm/langchain/prompts.mjs +2 -0
- package/dist/esm/langchain/prompts.mjs.map +1 -0
- package/dist/esm/langchain/runnables.mjs +2 -0
- package/dist/esm/langchain/runnables.mjs.map +1 -0
- package/dist/esm/langchain/tools.mjs +2 -0
- package/dist/esm/langchain/tools.mjs.map +1 -0
- package/dist/esm/langchain/utils/env.mjs +2 -0
- package/dist/esm/langchain/utils/env.mjs.map +1 -0
- package/dist/esm/llm/anthropic/index.mjs +146 -54
- package/dist/esm/llm/anthropic/index.mjs.map +1 -1
- package/dist/esm/llm/anthropic/types.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs +21 -14
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_outputs.mjs +84 -71
- package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -1
- package/dist/esm/llm/bedrock/index.mjs +1 -1
- package/dist/esm/llm/bedrock/index.mjs.map +1 -1
- package/dist/esm/llm/bedrock/utils/message_inputs.mjs +214 -4
- package/dist/esm/llm/bedrock/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/bedrock/utils/message_outputs.mjs +2 -1
- package/dist/esm/llm/bedrock/utils/message_outputs.mjs.map +1 -1
- package/dist/esm/llm/google/utils/common.mjs +5 -4
- package/dist/esm/llm/google/utils/common.mjs.map +1 -1
- package/dist/esm/llm/openai/index.mjs +520 -656
- package/dist/esm/llm/openai/index.mjs.map +1 -1
- package/dist/esm/llm/openai/utils/index.mjs +23 -459
- package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
- package/dist/esm/llm/openrouter/index.mjs +57 -175
- package/dist/esm/llm/openrouter/index.mjs.map +1 -1
- package/dist/esm/llm/vertexai/index.mjs +5 -3
- package/dist/esm/llm/vertexai/index.mjs.map +1 -1
- package/dist/esm/main.mjs +7 -0
- package/dist/esm/main.mjs.map +1 -1
- package/dist/esm/messages/cache.mjs +2 -1
- package/dist/esm/messages/cache.mjs.map +1 -1
- package/dist/esm/messages/core.mjs +7 -6
- package/dist/esm/messages/core.mjs.map +1 -1
- package/dist/esm/messages/format.mjs +73 -15
- package/dist/esm/messages/format.mjs.map +1 -1
- package/dist/esm/messages/langchain.mjs +23 -0
- package/dist/esm/messages/langchain.mjs.map +1 -0
- package/dist/esm/messages/prune.mjs +7 -6
- package/dist/esm/messages/prune.mjs.map +1 -1
- package/dist/esm/run.mjs +400 -42
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/tools/ToolNode.mjs +557 -57
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/search/search.mjs +55 -66
- package/dist/esm/tools/search/search.mjs.map +1 -1
- package/dist/esm/tools/search/tavily-scraper.mjs +186 -0
- package/dist/esm/tools/search/tavily-scraper.mjs.map +1 -0
- package/dist/esm/tools/search/tavily-search.mjs +370 -0
- package/dist/esm/tools/search/tavily-search.mjs.map +1 -0
- package/dist/esm/tools/search/tool.mjs +26 -4
- package/dist/esm/tools/search/tool.mjs.map +1 -1
- package/dist/esm/tools/search/utils.mjs +10 -3
- package/dist/esm/tools/search/utils.mjs.map +1 -1
- package/dist/types/graphs/Graph.d.ts +7 -0
- package/dist/types/hitl/askUserQuestion.d.ts +55 -0
- package/dist/types/hitl/index.d.ts +6 -0
- package/dist/types/hooks/HookRegistry.d.ts +58 -0
- package/dist/types/hooks/createToolPolicyHook.d.ts +87 -0
- package/dist/types/hooks/index.d.ts +4 -1
- package/dist/types/hooks/types.d.ts +109 -3
- package/dist/types/index.d.ts +10 -0
- package/dist/types/langchain/google-common.d.ts +1 -0
- package/dist/types/langchain/index.d.ts +8 -0
- package/dist/types/langchain/language_models/chat_models.d.ts +1 -0
- package/dist/types/langchain/messages/tool.d.ts +1 -0
- package/dist/types/langchain/messages.d.ts +2 -0
- package/dist/types/langchain/openai.d.ts +1 -0
- package/dist/types/langchain/prompts.d.ts +1 -0
- package/dist/types/langchain/runnables.d.ts +2 -0
- package/dist/types/langchain/tools.d.ts +2 -0
- package/dist/types/langchain/utils/env.d.ts +1 -0
- package/dist/types/llm/anthropic/index.d.ts +22 -9
- package/dist/types/llm/anthropic/types.d.ts +5 -1
- package/dist/types/llm/anthropic/utils/message_outputs.d.ts +13 -6
- package/dist/types/llm/anthropic/utils/output_parsers.d.ts +1 -1
- package/dist/types/llm/openai/index.d.ts +21 -24
- package/dist/types/llm/openrouter/index.d.ts +11 -9
- package/dist/types/llm/vertexai/index.d.ts +1 -0
- package/dist/types/messages/cache.d.ts +4 -1
- package/dist/types/messages/format.d.ts +4 -1
- package/dist/types/messages/langchain.d.ts +27 -0
- package/dist/types/run.d.ts +117 -1
- package/dist/types/tools/ToolNode.d.ts +26 -1
- package/dist/types/tools/search/tavily-scraper.d.ts +19 -0
- package/dist/types/tools/search/tavily-search.d.ts +4 -0
- package/dist/types/tools/search/types.d.ts +99 -5
- package/dist/types/tools/search/utils.d.ts +2 -2
- package/dist/types/types/graph.d.ts +23 -37
- package/dist/types/types/hitl.d.ts +272 -0
- package/dist/types/types/index.d.ts +1 -0
- package/dist/types/types/llm.d.ts +3 -3
- package/dist/types/types/run.d.ts +33 -0
- package/dist/types/types/stream.d.ts +1 -1
- package/dist/types/types/tools.d.ts +19 -0
- package/package.json +80 -17
- package/src/graphs/Graph.ts +33 -4
- package/src/graphs/__tests__/composition.smoke.test.ts +188 -0
- package/src/hitl/askUserQuestion.ts +72 -0
- package/src/hitl/index.ts +7 -0
- package/src/hooks/HookRegistry.ts +71 -0
- package/src/hooks/__tests__/createToolPolicyHook.test.ts +259 -0
- package/src/hooks/createToolPolicyHook.ts +184 -0
- package/src/hooks/executeHooks.ts +50 -1
- package/src/hooks/index.ts +6 -0
- package/src/hooks/types.ts +112 -0
- package/src/index.ts +22 -0
- package/src/langchain/google-common.ts +1 -0
- package/src/langchain/index.ts +8 -0
- package/src/langchain/language_models/chat_models.ts +1 -0
- package/src/langchain/messages/tool.ts +5 -0
- package/src/langchain/messages.ts +21 -0
- package/src/langchain/openai.ts +1 -0
- package/src/langchain/prompts.ts +1 -0
- package/src/langchain/runnables.ts +7 -0
- package/src/langchain/tools.ts +8 -0
- package/src/langchain/utils/env.ts +1 -0
- package/src/llm/anthropic/index.ts +252 -84
- package/src/llm/anthropic/llm.spec.ts +751 -102
- package/src/llm/anthropic/types.ts +9 -1
- package/src/llm/anthropic/utils/message_inputs.ts +37 -19
- package/src/llm/anthropic/utils/message_outputs.ts +119 -101
- package/src/llm/bedrock/index.ts +2 -2
- package/src/llm/bedrock/llm.spec.ts +341 -0
- package/src/llm/bedrock/utils/message_inputs.ts +303 -4
- package/src/llm/bedrock/utils/message_outputs.ts +2 -1
- package/src/llm/custom-chat-models.smoke.test.ts +836 -0
- package/src/llm/google/llm.spec.ts +339 -57
- package/src/llm/google/utils/common.ts +53 -48
- package/src/llm/openai/contentBlocks.test.ts +346 -0
- package/src/llm/openai/index.ts +856 -833
- package/src/llm/openai/utils/index.ts +107 -78
- package/src/llm/openai/utils/messages.test.ts +159 -0
- package/src/llm/openrouter/index.ts +124 -247
- package/src/llm/openrouter/reasoning.test.ts +8 -1
- package/src/llm/vertexai/index.ts +11 -5
- package/src/llm/vertexai/llm.spec.ts +28 -1
- package/src/messages/cache.test.ts +4 -3
- package/src/messages/cache.ts +3 -2
- package/src/messages/core.ts +16 -9
- package/src/messages/format.ts +96 -16
- package/src/messages/formatAgentMessages.test.ts +166 -1
- package/src/messages/langchain.ts +39 -0
- package/src/messages/prune.ts +12 -8
- package/src/run.ts +456 -47
- package/src/scripts/caching.ts +2 -3
- package/src/specs/summarization.test.ts +51 -58
- package/src/tools/ToolNode.ts +706 -63
- package/src/tools/__tests__/hitl.test.ts +3593 -0
- package/src/tools/search/search.ts +83 -73
- package/src/tools/search/tavily-scraper.ts +235 -0
- package/src/tools/search/tavily-search.ts +424 -0
- package/src/tools/search/tavily.test.ts +965 -0
- package/src/tools/search/tool.ts +36 -26
- package/src/tools/search/types.ts +133 -8
- package/src/tools/search/utils.ts +13 -5
- package/src/types/graph.ts +32 -87
- package/src/types/hitl.ts +303 -0
- package/src/types/index.ts +1 -0
- package/src/types/llm.ts +3 -3
- package/src/types/run.ts +33 -0
- package/src/types/stream.ts +1 -1
- package/src/types/tools.ts +19 -0
- package/src/utils/llmConfig.ts +1 -6
|
@@ -138,6 +138,7 @@ async function createSummarizationRun(opts: {
|
|
|
138
138
|
tools?: t.GraphTools;
|
|
139
139
|
indexTokenCountMap?: Record<string, number>;
|
|
140
140
|
llmConfigOverride?: Record<string, unknown>;
|
|
141
|
+
maxSummaryTokens?: number;
|
|
141
142
|
}): Promise<Run<t.IState>> {
|
|
142
143
|
const llmConfig = {
|
|
143
144
|
...getLLMConfig(opts.agentProvider),
|
|
@@ -157,6 +158,7 @@ async function createSummarizationRun(opts: {
|
|
|
157
158
|
summarizationConfig: {
|
|
158
159
|
provider: opts.summarizationProvider,
|
|
159
160
|
model: opts.summarizationModel,
|
|
161
|
+
maxSummaryTokens: opts.maxSummaryTokens,
|
|
160
162
|
},
|
|
161
163
|
},
|
|
162
164
|
returnContent: true,
|
|
@@ -244,6 +246,33 @@ function buildIndexTokenCountMap(
|
|
|
244
246
|
return map;
|
|
245
247
|
}
|
|
246
248
|
|
|
249
|
+
function sumTokenCountMap(map: Record<string, number | undefined>): number {
|
|
250
|
+
let total = 0;
|
|
251
|
+
for (const key in map) {
|
|
252
|
+
total += map[key] ?? 0;
|
|
253
|
+
}
|
|
254
|
+
return total;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
function createSeededTokenAuditHistory(): BaseMessage[] {
|
|
258
|
+
const details =
|
|
259
|
+
'Token audit context preserves index token counts, summary replacement, calibration data, and post-summary continuity. ' +
|
|
260
|
+
'Important retained values: alpha=1024, beta=2048, gamma=4096, checksum TOKEN-AUDIT-7F3. ' +
|
|
261
|
+
'The repeated detail intentionally exceeds a compact context budget. ';
|
|
262
|
+
const padding = details.repeat(8);
|
|
263
|
+
|
|
264
|
+
return [
|
|
265
|
+
new HumanMessage(
|
|
266
|
+
`Audit turn 1: establish the accounting scenario. ${padding}`
|
|
267
|
+
),
|
|
268
|
+
new AIMessage(`Recorded turn 1 accounting notes. ${padding}`),
|
|
269
|
+
new HumanMessage(`Audit turn 2: add more retained details. ${padding}`),
|
|
270
|
+
new AIMessage(`Recorded turn 2 accounting notes. ${padding}`),
|
|
271
|
+
new HumanMessage(`Audit turn 3: preserve final identifiers. ${padding}`),
|
|
272
|
+
new AIMessage(`Recorded turn 3 accounting notes. ${padding}`),
|
|
273
|
+
];
|
|
274
|
+
}
|
|
275
|
+
|
|
247
276
|
function logTurn(
|
|
248
277
|
label: string,
|
|
249
278
|
conversationHistory: BaseMessage[],
|
|
@@ -2417,10 +2446,10 @@ const hasAnyApiKey =
|
|
|
2417
2446
|
test('token count map is accurate after summarization cycle', async () => {
|
|
2418
2447
|
const spies = createSpies();
|
|
2419
2448
|
let collectedUsage: UsageMetadata[] = [];
|
|
2420
|
-
const conversationHistory
|
|
2449
|
+
const conversationHistory = createSeededTokenAuditHistory();
|
|
2421
2450
|
const tokenCounter = await createTokenCounter();
|
|
2422
2451
|
|
|
2423
|
-
const createRun = async (maxTokens =
|
|
2452
|
+
const createRun = async (maxTokens = 1200): Promise<Run<t.IState>> => {
|
|
2424
2453
|
collectedUsage = [];
|
|
2425
2454
|
const { aggregateContent } = createContentAggregator();
|
|
2426
2455
|
const indexTokenCountMap = buildIndexTokenCountMap(
|
|
@@ -2432,80 +2461,44 @@ const hasAnyApiKey =
|
|
|
2432
2461
|
summarizationProvider,
|
|
2433
2462
|
summarizationModel,
|
|
2434
2463
|
maxContextTokens: maxTokens,
|
|
2435
|
-
instructions:
|
|
2464
|
+
instructions:
|
|
2465
|
+
'You are a concise assistant. Preserve checkpoint context and answer in one short sentence.',
|
|
2436
2466
|
collectedUsage,
|
|
2437
2467
|
aggregateContent,
|
|
2438
2468
|
spies,
|
|
2439
2469
|
tokenCounter,
|
|
2440
2470
|
indexTokenCountMap,
|
|
2471
|
+
maxSummaryTokens: 300,
|
|
2472
|
+
tools: [],
|
|
2473
|
+
llmConfigOverride: {
|
|
2474
|
+
maxTokens: 128,
|
|
2475
|
+
},
|
|
2441
2476
|
});
|
|
2442
2477
|
};
|
|
2443
2478
|
|
|
2444
|
-
|
|
2445
|
-
|
|
2446
|
-
|
|
2447
|
-
{ run, conversationHistory },
|
|
2448
|
-
'What is 42 * 58? Calculator.',
|
|
2449
|
-
streamConfig
|
|
2450
|
-
);
|
|
2451
|
-
|
|
2452
|
-
run = await createRun();
|
|
2453
|
-
await runTurn(
|
|
2454
|
-
{ run, conversationHistory },
|
|
2455
|
-
'Now compute 2436 + 1000. Calculator.',
|
|
2456
|
-
streamConfig
|
|
2457
|
-
);
|
|
2458
|
-
|
|
2459
|
-
run = await createRun();
|
|
2460
|
-
await runTurn(
|
|
2461
|
-
{ run, conversationHistory },
|
|
2462
|
-
'What is 3436 / 4? Calculator.',
|
|
2463
|
-
streamConfig
|
|
2464
|
-
);
|
|
2465
|
-
|
|
2466
|
-
run = await createRun();
|
|
2467
|
-
await runTurn(
|
|
2468
|
-
{ run, conversationHistory },
|
|
2469
|
-
'Compute 999 * 2. Calculator.',
|
|
2470
|
-
streamConfig
|
|
2471
|
-
);
|
|
2472
|
-
|
|
2473
|
-
run = await createRun();
|
|
2474
|
-
await runTurn(
|
|
2475
|
-
{ run, conversationHistory },
|
|
2476
|
-
'What is 2^10? Calculator. Also list everything.',
|
|
2477
|
-
streamConfig
|
|
2479
|
+
const originalMap = buildIndexTokenCountMap(
|
|
2480
|
+
conversationHistory,
|
|
2481
|
+
tokenCounter
|
|
2478
2482
|
);
|
|
2483
|
+
const originalTokenTotal = sumTokenCountMap(originalMap);
|
|
2484
|
+
expect(originalTokenTotal).toBeGreaterThan(1200);
|
|
2479
2485
|
|
|
2480
|
-
run = await createRun();
|
|
2486
|
+
const run = await createRun();
|
|
2481
2487
|
await runTurn(
|
|
2482
2488
|
{ run, conversationHistory },
|
|
2483
|
-
'
|
|
2489
|
+
'Acknowledge the preserved token audit context in one short sentence.',
|
|
2484
2490
|
streamConfig
|
|
2485
2491
|
);
|
|
2486
2492
|
|
|
2487
|
-
// Squeeze progressively to force summarization
|
|
2488
|
-
for (const squeeze of [3500, 3200, 3100, 3000, 2800, 2500, 2000]) {
|
|
2489
|
-
if (spies.onSummarizeStartSpy.mock.calls.length > 0) {
|
|
2490
|
-
break;
|
|
2491
|
-
}
|
|
2492
|
-
run = await createRun(squeeze);
|
|
2493
|
-
await runTurn(
|
|
2494
|
-
{ run, conversationHistory },
|
|
2495
|
-
`What is ${squeeze} - 1000? Calculator.`,
|
|
2496
|
-
streamConfig
|
|
2497
|
-
);
|
|
2498
|
-
}
|
|
2499
|
-
|
|
2500
|
-
// Verify summarization fired
|
|
2501
2493
|
expect(spies.onSummarizeCompleteSpy).toHaveBeenCalled();
|
|
2502
2494
|
|
|
2503
2495
|
const completePayload = spies.onSummarizeCompleteSpy.mock
|
|
2504
2496
|
.calls[0][0] as t.SummarizeCompleteEvent;
|
|
2505
|
-
|
|
2506
|
-
expect(
|
|
2497
|
+
const summaryTokenCount = completePayload.summary!.tokenCount ?? 0;
|
|
2498
|
+
expect(summaryTokenCount).toBeGreaterThan(10);
|
|
2499
|
+
expect(summaryTokenCount).toBeLessThan(1500);
|
|
2500
|
+
expect(summaryTokenCount).toBeLessThan(originalTokenTotal);
|
|
2507
2501
|
|
|
2508
|
-
// Token accounting: collectedUsage should have valid entries
|
|
2509
2502
|
const validUsage = collectedUsage.filter(
|
|
2510
2503
|
(u: Partial<UsageMetadata>) =>
|
|
2511
2504
|
u.input_tokens != null && u.input_tokens > 0
|
|
@@ -2513,8 +2506,8 @@ const hasAnyApiKey =
|
|
|
2513
2506
|
expect(validUsage.length).toBeGreaterThan(0);
|
|
2514
2507
|
|
|
2515
2508
|
console.log(
|
|
2516
|
-
` Token audit: summary=${
|
|
2517
|
-
`usageEntries=${validUsage.length}`
|
|
2509
|
+
` Token audit: summary=${summaryTokenCount} tokens, ` +
|
|
2510
|
+
`preTotal=${originalTokenTotal}, usageEntries=${validUsage.length}`
|
|
2518
2511
|
);
|
|
2519
2512
|
}, 180_000);
|
|
2520
2513
|
|