@librechat/agents 3.3.3 → 3.3.5
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/common/constants.cjs +21 -0
- package/dist/cjs/common/constants.cjs.map +1 -1
- package/dist/cjs/events.cjs +10 -1
- package/dist/cjs/events.cjs.map +1 -1
- package/dist/cjs/graphs/Graph.cjs +793 -111
- 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/hooks/HookRegistry.cjs +25 -0
- package/dist/cjs/hooks/HookRegistry.cjs.map +1 -1
- package/dist/cjs/hooks/index.cjs +12 -0
- package/dist/cjs/hooks/index.cjs.map +1 -1
- package/dist/cjs/hooks/types.cjs +1 -0
- package/dist/cjs/hooks/types.cjs.map +1 -1
- package/dist/cjs/langfuse.cjs +8 -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 +38 -13
- 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 +331 -5
- 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/llm/preempt.cjs +132 -0
- package/dist/cjs/llm/preempt.cjs.map +1 -0
- package/dist/cjs/main.cjs +36 -5
- package/dist/cjs/messages/alternation.cjs +92 -0
- package/dist/cjs/messages/alternation.cjs.map +1 -0
- 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 +290 -60
- package/dist/cjs/messages/format.cjs.map +1 -1
- package/dist/cjs/messages/handoffCue.cjs +63 -0
- package/dist/cjs/messages/handoffCue.cjs.map +1 -0
- package/dist/cjs/messages/index.cjs +4 -1
- package/dist/cjs/messages/injected.cjs +60 -0
- package/dist/cjs/messages/injected.cjs.map +1 -0
- package/dist/cjs/messages/prune.cjs +503 -127
- package/dist/cjs/messages/prune.cjs.map +1 -1
- package/dist/cjs/run.cjs +80 -7
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/session/handlers.cjs +18 -9
- package/dist/cjs/session/handlers.cjs.map +1 -1
- package/dist/cjs/stream.cjs +35 -10
- 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 +56 -63
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/search/keenable-scraper.cjs +90 -0
- package/dist/cjs/tools/search/keenable-scraper.cjs.map +1 -0
- package/dist/cjs/tools/search/tool.cjs +9 -1
- package/dist/cjs/tools/search/tool.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/common/constants.mjs +19 -1
- package/dist/esm/common/constants.mjs.map +1 -1
- package/dist/esm/events.mjs +10 -1
- package/dist/esm/events.mjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +798 -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/hooks/HookRegistry.mjs +25 -0
- package/dist/esm/hooks/HookRegistry.mjs.map +1 -1
- package/dist/esm/hooks/index.mjs +12 -1
- package/dist/esm/hooks/index.mjs.map +1 -1
- package/dist/esm/hooks/types.mjs +1 -0
- package/dist/esm/hooks/types.mjs.map +1 -1
- package/dist/esm/langfuse.mjs +9 -1
- 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 +38 -13
- 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 +332 -8
- 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/llm/preempt.mjs +131 -0
- package/dist/esm/llm/preempt.mjs.map +1 -0
- package/dist/esm/main.mjs +14 -11
- package/dist/esm/messages/alternation.mjs +91 -0
- package/dist/esm/messages/alternation.mjs.map +1 -0
- 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 +290 -61
- package/dist/esm/messages/format.mjs.map +1 -1
- package/dist/esm/messages/handoffCue.mjs +61 -0
- package/dist/esm/messages/handoffCue.mjs.map +1 -0
- package/dist/esm/messages/index.mjs +4 -1
- package/dist/esm/messages/injected.mjs +60 -0
- package/dist/esm/messages/injected.mjs.map +1 -0
- package/dist/esm/messages/prune.mjs +500 -128
- package/dist/esm/messages/prune.mjs.map +1 -1
- package/dist/esm/run.mjs +80 -7
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/session/handlers.mjs +19 -10
- package/dist/esm/session/handlers.mjs.map +1 -1
- package/dist/esm/stream.mjs +34 -11
- 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 +56 -63
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/search/keenable-scraper.mjs +88 -0
- package/dist/esm/tools/search/keenable-scraper.mjs.map +1 -0
- package/dist/esm/tools/search/tool.mjs +9 -1
- package/dist/esm/tools/search/tool.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/common/constants.d.ts +18 -0
- package/dist/types/graphs/Graph.d.ts +139 -2
- package/dist/types/hooks/HookRegistry.d.ts +15 -0
- package/dist/types/hooks/index.d.ts +12 -1
- package/dist/types/hooks/types.d.ts +45 -6
- package/dist/types/index.d.ts +1 -1
- package/dist/types/llm/invoke.d.ts +34 -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/llm/preempt.d.ts +40 -0
- package/dist/types/messages/alternation.d.ts +23 -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/handoffCue.d.ts +40 -0
- package/dist/types/messages/index.d.ts +3 -0
- package/dist/types/messages/injected.d.ts +3 -0
- package/dist/types/messages/prune.d.ts +16 -12
- package/dist/types/run.d.ts +7 -0
- package/dist/types/stream.d.ts +14 -0
- package/dist/types/tools/ToolNode.d.ts +0 -7
- package/dist/types/tools/search/keenable-scraper.d.ts +15 -0
- package/dist/types/tools/search/types.d.ts +31 -2
- package/dist/types/types/graph.d.ts +8 -1
- package/dist/types/types/run.d.ts +65 -0
- package/dist/types/types/stream.d.ts +1 -26
- package/dist/types/utils/tokens.d.ts +7 -0
- package/dist/types/utils/toolContent.d.ts +107 -0
- package/package.json +1 -1
- package/src/__tests__/stream.eagerEventExecution.test.ts +74 -0
- package/src/agents/AgentContext.ts +1 -0
- package/src/{splitStream.test.ts → aggregator.test.ts} +59 -666
- package/src/common/constants.ts +21 -0
- package/src/events.ts +15 -1
- package/src/graphs/Graph.ts +1261 -198
- package/src/graphs/MultiAgentGraph.ts +6 -1
- package/src/graphs/__tests__/Graph.contextOverflow.test.ts +1139 -4
- package/src/graphs/__tests__/Graph.preemptSignal.test.ts +126 -0
- package/src/hooks/HookRegistry.ts +40 -0
- package/src/hooks/__tests__/preemptBoundary.test.ts +152 -0
- package/src/hooks/index.ts +16 -2
- package/src/hooks/types.ts +47 -3
- package/src/index.ts +1 -1
- package/src/langfuse.ts +26 -1
- 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 +131 -1
- package/src/llm/bedrock/utils/message_inputs.ts +100 -24
- package/src/llm/bedrock/utils/toolResultCachePoint.test.ts +15 -0
- package/src/llm/google/utils/common.test.ts +75 -9
- package/src/llm/google/utils/common.ts +34 -3
- package/src/llm/invoke.alternation.test.ts +87 -0
- package/src/llm/invoke.handoffCue.test.ts +112 -0
- package/src/llm/invoke.test.ts +488 -0
- package/src/llm/invoke.ts +611 -8
- 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/llm/preempt.test.ts +323 -0
- package/src/llm/preempt.ts +178 -0
- package/src/messages/__tests__/observationMasking.test.ts +93 -2
- package/src/messages/alternation.test.ts +212 -0
- package/src/messages/alternation.ts +112 -0
- 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 +454 -91
- package/src/messages/formatAgentMessages.steer.test.ts +267 -0
- package/src/messages/formatAgentMessages.test.ts +604 -14
- package/src/messages/formatAgentMessages.tools.test.ts +103 -0
- package/src/messages/handoffCue.test.ts +96 -0
- package/src/messages/handoffCue.ts +78 -0
- package/src/messages/index.ts +3 -0
- package/src/messages/injected.test.ts +90 -0
- package/src/messages/injected.ts +74 -0
- package/src/messages/prune.ts +996 -183
- package/src/run.ts +91 -6
- package/src/scripts/preempt-probe.ts +330 -0
- package/src/scripts/preempt-scenarios.ts +388 -0
- package/src/session/handlers.ts +32 -12
- package/src/specs/handoffCue.test.ts +165 -0
- package/src/specs/langfuse-callbacks.test.ts +352 -2
- package/src/specs/preemptSeal.test.ts +309 -0
- 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.dispatch.test.ts +63 -0
- package/src/stream.ts +59 -23
- package/src/summarization/__tests__/node.test.ts +77 -0
- package/src/summarization/node.ts +46 -18
- package/src/tools/ToolNode.ts +150 -99
- 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/search/keenable-scraper.test.ts +153 -0
- package/src/tools/search/keenable-scraper.ts +137 -0
- package/src/tools/search/tool.ts +13 -2
- package/src/tools/search/types.ts +50 -3
- package/src/tools/toolOutputReferences.ts +6 -0
- package/src/types/graph.ts +12 -1
- package/src/types/run.ts +67 -0
- package/src/types/stream.ts +1 -42
- 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
- package/dist/cjs/splitStream.cjs +0 -151
- package/dist/cjs/splitStream.cjs.map +0 -1
- package/dist/esm/splitStream.mjs +0 -150
- package/dist/esm/splitStream.mjs.map +0 -1
- package/dist/types/mockStream.d.ts +0 -32
- package/dist/types/splitStream.d.ts +0 -37
- package/src/mockStream.ts +0 -99
- package/src/splitStream.ts +0 -234
|
@@ -57,21 +57,30 @@ function createRunHandlers(params) {
|
|
|
57
57
|
const toolEndHandler = new require_events.ToolEndHandler();
|
|
58
58
|
const modelEndHandler = new require_events.ModelEndHandler();
|
|
59
59
|
emitEvent(createEvent("run.started"));
|
|
60
|
+
/**
|
|
61
|
+
* Forwards to the host's own handler, so it inherits that handler's
|
|
62
|
+
* capability. Branding matters because this wrapper is installed on EVERY
|
|
63
|
+
* session run and merged last: without it, a host that registered
|
|
64
|
+
* `new ChatModelStreamHandler()` would silently lose the sealing opt-out
|
|
65
|
+
* that registration is supposed to buy.
|
|
66
|
+
*/
|
|
67
|
+
const streamWrapper = { handle: async (event, data, metadata, graph) => {
|
|
68
|
+
await callUserHandler({
|
|
69
|
+
userHandlers: params.userHandlers,
|
|
70
|
+
event,
|
|
71
|
+
data,
|
|
72
|
+
metadata,
|
|
73
|
+
graph
|
|
74
|
+
});
|
|
75
|
+
} };
|
|
76
|
+
if (require_stream.dispatchesChatModelStream(params.userHandlers?.["on_chat_model_stream"])) Object.defineProperty(streamWrapper, require_stream.SDK_STREAM_DISPATCH, { value: true });
|
|
60
77
|
return {
|
|
61
78
|
contentParts,
|
|
62
79
|
steps,
|
|
63
80
|
usage,
|
|
64
81
|
events,
|
|
65
82
|
handlers: {
|
|
66
|
-
["on_chat_model_stream"]:
|
|
67
|
-
await callUserHandler({
|
|
68
|
-
userHandlers: params.userHandlers,
|
|
69
|
-
event,
|
|
70
|
-
data,
|
|
71
|
-
metadata,
|
|
72
|
-
graph
|
|
73
|
-
});
|
|
74
|
-
} },
|
|
83
|
+
["on_chat_model_stream"]: streamWrapper,
|
|
75
84
|
["on_chat_model_end"]: { handle: async (event, data, metadata, graph) => {
|
|
76
85
|
await modelEndHandler.handle(event, data, metadata, graph);
|
|
77
86
|
updateUsage(usage, data);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.cjs","names":["createTimestamp","toJsonValue","createContentAggregator","ToolEndHandler","ModelEndHandler"],"sources":["../../../src/session/handlers.ts"],"sourcesContent":["import type { UsageMetadata } from '@langchain/core/messages';\nimport type {\n AgentSessionHandlersResult,\n AgentSessionStreamEvent,\n AgentSessionUsage,\n} from './types';\nimport type * as t from '@/types';\nimport { ModelEndHandler, ToolEndHandler } from '@/events';\nimport { toJsonValue } from './messageSerialization';\nimport { createContentAggregator } from '@/stream';\nimport { createTimestamp } from './ids';\nimport { GraphEvents } from '@/common';\n\ntype CompletedRunStepResult =\n | t.ToolEndEvent\n | (t.SummaryCompleted & { id: string; index: number });\n\nfunction isToolCompletion(\n result: CompletedRunStepResult\n): result is t.ToolEndEvent {\n return 'tool_call' in result;\n}\n\nfunction createEventFactory(params: {\n runId: string;\n threadId: string;\n}): (\n type: AgentSessionStreamEvent['type'],\n data?: unknown\n) => AgentSessionStreamEvent {\n let sequence = 0;\n return (type, data) => ({\n type,\n sequence: sequence++,\n runId: params.runId,\n threadId: params.threadId,\n timestamp: createTimestamp(),\n ...(typeof data !== 'undefined' ? { data: toJsonValue(data) } : {}),\n });\n}\n\nfunction getTokenCount(value: number | null | undefined): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0;\n}\n\nfunction updateUsage(usage: AgentSessionUsage, data: t.ModelEndData): void {\n const metadata = data?.output?.usage_metadata as\n | Partial<UsageMetadata>\n | undefined;\n if (!metadata) {\n return;\n }\n const inputTokens = getTokenCount(metadata.input_tokens);\n const outputTokens = getTokenCount(metadata.output_tokens);\n const totalTokens =\n metadata.total_tokens == null\n ? inputTokens + outputTokens\n : getTokenCount(metadata.total_tokens);\n usage.inputTokens += inputTokens;\n usage.outputTokens += outputTokens;\n usage.totalTokens += totalTokens;\n}\n\nasync function callUserHandler(params: {\n userHandlers?: Record<string, t.EventHandler>;\n event: string;\n data: Parameters<t.EventHandler['handle']>[1];\n metadata?: Record<string, unknown>;\n graph?: Parameters<t.EventHandler['handle']>[3];\n}): Promise<void> {\n const handler = params.userHandlers?.[params.event];\n if (!handler) {\n return;\n }\n await handler.handle(\n params.event,\n params.data,\n params.metadata,\n params.graph\n );\n}\n\nexport function createRunHandlers(params: {\n runId: string;\n threadId: string;\n userHandlers?: Record<string, t.EventHandler>;\n onEvent?: (event: AgentSessionStreamEvent) => void;\n}): AgentSessionHandlersResult {\n const { contentParts, aggregateContent } = createContentAggregator();\n const steps: t.RunStep[] = [];\n const usage: AgentSessionUsage = {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n };\n const events: AgentSessionStreamEvent[] = [];\n const createEvent = createEventFactory({\n runId: params.runId,\n threadId: params.threadId,\n });\n const emitEvent = (event: AgentSessionStreamEvent): void => {\n events.push(event);\n params.onEvent?.(event);\n };\n const toolEndHandler = new ToolEndHandler();\n const modelEndHandler = new ModelEndHandler();\n\n emitEvent(createEvent('run.started'));\n\n const handlers: Record<string, t.EventHandler> = {\n [GraphEvents.CHAT_MODEL_STREAM]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.CHAT_MODEL_END]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n await modelEndHandler.handle(\n event,\n data as t.ModelEndData,\n metadata,\n graph\n );\n updateUsage(usage, data as t.ModelEndData);\n emitEvent(createEvent('usage.updated', usage));\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.TOOL_END]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n await toolEndHandler.handle(\n event,\n data as t.StreamEventData,\n metadata,\n graph\n );\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_RUN_STEP]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n const runStep = data as t.RunStep;\n steps.push(runStep);\n aggregateContent({ event: GraphEvents.ON_RUN_STEP, data: runStep });\n if (runStep.stepDetails.type === 'tool_calls') {\n emitEvent(createEvent('tool.started', runStep));\n }\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_RUN_STEP_DELTA]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n const delta = data as t.RunStepDeltaEvent;\n aggregateContent({ event: GraphEvents.ON_RUN_STEP_DELTA, data: delta });\n emitEvent(createEvent('tool.delta', delta));\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_RUN_STEP_COMPLETED]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n const completed = data as unknown as { result: CompletedRunStepResult };\n aggregateContent({\n event: GraphEvents.ON_RUN_STEP_COMPLETED,\n data: completed as { result: t.ToolEndEvent },\n });\n if (isToolCompletion(completed.result)) {\n emitEvent(createEvent('tool.completed', completed));\n }\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_MESSAGE_DELTA]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n const delta = data as t.MessageDeltaEvent;\n aggregateContent({ event: GraphEvents.ON_MESSAGE_DELTA, data: delta });\n emitEvent(createEvent('message.delta', delta));\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_REASONING_DELTA]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n const delta = data as t.ReasoningDeltaEvent;\n aggregateContent({\n event: GraphEvents.ON_REASONING_DELTA,\n data: delta,\n });\n emitEvent(createEvent('reasoning.delta', delta));\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_SUMMARIZE_DELTA]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n aggregateContent({\n event: GraphEvents.ON_SUMMARIZE_DELTA,\n data: data as t.SummarizeDeltaData,\n });\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_SUMMARIZE_COMPLETE]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n aggregateContent({\n event: GraphEvents.ON_SUMMARIZE_COMPLETE,\n data: data as t.SummarizeCompleteEvent,\n });\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n };\n\n return { contentParts, steps, usage, events, handlers };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"handlers.cjs","names":["createTimestamp","toJsonValue","createContentAggregator","ToolEndHandler","ModelEndHandler","dispatchesChatModelStream","SDK_STREAM_DISPATCH"],"sources":["../../../src/session/handlers.ts"],"sourcesContent":["import type { UsageMetadata } from '@langchain/core/messages';\nimport type {\n AgentSessionHandlersResult,\n AgentSessionStreamEvent,\n AgentSessionUsage,\n} from './types';\nimport type * as t from '@/types';\nimport { ModelEndHandler, ToolEndHandler } from '@/events';\nimport { toJsonValue } from './messageSerialization';\nimport {\n createContentAggregator,\n dispatchesChatModelStream,\n SDK_STREAM_DISPATCH,\n} from '@/stream';\nimport { createTimestamp } from './ids';\nimport { GraphEvents } from '@/common';\n\ntype CompletedRunStepResult =\n | t.ToolEndEvent\n | (t.SummaryCompleted & { id: string; index: number });\n\nfunction isToolCompletion(\n result: CompletedRunStepResult\n): result is t.ToolEndEvent {\n return 'tool_call' in result;\n}\n\nfunction createEventFactory(params: {\n runId: string;\n threadId: string;\n}): (\n type: AgentSessionStreamEvent['type'],\n data?: unknown\n) => AgentSessionStreamEvent {\n let sequence = 0;\n return (type, data) => ({\n type,\n sequence: sequence++,\n runId: params.runId,\n threadId: params.threadId,\n timestamp: createTimestamp(),\n ...(typeof data !== 'undefined' ? { data: toJsonValue(data) } : {}),\n });\n}\n\nfunction getTokenCount(value: number | null | undefined): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0;\n}\n\nfunction updateUsage(usage: AgentSessionUsage, data: t.ModelEndData): void {\n const metadata = data?.output?.usage_metadata as\n | Partial<UsageMetadata>\n | undefined;\n if (!metadata) {\n return;\n }\n const inputTokens = getTokenCount(metadata.input_tokens);\n const outputTokens = getTokenCount(metadata.output_tokens);\n const totalTokens =\n metadata.total_tokens == null\n ? inputTokens + outputTokens\n : getTokenCount(metadata.total_tokens);\n usage.inputTokens += inputTokens;\n usage.outputTokens += outputTokens;\n usage.totalTokens += totalTokens;\n}\n\nasync function callUserHandler(params: {\n userHandlers?: Record<string, t.EventHandler>;\n event: string;\n data: Parameters<t.EventHandler['handle']>[1];\n metadata?: Record<string, unknown>;\n graph?: Parameters<t.EventHandler['handle']>[3];\n}): Promise<void> {\n const handler = params.userHandlers?.[params.event];\n if (!handler) {\n return;\n }\n await handler.handle(\n params.event,\n params.data,\n params.metadata,\n params.graph\n );\n}\n\nexport function createRunHandlers(params: {\n runId: string;\n threadId: string;\n userHandlers?: Record<string, t.EventHandler>;\n onEvent?: (event: AgentSessionStreamEvent) => void;\n}): AgentSessionHandlersResult {\n const { contentParts, aggregateContent } = createContentAggregator();\n const steps: t.RunStep[] = [];\n const usage: AgentSessionUsage = {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n };\n const events: AgentSessionStreamEvent[] = [];\n const createEvent = createEventFactory({\n runId: params.runId,\n threadId: params.threadId,\n });\n const emitEvent = (event: AgentSessionStreamEvent): void => {\n events.push(event);\n params.onEvent?.(event);\n };\n const toolEndHandler = new ToolEndHandler();\n const modelEndHandler = new ModelEndHandler();\n\n emitEvent(createEvent('run.started'));\n\n /**\n * Forwards to the host's own handler, so it inherits that handler's\n * capability. Branding matters because this wrapper is installed on EVERY\n * session run and merged last: without it, a host that registered\n * `new ChatModelStreamHandler()` would silently lose the sealing opt-out\n * that registration is supposed to buy.\n */\n const streamWrapper: t.EventHandler = {\n handle: async (event, data, metadata, graph): Promise<void> => {\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n };\n if (\n dispatchesChatModelStream(\n params.userHandlers?.[GraphEvents.CHAT_MODEL_STREAM]\n )\n ) {\n Object.defineProperty(streamWrapper, SDK_STREAM_DISPATCH, { value: true });\n }\n\n const handlers: Record<string, t.EventHandler> = {\n [GraphEvents.CHAT_MODEL_STREAM]: streamWrapper,\n [GraphEvents.CHAT_MODEL_END]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n await modelEndHandler.handle(\n event,\n data as t.ModelEndData,\n metadata,\n graph\n );\n updateUsage(usage, data as t.ModelEndData);\n emitEvent(createEvent('usage.updated', usage));\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.TOOL_END]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n await toolEndHandler.handle(\n event,\n data as t.StreamEventData,\n metadata,\n graph\n );\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_RUN_STEP]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n const runStep = data as t.RunStep;\n steps.push(runStep);\n aggregateContent({ event: GraphEvents.ON_RUN_STEP, data: runStep });\n if (runStep.stepDetails.type === 'tool_calls') {\n emitEvent(createEvent('tool.started', runStep));\n }\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_RUN_STEP_DELTA]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n const delta = data as t.RunStepDeltaEvent;\n aggregateContent({ event: GraphEvents.ON_RUN_STEP_DELTA, data: delta });\n emitEvent(createEvent('tool.delta', delta));\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_RUN_STEP_COMPLETED]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n const completed = data as unknown as { result: CompletedRunStepResult };\n aggregateContent({\n event: GraphEvents.ON_RUN_STEP_COMPLETED,\n data: completed as { result: t.ToolEndEvent },\n });\n if (isToolCompletion(completed.result)) {\n emitEvent(createEvent('tool.completed', completed));\n }\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_MESSAGE_DELTA]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n const delta = data as t.MessageDeltaEvent;\n aggregateContent({ event: GraphEvents.ON_MESSAGE_DELTA, data: delta });\n emitEvent(createEvent('message.delta', delta));\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_REASONING_DELTA]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n const delta = data as t.ReasoningDeltaEvent;\n aggregateContent({\n event: GraphEvents.ON_REASONING_DELTA,\n data: delta,\n });\n emitEvent(createEvent('reasoning.delta', delta));\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_SUMMARIZE_DELTA]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n aggregateContent({\n event: GraphEvents.ON_SUMMARIZE_DELTA,\n data: data as t.SummarizeDeltaData,\n });\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n [GraphEvents.ON_SUMMARIZE_COMPLETE]: {\n handle: async (event, data, metadata, graph): Promise<void> => {\n aggregateContent({\n event: GraphEvents.ON_SUMMARIZE_COMPLETE,\n data: data as t.SummarizeCompleteEvent,\n });\n await callUserHandler({\n userHandlers: params.userHandlers,\n event,\n data,\n metadata,\n graph,\n });\n },\n },\n };\n\n return { contentParts, steps, usage, events, handlers };\n}\n"],"mappings":"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"}
|
package/dist/cjs/stream.cjs
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
const require_enum = require("./common/enum.cjs");
|
|
2
2
|
require("./common/index.cjs");
|
|
3
|
-
const require_ids = require("./messages/ids.cjs");
|
|
4
3
|
const require_truncation = require("./utils/truncation.cjs");
|
|
4
|
+
const require_toolContent = require("./utils/toolContent.cjs");
|
|
5
|
+
const require_ids = require("./messages/ids.cjs");
|
|
5
6
|
const require_events = require("./utils/events.cjs");
|
|
6
7
|
require("./messages/index.cjs");
|
|
7
8
|
const require_llm = require("./utils/llm.cjs");
|
|
@@ -355,7 +356,10 @@ async function dispatchEagerToolCompletions(args) {
|
|
|
355
356
|
if (graph.eagerEventToolExecutions.get(result.toolCallId) !== record) continue;
|
|
356
357
|
const stepId = record.request.stepId ?? graph.toolCallStepIds.get(result.toolCallId) ?? "";
|
|
357
358
|
if (stepId === "") continue;
|
|
358
|
-
|
|
359
|
+
let output;
|
|
360
|
+
if (result.status === "error") output = require_truncation.truncateToolResultContent(`Error: ${result.errorMessage ?? "Unknown error"}\n Please fix your mistakes.`, maxToolResultChars);
|
|
361
|
+
else if (typeof result.content === "string") output = require_truncation.truncateToolResultContent(result.content, maxToolResultChars);
|
|
362
|
+
else output = require_toolContent.serializeStructuredValueBounded(result.content, maxToolResultChars).content;
|
|
359
363
|
try {
|
|
360
364
|
if (await require_events.safeDispatchCustomEvent("on_run_step_completed", { result: {
|
|
361
365
|
id: stepId,
|
|
@@ -363,7 +367,7 @@ async function dispatchEagerToolCompletions(args) {
|
|
|
363
367
|
type: "tool_call",
|
|
364
368
|
eager: true,
|
|
365
369
|
tool_call: {
|
|
366
|
-
args:
|
|
370
|
+
args: require_toolContent.serializeToolContentBounded(record.request.args, maxToolResultChars),
|
|
367
371
|
name: record.toolName,
|
|
368
372
|
id: result.toolCallId,
|
|
369
373
|
output,
|
|
@@ -566,7 +570,25 @@ function shouldSkipLateOpenRouterReasoningChunk({ chunk, agentContext, graph, me
|
|
|
566
570
|
metadata
|
|
567
571
|
});
|
|
568
572
|
}
|
|
573
|
+
/**
|
|
574
|
+
* Brands a handler as one that dispatches content parts for the SDK — either
|
|
575
|
+
* `ChatModelStreamHandler` itself or a wrapper forwarding to one.
|
|
576
|
+
*
|
|
577
|
+
* Identity alone is not a usable contract here. Hosts compose and wrap
|
|
578
|
+
* handlers (`composeEventHandlers`, `createRunHandlers`), and every wrapper
|
|
579
|
+
* fails `instanceof` while still driving the same dispatch. A brand survives
|
|
580
|
+
* wrapping, so "does this handler own content-part dispatch" can be answered
|
|
581
|
+
* about a value the SDK did not construct.
|
|
582
|
+
*/
|
|
583
|
+
const SDK_STREAM_DISPATCH = Symbol.for("@librechat/agents:chatModelStreamDispatch");
|
|
584
|
+
/** True when `handler` is, or forwards to, the SDK's stream dispatcher. */
|
|
585
|
+
function dispatchesChatModelStream(handler) {
|
|
586
|
+
if (handler == null) return false;
|
|
587
|
+
if (handler instanceof ChatModelStreamHandler) return true;
|
|
588
|
+
return Reflect.get(handler, SDK_STREAM_DISPATCH) === true;
|
|
589
|
+
}
|
|
569
590
|
var ChatModelStreamHandler = class {
|
|
591
|
+
[SDK_STREAM_DISPATCH] = true;
|
|
570
592
|
async handle(event, data, metadata, graph) {
|
|
571
593
|
if (!graph) throw new Error("Graph not found");
|
|
572
594
|
if (!graph.config) throw new Error("Config not found in graph");
|
|
@@ -789,9 +811,12 @@ function createContentAggregator() {
|
|
|
789
811
|
/** Physical append cursor; event/chunk indices are correlation keys, not array offsets. */
|
|
790
812
|
let nextContentIndex = 0;
|
|
791
813
|
const contentMetaMap = /* @__PURE__ */ new Map();
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
814
|
+
/** A delta's content may carry several parts (e.g. Google server-side tool
|
|
815
|
+
* chunks emit multiple reasoning entries at once); every entry must reach
|
|
816
|
+
* the step's slot, in order, or streamed text is silently lost. */
|
|
817
|
+
const getDeltaContentParts = (content) => {
|
|
818
|
+
if (content == null) return [];
|
|
819
|
+
return Array.isArray(content) ? content : [content];
|
|
795
820
|
};
|
|
796
821
|
const indexContentPart = (index, contentPart) => {
|
|
797
822
|
if (contentPart == null) return;
|
|
@@ -1022,8 +1047,7 @@ function createContentAggregator() {
|
|
|
1022
1047
|
console.warn("No run step or runId found for message delta event");
|
|
1023
1048
|
return;
|
|
1024
1049
|
}
|
|
1025
|
-
const contentPart
|
|
1026
|
-
if (contentPart != null) updateContent(runStep.index, contentPart);
|
|
1050
|
+
for (const contentPart of getDeltaContentParts(messageDelta.delta.content)) updateContent(runStep.index, contentPart);
|
|
1027
1051
|
} else if (event === "on_agent_update" && data?.agent_update) {
|
|
1028
1052
|
const contentPart = data;
|
|
1029
1053
|
if (!contentPart) return;
|
|
@@ -1042,8 +1066,7 @@ function createContentAggregator() {
|
|
|
1042
1066
|
console.warn("No run step or runId found for reasoning delta event");
|
|
1043
1067
|
return;
|
|
1044
1068
|
}
|
|
1045
|
-
const contentPart
|
|
1046
|
-
if (contentPart != null) updateContent(runStep.index, contentPart);
|
|
1069
|
+
for (const contentPart of getDeltaContentParts(reasoningDelta.delta.content)) updateContent(runStep.index, contentPart);
|
|
1047
1070
|
} else if (event === "on_run_step_delta") {
|
|
1048
1071
|
const runStepDelta = data;
|
|
1049
1072
|
const runStep = stepMap.get(runStepDelta.id);
|
|
@@ -1131,7 +1154,9 @@ function createContentAggregator() {
|
|
|
1131
1154
|
}
|
|
1132
1155
|
//#endregion
|
|
1133
1156
|
exports.ChatModelStreamHandler = ChatModelStreamHandler;
|
|
1157
|
+
exports.SDK_STREAM_DISPATCH = SDK_STREAM_DISPATCH;
|
|
1134
1158
|
exports.createContentAggregator = createContentAggregator;
|
|
1159
|
+
exports.dispatchesChatModelStream = dispatchesChatModelStream;
|
|
1135
1160
|
exports.getChunkContent = getChunkContent;
|
|
1136
1161
|
|
|
1137
1162
|
//# sourceMappingURL=stream.cjs.map
|