@librechat/agents 3.1.67 → 3.1.68-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/agents/AgentContext.cjs +23 -3
- package/dist/cjs/agents/AgentContext.cjs.map +1 -1
- package/dist/cjs/common/enum.cjs +16 -1
- package/dist/cjs/common/enum.cjs.map +1 -1
- package/dist/cjs/graphs/Graph.cjs +91 -0
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/graphs/MultiAgentGraph.cjs +36 -0
- package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
- package/dist/cjs/hooks/HookRegistry.cjs +162 -0
- package/dist/cjs/hooks/HookRegistry.cjs.map +1 -0
- package/dist/cjs/hooks/executeHooks.cjs +276 -0
- package/dist/cjs/hooks/executeHooks.cjs.map +1 -0
- package/dist/cjs/hooks/matchers.cjs +256 -0
- package/dist/cjs/hooks/matchers.cjs.map +1 -0
- package/dist/cjs/hooks/types.cjs +27 -0
- package/dist/cjs/hooks/types.cjs.map +1 -0
- package/dist/cjs/main.cjs +54 -0
- package/dist/cjs/main.cjs.map +1 -1
- package/dist/cjs/messages/format.cjs +74 -12
- package/dist/cjs/messages/format.cjs.map +1 -1
- package/dist/cjs/run.cjs +111 -0
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/summarization/index.cjs +41 -0
- package/dist/cjs/summarization/index.cjs.map +1 -1
- package/dist/cjs/summarization/node.cjs +165 -19
- package/dist/cjs/summarization/node.cjs.map +1 -1
- package/dist/cjs/tools/BashExecutor.cjs +165 -0
- package/dist/cjs/tools/BashExecutor.cjs.map +1 -0
- package/dist/cjs/tools/BashProgrammaticToolCalling.cjs +287 -0
- package/dist/cjs/tools/BashProgrammaticToolCalling.cjs.map +1 -0
- package/dist/cjs/tools/CodeExecutor.cjs +0 -9
- package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs +7 -23
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
- package/dist/cjs/tools/ReadFile.cjs +43 -0
- package/dist/cjs/tools/ReadFile.cjs.map +1 -0
- package/dist/cjs/tools/SkillTool.cjs +50 -0
- package/dist/cjs/tools/SkillTool.cjs.map +1 -0
- package/dist/cjs/tools/SubagentTool.cjs +92 -0
- package/dist/cjs/tools/SubagentTool.cjs.map +1 -0
- package/dist/cjs/tools/ToolNode.cjs +304 -140
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/ToolSearch.cjs +2 -13
- package/dist/cjs/tools/ToolSearch.cjs.map +1 -1
- package/dist/cjs/tools/skillCatalog.cjs +84 -0
- package/dist/cjs/tools/skillCatalog.cjs.map +1 -0
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs +511 -0
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -0
- package/dist/esm/agents/AgentContext.mjs +23 -3
- package/dist/esm/agents/AgentContext.mjs.map +1 -1
- package/dist/esm/common/enum.mjs +15 -2
- package/dist/esm/common/enum.mjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +91 -0
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/graphs/MultiAgentGraph.mjs +36 -0
- package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
- package/dist/esm/hooks/HookRegistry.mjs +160 -0
- package/dist/esm/hooks/HookRegistry.mjs.map +1 -0
- package/dist/esm/hooks/executeHooks.mjs +273 -0
- package/dist/esm/hooks/executeHooks.mjs.map +1 -0
- package/dist/esm/hooks/matchers.mjs +251 -0
- package/dist/esm/hooks/matchers.mjs.map +1 -0
- package/dist/esm/hooks/types.mjs +25 -0
- package/dist/esm/hooks/types.mjs.map +1 -0
- package/dist/esm/main.mjs +13 -2
- package/dist/esm/main.mjs.map +1 -1
- package/dist/esm/messages/format.mjs +66 -4
- package/dist/esm/messages/format.mjs.map +1 -1
- package/dist/esm/run.mjs +111 -0
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/summarization/index.mjs +41 -1
- package/dist/esm/summarization/index.mjs.map +1 -1
- package/dist/esm/summarization/node.mjs +165 -19
- package/dist/esm/summarization/node.mjs.map +1 -1
- package/dist/esm/tools/BashExecutor.mjs +159 -0
- package/dist/esm/tools/BashExecutor.mjs.map +1 -0
- package/dist/esm/tools/BashProgrammaticToolCalling.mjs +278 -0
- package/dist/esm/tools/BashProgrammaticToolCalling.mjs.map +1 -0
- package/dist/esm/tools/CodeExecutor.mjs +0 -9
- package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
- package/dist/esm/tools/ProgrammaticToolCalling.mjs +8 -24
- package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
- package/dist/esm/tools/ReadFile.mjs +38 -0
- package/dist/esm/tools/ReadFile.mjs.map +1 -0
- package/dist/esm/tools/SkillTool.mjs +45 -0
- package/dist/esm/tools/SkillTool.mjs.map +1 -0
- package/dist/esm/tools/SubagentTool.mjs +85 -0
- package/dist/esm/tools/SubagentTool.mjs.map +1 -0
- package/dist/esm/tools/ToolNode.mjs +306 -142
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/ToolSearch.mjs +3 -14
- package/dist/esm/tools/ToolSearch.mjs.map +1 -1
- package/dist/esm/tools/skillCatalog.mjs +82 -0
- package/dist/esm/tools/skillCatalog.mjs.map +1 -0
- package/dist/esm/tools/subagent/SubagentExecutor.mjs +505 -0
- package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -0
- package/dist/types/agents/AgentContext.d.ts +6 -0
- package/dist/types/common/enum.d.ts +10 -2
- package/dist/types/graphs/Graph.d.ts +2 -0
- package/dist/types/graphs/MultiAgentGraph.d.ts +12 -0
- package/dist/types/hooks/HookRegistry.d.ts +56 -0
- package/dist/types/hooks/executeHooks.d.ts +79 -0
- package/dist/types/hooks/index.d.ts +6 -0
- package/dist/types/hooks/matchers.d.ts +95 -0
- package/dist/types/hooks/types.d.ts +320 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/messages/format.d.ts +2 -1
- package/dist/types/run.d.ts +1 -0
- package/dist/types/summarization/index.d.ts +2 -0
- package/dist/types/summarization/node.d.ts +2 -0
- package/dist/types/tools/BashExecutor.d.ts +45 -0
- package/dist/types/tools/BashProgrammaticToolCalling.d.ts +72 -0
- package/dist/types/tools/ProgrammaticToolCalling.d.ts +4 -9
- package/dist/types/tools/ReadFile.d.ts +28 -0
- package/dist/types/tools/SkillTool.d.ts +40 -0
- package/dist/types/tools/SubagentTool.d.ts +36 -0
- package/dist/types/tools/ToolNode.d.ts +24 -2
- package/dist/types/tools/ToolSearch.d.ts +2 -2
- package/dist/types/tools/skillCatalog.d.ts +19 -0
- package/dist/types/tools/subagent/SubagentExecutor.d.ts +137 -0
- package/dist/types/tools/subagent/index.d.ts +2 -0
- package/dist/types/types/graph.d.ts +61 -2
- package/dist/types/types/index.d.ts +1 -0
- package/dist/types/types/run.d.ts +20 -0
- package/dist/types/types/skill.d.ts +9 -0
- package/dist/types/types/tools.d.ts +38 -10
- package/package.json +5 -1
- package/src/agents/AgentContext.ts +26 -2
- package/src/common/enum.ts +15 -1
- package/src/graphs/Graph.ts +113 -0
- package/src/graphs/MultiAgentGraph.ts +39 -0
- package/src/graphs/__tests__/MultiAgentGraph.test.ts +91 -0
- package/src/hooks/HookRegistry.ts +208 -0
- package/src/hooks/__tests__/HookRegistry.test.ts +190 -0
- package/src/hooks/__tests__/compactHooks.test.ts +214 -0
- package/src/hooks/__tests__/executeHooks.test.ts +1013 -0
- package/src/hooks/__tests__/integration.test.ts +337 -0
- package/src/hooks/__tests__/matchers.test.ts +238 -0
- package/src/hooks/__tests__/toolHooks.test.ts +669 -0
- package/src/hooks/executeHooks.ts +375 -0
- package/src/hooks/index.ts +57 -0
- package/src/hooks/matchers.ts +280 -0
- package/src/hooks/types.ts +404 -0
- package/src/index.ts +10 -0
- package/src/messages/format.ts +74 -4
- package/src/messages/formatAgentMessages.skills.test.ts +334 -0
- package/src/run.ts +126 -0
- package/src/scripts/multi-agent-subagent.ts +246 -0
- package/src/scripts/programmatic_exec.ts +1 -10
- package/src/scripts/subagent-event-driven-debug.ts +190 -0
- package/src/scripts/subagent-tools-debug.ts +160 -0
- package/src/scripts/test_code_api.ts +0 -7
- package/src/scripts/tool_search.ts +1 -10
- package/src/specs/subagent.test.ts +305 -0
- package/src/summarization/__tests__/node.test.ts +42 -0
- package/src/summarization/__tests__/trigger.test.ts +100 -1
- package/src/summarization/index.ts +47 -0
- package/src/summarization/node.ts +202 -24
- package/src/tools/BashExecutor.ts +193 -0
- package/src/tools/BashProgrammaticToolCalling.ts +381 -0
- package/src/tools/CodeExecutor.ts +0 -11
- package/src/tools/ProgrammaticToolCalling.ts +4 -29
- package/src/tools/ReadFile.ts +39 -0
- package/src/tools/SkillTool.ts +46 -0
- package/src/tools/SubagentTool.ts +100 -0
- package/src/tools/ToolNode.ts +391 -169
- package/src/tools/ToolSearch.ts +3 -19
- package/src/tools/__tests__/ProgrammaticToolCalling.integration.test.ts +7 -8
- package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +0 -1
- package/src/tools/__tests__/ReadFile.test.ts +44 -0
- package/src/tools/__tests__/SkillTool.test.ts +442 -0
- package/src/tools/__tests__/SubagentExecutor.test.ts +1148 -0
- package/src/tools/__tests__/SubagentTool.test.ts +149 -0
- package/src/tools/__tests__/ToolNode.session.test.ts +12 -12
- package/src/tools/__tests__/ToolSearch.integration.test.ts +7 -8
- package/src/tools/__tests__/skillCatalog.test.ts +161 -0
- package/src/tools/__tests__/subagentHooks.test.ts +215 -0
- package/src/tools/skillCatalog.ts +126 -0
- package/src/tools/subagent/SubagentExecutor.ts +676 -0
- package/src/tools/subagent/index.ts +13 -0
- package/src/types/graph.ts +80 -1
- package/src/types/index.ts +1 -0
- package/src/types/run.ts +20 -0
- package/src/types/skill.ts +11 -0
- package/src/types/tools.ts +41 -10
package/dist/esm/run.mjs
CHANGED
|
@@ -11,6 +11,7 @@ import { MultiAgentGraph } from './graphs/MultiAgentGraph.mjs';
|
|
|
11
11
|
import { StandardGraph } from './graphs/Graph.mjs';
|
|
12
12
|
import { initializeModel } from './llm/init.mjs';
|
|
13
13
|
import { HandlerRegistry } from './events.mjs';
|
|
14
|
+
import { executeHooks } from './hooks/executeHooks.mjs';
|
|
14
15
|
import { isOpenAILike } from './utils/llm.mjs';
|
|
15
16
|
import { isPresent } from './utils/misc.mjs';
|
|
16
17
|
|
|
@@ -31,6 +32,7 @@ class Run {
|
|
|
31
32
|
id;
|
|
32
33
|
tokenCounter;
|
|
33
34
|
handlerRegistry;
|
|
35
|
+
hookRegistry;
|
|
34
36
|
indexTokenCountMap;
|
|
35
37
|
calibrationRatio = 1;
|
|
36
38
|
graphRunnable;
|
|
@@ -56,6 +58,7 @@ class Run {
|
|
|
56
58
|
}
|
|
57
59
|
}
|
|
58
60
|
this.handlerRegistry = handlerRegistry;
|
|
61
|
+
this.hookRegistry = config.hooks;
|
|
59
62
|
if (!config.graphConfig) {
|
|
60
63
|
throw new Error('Graph config not provided');
|
|
61
64
|
}
|
|
@@ -75,6 +78,11 @@ class Run {
|
|
|
75
78
|
this.Graph.handlerRegistry = handlerRegistry;
|
|
76
79
|
}
|
|
77
80
|
}
|
|
81
|
+
if (config.initialSessions && this.Graph) {
|
|
82
|
+
for (const [key, value] of config.initialSessions) {
|
|
83
|
+
this.Graph.sessions.set(key, value);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
78
86
|
this.returnContent = config.returnContent ?? false;
|
|
79
87
|
this.skipCleanup = config.skipCleanup ?? false;
|
|
80
88
|
}
|
|
@@ -112,6 +120,7 @@ class Run {
|
|
|
112
120
|
});
|
|
113
121
|
/** Propagate compile options from graph config */
|
|
114
122
|
standardGraph.compileOptions = config.compileOptions;
|
|
123
|
+
standardGraph.hookRegistry = this.hookRegistry;
|
|
115
124
|
this.Graph = standardGraph;
|
|
116
125
|
return standardGraph.createWorkflow();
|
|
117
126
|
}
|
|
@@ -128,6 +137,7 @@ class Run {
|
|
|
128
137
|
if (compileOptions != null) {
|
|
129
138
|
multiAgentGraph.compileOptions = compileOptions;
|
|
130
139
|
}
|
|
140
|
+
multiAgentGraph.hookRegistry = this.hookRegistry;
|
|
131
141
|
this.Graph = multiAgentGraph;
|
|
132
142
|
return multiAgentGraph.createWorkflow();
|
|
133
143
|
}
|
|
@@ -233,6 +243,42 @@ class Run {
|
|
|
233
243
|
config.configurable = Object.assign(config.configurable ?? {}, {
|
|
234
244
|
run_id: this.id,
|
|
235
245
|
});
|
|
246
|
+
const threadId = config.configurable.thread_id;
|
|
247
|
+
if (this.hookRegistry != null) {
|
|
248
|
+
await executeHooks({
|
|
249
|
+
registry: this.hookRegistry,
|
|
250
|
+
input: {
|
|
251
|
+
hook_event_name: 'RunStart',
|
|
252
|
+
runId: this.id,
|
|
253
|
+
threadId,
|
|
254
|
+
agentId: this.Graph.defaultAgentId,
|
|
255
|
+
messages: inputs.messages,
|
|
256
|
+
},
|
|
257
|
+
sessionId: this.id,
|
|
258
|
+
});
|
|
259
|
+
const lastHuman = findLastMessageOfType(inputs.messages, 'human');
|
|
260
|
+
if (lastHuman != null) {
|
|
261
|
+
const promptResult = await executeHooks({
|
|
262
|
+
registry: this.hookRegistry,
|
|
263
|
+
input: {
|
|
264
|
+
hook_event_name: 'UserPromptSubmit',
|
|
265
|
+
runId: this.id,
|
|
266
|
+
threadId,
|
|
267
|
+
agentId: this.Graph.defaultAgentId,
|
|
268
|
+
prompt: extractPromptText(lastHuman),
|
|
269
|
+
// attachments: not yet wired — Phase 2 will extract
|
|
270
|
+
// non-text content blocks (images, files) from messages
|
|
271
|
+
},
|
|
272
|
+
sessionId: this.id,
|
|
273
|
+
});
|
|
274
|
+
if (promptResult.decision === 'deny' ||
|
|
275
|
+
promptResult.decision === 'ask') {
|
|
276
|
+
this.hookRegistry.clearSession(this.id);
|
|
277
|
+
config.callbacks = undefined;
|
|
278
|
+
return undefined;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
236
282
|
const stream = this.graphRunnable.streamEvents(inputs, config, {
|
|
237
283
|
raiseError: true,
|
|
238
284
|
/**
|
|
@@ -258,8 +304,45 @@ class Run {
|
|
|
258
304
|
await handler.handle(eventName, data, metadata, this.Graph);
|
|
259
305
|
}
|
|
260
306
|
}
|
|
307
|
+
if (this.hookRegistry?.hasHookFor('Stop', this.id) === true) {
|
|
308
|
+
await executeHooks({
|
|
309
|
+
registry: this.hookRegistry,
|
|
310
|
+
input: {
|
|
311
|
+
hook_event_name: 'Stop',
|
|
312
|
+
runId: this.id,
|
|
313
|
+
threadId,
|
|
314
|
+
agentId: this.Graph.defaultAgentId,
|
|
315
|
+
messages: this.Graph.getRunMessages() ?? inputs.messages,
|
|
316
|
+
stopHookActive: false, // will be true when stop is triggered by a hook (Phase 2)
|
|
317
|
+
},
|
|
318
|
+
sessionId: this.id,
|
|
319
|
+
}).catch(() => {
|
|
320
|
+
/* Stop hook errors must not masquerade as stream failures */
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
catch (err) {
|
|
325
|
+
if (this.hookRegistry?.hasHookFor('StopFailure', this.id) === true) {
|
|
326
|
+
const runMessages = this.Graph.getRunMessages() ?? [];
|
|
327
|
+
await executeHooks({
|
|
328
|
+
registry: this.hookRegistry,
|
|
329
|
+
input: {
|
|
330
|
+
hook_event_name: 'StopFailure',
|
|
331
|
+
runId: this.id,
|
|
332
|
+
threadId,
|
|
333
|
+
agentId: this.Graph.defaultAgentId,
|
|
334
|
+
error: err instanceof Error ? err.message : String(err),
|
|
335
|
+
lastAssistantMessage: findLastMessageOfType(runMessages, 'ai'),
|
|
336
|
+
},
|
|
337
|
+
sessionId: this.id,
|
|
338
|
+
}).catch(() => {
|
|
339
|
+
/* swallow hook errors — the original error must propagate */
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
throw err;
|
|
261
343
|
}
|
|
262
344
|
finally {
|
|
345
|
+
this.hookRegistry?.clearSession(this.id);
|
|
263
346
|
/**
|
|
264
347
|
* Break the reference chain that keeps heavy data alive via
|
|
265
348
|
* LangGraph's internal `__pregel_scratchpad.currentTaskInput` →
|
|
@@ -387,6 +470,34 @@ class Run {
|
|
|
387
470
|
}
|
|
388
471
|
}
|
|
389
472
|
}
|
|
473
|
+
function findLastMessageOfType(messages, type) {
|
|
474
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
475
|
+
if (messages[i].getType() === type) {
|
|
476
|
+
return messages[i];
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
return undefined;
|
|
480
|
+
}
|
|
481
|
+
function extractPromptText(message) {
|
|
482
|
+
const content = message.content;
|
|
483
|
+
if (typeof content === 'string') {
|
|
484
|
+
return content;
|
|
485
|
+
}
|
|
486
|
+
if (!Array.isArray(content)) {
|
|
487
|
+
return String(content);
|
|
488
|
+
}
|
|
489
|
+
const parts = [];
|
|
490
|
+
for (const block of content) {
|
|
491
|
+
if (typeof block === 'object' &&
|
|
492
|
+
'type' in block &&
|
|
493
|
+
block.type === 'text' &&
|
|
494
|
+
'text' in block &&
|
|
495
|
+
typeof block.text === 'string') {
|
|
496
|
+
parts.push(block.text);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
return parts.join('\n');
|
|
500
|
+
}
|
|
390
501
|
|
|
391
502
|
export { Run, defaultOmitOptions };
|
|
392
503
|
//# sourceMappingURL=run.mjs.map
|
package/dist/esm/run.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.mjs","sources":["../../src/run.ts"],"sourcesContent":["// src/run.ts\nimport './instrumentation';\nimport { CallbackHandler } from '@langfuse/langchain';\nimport { PromptTemplate } from '@langchain/core/prompts';\nimport { RunnableLambda } from '@langchain/core/runnables';\nimport { AzureChatOpenAI, ChatOpenAI } from '@langchain/openai';\nimport { BaseCallbackHandler } from '@langchain/core/callbacks/base';\nimport type {\n MessageContentComplex,\n BaseMessage,\n} from '@langchain/core/messages';\nimport type { StringPromptValue } from '@langchain/core/prompt_values';\nimport type { RunnableConfig } from '@langchain/core/runnables';\nimport type * as t from '@/types';\nimport {\n createCompletionTitleRunnable,\n createTitleRunnable,\n} from '@/utils/title';\nimport { createTokenCounter, encodingForModel } from '@/utils/tokens';\nimport { GraphEvents, Callback, TitleMethod } from '@/common';\nimport { MultiAgentGraph } from '@/graphs/MultiAgentGraph';\nimport { StandardGraph } from '@/graphs/Graph';\nimport { initializeModel } from '@/llm/init';\nimport { HandlerRegistry } from '@/events';\nimport { isOpenAILike } from '@/utils/llm';\nimport { isPresent } from '@/utils/misc';\n\nexport const defaultOmitOptions = new Set([\n 'stream',\n 'thinking',\n 'streaming',\n 'maxTokens',\n 'clientOptions',\n 'thinkingConfig',\n 'thinkingBudget',\n 'includeThoughts',\n 'maxOutputTokens',\n 'additionalModelRequestFields',\n]);\n\nexport class Run<_T extends t.BaseGraphState> {\n id: string;\n private tokenCounter?: t.TokenCounter;\n private handlerRegistry?: HandlerRegistry;\n private indexTokenCountMap?: Record<string, number>;\n calibrationRatio: number = 1;\n graphRunnable?: t.CompiledStateWorkflow;\n Graph: StandardGraph | MultiAgentGraph | undefined;\n returnContent: boolean = false;\n private skipCleanup: boolean = false;\n private _streamResult: t.MessageContentComplex[] | undefined;\n\n private constructor(config: Partial<t.RunConfig>) {\n const runId = config.runId ?? '';\n if (!runId) {\n throw new Error('Run ID not provided');\n }\n\n this.id = runId;\n this.tokenCounter = config.tokenCounter;\n this.indexTokenCountMap = config.indexTokenCountMap;\n if (config.calibrationRatio != null && config.calibrationRatio > 0) {\n this.calibrationRatio = config.calibrationRatio;\n }\n\n const handlerRegistry = new HandlerRegistry();\n\n if (config.customHandlers) {\n for (const [eventType, handler] of Object.entries(\n config.customHandlers\n )) {\n handlerRegistry.register(eventType, handler);\n }\n }\n\n this.handlerRegistry = handlerRegistry;\n\n if (!config.graphConfig) {\n throw new Error('Graph config not provided');\n }\n\n /** Handle different graph types */\n if (config.graphConfig.type === 'multi-agent') {\n this.graphRunnable = this.createMultiAgentGraph(config.graphConfig);\n if (this.Graph) {\n this.Graph.handlerRegistry = handlerRegistry;\n }\n } else {\n /** Default to legacy graph for 'standard' or undefined type */\n this.graphRunnable = this.createLegacyGraph(config.graphConfig);\n if (this.Graph) {\n this.Graph.compileOptions =\n config.graphConfig.compileOptions ?? this.Graph.compileOptions;\n this.Graph.handlerRegistry = handlerRegistry;\n }\n }\n\n this.returnContent = config.returnContent ?? false;\n this.skipCleanup = config.skipCleanup ?? false;\n }\n\n private createLegacyGraph(\n config: t.LegacyGraphConfig | t.StandardGraphConfig\n ): t.CompiledStateWorkflow {\n let agentConfig: t.AgentInputs;\n let signal: AbortSignal | undefined;\n\n /** Check if this is a multi-agent style config (has agents array) */\n if ('agents' in config && Array.isArray(config.agents)) {\n if (config.agents.length === 0) {\n throw new Error('At least one agent must be provided');\n }\n agentConfig = config.agents[0];\n signal = config.signal;\n } else {\n /** Legacy path: build agent config from llmConfig */\n const {\n type: _type,\n llmConfig,\n signal: legacySignal,\n tools = [],\n ...agentInputs\n } = config as t.LegacyGraphConfig;\n const { provider, ...clientOptions } = llmConfig;\n\n agentConfig = {\n ...agentInputs,\n tools,\n provider,\n clientOptions,\n agentId: 'default',\n };\n signal = legacySignal;\n }\n\n const standardGraph = new StandardGraph({\n signal,\n runId: this.id,\n agents: [agentConfig],\n tokenCounter: this.tokenCounter,\n indexTokenCountMap: this.indexTokenCountMap,\n calibrationRatio: this.calibrationRatio,\n });\n /** Propagate compile options from graph config */\n standardGraph.compileOptions = config.compileOptions;\n this.Graph = standardGraph;\n return standardGraph.createWorkflow();\n }\n\n private createMultiAgentGraph(\n config: t.MultiAgentGraphConfig\n ): t.CompiledStateWorkflow {\n const { agents, edges, compileOptions } = config;\n\n const multiAgentGraph = new MultiAgentGraph({\n runId: this.id,\n agents,\n edges,\n tokenCounter: this.tokenCounter,\n indexTokenCountMap: this.indexTokenCountMap,\n calibrationRatio: this.calibrationRatio,\n });\n\n if (compileOptions != null) {\n multiAgentGraph.compileOptions = compileOptions;\n }\n\n this.Graph = multiAgentGraph;\n return multiAgentGraph.createWorkflow();\n }\n\n static async create<T extends t.BaseGraphState>(\n config: t.RunConfig\n ): Promise<Run<T>> {\n /** Create tokenCounter if indexTokenCountMap is provided but tokenCounter is not */\n if (config.indexTokenCountMap && !config.tokenCounter) {\n const gc = config.graphConfig;\n const clientOpts =\n 'agents' in gc ? gc.agents[0]?.clientOptions : gc.clientOptions;\n const model = (clientOpts as { model?: string } | undefined)?.model ?? '';\n config.tokenCounter = await createTokenCounter(encodingForModel(model));\n }\n return new Run<T>(config);\n }\n\n getRunMessages(): BaseMessage[] | undefined {\n if (!this.Graph) {\n throw new Error(\n 'Graph not initialized. Make sure to use Run.create() to instantiate the Run.'\n );\n }\n return this.Graph.getRunMessages();\n }\n\n /**\n * Returns the current calibration ratio (EMA of provider-vs-estimate token ratios).\n * Hosts should persist this value and pass it back as `RunConfig.calibrationRatio`\n * on the next run for the same conversation so the pruner starts with an accurate\n * scaling factor instead of the default (1).\n */\n getCalibrationRatio(): number {\n return this.calibrationRatio;\n }\n\n getResolvedInstructionOverhead(): number | undefined {\n return this.Graph?.getResolvedInstructionOverhead();\n }\n\n getToolCount(): number {\n return this.Graph?.getToolCount() ?? 0;\n }\n\n /**\n * Creates a custom event callback handler that intercepts custom events\n * and processes them through our handler registry instead of EventStreamCallbackHandler\n */\n private createCustomEventCallback() {\n return async (\n eventName: string,\n data: unknown,\n runId: string,\n tags?: string[],\n metadata?: Record<string, unknown>\n ): Promise<void> => {\n // ON_RUN_STEP is dispatched directly via handler registry in\n // Graph.dispatchRunStep (primary, reliable path). Skip the\n // callback-based dispatch to prevent double handling.\n if (\n eventName === GraphEvents.ON_RUN_STEP &&\n this.Graph != null &&\n this.Graph.handlerDispatchedStepIds.has((data as t.RunStep).id)\n ) {\n return;\n }\n const handler = this.handlerRegistry?.getHandler(eventName);\n if (handler && this.Graph) {\n return await handler.handle(\n eventName,\n data as\n | t.StreamEventData\n | t.ModelEndData\n | t.RunStep\n | t.RunStepDeltaEvent\n | t.MessageDeltaEvent\n | t.ReasoningDeltaEvent\n | { result: t.ToolEndEvent },\n metadata,\n this.Graph\n );\n }\n };\n }\n\n async processStream(\n inputs: t.IState,\n callerConfig: Partial<RunnableConfig> & {\n version: 'v1' | 'v2';\n run_id?: string;\n },\n streamOptions?: t.EventStreamOptions\n ): Promise<MessageContentComplex[] | undefined> {\n if (this.graphRunnable == null) {\n throw new Error(\n 'Run not initialized. Make sure to use Run.create() to instantiate the Run.'\n );\n }\n if (!this.Graph) {\n throw new Error(\n 'Graph not initialized. Make sure to use Run.create() to instantiate the Run.'\n );\n }\n\n const config: Partial<RunnableConfig> & {\n version: 'v1' | 'v2';\n run_id?: string;\n } = {\n recursionLimit: 50,\n ...callerConfig,\n configurable: { ...callerConfig.configurable },\n };\n\n this.Graph.resetValues(streamOptions?.keepContent);\n\n /** Custom event callback to intercept and handle custom events */\n const customEventCallback = this.createCustomEventCallback();\n\n const baseCallbacks = (config.callbacks as t.ProvidedCallbacks) ?? [];\n const streamCallbacks = streamOptions?.callbacks\n ? this.getCallbacks(streamOptions.callbacks)\n : [];\n\n const customHandler = BaseCallbackHandler.fromMethods({\n [Callback.CUSTOM_EVENT]: customEventCallback,\n });\n customHandler.awaitHandlers = true;\n\n config.callbacks = baseCallbacks\n .concat(streamCallbacks)\n .concat(customHandler);\n\n if (\n isPresent(process.env.LANGFUSE_SECRET_KEY) &&\n isPresent(process.env.LANGFUSE_PUBLIC_KEY) &&\n isPresent(process.env.LANGFUSE_BASE_URL)\n ) {\n const userId = config.configurable?.user_id;\n const sessionId = config.configurable?.thread_id;\n const primaryContext = this.Graph.agentContexts.get(\n this.Graph.defaultAgentId\n );\n const traceMetadata = {\n messageId: this.id,\n parentMessageId: config.configurable?.requestBody?.parentMessageId,\n agentName: primaryContext?.name,\n };\n const handler = new CallbackHandler({\n userId,\n sessionId,\n traceMetadata,\n });\n config.callbacks = (\n (config.callbacks as t.ProvidedCallbacks) ?? []\n ).concat([handler]);\n }\n\n if (!this.id) {\n throw new Error('Run ID not provided');\n }\n\n config.run_id = this.id;\n config.configurable = Object.assign(config.configurable ?? {}, {\n run_id: this.id,\n });\n\n const stream = this.graphRunnable.streamEvents(inputs, config, {\n raiseError: true,\n /**\n * Prevent EventStreamCallbackHandler from processing custom events.\n * Custom events are already handled via our createCustomEventCallback()\n * which routes them through the handlerRegistry.\n * Without this flag, EventStreamCallbackHandler throws errors when\n * custom events are dispatched for run IDs not in its internal map\n * (due to timing issues in parallel execution or after run cleanup).\n */\n ignoreCustomEvent: true,\n });\n\n try {\n for await (const event of stream) {\n const { data, metadata, ...info } = event;\n\n const eventName: t.EventName = info.event;\n\n /** Skip custom events as they're handled by our callback */\n if (eventName === GraphEvents.ON_CUSTOM_EVENT) {\n continue;\n }\n\n const handler = this.handlerRegistry?.getHandler(eventName);\n if (handler) {\n await handler.handle(eventName, data, metadata, this.Graph);\n }\n }\n } finally {\n /**\n * Break the reference chain that keeps heavy data alive via\n * LangGraph's internal `__pregel_scratchpad.currentTaskInput` →\n * `@langchain/core` `RunTree.extra[lc:child_config]` →\n * Node.js `AsyncLocalStorage` context captured by timers/promises.\n *\n * Without this, base64-encoded images/PDFs in message content remain\n * reachable from lingering `Timeout` handles until GC runs.\n */\n if (!this.skipCleanup) {\n if (\n (config.configurable as Record<string, unknown> | undefined) != null\n ) {\n for (const key of Object.getOwnPropertySymbols(config.configurable)) {\n const val = config.configurable[key as unknown as string] as\n | Record<string, unknown>\n | undefined;\n if (\n val != null &&\n typeof val === 'object' &&\n 'currentTaskInput' in val\n ) {\n (val as Record<string, unknown>).currentTaskInput = undefined;\n }\n delete config.configurable[key as unknown as string];\n }\n config.configurable = undefined;\n }\n config.callbacks = undefined;\n }\n\n const result = this.returnContent\n ? this.Graph.getContentParts()\n : undefined;\n\n this.calibrationRatio = this.Graph.getCalibrationRatio();\n\n if (!this.skipCleanup) {\n this.Graph.clearHeavyState();\n }\n\n this._streamResult = result;\n }\n\n return this._streamResult;\n }\n\n private createSystemCallback<K extends keyof t.ClientCallbacks>(\n clientCallbacks: t.ClientCallbacks,\n key: K\n ): t.SystemCallbacks[K] {\n return ((...args: unknown[]) => {\n const clientCallback = clientCallbacks[key];\n if (clientCallback && this.Graph) {\n (clientCallback as (...args: unknown[]) => void)(this.Graph, ...args);\n }\n }) as t.SystemCallbacks[K];\n }\n\n getCallbacks(clientCallbacks: t.ClientCallbacks): t.SystemCallbacks {\n return {\n [Callback.TOOL_ERROR]: this.createSystemCallback(\n clientCallbacks,\n Callback.TOOL_ERROR\n ),\n [Callback.TOOL_START]: this.createSystemCallback(\n clientCallbacks,\n Callback.TOOL_START\n ),\n [Callback.TOOL_END]: this.createSystemCallback(\n clientCallbacks,\n Callback.TOOL_END\n ),\n };\n }\n\n async generateTitle({\n provider,\n inputText,\n contentParts,\n titlePrompt,\n clientOptions,\n chainOptions,\n skipLanguage,\n titleMethod = TitleMethod.COMPLETION,\n titlePromptTemplate,\n }: t.RunTitleOptions): Promise<{ language?: string; title?: string }> {\n if (\n chainOptions != null &&\n isPresent(process.env.LANGFUSE_SECRET_KEY) &&\n isPresent(process.env.LANGFUSE_PUBLIC_KEY) &&\n isPresent(process.env.LANGFUSE_BASE_URL)\n ) {\n const userId = chainOptions.configurable?.user_id;\n const sessionId = chainOptions.configurable?.thread_id;\n const titleContext = this.Graph?.agentContexts.get(\n this.Graph.defaultAgentId\n );\n const traceMetadata = {\n messageId: 'title-' + this.id,\n agentName: titleContext?.name,\n };\n const handler = new CallbackHandler({\n userId,\n sessionId,\n traceMetadata,\n });\n chainOptions.callbacks = (\n (chainOptions.callbacks as t.ProvidedCallbacks) ?? []\n ).concat([handler]);\n }\n\n const convoTemplate = PromptTemplate.fromTemplate(\n titlePromptTemplate ?? 'User: {input}\\nAI: {output}'\n );\n\n const response = contentParts\n .map((part) => {\n if (part?.type === 'text') return part.text;\n return '';\n })\n .join('\\n');\n\n const model = initializeModel({\n provider,\n clientOptions,\n }) as t.ChatModelInstance;\n\n if (\n isOpenAILike(provider) &&\n (model instanceof ChatOpenAI || model instanceof AzureChatOpenAI)\n ) {\n model.temperature = (clientOptions as t.OpenAIClientOptions | undefined)\n ?.temperature as number;\n model.topP = (clientOptions as t.OpenAIClientOptions | undefined)\n ?.topP as number;\n model.frequencyPenalty = (\n clientOptions as t.OpenAIClientOptions | undefined\n )?.frequencyPenalty as number;\n model.presencePenalty = (\n clientOptions as t.OpenAIClientOptions | undefined\n )?.presencePenalty as number;\n model.n = (clientOptions as t.OpenAIClientOptions | undefined)\n ?.n as number;\n }\n\n const convoToTitleInput = new RunnableLambda({\n func: (\n promptValue: StringPromptValue\n ): { convo: string; inputText: string; skipLanguage?: boolean } => ({\n convo: promptValue.value,\n inputText,\n skipLanguage,\n }),\n }).withConfig({ runName: 'ConvoTransform' });\n\n const titleChain =\n titleMethod === TitleMethod.COMPLETION\n ? await createCompletionTitleRunnable(model, titlePrompt)\n : await createTitleRunnable(model, titlePrompt);\n\n /** Pipes `convoTemplate` -> `transformer` -> `titleChain` */\n const fullChain = convoTemplate\n .withConfig({ runName: 'ConvoTemplate' })\n .pipe(convoToTitleInput)\n .pipe(titleChain)\n .withConfig({ runName: 'TitleChain' });\n\n const invokeConfig = Object.assign({}, chainOptions, {\n run_id: this.id,\n runId: this.id,\n });\n\n try {\n return await fullChain.invoke(\n { input: inputText, output: response },\n invokeConfig\n );\n } catch (_e) {\n // Fallback: strip callbacks to avoid EventStream tracer errors in certain environments\n // But preserve langfuse handler if it exists\n const langfuseHandler = (\n invokeConfig.callbacks as t.ProvidedCallbacks\n )?.find((cb) => cb instanceof CallbackHandler);\n const { callbacks: _cb, ...rest } = invokeConfig;\n const safeConfig = Object.assign({}, rest, {\n callbacks: langfuseHandler ? [langfuseHandler] : [],\n });\n return await fullChain.invoke(\n { input: inputText, output: response },\n safeConfig as Partial<RunnableConfig>\n );\n }\n }\n}\n"],"names":["ChatOpenAI","AzureChatOpenAI"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"run.mjs","sources":["../../src/run.ts"],"sourcesContent":["// src/run.ts\nimport './instrumentation';\nimport { CallbackHandler } from '@langfuse/langchain';\nimport { PromptTemplate } from '@langchain/core/prompts';\nimport { RunnableLambda } from '@langchain/core/runnables';\nimport { AzureChatOpenAI, ChatOpenAI } from '@langchain/openai';\nimport { BaseCallbackHandler } from '@langchain/core/callbacks/base';\nimport type {\n MessageContentComplex,\n BaseMessage,\n} from '@langchain/core/messages';\nimport type { StringPromptValue } from '@langchain/core/prompt_values';\nimport type { RunnableConfig } from '@langchain/core/runnables';\nimport type * as t from '@/types';\nimport {\n createCompletionTitleRunnable,\n createTitleRunnable,\n} from '@/utils/title';\nimport { createTokenCounter, encodingForModel } from '@/utils/tokens';\nimport { GraphEvents, Callback, TitleMethod } from '@/common';\nimport { MultiAgentGraph } from '@/graphs/MultiAgentGraph';\nimport { StandardGraph } from '@/graphs/Graph';\nimport { initializeModel } from '@/llm/init';\nimport { HandlerRegistry } from '@/events';\nimport { executeHooks } from '@/hooks';\nimport { isOpenAILike } from '@/utils/llm';\nimport { isPresent } from '@/utils/misc';\nimport type { HookRegistry } from '@/hooks';\n\nexport const defaultOmitOptions = new Set([\n 'stream',\n 'thinking',\n 'streaming',\n 'maxTokens',\n 'clientOptions',\n 'thinkingConfig',\n 'thinkingBudget',\n 'includeThoughts',\n 'maxOutputTokens',\n 'additionalModelRequestFields',\n]);\n\nexport class Run<_T extends t.BaseGraphState> {\n id: string;\n private tokenCounter?: t.TokenCounter;\n private handlerRegistry?: HandlerRegistry;\n private hookRegistry?: HookRegistry;\n private indexTokenCountMap?: Record<string, number>;\n calibrationRatio: number = 1;\n graphRunnable?: t.CompiledStateWorkflow;\n Graph: StandardGraph | MultiAgentGraph | undefined;\n returnContent: boolean = false;\n private skipCleanup: boolean = false;\n private _streamResult: t.MessageContentComplex[] | undefined;\n\n private constructor(config: Partial<t.RunConfig>) {\n const runId = config.runId ?? '';\n if (!runId) {\n throw new Error('Run ID not provided');\n }\n\n this.id = runId;\n this.tokenCounter = config.tokenCounter;\n this.indexTokenCountMap = config.indexTokenCountMap;\n if (config.calibrationRatio != null && config.calibrationRatio > 0) {\n this.calibrationRatio = config.calibrationRatio;\n }\n\n const handlerRegistry = new HandlerRegistry();\n\n if (config.customHandlers) {\n for (const [eventType, handler] of Object.entries(\n config.customHandlers\n )) {\n handlerRegistry.register(eventType, handler);\n }\n }\n\n this.handlerRegistry = handlerRegistry;\n this.hookRegistry = config.hooks;\n\n if (!config.graphConfig) {\n throw new Error('Graph config not provided');\n }\n\n /** Handle different graph types */\n if (config.graphConfig.type === 'multi-agent') {\n this.graphRunnable = this.createMultiAgentGraph(config.graphConfig);\n if (this.Graph) {\n this.Graph.handlerRegistry = handlerRegistry;\n }\n } else {\n /** Default to legacy graph for 'standard' or undefined type */\n this.graphRunnable = this.createLegacyGraph(config.graphConfig);\n if (this.Graph) {\n this.Graph.compileOptions =\n config.graphConfig.compileOptions ?? this.Graph.compileOptions;\n this.Graph.handlerRegistry = handlerRegistry;\n }\n }\n\n if (config.initialSessions && this.Graph) {\n for (const [key, value] of config.initialSessions) {\n this.Graph.sessions.set(key, value);\n }\n }\n\n this.returnContent = config.returnContent ?? false;\n this.skipCleanup = config.skipCleanup ?? false;\n }\n\n private createLegacyGraph(\n config: t.LegacyGraphConfig | t.StandardGraphConfig\n ): t.CompiledStateWorkflow {\n let agentConfig: t.AgentInputs;\n let signal: AbortSignal | undefined;\n\n /** Check if this is a multi-agent style config (has agents array) */\n if ('agents' in config && Array.isArray(config.agents)) {\n if (config.agents.length === 0) {\n throw new Error('At least one agent must be provided');\n }\n agentConfig = config.agents[0];\n signal = config.signal;\n } else {\n /** Legacy path: build agent config from llmConfig */\n const {\n type: _type,\n llmConfig,\n signal: legacySignal,\n tools = [],\n ...agentInputs\n } = config as t.LegacyGraphConfig;\n const { provider, ...clientOptions } = llmConfig;\n\n agentConfig = {\n ...agentInputs,\n tools,\n provider,\n clientOptions,\n agentId: 'default',\n };\n signal = legacySignal;\n }\n\n const standardGraph = new StandardGraph({\n signal,\n runId: this.id,\n agents: [agentConfig],\n tokenCounter: this.tokenCounter,\n indexTokenCountMap: this.indexTokenCountMap,\n calibrationRatio: this.calibrationRatio,\n });\n /** Propagate compile options from graph config */\n standardGraph.compileOptions = config.compileOptions;\n standardGraph.hookRegistry = this.hookRegistry;\n this.Graph = standardGraph;\n return standardGraph.createWorkflow();\n }\n\n private createMultiAgentGraph(\n config: t.MultiAgentGraphConfig\n ): t.CompiledStateWorkflow {\n const { agents, edges, compileOptions } = config;\n\n const multiAgentGraph = new MultiAgentGraph({\n runId: this.id,\n agents,\n edges,\n tokenCounter: this.tokenCounter,\n indexTokenCountMap: this.indexTokenCountMap,\n calibrationRatio: this.calibrationRatio,\n });\n\n if (compileOptions != null) {\n multiAgentGraph.compileOptions = compileOptions;\n }\n\n multiAgentGraph.hookRegistry = this.hookRegistry;\n this.Graph = multiAgentGraph;\n return multiAgentGraph.createWorkflow();\n }\n\n static async create<T extends t.BaseGraphState>(\n config: t.RunConfig\n ): Promise<Run<T>> {\n /** Create tokenCounter if indexTokenCountMap is provided but tokenCounter is not */\n if (config.indexTokenCountMap && !config.tokenCounter) {\n const gc = config.graphConfig;\n const clientOpts =\n 'agents' in gc ? gc.agents[0]?.clientOptions : gc.clientOptions;\n const model = (clientOpts as { model?: string } | undefined)?.model ?? '';\n config.tokenCounter = await createTokenCounter(encodingForModel(model));\n }\n return new Run<T>(config);\n }\n\n getRunMessages(): BaseMessage[] | undefined {\n if (!this.Graph) {\n throw new Error(\n 'Graph not initialized. Make sure to use Run.create() to instantiate the Run.'\n );\n }\n return this.Graph.getRunMessages();\n }\n\n /**\n * Returns the current calibration ratio (EMA of provider-vs-estimate token ratios).\n * Hosts should persist this value and pass it back as `RunConfig.calibrationRatio`\n * on the next run for the same conversation so the pruner starts with an accurate\n * scaling factor instead of the default (1).\n */\n getCalibrationRatio(): number {\n return this.calibrationRatio;\n }\n\n getResolvedInstructionOverhead(): number | undefined {\n return this.Graph?.getResolvedInstructionOverhead();\n }\n\n getToolCount(): number {\n return this.Graph?.getToolCount() ?? 0;\n }\n\n /**\n * Creates a custom event callback handler that intercepts custom events\n * and processes them through our handler registry instead of EventStreamCallbackHandler\n */\n private createCustomEventCallback() {\n return async (\n eventName: string,\n data: unknown,\n runId: string,\n tags?: string[],\n metadata?: Record<string, unknown>\n ): Promise<void> => {\n // ON_RUN_STEP is dispatched directly via handler registry in\n // Graph.dispatchRunStep (primary, reliable path). Skip the\n // callback-based dispatch to prevent double handling.\n if (\n eventName === GraphEvents.ON_RUN_STEP &&\n this.Graph != null &&\n this.Graph.handlerDispatchedStepIds.has((data as t.RunStep).id)\n ) {\n return;\n }\n const handler = this.handlerRegistry?.getHandler(eventName);\n if (handler && this.Graph) {\n return await handler.handle(\n eventName,\n data as\n | t.StreamEventData\n | t.ModelEndData\n | t.RunStep\n | t.RunStepDeltaEvent\n | t.MessageDeltaEvent\n | t.ReasoningDeltaEvent\n | { result: t.ToolEndEvent },\n metadata,\n this.Graph\n );\n }\n };\n }\n\n async processStream(\n inputs: t.IState,\n callerConfig: Partial<RunnableConfig> & {\n version: 'v1' | 'v2';\n run_id?: string;\n },\n streamOptions?: t.EventStreamOptions\n ): Promise<MessageContentComplex[] | undefined> {\n if (this.graphRunnable == null) {\n throw new Error(\n 'Run not initialized. Make sure to use Run.create() to instantiate the Run.'\n );\n }\n if (!this.Graph) {\n throw new Error(\n 'Graph not initialized. Make sure to use Run.create() to instantiate the Run.'\n );\n }\n\n const config: Partial<RunnableConfig> & {\n version: 'v1' | 'v2';\n run_id?: string;\n } = {\n recursionLimit: 50,\n ...callerConfig,\n configurable: { ...callerConfig.configurable },\n };\n\n this.Graph.resetValues(streamOptions?.keepContent);\n\n /** Custom event callback to intercept and handle custom events */\n const customEventCallback = this.createCustomEventCallback();\n\n const baseCallbacks = (config.callbacks as t.ProvidedCallbacks) ?? [];\n const streamCallbacks = streamOptions?.callbacks\n ? this.getCallbacks(streamOptions.callbacks)\n : [];\n\n const customHandler = BaseCallbackHandler.fromMethods({\n [Callback.CUSTOM_EVENT]: customEventCallback,\n });\n customHandler.awaitHandlers = true;\n\n config.callbacks = baseCallbacks\n .concat(streamCallbacks)\n .concat(customHandler);\n\n if (\n isPresent(process.env.LANGFUSE_SECRET_KEY) &&\n isPresent(process.env.LANGFUSE_PUBLIC_KEY) &&\n isPresent(process.env.LANGFUSE_BASE_URL)\n ) {\n const userId = config.configurable?.user_id;\n const sessionId = config.configurable?.thread_id;\n const primaryContext = this.Graph.agentContexts.get(\n this.Graph.defaultAgentId\n );\n const traceMetadata = {\n messageId: this.id,\n parentMessageId: config.configurable?.requestBody?.parentMessageId,\n agentName: primaryContext?.name,\n };\n const handler = new CallbackHandler({\n userId,\n sessionId,\n traceMetadata,\n });\n config.callbacks = (\n (config.callbacks as t.ProvidedCallbacks) ?? []\n ).concat([handler]);\n }\n\n if (!this.id) {\n throw new Error('Run ID not provided');\n }\n\n config.run_id = this.id;\n config.configurable = Object.assign(config.configurable ?? {}, {\n run_id: this.id,\n });\n\n const threadId = config.configurable.thread_id as string | undefined;\n\n if (this.hookRegistry != null) {\n await executeHooks({\n registry: this.hookRegistry,\n input: {\n hook_event_name: 'RunStart',\n runId: this.id,\n threadId,\n agentId: this.Graph.defaultAgentId,\n messages: inputs.messages,\n },\n sessionId: this.id,\n });\n\n const lastHuman = findLastMessageOfType(inputs.messages, 'human');\n if (lastHuman != null) {\n const promptResult = await executeHooks({\n registry: this.hookRegistry,\n input: {\n hook_event_name: 'UserPromptSubmit',\n runId: this.id,\n threadId,\n agentId: this.Graph.defaultAgentId,\n prompt: extractPromptText(lastHuman),\n // attachments: not yet wired — Phase 2 will extract\n // non-text content blocks (images, files) from messages\n },\n sessionId: this.id,\n });\n if (\n promptResult.decision === 'deny' ||\n promptResult.decision === 'ask'\n ) {\n this.hookRegistry.clearSession(this.id);\n config.callbacks = undefined;\n return undefined;\n }\n }\n }\n\n const stream = this.graphRunnable.streamEvents(inputs, config, {\n raiseError: true,\n /**\n * Prevent EventStreamCallbackHandler from processing custom events.\n * Custom events are already handled via our createCustomEventCallback()\n * which routes them through the handlerRegistry.\n * Without this flag, EventStreamCallbackHandler throws errors when\n * custom events are dispatched for run IDs not in its internal map\n * (due to timing issues in parallel execution or after run cleanup).\n */\n ignoreCustomEvent: true,\n });\n\n try {\n for await (const event of stream) {\n const { data, metadata, ...info } = event;\n\n const eventName: t.EventName = info.event;\n\n /** Skip custom events as they're handled by our callback */\n if (eventName === GraphEvents.ON_CUSTOM_EVENT) {\n continue;\n }\n\n const handler = this.handlerRegistry?.getHandler(eventName);\n if (handler) {\n await handler.handle(eventName, data, metadata, this.Graph);\n }\n }\n\n if (this.hookRegistry?.hasHookFor('Stop', this.id) === true) {\n await executeHooks({\n registry: this.hookRegistry,\n input: {\n hook_event_name: 'Stop',\n runId: this.id,\n threadId,\n agentId: this.Graph.defaultAgentId,\n messages: this.Graph.getRunMessages() ?? inputs.messages,\n stopHookActive: false, // will be true when stop is triggered by a hook (Phase 2)\n },\n sessionId: this.id,\n }).catch(() => {\n /* Stop hook errors must not masquerade as stream failures */\n });\n }\n } catch (err) {\n if (this.hookRegistry?.hasHookFor('StopFailure', this.id) === true) {\n const runMessages = this.Graph.getRunMessages() ?? [];\n await executeHooks({\n registry: this.hookRegistry,\n input: {\n hook_event_name: 'StopFailure',\n runId: this.id,\n threadId,\n agentId: this.Graph.defaultAgentId,\n error: err instanceof Error ? err.message : String(err),\n lastAssistantMessage: findLastMessageOfType(runMessages, 'ai'),\n },\n sessionId: this.id,\n }).catch(() => {\n /* swallow hook errors — the original error must propagate */\n });\n }\n throw err;\n } finally {\n this.hookRegistry?.clearSession(this.id);\n\n /**\n * Break the reference chain that keeps heavy data alive via\n * LangGraph's internal `__pregel_scratchpad.currentTaskInput` →\n * `@langchain/core` `RunTree.extra[lc:child_config]` →\n * Node.js `AsyncLocalStorage` context captured by timers/promises.\n *\n * Without this, base64-encoded images/PDFs in message content remain\n * reachable from lingering `Timeout` handles until GC runs.\n */\n if (!this.skipCleanup) {\n if (\n (config.configurable as Record<string, unknown> | undefined) != null\n ) {\n for (const key of Object.getOwnPropertySymbols(config.configurable)) {\n const val = config.configurable[key as unknown as string] as\n | Record<string, unknown>\n | undefined;\n if (\n val != null &&\n typeof val === 'object' &&\n 'currentTaskInput' in val\n ) {\n (val as Record<string, unknown>).currentTaskInput = undefined;\n }\n delete config.configurable[key as unknown as string];\n }\n config.configurable = undefined;\n }\n config.callbacks = undefined;\n }\n\n const result = this.returnContent\n ? this.Graph.getContentParts()\n : undefined;\n\n this.calibrationRatio = this.Graph.getCalibrationRatio();\n\n if (!this.skipCleanup) {\n this.Graph.clearHeavyState();\n }\n\n this._streamResult = result;\n }\n\n return this._streamResult;\n }\n\n private createSystemCallback<K extends keyof t.ClientCallbacks>(\n clientCallbacks: t.ClientCallbacks,\n key: K\n ): t.SystemCallbacks[K] {\n return ((...args: unknown[]) => {\n const clientCallback = clientCallbacks[key];\n if (clientCallback && this.Graph) {\n (clientCallback as (...args: unknown[]) => void)(this.Graph, ...args);\n }\n }) as t.SystemCallbacks[K];\n }\n\n getCallbacks(clientCallbacks: t.ClientCallbacks): t.SystemCallbacks {\n return {\n [Callback.TOOL_ERROR]: this.createSystemCallback(\n clientCallbacks,\n Callback.TOOL_ERROR\n ),\n [Callback.TOOL_START]: this.createSystemCallback(\n clientCallbacks,\n Callback.TOOL_START\n ),\n [Callback.TOOL_END]: this.createSystemCallback(\n clientCallbacks,\n Callback.TOOL_END\n ),\n };\n }\n\n async generateTitle({\n provider,\n inputText,\n contentParts,\n titlePrompt,\n clientOptions,\n chainOptions,\n skipLanguage,\n titleMethod = TitleMethod.COMPLETION,\n titlePromptTemplate,\n }: t.RunTitleOptions): Promise<{ language?: string; title?: string }> {\n if (\n chainOptions != null &&\n isPresent(process.env.LANGFUSE_SECRET_KEY) &&\n isPresent(process.env.LANGFUSE_PUBLIC_KEY) &&\n isPresent(process.env.LANGFUSE_BASE_URL)\n ) {\n const userId = chainOptions.configurable?.user_id;\n const sessionId = chainOptions.configurable?.thread_id;\n const titleContext = this.Graph?.agentContexts.get(\n this.Graph.defaultAgentId\n );\n const traceMetadata = {\n messageId: 'title-' + this.id,\n agentName: titleContext?.name,\n };\n const handler = new CallbackHandler({\n userId,\n sessionId,\n traceMetadata,\n });\n chainOptions.callbacks = (\n (chainOptions.callbacks as t.ProvidedCallbacks) ?? []\n ).concat([handler]);\n }\n\n const convoTemplate = PromptTemplate.fromTemplate(\n titlePromptTemplate ?? 'User: {input}\\nAI: {output}'\n );\n\n const response = contentParts\n .map((part) => {\n if (part?.type === 'text') return part.text;\n return '';\n })\n .join('\\n');\n\n const model = initializeModel({\n provider,\n clientOptions,\n }) as t.ChatModelInstance;\n\n if (\n isOpenAILike(provider) &&\n (model instanceof ChatOpenAI || model instanceof AzureChatOpenAI)\n ) {\n model.temperature = (clientOptions as t.OpenAIClientOptions | undefined)\n ?.temperature as number;\n model.topP = (clientOptions as t.OpenAIClientOptions | undefined)\n ?.topP as number;\n model.frequencyPenalty = (\n clientOptions as t.OpenAIClientOptions | undefined\n )?.frequencyPenalty as number;\n model.presencePenalty = (\n clientOptions as t.OpenAIClientOptions | undefined\n )?.presencePenalty as number;\n model.n = (clientOptions as t.OpenAIClientOptions | undefined)\n ?.n as number;\n }\n\n const convoToTitleInput = new RunnableLambda({\n func: (\n promptValue: StringPromptValue\n ): { convo: string; inputText: string; skipLanguage?: boolean } => ({\n convo: promptValue.value,\n inputText,\n skipLanguage,\n }),\n }).withConfig({ runName: 'ConvoTransform' });\n\n const titleChain =\n titleMethod === TitleMethod.COMPLETION\n ? await createCompletionTitleRunnable(model, titlePrompt)\n : await createTitleRunnable(model, titlePrompt);\n\n /** Pipes `convoTemplate` -> `transformer` -> `titleChain` */\n const fullChain = convoTemplate\n .withConfig({ runName: 'ConvoTemplate' })\n .pipe(convoToTitleInput)\n .pipe(titleChain)\n .withConfig({ runName: 'TitleChain' });\n\n const invokeConfig = Object.assign({}, chainOptions, {\n run_id: this.id,\n runId: this.id,\n });\n\n try {\n return await fullChain.invoke(\n { input: inputText, output: response },\n invokeConfig\n );\n } catch (_e) {\n // Fallback: strip callbacks to avoid EventStream tracer errors in certain environments\n // But preserve langfuse handler if it exists\n const langfuseHandler = (\n invokeConfig.callbacks as t.ProvidedCallbacks\n )?.find((cb) => cb instanceof CallbackHandler);\n const { callbacks: _cb, ...rest } = invokeConfig;\n const safeConfig = Object.assign({}, rest, {\n callbacks: langfuseHandler ? [langfuseHandler] : [],\n });\n return await fullChain.invoke(\n { input: inputText, output: response },\n safeConfig as Partial<RunnableConfig>\n );\n }\n }\n}\n\nfunction findLastMessageOfType(\n messages: BaseMessage[],\n type: string\n): BaseMessage | undefined {\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i].getType() === type) {\n return messages[i];\n }\n }\n return undefined;\n}\n\nfunction extractPromptText(message: BaseMessage): string {\n const content = message.content;\n if (typeof content === 'string') {\n return content;\n }\n if (!Array.isArray(content)) {\n return String(content);\n }\n const parts: string[] = [];\n for (const block of content) {\n if (\n typeof block === 'object' &&\n 'type' in block &&\n block.type === 'text' &&\n 'text' in block &&\n typeof block.text === 'string'\n ) {\n parts.push(block.text);\n }\n }\n return parts.join('\\n');\n}\n"],"names":["ChatOpenAI","AzureChatOpenAI"],"mappings":"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"}
|
|
@@ -1,3 +1,42 @@
|
|
|
1
|
+
const VALID_TRIGGER_TYPES = [
|
|
2
|
+
'token_ratio',
|
|
3
|
+
'remaining_tokens',
|
|
4
|
+
'messages_to_refine',
|
|
5
|
+
];
|
|
6
|
+
/**
|
|
7
|
+
* Upper bound on the dedup set for unrecognized trigger types. Bounds memory in
|
|
8
|
+
* case a caller threads dynamic/user-provided strings through `trigger.type`.
|
|
9
|
+
* Well above the handful of legit misconfigurations a process would ever see.
|
|
10
|
+
*/
|
|
11
|
+
const MAX_WARNED_TRIGGER_TYPES = 32;
|
|
12
|
+
const warnedUnrecognizedTriggerTypes = new Set();
|
|
13
|
+
/**
|
|
14
|
+
* Warn (once per process, per unrecognized type) when the configured trigger
|
|
15
|
+
* type is something the runtime does not evaluate. Without this, a misconfigured
|
|
16
|
+
* `trigger.type` silently disables summarization with no visible signal.
|
|
17
|
+
*
|
|
18
|
+
* The dedup set is size-capped; on overflow we evict the oldest entry (Set
|
|
19
|
+
* preserves insertion order) so we keep bounded memory and still warn on
|
|
20
|
+
* recently-seen types.
|
|
21
|
+
*/
|
|
22
|
+
function warnUnrecognizedTriggerType(type) {
|
|
23
|
+
if (warnedUnrecognizedTriggerTypes.has(type)) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (warnedUnrecognizedTriggerTypes.size >= MAX_WARNED_TRIGGER_TYPES) {
|
|
27
|
+
const oldest = warnedUnrecognizedTriggerTypes.values().next().value;
|
|
28
|
+
if (oldest !== undefined) {
|
|
29
|
+
warnedUnrecognizedTriggerTypes.delete(oldest);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
warnedUnrecognizedTriggerTypes.add(type);
|
|
33
|
+
console.warn(`[shouldTriggerSummarization] Unrecognized trigger.type: "${type}". ` +
|
|
34
|
+
`Summarization will not fire. Valid values: ${VALID_TRIGGER_TYPES.join(', ')}.`);
|
|
35
|
+
}
|
|
36
|
+
/** For tests only. Resets the dedup set so warnings can be observed again. */
|
|
37
|
+
function _resetUnrecognizedTriggerWarnings() {
|
|
38
|
+
warnedUnrecognizedTriggerTypes.clear();
|
|
39
|
+
}
|
|
1
40
|
/**
|
|
2
41
|
* Determines whether summarization should be triggered based on the configured trigger
|
|
3
42
|
* and current context state.
|
|
@@ -66,8 +105,9 @@ function shouldTriggerSummarization(params) {
|
|
|
66
105
|
return messagesToRefineCount >= triggerValue;
|
|
67
106
|
}
|
|
68
107
|
// Unrecognized trigger type: cannot evaluate, do not fire.
|
|
108
|
+
warnUnrecognizedTriggerType(trigger.type);
|
|
69
109
|
return false;
|
|
70
110
|
}
|
|
71
111
|
|
|
72
|
-
export { shouldTriggerSummarization };
|
|
112
|
+
export { _resetUnrecognizedTriggerWarnings, shouldTriggerSummarization };
|
|
73
113
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../src/summarization/index.ts"],"sourcesContent":["import type { SummarizationTrigger } from '@/types';\n\n/**\n * Determines whether summarization should be triggered based on the configured trigger\n * and current context state.\n *\n * Default behavior (no trigger configured): returns `true` whenever messages were pruned.\n * This is intentional — when an admin enables summarization without specifying a trigger,\n * summarization fires on any context overflow that causes pruning.\n *\n * When a trigger IS configured but required runtime data is missing (e.g., maxContextTokens\n * unavailable for a token_ratio trigger), returns `false` — we cannot evaluate the condition,\n * so we do not fire.\n */\nexport function shouldTriggerSummarization(params: {\n trigger?: SummarizationTrigger;\n maxContextTokens?: number;\n prePruneContextTokens?: number;\n remainingContextTokens?: number;\n messagesToRefineCount: number;\n}): boolean {\n const {\n trigger,\n maxContextTokens,\n prePruneContextTokens,\n remainingContextTokens,\n messagesToRefineCount,\n } = params;\n if (messagesToRefineCount <= 0) {\n return false;\n }\n\n // No trigger configured: default to always summarize when pruning occurs.\n if (!trigger || typeof trigger.type !== 'string') {\n return true;\n }\n\n const triggerValue =\n typeof trigger.value === 'number' && Number.isFinite(trigger.value)\n ? trigger.value\n : undefined;\n\n // Trigger configured but value is invalid: cannot evaluate, do not fire.\n if (triggerValue == null) {\n return false;\n }\n\n if (trigger.type === 'token_ratio') {\n const prePruneRemainingContextTokens =\n maxContextTokens != null &&\n Number.isFinite(maxContextTokens) &&\n maxContextTokens > 0 &&\n prePruneContextTokens != null &&\n Number.isFinite(prePruneContextTokens)\n ? maxContextTokens - prePruneContextTokens\n : undefined;\n const effectiveRemainingContextTokens =\n prePruneRemainingContextTokens ?? remainingContextTokens;\n\n // Required runtime data missing: cannot evaluate token_ratio, do not fire.\n if (\n maxContextTokens == null ||\n !Number.isFinite(maxContextTokens) ||\n maxContextTokens <= 0 ||\n effectiveRemainingContextTokens == null ||\n !Number.isFinite(effectiveRemainingContextTokens)\n ) {\n return false;\n }\n const usedRatio = 1 - effectiveRemainingContextTokens / maxContextTokens;\n return usedRatio >= triggerValue;\n }\n\n if (trigger.type === 'remaining_tokens') {\n const prePruneRemainingContextTokens =\n maxContextTokens != null &&\n Number.isFinite(maxContextTokens) &&\n maxContextTokens > 0 &&\n prePruneContextTokens != null &&\n Number.isFinite(prePruneContextTokens)\n ? maxContextTokens - prePruneContextTokens\n : undefined;\n const effectiveRemainingContextTokens =\n prePruneRemainingContextTokens ?? remainingContextTokens;\n\n // Required runtime data missing: cannot evaluate remaining_tokens, do not fire.\n if (\n effectiveRemainingContextTokens == null ||\n !Number.isFinite(effectiveRemainingContextTokens)\n ) {\n return false;\n }\n return effectiveRemainingContextTokens <= triggerValue;\n }\n\n if (trigger.type === 'messages_to_refine') {\n return messagesToRefineCount >= triggerValue;\n }\n\n // Unrecognized trigger type: cannot evaluate, do not fire.\n return false;\n}\n"],"names":[],"mappings":"AAEA;;;;;;;;;;;AAWG;AACG,SAAU,0BAA0B,CAAC,MAM1C,EAAA;AACC,IAAA,MAAM,EACJ,OAAO,EACP,gBAAgB,EAChB,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,GACtB,GAAG,MAAM;AACV,IAAA,IAAI,qBAAqB,IAAI,CAAC,EAAE;AAC9B,QAAA,OAAO,KAAK;IACd;;IAGA,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE;AAChD,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,MAAM,YAAY,GAChB,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK;UAC9D,OAAO,CAAC;UACR,SAAS;;AAGf,IAAA,IAAI,YAAY,IAAI,IAAI,EAAE;AACxB,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,EAAE;AAClC,QAAA,MAAM,8BAA8B,GAClC,gBAAgB,IAAI,IAAI;AACxB,YAAA,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC;AACjC,YAAA,gBAAgB,GAAG,CAAC;AACpB,YAAA,qBAAqB,IAAI,IAAI;AAC7B,YAAA,MAAM,CAAC,QAAQ,CAAC,qBAAqB;cACjC,gBAAgB,GAAG;cACnB,SAAS;AACf,QAAA,MAAM,+BAA+B,GACnC,8BAA8B,IAAI,sBAAsB;;QAG1D,IACE,gBAAgB,IAAI,IAAI;AACxB,YAAA,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC;AAClC,YAAA,gBAAgB,IAAI,CAAC;AACrB,YAAA,+BAA+B,IAAI,IAAI;AACvC,YAAA,CAAC,MAAM,CAAC,QAAQ,CAAC,+BAA+B,CAAC,EACjD;AACA,YAAA,OAAO,KAAK;QACd;AACA,QAAA,MAAM,SAAS,GAAG,CAAC,GAAG,+BAA+B,GAAG,gBAAgB;QACxE,OAAO,SAAS,IAAI,YAAY;IAClC;AAEA,IAAA,IAAI,OAAO,CAAC,IAAI,KAAK,kBAAkB,EAAE;AACvC,QAAA,MAAM,8BAA8B,GAClC,gBAAgB,IAAI,IAAI;AACxB,YAAA,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC;AACjC,YAAA,gBAAgB,GAAG,CAAC;AACpB,YAAA,qBAAqB,IAAI,IAAI;AAC7B,YAAA,MAAM,CAAC,QAAQ,CAAC,qBAAqB;cACjC,gBAAgB,GAAG;cACnB,SAAS;AACf,QAAA,MAAM,+BAA+B,GACnC,8BAA8B,IAAI,sBAAsB;;QAG1D,IACE,+BAA+B,IAAI,IAAI;AACvC,YAAA,CAAC,MAAM,CAAC,QAAQ,CAAC,+BAA+B,CAAC,EACjD;AACA,YAAA,OAAO,KAAK;QACd;QACA,OAAO,+BAA+B,IAAI,YAAY;IACxD;AAEA,IAAA,IAAI,OAAO,CAAC,IAAI,KAAK,oBAAoB,EAAE;QACzC,OAAO,qBAAqB,IAAI,YAAY;IAC9C;;AAGA,IAAA,OAAO,KAAK;AACd;;;;"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../src/summarization/index.ts"],"sourcesContent":["import type { SummarizationTrigger } from '@/types';\n\nconst VALID_TRIGGER_TYPES = [\n 'token_ratio',\n 'remaining_tokens',\n 'messages_to_refine',\n] as const;\n\n/**\n * Upper bound on the dedup set for unrecognized trigger types. Bounds memory in\n * case a caller threads dynamic/user-provided strings through `trigger.type`.\n * Well above the handful of legit misconfigurations a process would ever see.\n */\nconst MAX_WARNED_TRIGGER_TYPES = 32;\n\nconst warnedUnrecognizedTriggerTypes = new Set<string>();\n\n/**\n * Warn (once per process, per unrecognized type) when the configured trigger\n * type is something the runtime does not evaluate. Without this, a misconfigured\n * `trigger.type` silently disables summarization with no visible signal.\n *\n * The dedup set is size-capped; on overflow we evict the oldest entry (Set\n * preserves insertion order) so we keep bounded memory and still warn on\n * recently-seen types.\n */\nfunction warnUnrecognizedTriggerType(type: string): void {\n if (warnedUnrecognizedTriggerTypes.has(type)) {\n return;\n }\n if (warnedUnrecognizedTriggerTypes.size >= MAX_WARNED_TRIGGER_TYPES) {\n const oldest = warnedUnrecognizedTriggerTypes.values().next().value;\n if (oldest !== undefined) {\n warnedUnrecognizedTriggerTypes.delete(oldest);\n }\n }\n warnedUnrecognizedTriggerTypes.add(type);\n console.warn(\n `[shouldTriggerSummarization] Unrecognized trigger.type: \"${type}\". ` +\n `Summarization will not fire. Valid values: ${VALID_TRIGGER_TYPES.join(', ')}.`\n );\n}\n\n/** For tests only. Resets the dedup set so warnings can be observed again. */\nexport function _resetUnrecognizedTriggerWarnings(): void {\n warnedUnrecognizedTriggerTypes.clear();\n}\n\n/**\n * Determines whether summarization should be triggered based on the configured trigger\n * and current context state.\n *\n * Default behavior (no trigger configured): returns `true` whenever messages were pruned.\n * This is intentional — when an admin enables summarization without specifying a trigger,\n * summarization fires on any context overflow that causes pruning.\n *\n * When a trigger IS configured but required runtime data is missing (e.g., maxContextTokens\n * unavailable for a token_ratio trigger), returns `false` — we cannot evaluate the condition,\n * so we do not fire.\n */\nexport function shouldTriggerSummarization(params: {\n trigger?: SummarizationTrigger;\n maxContextTokens?: number;\n prePruneContextTokens?: number;\n remainingContextTokens?: number;\n messagesToRefineCount: number;\n}): boolean {\n const {\n trigger,\n maxContextTokens,\n prePruneContextTokens,\n remainingContextTokens,\n messagesToRefineCount,\n } = params;\n if (messagesToRefineCount <= 0) {\n return false;\n }\n\n // No trigger configured: default to always summarize when pruning occurs.\n if (!trigger || typeof trigger.type !== 'string') {\n return true;\n }\n\n const triggerValue =\n typeof trigger.value === 'number' && Number.isFinite(trigger.value)\n ? trigger.value\n : undefined;\n\n // Trigger configured but value is invalid: cannot evaluate, do not fire.\n if (triggerValue == null) {\n return false;\n }\n\n if (trigger.type === 'token_ratio') {\n const prePruneRemainingContextTokens =\n maxContextTokens != null &&\n Number.isFinite(maxContextTokens) &&\n maxContextTokens > 0 &&\n prePruneContextTokens != null &&\n Number.isFinite(prePruneContextTokens)\n ? maxContextTokens - prePruneContextTokens\n : undefined;\n const effectiveRemainingContextTokens =\n prePruneRemainingContextTokens ?? remainingContextTokens;\n\n // Required runtime data missing: cannot evaluate token_ratio, do not fire.\n if (\n maxContextTokens == null ||\n !Number.isFinite(maxContextTokens) ||\n maxContextTokens <= 0 ||\n effectiveRemainingContextTokens == null ||\n !Number.isFinite(effectiveRemainingContextTokens)\n ) {\n return false;\n }\n const usedRatio = 1 - effectiveRemainingContextTokens / maxContextTokens;\n return usedRatio >= triggerValue;\n }\n\n if (trigger.type === 'remaining_tokens') {\n const prePruneRemainingContextTokens =\n maxContextTokens != null &&\n Number.isFinite(maxContextTokens) &&\n maxContextTokens > 0 &&\n prePruneContextTokens != null &&\n Number.isFinite(prePruneContextTokens)\n ? maxContextTokens - prePruneContextTokens\n : undefined;\n const effectiveRemainingContextTokens =\n prePruneRemainingContextTokens ?? remainingContextTokens;\n\n // Required runtime data missing: cannot evaluate remaining_tokens, do not fire.\n if (\n effectiveRemainingContextTokens == null ||\n !Number.isFinite(effectiveRemainingContextTokens)\n ) {\n return false;\n }\n return effectiveRemainingContextTokens <= triggerValue;\n }\n\n if (trigger.type === 'messages_to_refine') {\n return messagesToRefineCount >= triggerValue;\n }\n\n // Unrecognized trigger type: cannot evaluate, do not fire.\n warnUnrecognizedTriggerType(trigger.type);\n return false;\n}\n"],"names":[],"mappings":"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"}
|