@librechat/agents 3.2.35 → 3.2.37
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 +75 -2
- package/dist/cjs/agents/AgentContext.cjs.map +1 -1
- package/dist/cjs/agents/projection.cjs +25 -0
- package/dist/cjs/agents/projection.cjs.map +1 -0
- package/dist/cjs/graphs/Graph.cjs +10 -26
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/langfuse.cjs +16 -5
- package/dist/cjs/langfuse.cjs.map +1 -1
- package/dist/cjs/langfuseToolOutputTracing.cjs +7 -0
- package/dist/cjs/langfuseToolOutputTracing.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +118 -7
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/utils/message_inputs.cjs +44 -4
- package/dist/cjs/llm/bedrock/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/main.cjs +7 -0
- package/dist/cjs/messages/budget.cjs +23 -0
- package/dist/cjs/messages/budget.cjs.map +1 -0
- package/dist/cjs/messages/cache.cjs +184 -0
- package/dist/cjs/messages/cache.cjs.map +1 -1
- package/dist/cjs/messages/index.cjs +1 -0
- package/dist/cjs/summarization/node.cjs +1 -1
- package/dist/cjs/summarization/node.cjs.map +1 -1
- package/dist/cjs/tools/search/format.cjs +91 -2
- package/dist/cjs/tools/search/format.cjs.map +1 -1
- package/dist/cjs/tools/search/tool.cjs +4 -3
- package/dist/cjs/tools/search/tool.cjs.map +1 -1
- package/dist/cjs/tools/toolOutputReferences.cjs +28 -14
- package/dist/cjs/tools/toolOutputReferences.cjs.map +1 -1
- package/dist/esm/agents/AgentContext.mjs +76 -3
- package/dist/esm/agents/AgentContext.mjs.map +1 -1
- package/dist/esm/agents/projection.mjs +25 -0
- package/dist/esm/agents/projection.mjs.map +1 -0
- package/dist/esm/graphs/Graph.mjs +9 -25
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/langfuse.mjs +16 -5
- package/dist/esm/langfuse.mjs.map +1 -1
- package/dist/esm/langfuseToolOutputTracing.mjs +7 -0
- package/dist/esm/langfuseToolOutputTracing.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs +118 -7
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/bedrock/utils/message_inputs.mjs +44 -4
- package/dist/esm/llm/bedrock/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/main.mjs +4 -2
- package/dist/esm/messages/budget.mjs +23 -0
- package/dist/esm/messages/budget.mjs.map +1 -0
- package/dist/esm/messages/cache.mjs +182 -1
- package/dist/esm/messages/cache.mjs.map +1 -1
- package/dist/esm/messages/index.mjs +1 -0
- package/dist/esm/summarization/node.mjs +2 -2
- package/dist/esm/summarization/node.mjs.map +1 -1
- package/dist/esm/tools/search/format.mjs +91 -2
- package/dist/esm/tools/search/format.mjs.map +1 -1
- package/dist/esm/tools/search/tool.mjs +4 -3
- package/dist/esm/tools/search/tool.mjs.map +1 -1
- package/dist/esm/tools/toolOutputReferences.mjs +28 -14
- package/dist/esm/tools/toolOutputReferences.mjs.map +1 -1
- package/dist/types/agents/AgentContext.d.ts +30 -1
- package/dist/types/agents/projection.d.ts +26 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/messages/budget.d.ts +11 -0
- package/dist/types/messages/cache.d.ts +47 -0
- package/dist/types/messages/index.d.ts +1 -0
- package/dist/types/tools/search/format.d.ts +4 -1
- package/dist/types/tools/search/types.d.ts +7 -0
- package/dist/types/types/graph.d.ts +2 -0
- package/package.json +2 -1
- package/src/agents/AgentContext.ts +105 -4
- package/src/agents/__tests__/AgentContext.test.ts +232 -9
- package/src/agents/__tests__/projection.test.ts +73 -0
- package/src/agents/projection.ts +46 -0
- package/src/graphs/Graph.ts +66 -65
- package/src/index.ts +3 -0
- package/src/langfuse.ts +38 -4
- package/src/langfuseToolOutputTracing.ts +18 -0
- package/src/llm/anthropic/utils/cross-provider-reasoning.test.ts +317 -0
- package/src/llm/anthropic/utils/message_inputs.ts +209 -19
- package/src/llm/anthropic/utils/stripPrefillCache.test.ts +111 -0
- package/src/llm/bedrock/utils/cross-provider-reasoning.test.ts +131 -0
- package/src/llm/bedrock/utils/message_inputs.test.ts +129 -0
- package/src/llm/bedrock/utils/message_inputs.ts +81 -4
- package/src/llm/bedrock/utils/toolResultCachePoint.test.ts +103 -0
- package/src/messages/budget.ts +32 -0
- package/src/messages/cache.tail.test.ts +340 -0
- package/src/messages/cache.ts +267 -1
- package/src/messages/index.ts +1 -0
- package/src/messages/tailCacheConversion.test.ts +161 -0
- package/src/scripts/bench-prompt-cache.ts +479 -0
- package/src/specs/langfuse-config.test.ts +69 -2
- package/src/specs/langfuse-metadata.test.ts +44 -0
- package/src/specs/langfuse-tool-output-tracing.test.ts +6 -0
- package/src/summarization/node.ts +2 -2
- package/src/tools/__tests__/annotateMessagesForLLM.test.ts +50 -0
- package/src/tools/search/format.test.ts +242 -0
- package/src/tools/search/format.ts +122 -5
- package/src/tools/search/tool.ts +5 -1
- package/src/tools/search/types.ts +7 -0
- package/src/tools/toolOutputReferences.ts +34 -20
- package/src/types/graph.ts +2 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Graph.mjs","names":["CustomToolNode","messagesStateReducer"],"sources":["../../../src/graphs/Graph.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport { nanoid } from 'nanoid';\nimport { tool } from '@langchain/core/tools';\nimport { ToolNode } from '@langchain/langgraph/prebuilt';\nimport { Runnable, RunnableConfig } from '@langchain/core/runnables';\nimport { ToolMessage, AIMessageChunk } from '@langchain/core/messages';\nimport { START, END, StateGraph, Annotation } from '@langchain/langgraph';\nimport type {\n UsageMetadata,\n BaseMessage,\n MessageContent,\n} from '@langchain/core/messages';\nimport type { ToolCall } from '@langchain/core/messages/tool';\nimport type { HookRegistry } from '@/hooks';\nimport type * as t from '@/types';\nimport {\n formatAnthropicArtifactContent,\n ensureThinkingBlockInMessages,\n convertMessagesToContent,\n sanitizeOrphanToolBlocks,\n extractToolDiscoveries,\n addBedrockCacheControl,\n formatArtifactPayload,\n enforceOriginalContentCap,\n formatContentStrings,\n isLegacyConvertible,\n createPruneMessages,\n addCacheControl,\n getMessageId,\n makeIsDeferred,\n partitionAndMarkAnthropicToolCache,\n} from '@/messages';\nimport {\n resolveLangfuseConfig,\n shouldTraceToolNodeForLangfuse,\n withLangfuseToolOutputTracingConfig,\n} from '@/langfuseToolOutputTracing';\nimport {\n createLangfuseHandler,\n createLangfuseTraceMetadata,\n disposeLangfuseHandler,\n isLangfuseCallbackHandler,\n} from '@/langfuse';\nimport {\n resetIfNotEmpty,\n isAnthropicLike,\n isOpenAILike,\n isGoogleLike,\n apportionTokenCounts,\n joinKeys,\n sleep,\n} from '@/utils';\nimport {\n GraphNodeKeys,\n ContentTypes,\n GraphEvents,\n Providers,\n StepTypes,\n} from '@/common';\nimport {\n appendCallbacks,\n findCallback,\n type CallbackEntry,\n} from '@/utils/callbacks';\nimport { partitionAndMarkOpenRouterToolCache } from '@/llm/openrouter/toolCache';\nimport { ToolNode as CustomToolNode, toolsCondition } from '@/tools/ToolNode';\nimport { createLocalCodingToolBundle } from '@/tools/local/LocalCodingTools';\nimport { SubagentExecutor, resolveSubagentConfigs } from '@/tools/subagent';\nimport { ToolOutputReferenceRegistry } from '@/tools/toolOutputReferences';\nimport { partitionAndMarkBedrockToolCache } from '@/llm/bedrock/toolCache';\nimport { safeDispatchCustomEvent, emitAgentLog } from '@/utils/events';\nimport { createCloudflareCodingToolBundle } from '@/tools/cloudflare';\nimport { attemptInvoke, tryFallbackProviders } from '@/llm/invoke';\nimport { buildSubagentToolParams } from '@/tools/SubagentTool';\nimport { initializeLangfuseTracing } from '@/instrumentation';\nimport { shouldTriggerSummarization } from '@/summarization';\nimport { resolveLocalToolsForBinding } from '@/tools/local';\nimport { createSummarizeNode } from '@/summarization/node';\nimport { messagesStateReducer } from '@/messages/reducer';\nimport { createSchemaOnlyTools } from '@/tools/schema';\nimport { AgentContext } from '@/agents/AgentContext';\nimport { createFakeStreamingLLM } from '@/llm/fake';\nimport { handleToolCalls } from '@/tools/handlers';\nimport { isThinkingEnabled } from '@/llm/request';\nimport { initializeModel } from '@/llm/init';\nimport { HandlerRegistry } from '@/events';\nimport { ChatOpenAI } from '@/llm/openai';\n\nconst { AGENT, TOOLS, SUMMARIZE } = GraphNodeKeys;\n\n/** Minimum relative variance before calibrated toolSchemaTokens overrides current value. */\nconst CALIBRATION_VARIANCE_THRESHOLD = 0.15;\n\n/**\n * Start index of the span post-prune formatters can mutate in place: the\n * trailing tool batch plus its owning AI message (artifact formatting touches\n * every tool result after the last AI tool call; Bedrock rewrites the AI\n * message before a trailing tool result). Capped so the usage-snapshot\n * recount stays constant-cost.\n */\nfunction trailingMutationStart(messages: BaseMessage[]): number {\n const MAX_SPAN = 16;\n let index = messages.length - 1;\n while (\n index >= 0 &&\n messages[index]?.getType() === 'tool' &&\n messages.length - index < MAX_SPAN\n ) {\n index--;\n }\n return Math.max(0, Math.min(index, messages.length - 2));\n}\n\n/**\n * Re-derives the breakdown fields coupled to the calibrated budget math so\n * the snapshot stays internally consistent: the aggregate\n * `instructionTokens`/`availableForMessages` reflect the pruner's effective\n * (calibrated) overhead — component fields remain local estimates — and\n * `messageTokens` mirrors `contextBudget - instructions - remaining`.\n */\nfunction syncBudgetDerivedFields(usage: t.ContextUsageEvent): void {\n const { breakdown, contextBudget, effectiveInstructionTokens } = usage;\n if (effectiveInstructionTokens == null) {\n return;\n }\n breakdown.instructionTokens = effectiveInstructionTokens;\n if (contextBudget == null) {\n return;\n }\n breakdown.availableForMessages = Math.max(\n 0,\n contextBudget - effectiveInstructionTokens\n );\n if (usage.remainingContextTokens == null) {\n return;\n }\n breakdown.messageTokens = Math.max(\n 0,\n contextBudget - effectiveInstructionTokens - usage.remainingContextTokens\n );\n}\n\ntype ReasoningKey = 'reasoning_content' | 'reasoning';\ntype ReasoningSummary = { summary?: Array<{ text?: string }> };\ntype ReasoningDetail = { type?: string; text?: string };\n\nfunction getHandlerDispatchedEventKey(\n eventName: string,\n stepId: string\n): string {\n return `${eventName}:${stepId}`;\n}\n\nfunction getReasoningText(\n value: string | Partial<ReasoningSummary> | null | undefined\n): string | undefined {\n if (typeof value === 'string') {\n return value !== '' ? value : undefined;\n }\n const summaryText = value?.summary\n ?.map((summary) => summary.text ?? '')\n .filter((text) => text !== '')\n .join('');\n return summaryText != null && summaryText !== '' ? summaryText : undefined;\n}\n\nfunction getReasoningDetailsText(\n value: ReasoningDetail[] | null | undefined\n): string | undefined {\n if (!Array.isArray(value)) {\n return undefined;\n }\n const reasoningText = value\n .filter((detail) => detail.type === 'reasoning.text')\n .map((detail) => detail.text ?? '')\n .filter((text) => text !== '')\n .join('');\n return reasoningText !== '' ? reasoningText : undefined;\n}\n\nfunction getResponseReasoningContent({\n responseMessage,\n reasoningKey,\n}: {\n responseMessage?: Partial<AIMessageChunk>;\n reasoningKey: ReasoningKey;\n}): string | undefined {\n const additionalKwargs = responseMessage?.additional_kwargs;\n if (additionalKwargs == null) {\n return undefined;\n }\n\n const keyedReasoning = getReasoningText(\n additionalKwargs[reasoningKey] as\n | string\n | Partial<ReasoningSummary>\n | null\n | undefined\n );\n if (keyedReasoning != null) {\n return keyedReasoning;\n }\n\n const reasoningContent = getReasoningText(\n additionalKwargs.reasoning_content as\n | string\n | Partial<ReasoningSummary>\n | null\n | undefined\n );\n if (reasoningContent != null) {\n return reasoningContent;\n }\n\n const reasoning = getReasoningText(\n additionalKwargs.reasoning as\n | string\n | Partial<ReasoningSummary>\n | null\n | undefined\n );\n if (reasoning != null) {\n return reasoning;\n }\n\n return getReasoningDetailsText(\n additionalKwargs.reasoning_details as ReasoningDetail[] | null | undefined\n );\n}\n\nfunction isTextMessageContentPart(\n contentPart: MessageContent[number] | t.MessageContentComplex\n): boolean {\n return (\n typeof contentPart === 'object' &&\n 'type' in contentPart &&\n typeof contentPart.type === 'string' &&\n contentPart.type.startsWith('text')\n );\n}\n\nfunction isGoogleServerSideToolMessageContentPart(\n contentPart: MessageContent[number] | t.MessageContentComplex\n): boolean {\n return (\n typeof contentPart === 'object' &&\n 'type' in contentPart &&\n (contentPart.type === 'toolCall' || contentPart.type === 'toolResponse')\n );\n}\n\nfunction hasGoogleServerSideToolDeltaContent(\n provider: Providers | undefined,\n content: t.MessageDelta['content']\n): content is t.MessageContentComplex[] {\n return (\n isGoogleLike(provider) &&\n Array.isArray(content) &&\n content.some((contentPart) =>\n isGoogleServerSideToolMessageContentPart(contentPart)\n )\n );\n}\n\nfunction getMessageDeltaContent(\n provider: Providers | undefined,\n content: MessageContent | undefined\n): t.MessageDelta['content'] | undefined {\n if (content == null) {\n return undefined;\n }\n if (typeof content === 'string') {\n return content !== ''\n ? [{ type: ContentTypes.TEXT, text: content }]\n : undefined;\n }\n if (content.length === 0) {\n return undefined;\n }\n\n const hasGoogleServerSideToolPart =\n isGoogleLike(provider) &&\n content.some((contentPart) =>\n isGoogleServerSideToolMessageContentPart(contentPart)\n );\n if (content.every((contentPart) => isTextMessageContentPart(contentPart))) {\n return content as t.MessageDelta['content'];\n }\n if (!hasGoogleServerSideToolPart) {\n return undefined;\n }\n const messageContent = content.filter(\n (contentPart) =>\n isTextMessageContentPart(contentPart) ||\n isGoogleServerSideToolMessageContentPart(contentPart)\n );\n return messageContent.length > 0\n ? (messageContent as t.MessageDelta['content'])\n : undefined;\n}\n\nfunction hasTextDeltaContent(\n content: t.MessageDelta['content'] | undefined\n): boolean {\n if (content == null) {\n return false;\n }\n return content.some((contentPart) => {\n if (contentPart.type?.startsWith(ContentTypes.TEXT) !== true) {\n return false;\n }\n const text = (contentPart as Partial<{ text: string }>).text;\n return typeof text === 'string' && text !== '';\n });\n}\n\nfunction hasReasoningDeltaContent(\n content: t.ReasoningDelta['content'] | undefined\n): boolean {\n if (content == null) {\n return false;\n }\n return content.some(\n (contentPart) =>\n contentPart.type === ContentTypes.THINK && contentPart.think !== ''\n );\n}\n\nfunction getCurrentStepIds({\n graph,\n metadata,\n}: {\n graph: Graph<t.BaseGraphState>;\n metadata: Record<string, unknown>;\n}): string[] {\n const baseStepKey = graph.getStepBaseKey(metadata);\n const currentStepIds: string[] = [];\n for (const [stepKey, stepIds] of graph.stepKeyIds) {\n if (stepKey !== baseStepKey && !stepKey.startsWith(`${baseStepKey}_`)) {\n continue;\n }\n currentStepIds.push(...stepIds);\n }\n return currentStepIds;\n}\n\nfunction hasCurrentTextDeltaStep({\n graph,\n metadata,\n}: {\n graph: Graph<t.BaseGraphState>;\n metadata: Record<string, unknown>;\n}): boolean {\n return getCurrentStepIds({ graph, metadata }).some((stepId) =>\n graph.messageStepHasTextDeltas.has(stepId)\n );\n}\n\nfunction hasCurrentReasoningDeltaStep({\n graph,\n metadata,\n}: {\n graph: Graph<t.BaseGraphState>;\n metadata: Record<string, unknown>;\n}): boolean {\n return getCurrentStepIds({ graph, metadata }).some((stepId) =>\n graph.reasoningStepHasDeltas.has(stepId)\n );\n}\n\nfunction clearCurrentDeltaStepMarkers({\n graph,\n metadata,\n}: {\n graph: Graph<t.BaseGraphState>;\n metadata: Record<string, unknown>;\n}): void {\n for (const stepId of getCurrentStepIds({ graph, metadata })) {\n graph.messageStepHasTextDeltas.delete(stepId);\n graph.reasoningStepHasDeltas.delete(stepId);\n }\n}\n\nasync function dispatchMessageCreationStep({\n graph,\n stepKey,\n messageId,\n metadata,\n}: {\n graph: Graph<t.BaseGraphState>;\n stepKey: string;\n messageId: string;\n metadata: Record<string, unknown>;\n}): Promise<string> {\n await graph.dispatchRunStep(\n stepKey,\n {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: { message_id: messageId },\n },\n metadata\n );\n return graph.getStepIdByKey(stepKey);\n}\n\nasync function dispatchTextMessageContent({\n graph,\n stepKey,\n provider,\n content,\n metadata,\n}: {\n graph: Graph<t.BaseGraphState>;\n stepKey: string;\n provider?: Providers;\n content: t.MessageDelta['content'];\n metadata: Record<string, unknown>;\n}): Promise<boolean> {\n const messageId = getMessageId(stepKey, graph) ?? '';\n if (!messageId) {\n return false;\n }\n if (hasGoogleServerSideToolDeltaContent(provider, content)) {\n for (const contentPart of content) {\n const stepId = await dispatchMessageCreationStep({\n graph,\n stepKey,\n messageId,\n metadata,\n });\n await graph.dispatchMessageDelta(\n stepId,\n { content: [contentPart] },\n metadata\n );\n }\n return true;\n }\n const stepId = await dispatchMessageCreationStep({\n graph,\n stepKey,\n messageId,\n metadata,\n });\n await graph.dispatchMessageDelta(stepId, { content }, metadata);\n return true;\n}\n\nasync function dispatchReasoningContent({\n graph,\n agentContext,\n reasoningContent,\n metadata,\n}: {\n graph: Graph<t.BaseGraphState>;\n agentContext: AgentContext;\n reasoningContent: string;\n metadata: Record<string, unknown>;\n}): Promise<boolean> {\n const previousTokenType = agentContext.currentTokenType;\n const previousTokenTypeSwitch = agentContext.tokenTypeSwitch;\n const previousTransitionCount = agentContext.reasoningTransitionCount;\n\n agentContext.currentTokenType = ContentTypes.THINK;\n agentContext.tokenTypeSwitch = 'reasoning';\n\n const stepKey = graph.getStepKey(metadata);\n const messageId = getMessageId(stepKey, graph) ?? '';\n if (!messageId) {\n agentContext.currentTokenType = previousTokenType;\n agentContext.tokenTypeSwitch = previousTokenTypeSwitch;\n agentContext.reasoningTransitionCount = previousTransitionCount;\n return false;\n }\n\n await graph.dispatchRunStep(\n stepKey,\n {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: { message_id: messageId },\n },\n metadata\n );\n const stepId = graph.getStepIdByKey(stepKey);\n await graph.dispatchReasoningDelta(\n stepId,\n {\n content: [{ type: ContentTypes.THINK, think: reasoningContent }],\n },\n metadata\n );\n return true;\n}\n\nfunction markPostReasoningContent(agentContext: AgentContext): void {\n if (\n agentContext.tokenTypeSwitch !== 'reasoning' ||\n agentContext.currentTokenType === ContentTypes.TEXT\n ) {\n return;\n }\n agentContext.currentTokenType = ContentTypes.TEXT;\n agentContext.tokenTypeSwitch = 'content';\n agentContext.reasoningTransitionCount++;\n}\n\nfunction getDispatchableFinalReasoningContent({\n agentContext,\n responseReasoningContent,\n hasStreamedTextDeltaStep,\n hasStreamedReasoningDeltaStep,\n}: {\n agentContext: AgentContext;\n responseReasoningContent: string | undefined;\n hasStreamedTextDeltaStep: boolean;\n hasStreamedReasoningDeltaStep: boolean;\n}): string | undefined {\n if (responseReasoningContent == null || hasStreamedReasoningDeltaStep) {\n return undefined;\n }\n if (\n agentContext.provider === Providers.OPENROUTER &&\n hasStreamedTextDeltaStep\n ) {\n return undefined;\n }\n return responseReasoningContent;\n}\n\nexport abstract class Graph<\n T extends t.BaseGraphState = t.BaseGraphState,\n _TNodeName extends string = string,\n> {\n abstract resetValues(): void;\n abstract initializeTools({\n currentTools,\n currentToolMap,\n }: {\n currentTools?: t.GraphTools;\n currentToolMap?: t.ToolMap;\n }): CustomToolNode<T> | ToolNode<T>;\n abstract getRunMessages(): BaseMessage[] | undefined;\n abstract getContentParts(): t.MessageContentComplex[] | undefined;\n abstract generateStepId(stepKey: string): [string, number];\n abstract getKeyList(\n metadata: Record<string, unknown> | undefined\n ): (string | number | undefined)[];\n abstract getStepBaseKey(\n metadata: Record<string, unknown> | undefined\n ): string;\n abstract getStepKey(metadata: Record<string, unknown> | undefined): string;\n abstract checkKeyList(keyList: (string | number | undefined)[]): boolean;\n abstract getStepIdByKey(stepKey: string, index?: number): string;\n abstract getRunStep(stepId: string): t.RunStep | undefined;\n abstract dispatchRunStep(\n stepKey: string,\n stepDetails: t.StepDetails,\n metadata?: Record<string, unknown>\n ): Promise<string>;\n abstract dispatchRunStepDelta(\n id: string,\n delta: t.ToolCallDelta,\n metadata?: Record<string, unknown>\n ): Promise<void>;\n abstract dispatchMessageDelta(\n id: string,\n delta: t.MessageDelta,\n metadata?: Record<string, unknown>\n ): Promise<void>;\n abstract dispatchReasoningDelta(\n stepId: string,\n delta: t.ReasoningDelta,\n metadata?: Record<string, unknown>\n ): Promise<void>;\n abstract createCallModel(\n agentId?: string,\n currentModel?: t.ChatModel\n ): (\n state: t.AgentSubgraphState,\n config?: RunnableConfig\n ) => Promise<Partial<t.AgentSubgraphState>>;\n messageStepHasTextDeltas: Set<string> = new Set();\n messageStepHasToolCalls: Map<string, boolean> = new Map();\n messageIdsByStepKey: Map<string, string> = new Map();\n prelimMessageIdsByStepKey: Map<string, string> = new Map();\n config: RunnableConfig | undefined;\n contentData: t.RunStep[] = [];\n stepKeyIds: Map<string, string[]> = new Map<string, string[]>();\n contentIndexMap: Map<string, number> = new Map();\n toolCallStepIds: Map<string, string> = new Map();\n /**\n * Step IDs dispatched through the handler registry during this run.\n * Event echo suppression is tracked separately so repeated deltas for\n * the same step are scoped to the active custom event dispatch.\n */\n handlerDispatchedStepIds: Set<string> = new Set();\n reasoningStepHasDeltas: Set<string> = new Set();\n protected handlerDispatchedEventCounts: Map<string, number> = new Map();\n signal?: AbortSignal;\n /** Set of invoked tool call IDs from non-message run steps completed mid-run, if any */\n invokedToolIds?: Set<string>;\n handlerRegistry: HandlerRegistry | undefined;\n /**\n * True when event-driven tool execution can be routed through callbacks even\n * though this graph intentionally does not own the full handler registry.\n * Self-spawned subagent graphs use this shape: their callback forwarder sends\n * `ON_TOOL_EXECUTE` to the parent's handler, while child run-step events stay\n * wrapped as `ON_SUBAGENT_UPDATE` instead of leaking as parent events.\n */\n eventToolExecutionAvailable: boolean = false;\n hookRegistry: HookRegistry | undefined;\n /**\n * Run-scoped HITL configuration. When `humanInTheLoop?.enabled` is\n * `true`, `ToolNode` raises a real `interrupt()` for `PreToolUse`\n * `ask` decisions instead of treating them as a synchronous deny.\n * Threaded from `RunConfig.humanInTheLoop`.\n */\n humanInTheLoop: t.HumanInTheLoopConfig | undefined;\n /**\n * Run-scoped config for the tool output reference registry. Threaded\n * from `RunConfig.toolOutputReferences` down into every ToolNode this\n * graph compiles.\n */\n toolOutputReferences: t.ToolOutputReferencesConfig | undefined;\n /**\n * Run-scoped Langfuse defaults. Per-agent config wins when present.\n */\n langfuse: t.LangfuseConfig | undefined;\n /**\n * Run-scoped opt-in for eager event-driven tool execution. The stream\n * handler may prestart eligible event-driven tools; ToolNode later\n * consumes the settled promises while preserving final ToolMessage order.\n */\n eagerEventToolExecution: t.EagerEventToolExecutionConfig | undefined;\n eagerEventToolExecutions: Map<string, t.EagerEventToolExecution> = new Map();\n eagerEventToolUsageCount: Map<string, number> = new Map();\n private eagerEventToolUsageCountsByAgentId: Map<string, Map<string, number>> =\n new Map();\n eagerEventToolCallChunks: Map<string, t.EagerEventToolCallChunkState> =\n new Map();\n /**\n * Run-scoped execution backend for built-in code tools. Defaults to the\n * remote Code API sandbox when unset.\n */\n toolExecution: t.ToolExecutionConfig | undefined;\n /**\n * Shared registry instance used by every ToolNode compiled from this\n * graph. Lazily constructed on first access so multi-agent graphs\n * produce one registry per run (not one per agent), letting cross-\n * agent `{{tool<i>turn<n>}}` substitutions resolve.\n */\n private _toolOutputRegistry?: ToolOutputReferenceRegistry;\n /**\n * Tool session contexts for automatic state persistence across tool invocations.\n * Keyed by tool name (e.g., Constants.EXECUTE_CODE).\n * Currently supports code execution session tracking (session_id, files).\n */\n sessions: t.ToolSessionMap = new Map();\n\n /**\n * Clears heavy references to allow GC to reclaim memory held by\n * LangGraph's internal config / AsyncLocalStorage RunTree chain.\n * Call after a run completes and content has been extracted.\n */\n clearHeavyState(): void {\n this.config = undefined;\n this.signal = undefined;\n this.contentData = [];\n this.contentIndexMap = new Map();\n this.stepKeyIds = new Map();\n this.toolCallStepIds.clear();\n this.messageIdsByStepKey = new Map();\n this.messageStepHasTextDeltas = new Set();\n this.reasoningStepHasDeltas = new Set();\n this.messageStepHasToolCalls = new Map();\n this.prelimMessageIdsByStepKey = new Map();\n this.invokedToolIds = undefined;\n this.handlerRegistry = undefined;\n this.hookRegistry = undefined;\n this.humanInTheLoop = undefined;\n this.toolOutputReferences = undefined;\n this.eagerEventToolExecution = undefined;\n this.eagerEventToolExecutions.clear();\n this.clearEagerEventToolUsageCounts();\n this.eagerEventToolCallChunks.clear();\n this.toolExecution = undefined;\n this.handlerDispatchedEventCounts.clear();\n /**\n * ToolNodes compiled from this graph captured the registry\n * instance at construction time, so simply dropping the Graph's\n * own reference would leave their captured reference — and every\n * stored `tool<i>turn<n>` entry, plus up to `maxTotalSize` of raw\n * output — alive across subsequent `processStream()` calls. Wipe\n * the registry's contents first so subsequent runs start fresh.\n */\n this._toolOutputRegistry?.clear();\n this._toolOutputRegistry = undefined;\n // NB: `_fileCheckpointer` is intentionally NOT cleared here.\n // `Run.processStream()` calls `clearHeavyState()` in its\n // finally block on natural-completion / error paths — exactly\n // when the host is most likely to want `Run.rewindFiles()` (for\n // rollback after a failed batch). Per-Run isolation is already\n // automatic because each `Run.create()` constructs a brand-new\n // Graph instance, so the next Run gets its own checkpointer\n // without us needing to reset this field. Codex P1 #32: pre-fix\n // the checkpointer was nulled before the caller could reach it.\n // Flush each compiled ToolNode's direct-path turn cache so it\n // doesn't leak across Runs (Codex P2 #33). The cache survives\n // `run()` re-entry by design (resume-stable), but end-of-Run\n // is the right point to reset it.\n for (const node of this._compiledToolNodes) {\n node.clearDirectPathTurns();\n }\n this._compiledToolNodes.clear();\n this.sessions.clear();\n }\n\n getEagerEventToolUsageCount(agentId?: string): Map<string, number> {\n if (agentId == null || agentId === '') {\n return this.eagerEventToolUsageCount;\n }\n let usageCount = this.eagerEventToolUsageCountsByAgentId.get(agentId);\n if (usageCount == null) {\n usageCount = new Map<string, number>();\n this.eagerEventToolUsageCountsByAgentId.set(agentId, usageCount);\n }\n return usageCount;\n }\n\n protected clearEagerEventToolUsageCounts(): void {\n this.eagerEventToolUsageCount.clear();\n for (const usageCount of this.eagerEventToolUsageCountsByAgentId.values()) {\n usageCount.clear();\n }\n }\n\n markHandlerDispatchedEvent(eventName: string, stepId: string): () => void {\n const key = getHandlerDispatchedEventKey(eventName, stepId);\n this.handlerDispatchedEventCounts.set(\n key,\n (this.handlerDispatchedEventCounts.get(key) ?? 0) + 1\n );\n return () => {\n const count = this.handlerDispatchedEventCounts.get(key) ?? 0;\n if (count <= 1) {\n this.handlerDispatchedEventCounts.delete(key);\n return;\n }\n this.handlerDispatchedEventCounts.set(key, count - 1);\n };\n }\n\n hasHandlerDispatchedEvent(eventName: string, stepId: string): boolean {\n const key = getHandlerDispatchedEventKey(eventName, stepId);\n return (this.handlerDispatchedEventCounts.get(key) ?? 0) > 0;\n }\n\n /**\n * Subclass hook to register a freshly compiled ToolNode so\n * `clearHeavyState` can flush its per-Run direct-path turn cache\n * at end-of-Run. Internal — called from `initializeTools` in the\n * concrete graph subclasses.\n */\n protected registerCompiledToolNode(node: {\n clearDirectPathTurns(): void;\n }): void {\n this._compiledToolNodes.add(node);\n }\n\n /**\n * Returns the shared `ToolOutputReferenceRegistry` for this run,\n * constructing it on first access. Returns `undefined` when the\n * feature is disabled. All ToolNodes compiled from this graph share\n * this single instance so cross-agent `{{…}}` references resolve.\n *\n * @internal Public so `attemptInvoke` can read it through the typed\n * `InvokeContext` and project ToolMessages into LLM-facing annotated\n * copies right before each provider call (see\n * `annotateMessagesForLLM`). Host code should not call this directly\n * — registry mutations outside the ToolNode lifecycle break the\n * partitioning, eviction, and turn-counter invariants.\n */\n public getOrCreateToolOutputRegistry():\n | ToolOutputReferenceRegistry\n | undefined {\n if (this.toolOutputReferences?.enabled !== true) {\n return undefined;\n }\n if (this._toolOutputRegistry == null) {\n this._toolOutputRegistry = new ToolOutputReferenceRegistry({\n maxOutputSize: this.toolOutputReferences.maxOutputSize,\n maxTotalSize: this.toolOutputReferences.maxTotalSize,\n });\n }\n return this._toolOutputRegistry;\n }\n\n /**\n * Single per-Run file checkpointer shared across every ToolNode the\n * graph compiles. Lazily constructed when\n * `toolExecution.local.fileCheckpointing === true` or\n * `toolExecution.cloudflare.fileCheckpointing === true` so\n * multi-agent graphs see ONE snapshot store, not one-per-agent.\n * Returns undefined when checkpointing is disabled or a supported\n * coding-tool engine isn't selected. Exposed via\n * `Run.getFileCheckpointer()` / `Run.rewindFiles()`.\n */\n private _fileCheckpointer?: t.LocalFileCheckpointer;\n /**\n * ToolNodes compiled into this Graph's workflow. Tracked so\n * `clearHeavyState()` can flush their per-Run direct-path turn\n * cache (`directPathTurns`) at end-of-Run — that map intentionally\n * survives `run()` re-entry (resume-stable per Codex P2 #30) but\n * would otherwise grow linearly with tool calls and could collide\n * across Runs if a provider reuses call ids (Codex P2 #33).\n */\n private _compiledToolNodes: Set<{\n clearDirectPathTurns(): void;\n }> = new Set();\n public getOrCreateFileCheckpointer(): t.LocalFileCheckpointer | undefined {\n // Return the cached instance unconditionally if one exists. The\n // toolExecution check below decides whether to *create* a new\n // one — `clearHeavyState` nulls `this.toolExecution` at end-of-\n // Run, but we want post-Run `Run.rewindFiles()` to still resolve\n // to the checkpointer that captured the writes. Codex P1 #32.\n if (this._fileCheckpointer != null) {\n return this._fileCheckpointer;\n }\n // Eagerly create via the bundle factory so the construction path\n // matches the bundle-only callers (and future bundle-internal\n // cleanup hooks fire). The bundle factory itself accepts a pre-\n // supplied checkpointer when present, so re-injecting this one\n // into every ToolNode is idempotent.\n if (\n this.toolExecution?.engine === 'local' &&\n this.toolExecution.local?.fileCheckpointing === true\n ) {\n const bundle = createLocalCodingToolBundle(\n this.toolExecution.local ?? {}\n );\n this._fileCheckpointer = bundle.checkpointer;\n return this._fileCheckpointer;\n }\n if (\n this.toolExecution?.engine === 'cloudflare-sandbox' &&\n this.toolExecution.cloudflare?.fileCheckpointing === true\n ) {\n const bundle = createCloudflareCodingToolBundle(\n this.toolExecution.cloudflare\n );\n this._fileCheckpointer = bundle.checkpointer;\n return this._fileCheckpointer;\n }\n return undefined;\n }\n}\n\nexport class StandardGraph extends Graph<t.BaseGraphState, t.GraphNode> {\n overrideModel?: t.ChatModel;\n /** Optional compile options passed into workflow.compile() */\n compileOptions?: t.CompileOptions | undefined;\n messages: BaseMessage[] = [];\n /** Cached run messages preserved before clearHeavyState() so getRunMessages() works after cleanup. */\n private cachedRunMessages?: BaseMessage[];\n runId: string | undefined;\n /**\n * Boundary between historical messages (loaded from conversation state)\n * and messages produced during the current run. Set once in the state\n * reducer when messages first arrive. Used by `getRunMessages()` and\n * multi-agent message filtering — NOT for pruner token counting (the\n * pruner maintains its own `lastTurnStartIndex` in its closure).\n */\n startIndex: number = 0;\n signal?: AbortSignal;\n /** Map of agent contexts by agent ID */\n agentContexts: Map<string, AgentContext> = new Map();\n /** Default agent ID to use */\n defaultAgentId: string;\n /**\n * Host sink for model usage emitted inside subagent child runs. Threaded\n * into each `SubagentExecutor` this graph creates (and from there into\n * child graphs, so nested subagents report too). See\n * {@link t.StandardGraphInput.subagentUsageSink}.\n */\n subagentUsageSink?: t.SubagentUsageSink;\n\n constructor({\n runId,\n signal,\n agents,\n langfuse,\n tokenCounter,\n indexTokenCountMap,\n calibrationRatio,\n subagentUsageSink,\n }: t.StandardGraphInput) {\n super();\n this.runId = runId;\n this.signal = signal;\n this.langfuse = langfuse;\n this.subagentUsageSink = subagentUsageSink;\n\n if (agents.length === 0) {\n throw new Error('At least one agent configuration is required');\n }\n\n for (const agentConfig of agents) {\n const agentContext = AgentContext.fromConfig(\n agentConfig,\n tokenCounter,\n indexTokenCountMap\n );\n if (calibrationRatio != null && calibrationRatio > 0) {\n agentContext.calibrationRatio = calibrationRatio;\n }\n\n this.agentContexts.set(agentConfig.agentId, agentContext);\n }\n\n this.defaultAgentId = agents[0].agentId;\n }\n\n /* Init */\n\n resetValues(keepContent?: boolean): void {\n this.messages = [];\n this.cachedRunMessages = undefined;\n this.config = resetIfNotEmpty(this.config, undefined);\n if (keepContent !== true) {\n this.contentData = resetIfNotEmpty(this.contentData, []);\n this.contentIndexMap = resetIfNotEmpty(this.contentIndexMap, new Map());\n }\n this.stepKeyIds = resetIfNotEmpty(this.stepKeyIds, new Map());\n /**\n * Clear in-place instead of replacing with a new Map to preserve the\n * shared reference held by ToolNode (passed at construction time).\n * Using resetIfNotEmpty would create a new Map, leaving ToolNode with\n * a stale reference on 2nd+ processStream calls.\n */\n this.toolCallStepIds.clear();\n this.eagerEventToolExecutions.clear();\n this.clearEagerEventToolUsageCounts();\n this.eagerEventToolCallChunks.clear();\n this.handlerDispatchedStepIds = resetIfNotEmpty(\n this.handlerDispatchedStepIds,\n new Set()\n );\n this.handlerDispatchedEventCounts = resetIfNotEmpty(\n this.handlerDispatchedEventCounts,\n new Map()\n );\n this.messageIdsByStepKey = resetIfNotEmpty(\n this.messageIdsByStepKey,\n new Map()\n );\n this.messageStepHasToolCalls = resetIfNotEmpty(\n this.messageStepHasToolCalls,\n new Map()\n );\n this.messageStepHasTextDeltas = resetIfNotEmpty(\n this.messageStepHasTextDeltas,\n new Set()\n );\n this.reasoningStepHasDeltas = resetIfNotEmpty(\n this.reasoningStepHasDeltas,\n new Set()\n );\n this.prelimMessageIdsByStepKey = resetIfNotEmpty(\n this.prelimMessageIdsByStepKey,\n new Map()\n );\n this.invokedToolIds = resetIfNotEmpty(this.invokedToolIds, undefined);\n for (const context of this.agentContexts.values()) {\n context.reset();\n }\n }\n\n override clearHeavyState(): void {\n this.cachedRunMessages = this.messages.slice(this.startIndex);\n super.clearHeavyState();\n this.messages = [];\n this.overrideModel = undefined;\n for (const context of this.agentContexts.values()) {\n context.reset();\n }\n }\n\n /* Run Step Processing */\n\n getRunStep(stepId: string): t.RunStep | undefined {\n const index = this.contentIndexMap.get(stepId);\n if (index !== undefined) {\n return this.contentData[index];\n }\n return undefined;\n }\n\n getAgentContext(metadata: Record<string, unknown> | undefined): AgentContext {\n if (!metadata) {\n throw new Error('No metadata provided to retrieve agent context');\n }\n\n const currentNode = metadata.langgraph_node as string;\n if (!currentNode) {\n throw new Error(\n 'No langgraph_node in metadata to retrieve agent context'\n );\n }\n\n let agentId: string | undefined;\n if (currentNode.startsWith(AGENT)) {\n agentId = currentNode.substring(AGENT.length);\n } else if (currentNode.startsWith(TOOLS)) {\n agentId = currentNode.substring(TOOLS.length);\n } else if (currentNode.startsWith(SUMMARIZE)) {\n agentId = currentNode.substring(SUMMARIZE.length);\n }\n\n const agentContext = this.agentContexts.get(agentId ?? '');\n if (!agentContext) {\n throw new Error(`No agent context found for agent ID ${agentId}`);\n }\n\n return agentContext;\n }\n\n getStepBaseKey(metadata: Record<string, unknown> | undefined): string {\n if (!metadata) return '';\n\n const keyList = this.getInvocationKeyList(metadata);\n if (this.checkKeyList(keyList)) {\n throw new Error('Missing metadata');\n }\n\n return joinKeys(keyList);\n }\n\n getStepKey(metadata: Record<string, unknown> | undefined): string {\n if (!metadata) return '';\n\n const keyList = this.getKeyList(metadata);\n if (this.checkKeyList(keyList)) {\n throw new Error('Missing metadata');\n }\n\n return joinKeys(keyList);\n }\n\n getStepIdByKey(stepKey: string, index?: number): string {\n const stepIds = this.stepKeyIds.get(stepKey);\n if (!stepIds) {\n throw new Error(`No step IDs found for stepKey ${stepKey}`);\n }\n\n if (index === undefined) {\n return stepIds[stepIds.length - 1];\n }\n\n return stepIds[index];\n }\n\n generateStepId(stepKey: string): [string, number] {\n const stepIds = this.stepKeyIds.get(stepKey);\n let newStepId: string | undefined;\n let stepIndex = 0;\n if (stepIds) {\n stepIndex = stepIds.length;\n newStepId = `step_${nanoid()}`;\n stepIds.push(newStepId);\n this.stepKeyIds.set(stepKey, stepIds);\n } else {\n newStepId = `step_${nanoid()}`;\n this.stepKeyIds.set(stepKey, [newStepId]);\n }\n\n return [newStepId, stepIndex];\n }\n\n getKeyList(\n metadata: Record<string, unknown> | undefined\n ): (string | number | undefined)[] {\n if (!metadata) return [];\n\n const keyList = this.getInvocationKeyList(metadata);\n const agentContext = this.getAgentContext(metadata);\n if (\n agentContext.currentTokenType === ContentTypes.THINK ||\n agentContext.currentTokenType === 'think_and_text'\n ) {\n keyList.push('reasoning');\n } else if (agentContext.tokenTypeSwitch === 'content') {\n keyList.push(`post-reasoning-${agentContext.reasoningTransitionCount}`);\n }\n\n return keyList;\n }\n\n private getInvocationKeyList(\n metadata: Record<string, unknown>\n ): (string | number | undefined)[] {\n const keyList = this.getBaseKeyList(metadata);\n if (this.invokedToolIds != null && this.invokedToolIds.size > 0) {\n keyList.push(this.invokedToolIds.size + '');\n }\n return keyList;\n }\n\n private getBaseKeyList(\n metadata: Record<string, unknown>\n ): (string | number | undefined)[] {\n const configurable = this.config?.configurable;\n const runId =\n (metadata.run_id as string | undefined) ??\n (configurable?.run_id as string | undefined) ??\n this.runId;\n const threadId =\n (metadata.thread_id as string | undefined) ??\n (configurable?.thread_id as string | undefined) ??\n runId;\n const checkpointNs =\n (metadata.checkpoint_ns as string | undefined) ??\n (metadata.langgraph_checkpoint_ns as string | undefined) ??\n '';\n const keyList = [\n runId,\n threadId,\n metadata.langgraph_node as string,\n metadata.langgraph_step as number,\n checkpointNs,\n ];\n\n return keyList;\n }\n\n checkKeyList(keyList: (string | number | undefined)[]): boolean {\n return keyList.some((key) => key === undefined);\n }\n\n /* Misc.*/\n\n getRunMessages(): BaseMessage[] | undefined {\n if (this.messages.length === 0 && this.cachedRunMessages != null) {\n return this.cachedRunMessages;\n }\n return this.messages.slice(this.startIndex);\n }\n\n getContentParts(): t.MessageContentComplex[] | undefined {\n return convertMessagesToContent(this.messages.slice(this.startIndex));\n }\n\n getCalibrationRatio(): number {\n const context = this.agentContexts.get(this.defaultAgentId);\n return context?.calibrationRatio ?? 1;\n }\n\n getResolvedInstructionOverhead(): number | undefined {\n const context = this.agentContexts.get(this.defaultAgentId);\n return context?.resolvedInstructionOverhead;\n }\n\n getToolCount(): number {\n const context = this.agentContexts.get(this.defaultAgentId);\n return (\n (context?.tools?.length ?? 0) + (context?.toolDefinitions?.length ?? 0)\n );\n }\n\n /**\n * Get all run steps, optionally filtered by agent ID\n */\n getRunSteps(agentId?: string): t.RunStep[] {\n if (agentId == null || agentId === '') {\n return [...this.contentData];\n }\n return this.contentData.filter((step) => step.agentId === agentId);\n }\n\n /**\n * Get run steps grouped by agent ID\n */\n getRunStepsByAgent(): Map<string, t.RunStep[]> {\n const stepsByAgent = new Map<string, t.RunStep[]>();\n\n for (const step of this.contentData) {\n if (step.agentId == null || step.agentId === '') continue;\n\n const steps = stepsByAgent.get(step.agentId) ?? [];\n steps.push(step);\n stepsByAgent.set(step.agentId, steps);\n }\n\n return stepsByAgent;\n }\n\n /**\n * Get agent IDs that participated in this run\n */\n getActiveAgentIds(): string[] {\n const agentIds = new Set<string>();\n for (const step of this.contentData) {\n if (step.agentId != null && step.agentId !== '') {\n agentIds.add(step.agentId);\n }\n }\n return Array.from(agentIds);\n }\n\n /**\n * Maps contentPart indices to agent IDs for post-run analysis\n * Returns a map where key is the contentPart index and value is the agentId\n */\n getContentPartAgentMap(): Map<number, string> {\n const contentPartAgentMap = new Map<number, string>();\n\n for (const step of this.contentData) {\n if (\n step.agentId != null &&\n step.agentId !== '' &&\n Number.isFinite(step.index)\n ) {\n contentPartAgentMap.set(step.index, step.agentId);\n }\n }\n\n return contentPartAgentMap;\n }\n\n /* Graph */\n\n initializeTools({\n currentTools,\n currentToolMap,\n agentContext,\n }: {\n currentTools?: t.GraphTools;\n currentToolMap?: t.ToolMap;\n agentContext?: AgentContext;\n }): CustomToolNode<t.BaseGraphState> | ToolNode<t.BaseGraphState> {\n const toolDefinitions = agentContext?.toolDefinitions;\n const eventDrivenMode =\n toolDefinitions != null && toolDefinitions.length > 0;\n const traceToolNode = shouldTraceToolNodeForLangfuse({\n runLangfuse: this.langfuse,\n agentLangfuse: agentContext?.langfuse,\n });\n\n if (eventDrivenMode) {\n const schemaTools = createSchemaOnlyTools(toolDefinitions);\n const toolDefMap = new Map(toolDefinitions.map((def) => [def.name, def]));\n const graphTools = agentContext?.graphTools as\n | t.GenericTool[]\n | undefined;\n\n const directToolNames = new Set<string>();\n const allTools = [...schemaTools] as t.GenericTool[];\n const allToolMap: t.ToolMap = new Map(\n schemaTools.map((tool) => [tool.name, tool])\n );\n\n if (graphTools && graphTools.length > 0) {\n for (const tool of graphTools) {\n if ('name' in tool) {\n allTools.push(tool);\n allToolMap.set(tool.name, tool);\n directToolNames.add(tool.name);\n }\n }\n }\n\n const node = new CustomToolNode<t.BaseGraphState>({\n tools: allTools,\n toolMap: allToolMap,\n trace: traceToolNode,\n runLangfuse: this.langfuse,\n agentLangfuse: agentContext?.langfuse,\n eventDrivenMode: true,\n sessions: this.sessions,\n toolDefinitions: toolDefMap,\n agentId: agentContext?.agentId,\n executingAgentId: agentContext?.agentId,\n toolCallStepIds: this.toolCallStepIds,\n toolRegistry: agentContext?.toolRegistry,\n hookRegistry: this.hookRegistry,\n humanInTheLoop: this.humanInTheLoop,\n eagerEventToolExecution: this.eagerEventToolExecution,\n eagerEventToolExecutions: this.eagerEventToolExecutions,\n eagerEventToolUsageCount: this.getEagerEventToolUsageCount(\n agentContext?.agentId\n ),\n toolExecution: this.toolExecution,\n directToolNames: directToolNames.size > 0 ? directToolNames : undefined,\n maxContextTokens: agentContext?.maxContextTokens,\n maxToolResultChars: agentContext?.maxToolResultChars,\n toolOutputRegistry: this.getOrCreateToolOutputRegistry(),\n fileCheckpointer: this.getOrCreateFileCheckpointer(),\n errorHandler: (data, metadata): Promise<void> =>\n StandardGraph.handleToolCallErrorStatic(this, data, metadata),\n });\n this.registerCompiledToolNode(node);\n return node;\n }\n\n const graphTools = agentContext?.graphTools as t.GenericTool[] | undefined;\n const baseTools = (currentTools as t.GenericTool[] | undefined) ?? [];\n const allTraditionalTools =\n graphTools && graphTools.length > 0\n ? [...baseTools, ...graphTools]\n : baseTools;\n const traditionalToolMap =\n graphTools && graphTools.length > 0\n ? new Map([\n ...(currentToolMap ?? new Map()),\n ...graphTools\n .filter((t): t is t.GenericTool & { name: string } => 'name' in t)\n .map((t) => [t.name, t] as [string, t.GenericTool]),\n ])\n : currentToolMap;\n\n const node = new CustomToolNode<t.BaseGraphState>({\n tools: allTraditionalTools,\n toolMap: traditionalToolMap,\n trace: traceToolNode,\n runLangfuse: this.langfuse,\n agentLangfuse: agentContext?.langfuse,\n // `agentId` is intentionally left unset on this path (it is the\n // subagent-scope marker); `executingAgentId` always identifies the owning\n // agent so hooks can attribute the batch even at the top level.\n executingAgentId: agentContext?.agentId,\n toolCallStepIds: this.toolCallStepIds,\n errorHandler: (data, metadata): Promise<void> =>\n StandardGraph.handleToolCallErrorStatic(this, data, metadata),\n toolRegistry: agentContext?.toolRegistry,\n sessions: this.sessions,\n toolExecution: this.toolExecution,\n hookRegistry: this.hookRegistry,\n humanInTheLoop: this.humanInTheLoop,\n maxContextTokens: agentContext?.maxContextTokens,\n maxToolResultChars: agentContext?.maxToolResultChars,\n toolOutputRegistry: this.getOrCreateToolOutputRegistry(),\n fileCheckpointer: this.getOrCreateFileCheckpointer(),\n });\n this.registerCompiledToolNode(node);\n return node;\n }\n\n overrideTestModel(\n responses: string[],\n sleep?: number,\n toolCalls?: ToolCall[]\n ): void {\n this.overrideModel = createFakeStreamingLLM({\n responses,\n sleep,\n toolCalls,\n });\n }\n\n getUsageMetadata(\n finalMessage?: BaseMessage\n ): Partial<UsageMetadata> | undefined {\n if (\n finalMessage &&\n 'usage_metadata' in finalMessage &&\n finalMessage.usage_metadata != null\n ) {\n return finalMessage.usage_metadata as Partial<UsageMetadata>;\n }\n }\n\n cleanupSignalListener(currentModel?: t.ChatModel): void {\n if (!this.signal) {\n return;\n }\n const model = this.overrideModel ?? currentModel;\n if (!model) {\n return;\n }\n const client = (model as ChatOpenAI | undefined)?.exposedClient;\n if (!client?.abortHandler) {\n return;\n }\n this.signal.removeEventListener('abort', client.abortHandler);\n client.abortHandler = undefined;\n }\n\n createCallModel(agentId = 'default') {\n return async (\n state: t.AgentSubgraphState,\n config?: RunnableConfig\n ): Promise<Partial<t.AgentSubgraphState>> => {\n const agentContext = this.agentContexts.get(agentId);\n if (!agentContext) {\n throw new Error(`Agent context not found for agentId: ${agentId}`);\n }\n\n if (!config) {\n throw new Error('No config provided');\n }\n\n const { messages } = state;\n\n const discoveredNames = extractToolDiscoveries(messages);\n if (discoveredNames.length > 0) {\n agentContext.markToolsAsDiscovered(discoveredNames);\n }\n\n const rawToolsForBinding = resolveLocalToolsForBinding({\n tools: agentContext.getToolsForBinding(),\n toolExecution: this.toolExecution,\n });\n\n /**\n * Anthropic prompt-cache breakpoint on the tool definitions.\n *\n * Without this, the (often static) tool inventory shows up as\n * fresh input on every turn — measured at ~28k tokens/turn for\n * the local engine's coding-tool bundle, dominating per-turn\n * cost even when message-level caching is on.\n *\n * Strategy: partition tools into [static, deferred] and stamp\n * `cache_control: ephemeral` on the last static tool.\n * Discovered deferred tools that arrive across turns sit *after*\n * the breakpoint and don't invalidate the prefix.\n */\n let toolsForBinding = rawToolsForBinding;\n if (\n agentContext.provider === Providers.ANTHROPIC &&\n (agentContext.clientOptions as t.AnthropicClientOptions | undefined)\n ?.promptCache === true\n ) {\n toolsForBinding =\n partitionAndMarkAnthropicToolCache(\n rawToolsForBinding,\n makeIsDeferred(agentContext.toolDefinitions)\n ) ?? rawToolsForBinding;\n } else if (\n agentContext.provider === Providers.OPENROUTER &&\n (\n agentContext.clientOptions as\n | t.ProviderOptionsMap[Providers.OPENROUTER]\n | undefined\n )?.promptCache === true\n ) {\n toolsForBinding =\n partitionAndMarkOpenRouterToolCache(\n rawToolsForBinding,\n makeIsDeferred(agentContext.toolDefinitions)\n ) ?? rawToolsForBinding;\n } else if (\n agentContext.provider === Providers.BEDROCK &&\n (\n agentContext.clientOptions as\n | t.BedrockAnthropicClientOptions\n | undefined\n )?.promptCache === true\n ) {\n toolsForBinding =\n partitionAndMarkBedrockToolCache(\n rawToolsForBinding,\n makeIsDeferred(agentContext.toolDefinitions)\n ) ?? rawToolsForBinding;\n }\n\n let model =\n this.overrideModel ??\n initializeModel({\n tools: toolsForBinding,\n provider: agentContext.provider,\n clientOptions: agentContext.clientOptions,\n });\n\n if (agentContext.systemRunnable) {\n model = agentContext.systemRunnable.pipe(model as Runnable);\n }\n\n if (agentContext.tokenCalculationPromise) {\n await agentContext.tokenCalculationPromise;\n }\n if (!config.signal) {\n config.signal = this.signal;\n }\n this.config = config;\n\n let messagesToUse = messages;\n let contextUsage: t.ContextUsageEvent | null = null;\n if (\n !agentContext.pruneMessages &&\n agentContext.tokenCounter &&\n agentContext.maxContextTokens != null\n ) {\n agentContext.pruneMessages = createPruneMessages({\n startIndex:\n agentContext.indexTokenCountMap[0] != null ? this.startIndex : 0,\n provider: agentContext.provider,\n tokenCounter: agentContext.tokenCounter,\n maxTokens: agentContext.maxContextTokens,\n thinkingEnabled: isThinkingEnabled(\n agentContext.provider,\n agentContext.clientOptions\n ),\n indexTokenCountMap: agentContext.indexTokenCountMap,\n contextPruningConfig: agentContext.contextPruningConfig,\n summarizationEnabled: agentContext.summarizationEnabled,\n reserveRatio: agentContext.summarizationConfig?.reserveRatio,\n calibrationRatio: agentContext.calibrationRatio,\n getInstructionTokens: () => agentContext.instructionTokens,\n log: (level, message, data) => {\n emitAgentLog(config, level, 'prune', message, data, {\n runId: this.runId,\n agentId,\n });\n },\n });\n }\n if (agentContext.pruneMessages) {\n const {\n context,\n indexTokenCountMap,\n messagesToRefine,\n prePruneContextTokens,\n remainingContextTokens,\n originalToolContent,\n calibrationRatio,\n resolvedInstructionOverhead,\n contextBudget,\n effectiveInstructionTokens,\n } = agentContext.pruneMessages({\n messages,\n usageMetadata: agentContext.currentUsage,\n lastCallUsage: agentContext.lastCallUsage,\n totalTokensFresh: agentContext.totalTokensFresh,\n });\n agentContext.indexTokenCountMap = indexTokenCountMap;\n if (calibrationRatio != null && calibrationRatio > 0) {\n agentContext.calibrationRatio = calibrationRatio;\n }\n if (resolvedInstructionOverhead != null) {\n agentContext.resolvedInstructionOverhead =\n resolvedInstructionOverhead;\n const nonToolOverhead =\n agentContext.instructionTokens - agentContext.toolSchemaTokens;\n const calibratedToolTokens = Math.max(\n 0,\n resolvedInstructionOverhead - nonToolOverhead\n );\n const currentToolTokens = agentContext.toolSchemaTokens;\n const variance =\n currentToolTokens > 0\n ? Math.abs(calibratedToolTokens - currentToolTokens) /\n currentToolTokens\n : 1;\n if (variance > CALIBRATION_VARIANCE_THRESHOLD) {\n agentContext.toolSchemaTokens = calibratedToolTokens;\n /** Largest-remainder apportionment keeps the per-tool breakdown\n * summing exactly to the calibrated aggregate */\n if (agentContext.toolTokenCounts != null && currentToolTokens > 0) {\n agentContext.toolTokenCounts = apportionTokenCounts(\n agentContext.toolTokenCounts,\n calibratedToolTokens / currentToolTokens,\n calibratedToolTokens\n );\n }\n }\n }\n messagesToUse = context;\n\n /** Dispatched right before the model invoke — a summarization\n * detour returns from this node without an LLM call, and the\n * post-summary retry produces its own snapshot.\n *\n * The breakdown describes the post-prune prompt: counts from the\n * kept context, message tokens derived from the same calibrated\n * budget math as `remainingContextTokens` (the index map is keyed\n * by pre-prune state indices, so summing it over `context` would\n * missum); `prePruneContextTokens` carries the pre-prune metric. */\n const usageBreakdown = agentContext.getTokenBudgetBreakdown(messages);\n usageBreakdown.messageCount = context.length;\n contextUsage = {\n runId: this.runId,\n agentId,\n breakdown: usageBreakdown,\n contextBudget,\n effectiveInstructionTokens,\n prePruneContextTokens,\n remainingContextTokens,\n calibrationRatio: agentContext.calibrationRatio,\n };\n syncBudgetDerivedFields(contextUsage);\n\n const hasPrunedMessages =\n agentContext.summarizationEnabled === true &&\n Array.isArray(messagesToRefine) &&\n messagesToRefine.length > 0;\n\n if (hasPrunedMessages) {\n const shouldSkip = agentContext.shouldSkipSummarization(\n messages.length\n );\n const triggerResult =\n !shouldSkip &&\n shouldTriggerSummarization({\n trigger: agentContext.summarizationConfig?.trigger,\n maxContextTokens: agentContext.maxContextTokens,\n prePruneContextTokens:\n prePruneContextTokens != null\n ? prePruneContextTokens + agentContext.instructionTokens\n : undefined,\n remainingContextTokens,\n messagesToRefineCount: messagesToRefine.length,\n });\n\n if (triggerResult) {\n if (originalToolContent != null && originalToolContent.size > 0) {\n /**\n * Merge — never overwrite — the pruner's masking record\n * into pendingOriginalToolContent. Carry-over entries\n * from a prior summarize (preserved by the recency\n * window for masked tool messages still in the tail) and\n * the current pruner's new entries are both keyed by\n * indices in the current `state.messages`, so a key-wise\n * union is correct. Overwriting would discard the\n * carry-over and reduce summary fidelity when those\n * masked tail messages eventually move into the head.\n */\n if (agentContext.pendingOriginalToolContent == null) {\n agentContext.pendingOriginalToolContent = originalToolContent;\n } else {\n for (const [idx, content] of originalToolContent) {\n agentContext.pendingOriginalToolContent.set(idx, content);\n }\n /**\n * Re-apply the per-store char cap after the union. The\n * pruner enforces ORIGINAL_CONTENT_MAX_CHARS inside its\n * own map via the onContentStored callback, but a\n * key-wise merge with recency carry-over bypasses that\n * accounting and could let the merged map grow without\n * bound across long sessions.\n */\n enforceOriginalContentCap(\n agentContext.pendingOriginalToolContent\n );\n }\n }\n\n emitAgentLog(\n config,\n 'info',\n 'graph',\n 'Summarization triggered',\n undefined,\n { runId: this.runId, agentId }\n );\n emitAgentLog(\n config,\n 'debug',\n 'graph',\n 'Summarization trigger details',\n {\n totalMessages: messages.length,\n remainingContextTokens: remainingContextTokens ?? 0,\n summaryVersion: agentContext.summaryVersion + 1,\n toolSchemaTokens: agentContext.toolSchemaTokens,\n instructionTokens: agentContext.instructionTokens,\n systemMessageTokens: agentContext.systemMessageTokens,\n },\n { runId: this.runId, agentId }\n );\n agentContext.markSummarizationTriggered(messages.length);\n return {\n summarizationRequest: {\n remainingContextTokens: remainingContextTokens ?? 0,\n agentId: agentId || agentContext.agentId,\n },\n };\n }\n\n if (shouldSkip) {\n emitAgentLog(\n config,\n 'debug',\n 'graph',\n 'Summarization skipped — no new messages or per-run cap reached',\n {\n messageCount: messages.length,\n messagesToRefineCount: messagesToRefine.length,\n contextLength: context.length,\n },\n { runId: this.runId, agentId }\n );\n }\n }\n }\n\n let finalMessages = messagesToUse;\n /** Tail snapshot for the dispatch-time usage delta: in-place\n * formatters (artifact appends, Bedrock content rewrites, legacy\n * string conversion) mutate without changing length or identity —\n * capture before they run. Legacy string conversion can also touch\n * messages before the tail, so those convertible indices are\n * tracked separately (none exist in the common case). */\n const tailStart = trailingMutationStart(messagesToUse);\n let preFormatTailTokens: number | null = null;\n let legacyIndices: number[] | null = null;\n let preFormatLegacyTokens = 0;\n if (contextUsage != null && agentContext.tokenCounter != null) {\n preFormatTailTokens = 0;\n for (const message of messagesToUse.slice(tailStart)) {\n preFormatTailTokens += agentContext.tokenCounter(message);\n }\n if (agentContext.useLegacyContent) {\n legacyIndices = [];\n for (let i = 0; i < tailStart; i++) {\n if (isLegacyConvertible(messagesToUse[i])) {\n legacyIndices.push(i);\n preFormatLegacyTokens += agentContext.tokenCounter(\n messagesToUse[i]\n );\n }\n }\n }\n }\n if (agentContext.useLegacyContent) {\n finalMessages = formatContentStrings(finalMessages);\n }\n\n const lastMessageX =\n finalMessages.length >= 2\n ? finalMessages[finalMessages.length - 2]\n : null;\n const lastMessageY =\n finalMessages.length >= 1\n ? finalMessages[finalMessages.length - 1]\n : null;\n\n const anthropicLike = isAnthropicLike(\n agentContext.provider,\n agentContext.clientOptions as { model?: string }\n );\n\n if (\n agentContext.provider === Providers.BEDROCK &&\n lastMessageX instanceof AIMessageChunk &&\n lastMessageY instanceof ToolMessage &&\n typeof lastMessageX.content === 'string'\n ) {\n const trimmed = lastMessageX.content.trim();\n finalMessages[finalMessages.length - 2].content =\n trimmed.length > 0 ? [{ type: 'text' as const, text: trimmed }] : '';\n }\n\n if (lastMessageY instanceof ToolMessage) {\n if (anthropicLike) {\n formatAnthropicArtifactContent(finalMessages);\n } else if (\n (isOpenAILike(agentContext.provider) &&\n agentContext.provider !== Providers.DEEPSEEK) ||\n isGoogleLike(agentContext.provider)\n ) {\n formatArtifactPayload(finalMessages);\n }\n }\n\n if (agentContext.provider === Providers.ANTHROPIC) {\n const anthropicOptions = agentContext.clientOptions as\n | t.AnthropicClientOptions\n | undefined;\n if (\n anthropicOptions?.promptCache === true &&\n !agentContext.systemRunnable\n ) {\n finalMessages = addCacheControl<BaseMessage>(finalMessages);\n }\n } else if (agentContext.provider === Providers.BEDROCK) {\n const bedrockOptions = agentContext.clientOptions as\n | t.BedrockAnthropicClientOptions\n | undefined;\n if (bedrockOptions?.promptCache === true) {\n finalMessages = addBedrockCacheControl<BaseMessage>(finalMessages);\n }\n } else if (agentContext.provider === Providers.OPENROUTER) {\n const openRouterOptions = agentContext.clientOptions as\n | t.ProviderOptionsMap[Providers.OPENROUTER]\n | undefined;\n if (\n openRouterOptions?.promptCache === true &&\n !agentContext.systemRunnable\n ) {\n finalMessages = addCacheControl<BaseMessage>(finalMessages);\n }\n }\n\n if (\n isThinkingEnabled(agentContext.provider, agentContext.clientOptions)\n ) {\n /**\n * Pass `this.startIndex` so the function can distinguish CURRENT-run\n * AI messages (the agent's own iterations — possibly without a\n * leading thinking block, which Claude is allowed to skip) from\n * historical context that genuinely needs the\n * `[Previous agent context]` placeholder. Without this signal the\n * function would convert the agent's own in-run tool_use messages,\n * polluting the next iteration's prompt with a placeholder the\n * model treats as suspicious injected content.\n */\n finalMessages = ensureThinkingBlockInMessages(\n finalMessages,\n agentContext.provider,\n config,\n this.startIndex\n );\n }\n\n // Intentionally broad: runs when the pruner wasn't used OR any post-pruning\n // transform (addCacheControl, ensureThinkingBlock, etc.) reassigned finalMessages.\n // sanitizeOrphanToolBlocks fast-paths to a Set diff check when no orphans exist,\n // so the cost is negligible and this acts as a safety net for Anthropic/Bedrock.\n const needsOrphanSanitize =\n anthropicLike &&\n (!agentContext.pruneMessages || finalMessages !== messagesToUse);\n if (needsOrphanSanitize) {\n const beforeSanitize = finalMessages.length;\n finalMessages = sanitizeOrphanToolBlocks(finalMessages);\n if (finalMessages.length !== beforeSanitize) {\n emitAgentLog(\n config,\n 'warn',\n 'sanitize',\n 'Orphan tool blocks removed',\n {\n before: beforeSanitize,\n after: finalMessages.length,\n dropped: beforeSanitize - finalMessages.length,\n },\n { runId: this.runId, agentId }\n );\n }\n }\n\n if (\n agentContext.lastStreamCall != null &&\n agentContext.streamBuffer != null\n ) {\n const timeSinceLastCall = Date.now() - agentContext.lastStreamCall;\n if (timeSinceLastCall < agentContext.streamBuffer) {\n const timeToWait =\n Math.ceil((agentContext.streamBuffer - timeSinceLastCall) / 1000) *\n 1000;\n await sleep(timeToWait);\n }\n }\n\n agentContext.lastStreamCall = Date.now();\n agentContext.markTokensStale();\n\n let result: Partial<t.BaseGraphState> | undefined;\n const fallbacks =\n (agentContext.clientOptions as t.LLMConfig | undefined)?.fallbacks ??\n [];\n\n if (\n finalMessages.length === 0 &&\n !agentContext.hasPendingCompactionSummary()\n ) {\n const budgetBreakdown = agentContext.getTokenBudgetBreakdown(messages);\n const breakdown = agentContext.formatTokenBudgetBreakdown(messages);\n const instructionsExceedBudget =\n budgetBreakdown.instructionTokens > budgetBreakdown.maxContextTokens;\n\n let guidance: string;\n if (instructionsExceedBudget) {\n const toolPct =\n budgetBreakdown.toolSchemaTokens > 0\n ? Math.round(\n (budgetBreakdown.toolSchemaTokens /\n budgetBreakdown.instructionTokens) *\n 100\n )\n : 0;\n guidance =\n toolPct > 50\n ? `Tool definitions consume ${budgetBreakdown.toolSchemaTokens} tokens (${toolPct}% of instructions) across ${budgetBreakdown.toolCount} tools, exceeding maxContextTokens (${budgetBreakdown.maxContextTokens}). Reduce the number of tools or increase maxContextTokens.`\n : `Instructions (${budgetBreakdown.instructionTokens} tokens) exceed maxContextTokens (${budgetBreakdown.maxContextTokens}). Increase maxContextTokens or shorten the system prompt.`;\n if (agentContext.summarizationEnabled === true) {\n guidance +=\n ' Summarization was skipped because the summary would further increase the instruction overhead.';\n }\n } else {\n guidance =\n 'Please increase the context window size or make your message shorter.';\n }\n\n emitAgentLog(\n config,\n 'error',\n 'graph',\n 'Empty messages after pruning',\n {\n messageCount: messages.length,\n instructionsExceedBudget,\n breakdown,\n },\n { runId: this.runId, agentId }\n );\n throw new Error(\n JSON.stringify({\n type: 'empty_messages',\n info: `Message pruning removed all messages as none fit in the context window. ${guidance}\\n${breakdown}`,\n })\n );\n }\n\n /** Past the empty-prompt guard — a model call is now guaranteed */\n if (contextUsage != null) {\n const usageRatio =\n contextUsage.calibrationRatio != null &&\n contextUsage.calibrationRatio > 0\n ? contextUsage.calibrationRatio\n : 1;\n if (\n agentContext.tokenCounter != null &&\n finalMessages.length !== messagesToUse.length\n ) {\n /** Post-prune formatting restructured the payload (e.g. thinking\n * placeholder collapse, orphan drops) — recount so the gauge\n * reflects what is actually sent */\n let rawTokens = 0;\n for (const message of finalMessages) {\n rawTokens += agentContext.tokenCounter(message);\n }\n contextUsage.breakdown.messageCount = finalMessages.length;\n if (\n contextUsage.contextBudget != null &&\n contextUsage.effectiveInstructionTokens != null\n ) {\n contextUsage.remainingContextTokens = Math.max(\n 0,\n contextUsage.contextBudget -\n contextUsage.effectiveInstructionTokens -\n Math.round(rawTokens * usageRatio)\n );\n }\n } else if (\n preFormatTailTokens != null &&\n agentContext.tokenCounter != null &&\n contextUsage.remainingContextTokens != null\n ) {\n /** Same-length formatting can still mutate in place — the trailing\n * tool batch (artifacts, Bedrock rewrites) and any legacy-converted\n * messages before it — adjust remaining by the calibrated delta */\n let postFormatTailTokens = 0;\n for (const message of finalMessages.slice(tailStart)) {\n postFormatTailTokens += agentContext.tokenCounter(message);\n }\n let formatDelta = postFormatTailTokens - preFormatTailTokens;\n if (legacyIndices != null && legacyIndices.length > 0) {\n let postFormatLegacyTokens = 0;\n for (const index of legacyIndices) {\n postFormatLegacyTokens += agentContext.tokenCounter(\n finalMessages[index]\n );\n }\n formatDelta += postFormatLegacyTokens - preFormatLegacyTokens;\n }\n if (formatDelta !== 0) {\n contextUsage.remainingContextTokens = Math.max(\n 0,\n Math.min(\n contextUsage.contextBudget ?? Number.MAX_SAFE_INTEGER,\n contextUsage.remainingContextTokens -\n Math.round(formatDelta * usageRatio)\n )\n );\n }\n }\n syncBudgetDerivedFields(contextUsage);\n /** Awaited so async host handlers receive the pre-invoke snapshot\n * before any model deltas are emitted */\n await safeDispatchCustomEvent(\n GraphEvents.ON_CONTEXT_USAGE,\n contextUsage,\n config\n );\n }\n\n const invokeStart = Date.now();\n const invokeMeta = { runId: this.runId, agentId };\n emitAgentLog(\n config,\n 'debug',\n 'graph',\n 'Invoking LLM',\n {\n messageCount: finalMessages.length,\n provider: agentContext.provider,\n },\n invokeMeta,\n { force: true }\n );\n\n const langfuse = resolveLangfuseConfig(\n this.langfuse,\n agentContext.langfuse\n );\n const traceMetadata = createLangfuseTraceMetadata({\n messageId: this.runId,\n parentMessageId: config.configurable?.requestBody?.parentMessageId,\n agentId,\n agentName: agentContext.name,\n });\n let langfuseHandler: CallbackEntry | undefined;\n let invokeConfig = {\n ...config,\n metadata: {\n ...(config.metadata ?? {}),\n ...traceMetadata,\n },\n };\n initializeLangfuseTracing(langfuse);\n if (findCallback(config.callbacks, isLangfuseCallbackHandler) == null) {\n langfuseHandler = createLangfuseHandler({\n langfuse,\n userId: config.configurable?.user_id as string | undefined,\n sessionId: config.configurable?.thread_id as string | undefined,\n traceMetadata,\n tags: ['librechat', 'agent'],\n });\n if (langfuseHandler != null) {\n invokeConfig = {\n ...invokeConfig,\n callbacks: appendCallbacks(invokeConfig.callbacks, [\n langfuseHandler,\n ]),\n };\n }\n }\n const metadata = config.metadata as Record<string, unknown>;\n\n try {\n result = await withLangfuseToolOutputTracingConfig(\n this.langfuse,\n () =>\n attemptInvoke(\n {\n model: (this.overrideModel ?? model) as t.ChatModel,\n messages: finalMessages,\n provider: agentContext.provider,\n context: this,\n },\n invokeConfig\n ),\n agentContext.langfuse\n );\n } catch (primaryError) {\n clearCurrentDeltaStepMarkers({\n graph: this,\n metadata,\n });\n result = await withLangfuseToolOutputTracingConfig(\n this.langfuse,\n () =>\n tryFallbackProviders({\n fallbacks,\n tools: agentContext.tools,\n messages: finalMessages,\n config: invokeConfig,\n primaryError,\n context: this,\n }),\n agentContext.langfuse\n );\n } finally {\n await disposeLangfuseHandler(langfuseHandler);\n }\n\n if (!result) {\n throw new Error('No result after model invocation');\n }\n\n /**\n * Fallback: populate toolCallStepIds in the graph execution context.\n *\n * When model.stream() is available (the common case), attemptInvoke\n * processes all chunks through a local ChatModelStreamHandler which\n * creates run steps and populates toolCallStepIds before returning.\n * The code below is a fallback for the rare case where model.stream\n * is unavailable and model.invoke() was used instead.\n *\n * Text content is dispatched FIRST so that MESSAGE_CREATION is the\n * current step when handleToolCalls runs. handleToolCalls then creates\n * TOOL_CALLS on top of it. The dedup in getMessageId and\n * toolCallStepIds.has makes this safe when attemptInvoke already\n * handled everything — both paths become no-ops.\n */\n const responseMessage = result.messages?.[0];\n const toolCalls = (responseMessage as AIMessageChunk | undefined)\n ?.tool_calls;\n const hasToolCalls = Array.isArray(toolCalls) && toolCalls.length > 0;\n const responseReasoningContent = getResponseReasoningContent({\n responseMessage: responseMessage as Partial<AIMessageChunk> | undefined,\n reasoningKey: agentContext.reasoningKey,\n });\n const textMessageContent = getMessageDeltaContent(\n agentContext.provider,\n responseMessage?.content as MessageContent | undefined\n );\n const hasStreamedTextDeltaStep = hasCurrentTextDeltaStep({\n graph: this,\n metadata,\n });\n const hasStreamedReasoningDeltaStep = hasCurrentReasoningDeltaStep({\n graph: this,\n metadata,\n });\n const dispatchableFinalReasoningContent =\n getDispatchableFinalReasoningContent({\n agentContext,\n responseReasoningContent,\n hasStreamedTextDeltaStep,\n hasStreamedReasoningDeltaStep,\n });\n\n if (hasToolCalls) {\n const dispatchedReasoning =\n dispatchableFinalReasoningContent != null &&\n (await dispatchReasoningContent({\n graph: this,\n agentContext,\n reasoningContent: dispatchableFinalReasoningContent,\n metadata,\n }));\n if (dispatchedReasoning) {\n markPostReasoningContent(agentContext);\n }\n if (textMessageContent != null && !hasStreamedTextDeltaStep) {\n const stepKey = this.getStepKey(metadata);\n const dispatchedText = await dispatchTextMessageContent({\n graph: this,\n stepKey,\n provider: agentContext.provider,\n content: textMessageContent,\n metadata,\n });\n if (dispatchedText) {\n markPostReasoningContent(agentContext);\n }\n }\n\n await handleToolCalls(toolCalls as ToolCall[], metadata, this);\n }\n\n /**\n * When streaming events are unavailable, ChatModelStreamHandler never\n * fires. Dispatch final reasoning/text content here. getMessageId makes\n * this a no-op when the streaming path already handled the same step.\n */\n if (!hasToolCalls && responseMessage != null) {\n const dispatchedReasoning =\n dispatchableFinalReasoningContent != null &&\n (await dispatchReasoningContent({\n graph: this,\n agentContext,\n reasoningContent: dispatchableFinalReasoningContent,\n metadata,\n }));\n if (dispatchedReasoning && textMessageContent != null) {\n markPostReasoningContent(agentContext);\n }\n if (textMessageContent != null && !hasStreamedTextDeltaStep) {\n const stepKey = this.getStepKey(metadata);\n await dispatchTextMessageContent({\n graph: this,\n stepKey,\n provider: agentContext.provider,\n content: textMessageContent,\n metadata,\n });\n }\n }\n\n const invokeElapsed = ((Date.now() - invokeStart) / 1000).toFixed(2);\n agentContext.currentUsage = this.getUsageMetadata(result.messages?.[0]);\n if (agentContext.currentUsage) {\n agentContext.updateLastCallUsage(agentContext.currentUsage);\n emitAgentLog(\n config,\n 'debug',\n 'graph',\n `LLM call complete (${invokeElapsed}s)`,\n {\n ...agentContext.currentUsage,\n elapsedSeconds: Number(invokeElapsed),\n instructionTokens: agentContext.instructionTokens,\n toolSchemaTokens: agentContext.toolSchemaTokens,\n messageCount: finalMessages.length,\n },\n invokeMeta,\n { force: true }\n );\n } else {\n emitAgentLog(\n config,\n 'debug',\n 'graph',\n `LLM call complete (${invokeElapsed}s)`,\n {\n elapsedSeconds: Number(invokeElapsed),\n messageCount: finalMessages.length,\n },\n invokeMeta,\n { force: true }\n );\n }\n this.cleanupSignalListener();\n return result;\n };\n }\n\n createAgentNode(agentId: string): t.CompiledAgentWorfklow {\n const getConfig = (): RunnableConfig | undefined => this.config;\n const agentContext = this.agentContexts.get(agentId);\n if (!agentContext) {\n throw new Error(`Agent context not found for agentId: ${agentId}`);\n }\n\n /**\n * Depth countdown across graph boundaries: the parent's `maxSubagentDepth`\n * becomes this executor's `maxDepth`. When the child graph is constructed,\n * `buildChildInputs()` decrements `maxSubagentDepth` on the child's\n * `AgentInputs` (only when `allowNested: true`; otherwise subagentConfigs\n * are stripped entirely). The child graph's own `createAgentNode()` then\n * reads the decremented value here and creates a narrower executor —\n * recursion is bounded even though each graph has its own separate\n * executor instance.\n */\n const effectiveSubagentDepth = agentContext.maxSubagentDepth ?? 1;\n if (\n agentContext.subagentConfigs != null &&\n agentContext.subagentConfigs.length > 0 &&\n effectiveSubagentDepth > 0\n ) {\n const resolvedConfigs = resolveSubagentConfigs(\n agentContext.subagentConfigs,\n agentContext\n );\n if (resolvedConfigs.length > 0) {\n const getParentHandlerRegistry = (): HandlerRegistry | undefined =>\n this.handlerRegistry;\n const executor = new SubagentExecutor({\n configs: new Map(resolvedConfigs.map((c) => [c.type, c])),\n parentSignal: this.signal,\n hookRegistry: this.hookRegistry,\n /** Lazy — Run wires the registry onto the graph AFTER\n * `createWorkflow()` runs, so a direct capture here would be\n * `undefined` at construction time. */\n parentHandlerRegistry: getParentHandlerRegistry,\n parentRunId: this.runId ?? '',\n parentAgentId: agentContext.agentId,\n langfuse: this.langfuse,\n tokenCounter: agentContext.tokenCounter,\n usageSink: this.subagentUsageSink,\n maxDepth: effectiveSubagentDepth,\n createChildGraph: (input): StandardGraph => {\n const childGraph = new StandardGraph(input);\n childGraph.hookRegistry = this.hookRegistry;\n /**\n * Do not propagate `humanInTheLoop` into the child graph yet:\n * nested subagent interrupts need a stable child checkpoint and\n * resume bridge. Child hooks still fire; `ask` decisions fail\n * closed inside the subagent until that flow is implemented.\n */\n childGraph.toolOutputReferences = this.toolOutputReferences;\n childGraph.eagerEventToolExecution = this.eagerEventToolExecution;\n childGraph.toolExecution = this.toolExecution;\n childGraph.eventToolExecutionAvailable =\n this.handlerRegistry?.getHandler(GraphEvents.ON_TOOL_EXECUTE) !=\n null;\n return childGraph;\n },\n });\n\n const subagentTool = tool(async (rawInput, config) => {\n const input = rawInput as {\n description?: string;\n subagent_type?: string;\n };\n const description =\n typeof input.description === 'string' &&\n input.description.trim().length > 0\n ? input.description\n : 'No task description provided';\n const subagentType =\n typeof input.subagent_type === 'string' ? input.subagent_type : '';\n const threadId = config.configurable?.thread_id as string | undefined;\n /**\n * When the tool is dispatched from an LLM's `tool_call`, LangChain\n * threads the originating `ToolCall` onto the RunnableConfig as\n * `config.toolCall` (see `ToolRunnableConfig` in\n * `@langchain/core/tools` — internal but stable since ≥0.3.x).\n * Surfacing its id lets hosts correlate `SubagentUpdateEvent`s\n * back to the parent's `tool_call_id` deterministically — no\n * temporal heuristics needed. If a future LangChain version\n * changes the threading, the type-guarded read falls back to\n * `undefined` and the correlation degrades gracefully.\n */\n const toolCall = (config as { toolCall?: { id?: string } }).toolCall;\n const parentToolCallId =\n typeof toolCall?.id === 'string' ? toolCall.id : undefined;\n const result = await executor.execute({\n description,\n subagentType,\n threadId,\n parentToolCallId,\n /**\n * Forward the parent's `configurable` so host-set fields\n * (`requestBody`, `user`, etc.) propagate into the child\n * workflow. The executor scrubs run-identity fields before\n * forwarding — see `SubagentExecuteParams.parentConfigurable`.\n */\n parentConfigurable: config.configurable as\n | Record<string, unknown>\n | undefined,\n });\n return result.content;\n }, buildSubagentToolParams(resolvedConfigs));\n\n if (!agentContext.graphTools) {\n agentContext.graphTools = [];\n }\n (agentContext.graphTools as t.GenericTool[]).push(subagentTool);\n\n /**\n * Refresh toolSchemaTokens to include the subagent tool's schema.\n * `calculateInstructionTokens()` was kicked off in `fromConfig()`\n * before graphTools was populated, so its result did not count this\n * tool. Without this retrigger, token-budget/pruning logic\n * underestimates prompt overhead.\n */\n if (agentContext.tokenCounter) {\n const { tokenCounter, baseIndexTokenCountMap } = agentContext;\n agentContext.tokenCalculationPromise = agentContext\n .calculateInstructionTokens(tokenCounter)\n .then(() => {\n agentContext.updateTokenMapWithInstructions(\n baseIndexTokenCountMap\n );\n })\n .catch((err) => {\n console.error(\n 'Error recalculating instruction tokens after subagent tool injection:',\n err\n );\n });\n }\n }\n }\n\n const agentNode = `${AGENT}${agentId}` as const;\n const toolNode = `${TOOLS}${agentId}` as const;\n const summarizeNode = `${SUMMARIZE}${agentId}` as const;\n\n const routeMessage = (\n state: t.AgentSubgraphState,\n config?: RunnableConfig\n ): string => {\n this.config = config;\n if (state.summarizationRequest != null) {\n return summarizeNode;\n }\n return toolsCondition(\n state as t.BaseGraphState,\n toolNode,\n this.invokedToolIds\n );\n };\n\n const StateAnnotation = Annotation.Root({\n messages: Annotation<BaseMessage[]>({\n reducer: messagesStateReducer,\n default: () => [],\n }),\n summarizationRequest: Annotation<t.SummarizationNodeInput | undefined>({\n reducer: (\n _: t.SummarizationNodeInput | undefined,\n b: t.SummarizationNodeInput | undefined\n ) => b,\n default: () => undefined,\n }),\n });\n\n const workflow = new StateGraph(StateAnnotation)\n .addNode(agentNode, this.createCallModel(agentId))\n .addNode(\n toolNode,\n this.initializeTools({\n currentTools: agentContext.tools,\n currentToolMap: agentContext.toolMap,\n agentContext,\n })\n )\n .addNode(\n summarizeNode,\n createSummarizeNode({\n agentContext,\n graph: {\n contentData: this.contentData,\n contentIndexMap: this.contentIndexMap,\n get config() {\n return getConfig();\n },\n runId: this.runId,\n isMultiAgent: this.isMultiAgentGraph(),\n hookRegistry: this.hookRegistry,\n dispatchRunStep: async (runStep, nodeConfig) => {\n this.contentData.push(runStep);\n this.contentIndexMap.set(runStep.id, runStep.index);\n\n const resolvedConfig = nodeConfig ?? this.config;\n const handler = this.handlerRegistry?.getHandler(\n GraphEvents.ON_RUN_STEP\n );\n if (handler) {\n await handler.handle(\n GraphEvents.ON_RUN_STEP,\n runStep,\n resolvedConfig?.configurable,\n this\n );\n this.handlerDispatchedStepIds.add(runStep.id);\n }\n\n const unmarkHandlerDispatchedEvent = handler\n ? this.markHandlerDispatchedEvent(\n GraphEvents.ON_RUN_STEP,\n runStep.id\n )\n : undefined;\n try {\n if (resolvedConfig) {\n await safeDispatchCustomEvent(\n GraphEvents.ON_RUN_STEP,\n runStep,\n resolvedConfig\n );\n }\n } finally {\n unmarkHandlerDispatchedEvent?.();\n }\n },\n dispatchRunStepCompleted: async (\n stepId: string,\n result: t.StepCompleted,\n nodeConfig?: RunnableConfig\n ) => {\n const resolvedConfig = nodeConfig ?? this.config;\n const runStep = this.contentData.find((s) => s.id === stepId);\n const handler = this.handlerRegistry?.getHandler(\n GraphEvents.ON_RUN_STEP_COMPLETED\n );\n if (handler) {\n await handler.handle(\n GraphEvents.ON_RUN_STEP_COMPLETED,\n {\n result: {\n ...result,\n id: stepId,\n index: runStep?.index ?? 0,\n },\n },\n resolvedConfig?.configurable,\n this\n );\n }\n },\n },\n generateStepId: (stepKey: string) => this.generateStepId(stepKey),\n })\n )\n .addEdge(START, agentNode)\n .addConditionalEdges(agentNode, routeMessage)\n .addEdge(summarizeNode, agentNode)\n .addEdge(toolNode, agentContext.toolEnd ? END : agentNode);\n\n return workflow.compile();\n }\n\n createWorkflow(): t.CompiledStateWorkflow {\n const agentNode = this.createAgentNode(this.defaultAgentId);\n const StateAnnotation = Annotation.Root({\n messages: Annotation<BaseMessage[]>({\n reducer: (a, b) => {\n if (!this.messages.length) {\n this.startIndex = a.length + b.length;\n }\n const result = messagesStateReducer(a, b);\n this.messages = result;\n return result;\n },\n default: () => [],\n }),\n });\n const workflow = new StateGraph(StateAnnotation)\n .addNode(\n this.defaultAgentId,\n agentNode as Runnable<\n t.AgentSubgraphState,\n Partial<t.AgentSubgraphState>\n >,\n { ends: [END] }\n )\n .addEdge(START, this.defaultAgentId)\n // LangGraph compile() types are overly strict for opt-in options\n .compile(this.compileOptions as unknown as never);\n\n return workflow;\n }\n\n /**\n * Indicates if this is a multi-agent graph.\n * Override in MultiAgentGraph to return true.\n * Used to conditionally include agentId in RunStep for frontend rendering.\n */\n protected isMultiAgentGraph(): boolean {\n return false;\n }\n\n /**\n * Get the parallel group ID for an agent, if any.\n * Override in MultiAgentGraph to provide actual group IDs.\n * Group IDs are incrementing numbers (1, 2, 3...) reflecting execution order.\n * @param _agentId - The agent ID to look up\n * @returns undefined for StandardGraph (no parallel groups), or group number for MultiAgentGraph\n */\n protected getParallelGroupIdForAgent(_agentId: string): number | undefined {\n return undefined;\n }\n\n /* Dispatchers */\n\n /**\n * Dispatches a run step to the client, returns the step ID\n */\n async dispatchRunStep(\n stepKey: string,\n stepDetails: t.StepDetails,\n metadata?: Record<string, unknown>\n ): Promise<string> {\n if (!this.config) {\n throw new Error('No config provided');\n }\n\n const [stepId, stepIndex] = this.generateStepId(stepKey);\n if (stepDetails.type === StepTypes.TOOL_CALLS && stepDetails.tool_calls) {\n for (const tool_call of stepDetails.tool_calls) {\n const toolCallId = tool_call.id ?? '';\n if (!toolCallId || this.toolCallStepIds.has(toolCallId)) {\n continue;\n }\n this.toolCallStepIds.set(toolCallId, stepId);\n }\n }\n\n const runStep: t.RunStep = {\n stepIndex,\n id: stepId,\n type: stepDetails.type,\n index: this.contentData.length,\n stepDetails,\n usage: null,\n };\n\n const runId = this.runId ?? '';\n if (runId) {\n runStep.runId = runId;\n }\n\n if (metadata) {\n try {\n const agentContext = this.getAgentContext(metadata);\n if (this.isMultiAgentGraph() && agentContext.agentId) {\n runStep.agentId = agentContext.agentId;\n const groupId = this.getParallelGroupIdForAgent(agentContext.agentId);\n if (groupId != null) {\n runStep.groupId = groupId;\n }\n }\n } catch (_e) {\n /** If we can't get agent context, that's okay - agentId remains undefined */\n }\n }\n\n this.contentData.push(runStep);\n this.contentIndexMap.set(stepId, runStep.index);\n\n // Primary dispatch: handler registry (reliable, always works).\n // This mirrors how handleToolCallCompleted dispatches ON_RUN_STEP_COMPLETED\n // via the handler registry, ensuring the event always reaches the handler\n // even when LangGraph's callback system drops the custom event.\n const handler = this.handlerRegistry?.getHandler(GraphEvents.ON_RUN_STEP);\n if (handler) {\n await handler.handle(GraphEvents.ON_RUN_STEP, runStep, metadata, this);\n this.handlerDispatchedStepIds.add(stepId);\n }\n\n // Secondary dispatch: custom event for LangGraph callback chain\n // (tracing, Langfuse, external consumers). May be silently dropped\n // in some scenarios (stale run ID, subgraph callback propagation issues),\n // but the primary dispatch above guarantees the event reaches the handler.\n // The customEventCallback in run.ts skips events already dispatched above\n // to prevent double handling.\n const unmarkHandlerDispatchedEvent = handler\n ? this.markHandlerDispatchedEvent(GraphEvents.ON_RUN_STEP, stepId)\n : undefined;\n try {\n await safeDispatchCustomEvent(\n GraphEvents.ON_RUN_STEP,\n runStep,\n this.config\n );\n } finally {\n unmarkHandlerDispatchedEvent?.();\n }\n return stepId;\n }\n\n /**\n * Static version of handleToolCallError to avoid creating strong references\n * that prevent garbage collection\n */\n static async handleToolCallErrorStatic(\n graph: StandardGraph,\n data: t.ToolErrorData,\n metadata?: Record<string, unknown>\n ): Promise<void> {\n if (!graph.config) {\n throw new Error('No config provided');\n }\n\n if (!data.id) {\n console.warn('No Tool ID provided for Tool Error');\n return;\n }\n\n const stepId = graph.toolCallStepIds.get(data.id) ?? '';\n if (!stepId) {\n throw new Error(`No stepId found for tool_call_id ${data.id}`);\n }\n\n const { name, input: args, error } = data;\n\n const runStep = graph.getRunStep(stepId);\n if (!runStep) {\n throw new Error(`No run step found for stepId ${stepId}`);\n }\n\n const tool_call: t.ProcessedToolCall = {\n id: data.id,\n name: name || '',\n args: typeof args === 'string' ? args : JSON.stringify(args),\n output: `Error processing tool${error?.message != null ? `: ${error.message}` : ''}`,\n progress: 1,\n };\n\n await graph.handlerRegistry\n ?.getHandler(GraphEvents.ON_RUN_STEP_COMPLETED)\n ?.handle(\n GraphEvents.ON_RUN_STEP_COMPLETED,\n {\n result: {\n id: stepId,\n index: runStep.index,\n type: 'tool_call',\n tool_call,\n } as t.ToolCompleteEvent,\n },\n metadata,\n graph\n );\n }\n\n /**\n * Instance method that delegates to the static method\n * Kept for backward compatibility\n */\n async handleToolCallError(\n data: t.ToolErrorData,\n metadata?: Record<string, unknown>\n ): Promise<void> {\n await StandardGraph.handleToolCallErrorStatic(this, data, metadata);\n }\n\n async dispatchRunStepDelta(\n id: string,\n delta: t.ToolCallDelta,\n metadata?: Record<string, unknown>\n ): Promise<void> {\n if (!this.config) {\n throw new Error('No config provided');\n } else if (!id) {\n throw new Error('No step ID found');\n }\n const runStepDelta: t.RunStepDeltaEvent = {\n id,\n delta,\n };\n const handler = this.handlerRegistry?.getHandler(\n GraphEvents.ON_RUN_STEP_DELTA\n );\n if (handler) {\n await handler.handle(\n GraphEvents.ON_RUN_STEP_DELTA,\n runStepDelta,\n metadata,\n this\n );\n this.handlerDispatchedStepIds.add(id);\n }\n const unmarkHandlerDispatchedEvent = handler\n ? this.markHandlerDispatchedEvent(GraphEvents.ON_RUN_STEP_DELTA, id)\n : undefined;\n try {\n await safeDispatchCustomEvent(\n GraphEvents.ON_RUN_STEP_DELTA,\n runStepDelta,\n this.config\n );\n } finally {\n unmarkHandlerDispatchedEvent?.();\n }\n }\n\n async dispatchMessageDelta(\n id: string,\n delta: t.MessageDelta,\n metadata?: Record<string, unknown>\n ): Promise<void> {\n if (!this.config) {\n throw new Error('No config provided');\n }\n const messageDelta: t.MessageDeltaEvent = {\n id,\n delta,\n };\n if (hasTextDeltaContent(delta.content)) {\n this.messageStepHasTextDeltas.add(id);\n }\n const handler = this.handlerRegistry?.getHandler(\n GraphEvents.ON_MESSAGE_DELTA\n );\n if (handler) {\n await handler.handle(\n GraphEvents.ON_MESSAGE_DELTA,\n messageDelta,\n metadata,\n this\n );\n this.handlerDispatchedStepIds.add(id);\n }\n const unmarkHandlerDispatchedEvent = handler\n ? this.markHandlerDispatchedEvent(GraphEvents.ON_MESSAGE_DELTA, id)\n : undefined;\n try {\n await safeDispatchCustomEvent(\n GraphEvents.ON_MESSAGE_DELTA,\n messageDelta,\n this.config\n );\n } finally {\n unmarkHandlerDispatchedEvent?.();\n }\n }\n\n dispatchReasoningDelta = async (\n stepId: string,\n delta: t.ReasoningDelta,\n metadata?: Record<string, unknown>\n ): Promise<void> => {\n if (!this.config) {\n throw new Error('No config provided');\n }\n const reasoningDelta: t.ReasoningDeltaEvent = {\n id: stepId,\n delta,\n };\n if (hasReasoningDeltaContent(delta.content)) {\n this.reasoningStepHasDeltas.add(stepId);\n }\n const handler = this.handlerRegistry?.getHandler(\n GraphEvents.ON_REASONING_DELTA\n );\n if (handler) {\n await handler.handle(\n GraphEvents.ON_REASONING_DELTA,\n reasoningDelta,\n metadata,\n this\n );\n this.handlerDispatchedStepIds.add(stepId);\n }\n const unmarkHandlerDispatchedEvent = handler\n ? this.markHandlerDispatchedEvent(GraphEvents.ON_REASONING_DELTA, stepId)\n : undefined;\n try {\n await safeDispatchCustomEvent(\n GraphEvents.ON_REASONING_DELTA,\n reasoningDelta,\n this.config\n );\n } finally {\n unmarkHandlerDispatchedEvent?.();\n }\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Graph.mjs","names":["CustomToolNode","messagesStateReducer"],"sources":["../../../src/graphs/Graph.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport { nanoid } from 'nanoid';\nimport { tool } from '@langchain/core/tools';\nimport { ToolNode } from '@langchain/langgraph/prebuilt';\nimport { Runnable, RunnableConfig } from '@langchain/core/runnables';\nimport { ToolMessage, AIMessageChunk } from '@langchain/core/messages';\nimport { START, END, StateGraph, Annotation } from '@langchain/langgraph';\nimport type {\n UsageMetadata,\n BaseMessage,\n MessageContent,\n} from '@langchain/core/messages';\nimport type { ToolCall } from '@langchain/core/messages/tool';\nimport type { HookRegistry } from '@/hooks';\nimport type * as t from '@/types';\nimport {\n formatAnthropicArtifactContent,\n ensureThinkingBlockInMessages,\n convertMessagesToContent,\n sanitizeOrphanToolBlocks,\n extractToolDiscoveries,\n addBedrockTailCacheControl,\n formatArtifactPayload,\n enforceOriginalContentCap,\n formatContentStrings,\n isLegacyConvertible,\n createPruneMessages,\n syncBudgetDerivedFields,\n addTailCacheControl,\n getMessageId,\n makeIsDeferred,\n partitionAndMarkAnthropicToolCache,\n} from '@/messages';\nimport {\n resolveLangfuseConfig,\n shouldTraceToolNodeForLangfuse,\n withLangfuseToolOutputTracingConfig,\n} from '@/langfuseToolOutputTracing';\nimport {\n createLangfuseHandler,\n createLangfuseTraceMetadata,\n disposeLangfuseHandler,\n isLangfuseCallbackHandler,\n} from '@/langfuse';\nimport {\n resetIfNotEmpty,\n isAnthropicLike,\n isOpenAILike,\n isGoogleLike,\n apportionTokenCounts,\n joinKeys,\n sleep,\n} from '@/utils';\nimport {\n GraphNodeKeys,\n ContentTypes,\n GraphEvents,\n Providers,\n StepTypes,\n} from '@/common';\nimport {\n appendCallbacks,\n findCallback,\n type CallbackEntry,\n} from '@/utils/callbacks';\nimport { partitionAndMarkOpenRouterToolCache } from '@/llm/openrouter/toolCache';\nimport { ToolNode as CustomToolNode, toolsCondition } from '@/tools/ToolNode';\nimport { createLocalCodingToolBundle } from '@/tools/local/LocalCodingTools';\nimport { SubagentExecutor, resolveSubagentConfigs } from '@/tools/subagent';\nimport { ToolOutputReferenceRegistry } from '@/tools/toolOutputReferences';\nimport { partitionAndMarkBedrockToolCache } from '@/llm/bedrock/toolCache';\nimport { safeDispatchCustomEvent, emitAgentLog } from '@/utils/events';\nimport { createCloudflareCodingToolBundle } from '@/tools/cloudflare';\nimport { attemptInvoke, tryFallbackProviders } from '@/llm/invoke';\nimport { buildSubagentToolParams } from '@/tools/SubagentTool';\nimport { initializeLangfuseTracing } from '@/instrumentation';\nimport { shouldTriggerSummarization } from '@/summarization';\nimport { resolveLocalToolsForBinding } from '@/tools/local';\nimport { createSummarizeNode } from '@/summarization/node';\nimport { messagesStateReducer } from '@/messages/reducer';\nimport { createSchemaOnlyTools } from '@/tools/schema';\nimport { AgentContext } from '@/agents/AgentContext';\nimport { createFakeStreamingLLM } from '@/llm/fake';\nimport { handleToolCalls } from '@/tools/handlers';\nimport { isThinkingEnabled } from '@/llm/request';\nimport { initializeModel } from '@/llm/init';\nimport { HandlerRegistry } from '@/events';\nimport { ChatOpenAI } from '@/llm/openai';\n\nconst { AGENT, TOOLS, SUMMARIZE } = GraphNodeKeys;\n\n/** Minimum relative variance before calibrated toolSchemaTokens overrides current value. */\nconst CALIBRATION_VARIANCE_THRESHOLD = 0.15;\n\n/**\n * Start index of the span post-prune formatters can mutate in place: the\n * trailing tool batch plus its owning AI message (artifact formatting touches\n * every tool result after the last AI tool call; Bedrock rewrites the AI\n * message before a trailing tool result). Capped so the usage-snapshot\n * recount stays constant-cost.\n */\nfunction trailingMutationStart(messages: BaseMessage[]): number {\n const MAX_SPAN = 16;\n let index = messages.length - 1;\n while (\n index >= 0 &&\n messages[index]?.getType() === 'tool' &&\n messages.length - index < MAX_SPAN\n ) {\n index--;\n }\n return Math.max(0, Math.min(index, messages.length - 2));\n}\n\ntype ReasoningKey = 'reasoning_content' | 'reasoning';\ntype ReasoningSummary = { summary?: Array<{ text?: string }> };\ntype ReasoningDetail = { type?: string; text?: string };\n\nfunction getHandlerDispatchedEventKey(\n eventName: string,\n stepId: string\n): string {\n return `${eventName}:${stepId}`;\n}\n\nfunction getReasoningText(\n value: string | Partial<ReasoningSummary> | null | undefined\n): string | undefined {\n if (typeof value === 'string') {\n return value !== '' ? value : undefined;\n }\n const summaryText = value?.summary\n ?.map((summary) => summary.text ?? '')\n .filter((text) => text !== '')\n .join('');\n return summaryText != null && summaryText !== '' ? summaryText : undefined;\n}\n\nfunction getReasoningDetailsText(\n value: ReasoningDetail[] | null | undefined\n): string | undefined {\n if (!Array.isArray(value)) {\n return undefined;\n }\n const reasoningText = value\n .filter((detail) => detail.type === 'reasoning.text')\n .map((detail) => detail.text ?? '')\n .filter((text) => text !== '')\n .join('');\n return reasoningText !== '' ? reasoningText : undefined;\n}\n\nfunction getResponseReasoningContent({\n responseMessage,\n reasoningKey,\n}: {\n responseMessage?: Partial<AIMessageChunk>;\n reasoningKey: ReasoningKey;\n}): string | undefined {\n const additionalKwargs = responseMessage?.additional_kwargs;\n if (additionalKwargs == null) {\n return undefined;\n }\n\n const keyedReasoning = getReasoningText(\n additionalKwargs[reasoningKey] as\n | string\n | Partial<ReasoningSummary>\n | null\n | undefined\n );\n if (keyedReasoning != null) {\n return keyedReasoning;\n }\n\n const reasoningContent = getReasoningText(\n additionalKwargs.reasoning_content as\n | string\n | Partial<ReasoningSummary>\n | null\n | undefined\n );\n if (reasoningContent != null) {\n return reasoningContent;\n }\n\n const reasoning = getReasoningText(\n additionalKwargs.reasoning as\n | string\n | Partial<ReasoningSummary>\n | null\n | undefined\n );\n if (reasoning != null) {\n return reasoning;\n }\n\n return getReasoningDetailsText(\n additionalKwargs.reasoning_details as ReasoningDetail[] | null | undefined\n );\n}\n\nfunction isTextMessageContentPart(\n contentPart: MessageContent[number] | t.MessageContentComplex\n): boolean {\n return (\n typeof contentPart === 'object' &&\n 'type' in contentPart &&\n typeof contentPart.type === 'string' &&\n contentPart.type.startsWith('text')\n );\n}\n\nfunction isGoogleServerSideToolMessageContentPart(\n contentPart: MessageContent[number] | t.MessageContentComplex\n): boolean {\n return (\n typeof contentPart === 'object' &&\n 'type' in contentPart &&\n (contentPart.type === 'toolCall' || contentPart.type === 'toolResponse')\n );\n}\n\nfunction hasGoogleServerSideToolDeltaContent(\n provider: Providers | undefined,\n content: t.MessageDelta['content']\n): content is t.MessageContentComplex[] {\n return (\n isGoogleLike(provider) &&\n Array.isArray(content) &&\n content.some((contentPart) =>\n isGoogleServerSideToolMessageContentPart(contentPart)\n )\n );\n}\n\nfunction getMessageDeltaContent(\n provider: Providers | undefined,\n content: MessageContent | undefined\n): t.MessageDelta['content'] | undefined {\n if (content == null) {\n return undefined;\n }\n if (typeof content === 'string') {\n return content !== ''\n ? [{ type: ContentTypes.TEXT, text: content }]\n : undefined;\n }\n if (content.length === 0) {\n return undefined;\n }\n\n const hasGoogleServerSideToolPart =\n isGoogleLike(provider) &&\n content.some((contentPart) =>\n isGoogleServerSideToolMessageContentPart(contentPart)\n );\n if (content.every((contentPart) => isTextMessageContentPart(contentPart))) {\n return content as t.MessageDelta['content'];\n }\n if (!hasGoogleServerSideToolPart) {\n return undefined;\n }\n const messageContent = content.filter(\n (contentPart) =>\n isTextMessageContentPart(contentPart) ||\n isGoogleServerSideToolMessageContentPart(contentPart)\n );\n return messageContent.length > 0\n ? (messageContent as t.MessageDelta['content'])\n : undefined;\n}\n\nfunction hasTextDeltaContent(\n content: t.MessageDelta['content'] | undefined\n): boolean {\n if (content == null) {\n return false;\n }\n return content.some((contentPart) => {\n if (contentPart.type?.startsWith(ContentTypes.TEXT) !== true) {\n return false;\n }\n const text = (contentPart as Partial<{ text: string }>).text;\n return typeof text === 'string' && text !== '';\n });\n}\n\nfunction hasReasoningDeltaContent(\n content: t.ReasoningDelta['content'] | undefined\n): boolean {\n if (content == null) {\n return false;\n }\n return content.some(\n (contentPart) =>\n contentPart.type === ContentTypes.THINK && contentPart.think !== ''\n );\n}\n\nfunction getCurrentStepIds({\n graph,\n metadata,\n}: {\n graph: Graph<t.BaseGraphState>;\n metadata: Record<string, unknown>;\n}): string[] {\n const baseStepKey = graph.getStepBaseKey(metadata);\n const currentStepIds: string[] = [];\n for (const [stepKey, stepIds] of graph.stepKeyIds) {\n if (stepKey !== baseStepKey && !stepKey.startsWith(`${baseStepKey}_`)) {\n continue;\n }\n currentStepIds.push(...stepIds);\n }\n return currentStepIds;\n}\n\nfunction hasCurrentTextDeltaStep({\n graph,\n metadata,\n}: {\n graph: Graph<t.BaseGraphState>;\n metadata: Record<string, unknown>;\n}): boolean {\n return getCurrentStepIds({ graph, metadata }).some((stepId) =>\n graph.messageStepHasTextDeltas.has(stepId)\n );\n}\n\nfunction hasCurrentReasoningDeltaStep({\n graph,\n metadata,\n}: {\n graph: Graph<t.BaseGraphState>;\n metadata: Record<string, unknown>;\n}): boolean {\n return getCurrentStepIds({ graph, metadata }).some((stepId) =>\n graph.reasoningStepHasDeltas.has(stepId)\n );\n}\n\nfunction clearCurrentDeltaStepMarkers({\n graph,\n metadata,\n}: {\n graph: Graph<t.BaseGraphState>;\n metadata: Record<string, unknown>;\n}): void {\n for (const stepId of getCurrentStepIds({ graph, metadata })) {\n graph.messageStepHasTextDeltas.delete(stepId);\n graph.reasoningStepHasDeltas.delete(stepId);\n }\n}\n\nasync function dispatchMessageCreationStep({\n graph,\n stepKey,\n messageId,\n metadata,\n}: {\n graph: Graph<t.BaseGraphState>;\n stepKey: string;\n messageId: string;\n metadata: Record<string, unknown>;\n}): Promise<string> {\n await graph.dispatchRunStep(\n stepKey,\n {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: { message_id: messageId },\n },\n metadata\n );\n return graph.getStepIdByKey(stepKey);\n}\n\nasync function dispatchTextMessageContent({\n graph,\n stepKey,\n provider,\n content,\n metadata,\n}: {\n graph: Graph<t.BaseGraphState>;\n stepKey: string;\n provider?: Providers;\n content: t.MessageDelta['content'];\n metadata: Record<string, unknown>;\n}): Promise<boolean> {\n const messageId = getMessageId(stepKey, graph) ?? '';\n if (!messageId) {\n return false;\n }\n if (hasGoogleServerSideToolDeltaContent(provider, content)) {\n for (const contentPart of content) {\n const stepId = await dispatchMessageCreationStep({\n graph,\n stepKey,\n messageId,\n metadata,\n });\n await graph.dispatchMessageDelta(\n stepId,\n { content: [contentPart] },\n metadata\n );\n }\n return true;\n }\n const stepId = await dispatchMessageCreationStep({\n graph,\n stepKey,\n messageId,\n metadata,\n });\n await graph.dispatchMessageDelta(stepId, { content }, metadata);\n return true;\n}\n\nasync function dispatchReasoningContent({\n graph,\n agentContext,\n reasoningContent,\n metadata,\n}: {\n graph: Graph<t.BaseGraphState>;\n agentContext: AgentContext;\n reasoningContent: string;\n metadata: Record<string, unknown>;\n}): Promise<boolean> {\n const previousTokenType = agentContext.currentTokenType;\n const previousTokenTypeSwitch = agentContext.tokenTypeSwitch;\n const previousTransitionCount = agentContext.reasoningTransitionCount;\n\n agentContext.currentTokenType = ContentTypes.THINK;\n agentContext.tokenTypeSwitch = 'reasoning';\n\n const stepKey = graph.getStepKey(metadata);\n const messageId = getMessageId(stepKey, graph) ?? '';\n if (!messageId) {\n agentContext.currentTokenType = previousTokenType;\n agentContext.tokenTypeSwitch = previousTokenTypeSwitch;\n agentContext.reasoningTransitionCount = previousTransitionCount;\n return false;\n }\n\n await graph.dispatchRunStep(\n stepKey,\n {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: { message_id: messageId },\n },\n metadata\n );\n const stepId = graph.getStepIdByKey(stepKey);\n await graph.dispatchReasoningDelta(\n stepId,\n {\n content: [{ type: ContentTypes.THINK, think: reasoningContent }],\n },\n metadata\n );\n return true;\n}\n\nfunction markPostReasoningContent(agentContext: AgentContext): void {\n if (\n agentContext.tokenTypeSwitch !== 'reasoning' ||\n agentContext.currentTokenType === ContentTypes.TEXT\n ) {\n return;\n }\n agentContext.currentTokenType = ContentTypes.TEXT;\n agentContext.tokenTypeSwitch = 'content';\n agentContext.reasoningTransitionCount++;\n}\n\nfunction getDispatchableFinalReasoningContent({\n agentContext,\n responseReasoningContent,\n hasStreamedTextDeltaStep,\n hasStreamedReasoningDeltaStep,\n}: {\n agentContext: AgentContext;\n responseReasoningContent: string | undefined;\n hasStreamedTextDeltaStep: boolean;\n hasStreamedReasoningDeltaStep: boolean;\n}): string | undefined {\n if (responseReasoningContent == null || hasStreamedReasoningDeltaStep) {\n return undefined;\n }\n if (\n agentContext.provider === Providers.OPENROUTER &&\n hasStreamedTextDeltaStep\n ) {\n return undefined;\n }\n return responseReasoningContent;\n}\n\nexport abstract class Graph<\n T extends t.BaseGraphState = t.BaseGraphState,\n _TNodeName extends string = string,\n> {\n abstract resetValues(): void;\n abstract initializeTools({\n currentTools,\n currentToolMap,\n }: {\n currentTools?: t.GraphTools;\n currentToolMap?: t.ToolMap;\n }): CustomToolNode<T> | ToolNode<T>;\n abstract getRunMessages(): BaseMessage[] | undefined;\n abstract getContentParts(): t.MessageContentComplex[] | undefined;\n abstract generateStepId(stepKey: string): [string, number];\n abstract getKeyList(\n metadata: Record<string, unknown> | undefined\n ): (string | number | undefined)[];\n abstract getStepBaseKey(\n metadata: Record<string, unknown> | undefined\n ): string;\n abstract getStepKey(metadata: Record<string, unknown> | undefined): string;\n abstract checkKeyList(keyList: (string | number | undefined)[]): boolean;\n abstract getStepIdByKey(stepKey: string, index?: number): string;\n abstract getRunStep(stepId: string): t.RunStep | undefined;\n abstract dispatchRunStep(\n stepKey: string,\n stepDetails: t.StepDetails,\n metadata?: Record<string, unknown>\n ): Promise<string>;\n abstract dispatchRunStepDelta(\n id: string,\n delta: t.ToolCallDelta,\n metadata?: Record<string, unknown>\n ): Promise<void>;\n abstract dispatchMessageDelta(\n id: string,\n delta: t.MessageDelta,\n metadata?: Record<string, unknown>\n ): Promise<void>;\n abstract dispatchReasoningDelta(\n stepId: string,\n delta: t.ReasoningDelta,\n metadata?: Record<string, unknown>\n ): Promise<void>;\n abstract createCallModel(\n agentId?: string,\n currentModel?: t.ChatModel\n ): (\n state: t.AgentSubgraphState,\n config?: RunnableConfig\n ) => Promise<Partial<t.AgentSubgraphState>>;\n messageStepHasTextDeltas: Set<string> = new Set();\n messageStepHasToolCalls: Map<string, boolean> = new Map();\n messageIdsByStepKey: Map<string, string> = new Map();\n prelimMessageIdsByStepKey: Map<string, string> = new Map();\n config: RunnableConfig | undefined;\n contentData: t.RunStep[] = [];\n stepKeyIds: Map<string, string[]> = new Map<string, string[]>();\n contentIndexMap: Map<string, number> = new Map();\n toolCallStepIds: Map<string, string> = new Map();\n /**\n * Step IDs dispatched through the handler registry during this run.\n * Event echo suppression is tracked separately so repeated deltas for\n * the same step are scoped to the active custom event dispatch.\n */\n handlerDispatchedStepIds: Set<string> = new Set();\n reasoningStepHasDeltas: Set<string> = new Set();\n protected handlerDispatchedEventCounts: Map<string, number> = new Map();\n signal?: AbortSignal;\n /** Set of invoked tool call IDs from non-message run steps completed mid-run, if any */\n invokedToolIds?: Set<string>;\n handlerRegistry: HandlerRegistry | undefined;\n /**\n * True when event-driven tool execution can be routed through callbacks even\n * though this graph intentionally does not own the full handler registry.\n * Self-spawned subagent graphs use this shape: their callback forwarder sends\n * `ON_TOOL_EXECUTE` to the parent's handler, while child run-step events stay\n * wrapped as `ON_SUBAGENT_UPDATE` instead of leaking as parent events.\n */\n eventToolExecutionAvailable: boolean = false;\n hookRegistry: HookRegistry | undefined;\n /**\n * Run-scoped HITL configuration. When `humanInTheLoop?.enabled` is\n * `true`, `ToolNode` raises a real `interrupt()` for `PreToolUse`\n * `ask` decisions instead of treating them as a synchronous deny.\n * Threaded from `RunConfig.humanInTheLoop`.\n */\n humanInTheLoop: t.HumanInTheLoopConfig | undefined;\n /**\n * Run-scoped config for the tool output reference registry. Threaded\n * from `RunConfig.toolOutputReferences` down into every ToolNode this\n * graph compiles.\n */\n toolOutputReferences: t.ToolOutputReferencesConfig | undefined;\n /**\n * Run-scoped Langfuse defaults. Per-agent config wins when present.\n */\n langfuse: t.LangfuseConfig | undefined;\n /**\n * Run-scoped opt-in for eager event-driven tool execution. The stream\n * handler may prestart eligible event-driven tools; ToolNode later\n * consumes the settled promises while preserving final ToolMessage order.\n */\n eagerEventToolExecution: t.EagerEventToolExecutionConfig | undefined;\n eagerEventToolExecutions: Map<string, t.EagerEventToolExecution> = new Map();\n eagerEventToolUsageCount: Map<string, number> = new Map();\n private eagerEventToolUsageCountsByAgentId: Map<string, Map<string, number>> =\n new Map();\n eagerEventToolCallChunks: Map<string, t.EagerEventToolCallChunkState> =\n new Map();\n /**\n * Run-scoped execution backend for built-in code tools. Defaults to the\n * remote Code API sandbox when unset.\n */\n toolExecution: t.ToolExecutionConfig | undefined;\n /**\n * Shared registry instance used by every ToolNode compiled from this\n * graph. Lazily constructed on first access so multi-agent graphs\n * produce one registry per run (not one per agent), letting cross-\n * agent `{{tool<i>turn<n>}}` substitutions resolve.\n */\n private _toolOutputRegistry?: ToolOutputReferenceRegistry;\n /**\n * Tool session contexts for automatic state persistence across tool invocations.\n * Keyed by tool name (e.g., Constants.EXECUTE_CODE).\n * Currently supports code execution session tracking (session_id, files).\n */\n sessions: t.ToolSessionMap = new Map();\n\n /**\n * Clears heavy references to allow GC to reclaim memory held by\n * LangGraph's internal config / AsyncLocalStorage RunTree chain.\n * Call after a run completes and content has been extracted.\n */\n clearHeavyState(): void {\n this.config = undefined;\n this.signal = undefined;\n this.contentData = [];\n this.contentIndexMap = new Map();\n this.stepKeyIds = new Map();\n this.toolCallStepIds.clear();\n this.messageIdsByStepKey = new Map();\n this.messageStepHasTextDeltas = new Set();\n this.reasoningStepHasDeltas = new Set();\n this.messageStepHasToolCalls = new Map();\n this.prelimMessageIdsByStepKey = new Map();\n this.invokedToolIds = undefined;\n this.handlerRegistry = undefined;\n this.hookRegistry = undefined;\n this.humanInTheLoop = undefined;\n this.toolOutputReferences = undefined;\n this.eagerEventToolExecution = undefined;\n this.eagerEventToolExecutions.clear();\n this.clearEagerEventToolUsageCounts();\n this.eagerEventToolCallChunks.clear();\n this.toolExecution = undefined;\n this.handlerDispatchedEventCounts.clear();\n /**\n * ToolNodes compiled from this graph captured the registry\n * instance at construction time, so simply dropping the Graph's\n * own reference would leave their captured reference — and every\n * stored `tool<i>turn<n>` entry, plus up to `maxTotalSize` of raw\n * output — alive across subsequent `processStream()` calls. Wipe\n * the registry's contents first so subsequent runs start fresh.\n */\n this._toolOutputRegistry?.clear();\n this._toolOutputRegistry = undefined;\n // NB: `_fileCheckpointer` is intentionally NOT cleared here.\n // `Run.processStream()` calls `clearHeavyState()` in its\n // finally block on natural-completion / error paths — exactly\n // when the host is most likely to want `Run.rewindFiles()` (for\n // rollback after a failed batch). Per-Run isolation is already\n // automatic because each `Run.create()` constructs a brand-new\n // Graph instance, so the next Run gets its own checkpointer\n // without us needing to reset this field. Codex P1 #32: pre-fix\n // the checkpointer was nulled before the caller could reach it.\n // Flush each compiled ToolNode's direct-path turn cache so it\n // doesn't leak across Runs (Codex P2 #33). The cache survives\n // `run()` re-entry by design (resume-stable), but end-of-Run\n // is the right point to reset it.\n for (const node of this._compiledToolNodes) {\n node.clearDirectPathTurns();\n }\n this._compiledToolNodes.clear();\n this.sessions.clear();\n }\n\n getEagerEventToolUsageCount(agentId?: string): Map<string, number> {\n if (agentId == null || agentId === '') {\n return this.eagerEventToolUsageCount;\n }\n let usageCount = this.eagerEventToolUsageCountsByAgentId.get(agentId);\n if (usageCount == null) {\n usageCount = new Map<string, number>();\n this.eagerEventToolUsageCountsByAgentId.set(agentId, usageCount);\n }\n return usageCount;\n }\n\n protected clearEagerEventToolUsageCounts(): void {\n this.eagerEventToolUsageCount.clear();\n for (const usageCount of this.eagerEventToolUsageCountsByAgentId.values()) {\n usageCount.clear();\n }\n }\n\n markHandlerDispatchedEvent(eventName: string, stepId: string): () => void {\n const key = getHandlerDispatchedEventKey(eventName, stepId);\n this.handlerDispatchedEventCounts.set(\n key,\n (this.handlerDispatchedEventCounts.get(key) ?? 0) + 1\n );\n return () => {\n const count = this.handlerDispatchedEventCounts.get(key) ?? 0;\n if (count <= 1) {\n this.handlerDispatchedEventCounts.delete(key);\n return;\n }\n this.handlerDispatchedEventCounts.set(key, count - 1);\n };\n }\n\n hasHandlerDispatchedEvent(eventName: string, stepId: string): boolean {\n const key = getHandlerDispatchedEventKey(eventName, stepId);\n return (this.handlerDispatchedEventCounts.get(key) ?? 0) > 0;\n }\n\n /**\n * Subclass hook to register a freshly compiled ToolNode so\n * `clearHeavyState` can flush its per-Run direct-path turn cache\n * at end-of-Run. Internal — called from `initializeTools` in the\n * concrete graph subclasses.\n */\n protected registerCompiledToolNode(node: {\n clearDirectPathTurns(): void;\n }): void {\n this._compiledToolNodes.add(node);\n }\n\n /**\n * Returns the shared `ToolOutputReferenceRegistry` for this run,\n * constructing it on first access. Returns `undefined` when the\n * feature is disabled. All ToolNodes compiled from this graph share\n * this single instance so cross-agent `{{…}}` references resolve.\n *\n * @internal Public so `attemptInvoke` can read it through the typed\n * `InvokeContext` and project ToolMessages into LLM-facing annotated\n * copies right before each provider call (see\n * `annotateMessagesForLLM`). Host code should not call this directly\n * — registry mutations outside the ToolNode lifecycle break the\n * partitioning, eviction, and turn-counter invariants.\n */\n public getOrCreateToolOutputRegistry():\n | ToolOutputReferenceRegistry\n | undefined {\n if (this.toolOutputReferences?.enabled !== true) {\n return undefined;\n }\n if (this._toolOutputRegistry == null) {\n this._toolOutputRegistry = new ToolOutputReferenceRegistry({\n maxOutputSize: this.toolOutputReferences.maxOutputSize,\n maxTotalSize: this.toolOutputReferences.maxTotalSize,\n });\n }\n return this._toolOutputRegistry;\n }\n\n /**\n * Single per-Run file checkpointer shared across every ToolNode the\n * graph compiles. Lazily constructed when\n * `toolExecution.local.fileCheckpointing === true` or\n * `toolExecution.cloudflare.fileCheckpointing === true` so\n * multi-agent graphs see ONE snapshot store, not one-per-agent.\n * Returns undefined when checkpointing is disabled or a supported\n * coding-tool engine isn't selected. Exposed via\n * `Run.getFileCheckpointer()` / `Run.rewindFiles()`.\n */\n private _fileCheckpointer?: t.LocalFileCheckpointer;\n /**\n * ToolNodes compiled into this Graph's workflow. Tracked so\n * `clearHeavyState()` can flush their per-Run direct-path turn\n * cache (`directPathTurns`) at end-of-Run — that map intentionally\n * survives `run()` re-entry (resume-stable per Codex P2 #30) but\n * would otherwise grow linearly with tool calls and could collide\n * across Runs if a provider reuses call ids (Codex P2 #33).\n */\n private _compiledToolNodes: Set<{\n clearDirectPathTurns(): void;\n }> = new Set();\n public getOrCreateFileCheckpointer(): t.LocalFileCheckpointer | undefined {\n // Return the cached instance unconditionally if one exists. The\n // toolExecution check below decides whether to *create* a new\n // one — `clearHeavyState` nulls `this.toolExecution` at end-of-\n // Run, but we want post-Run `Run.rewindFiles()` to still resolve\n // to the checkpointer that captured the writes. Codex P1 #32.\n if (this._fileCheckpointer != null) {\n return this._fileCheckpointer;\n }\n // Eagerly create via the bundle factory so the construction path\n // matches the bundle-only callers (and future bundle-internal\n // cleanup hooks fire). The bundle factory itself accepts a pre-\n // supplied checkpointer when present, so re-injecting this one\n // into every ToolNode is idempotent.\n if (\n this.toolExecution?.engine === 'local' &&\n this.toolExecution.local?.fileCheckpointing === true\n ) {\n const bundle = createLocalCodingToolBundle(\n this.toolExecution.local ?? {}\n );\n this._fileCheckpointer = bundle.checkpointer;\n return this._fileCheckpointer;\n }\n if (\n this.toolExecution?.engine === 'cloudflare-sandbox' &&\n this.toolExecution.cloudflare?.fileCheckpointing === true\n ) {\n const bundle = createCloudflareCodingToolBundle(\n this.toolExecution.cloudflare\n );\n this._fileCheckpointer = bundle.checkpointer;\n return this._fileCheckpointer;\n }\n return undefined;\n }\n}\n\nexport class StandardGraph extends Graph<t.BaseGraphState, t.GraphNode> {\n overrideModel?: t.ChatModel;\n /** Optional compile options passed into workflow.compile() */\n compileOptions?: t.CompileOptions | undefined;\n messages: BaseMessage[] = [];\n /** Cached run messages preserved before clearHeavyState() so getRunMessages() works after cleanup. */\n private cachedRunMessages?: BaseMessage[];\n runId: string | undefined;\n /**\n * Boundary between historical messages (loaded from conversation state)\n * and messages produced during the current run. Set once in the state\n * reducer when messages first arrive. Used by `getRunMessages()` and\n * multi-agent message filtering — NOT for pruner token counting (the\n * pruner maintains its own `lastTurnStartIndex` in its closure).\n */\n startIndex: number = 0;\n signal?: AbortSignal;\n /** Map of agent contexts by agent ID */\n agentContexts: Map<string, AgentContext> = new Map();\n /** Default agent ID to use */\n defaultAgentId: string;\n /**\n * Host sink for model usage emitted inside subagent child runs. Threaded\n * into each `SubagentExecutor` this graph creates (and from there into\n * child graphs, so nested subagents report too). See\n * {@link t.StandardGraphInput.subagentUsageSink}.\n */\n subagentUsageSink?: t.SubagentUsageSink;\n\n constructor({\n runId,\n signal,\n agents,\n langfuse,\n tokenCounter,\n indexTokenCountMap,\n calibrationRatio,\n subagentUsageSink,\n }: t.StandardGraphInput) {\n super();\n this.runId = runId;\n this.signal = signal;\n this.langfuse = langfuse;\n this.subagentUsageSink = subagentUsageSink;\n\n if (agents.length === 0) {\n throw new Error('At least one agent configuration is required');\n }\n\n for (const agentConfig of agents) {\n const agentContext = AgentContext.fromConfig(\n agentConfig,\n tokenCounter,\n indexTokenCountMap\n );\n if (calibrationRatio != null && calibrationRatio > 0) {\n agentContext.calibrationRatio = calibrationRatio;\n }\n\n this.agentContexts.set(agentConfig.agentId, agentContext);\n }\n\n this.defaultAgentId = agents[0].agentId;\n }\n\n /* Init */\n\n resetValues(keepContent?: boolean): void {\n this.messages = [];\n this.cachedRunMessages = undefined;\n this.config = resetIfNotEmpty(this.config, undefined);\n if (keepContent !== true) {\n this.contentData = resetIfNotEmpty(this.contentData, []);\n this.contentIndexMap = resetIfNotEmpty(this.contentIndexMap, new Map());\n }\n this.stepKeyIds = resetIfNotEmpty(this.stepKeyIds, new Map());\n /**\n * Clear in-place instead of replacing with a new Map to preserve the\n * shared reference held by ToolNode (passed at construction time).\n * Using resetIfNotEmpty would create a new Map, leaving ToolNode with\n * a stale reference on 2nd+ processStream calls.\n */\n this.toolCallStepIds.clear();\n this.eagerEventToolExecutions.clear();\n this.clearEagerEventToolUsageCounts();\n this.eagerEventToolCallChunks.clear();\n this.handlerDispatchedStepIds = resetIfNotEmpty(\n this.handlerDispatchedStepIds,\n new Set()\n );\n this.handlerDispatchedEventCounts = resetIfNotEmpty(\n this.handlerDispatchedEventCounts,\n new Map()\n );\n this.messageIdsByStepKey = resetIfNotEmpty(\n this.messageIdsByStepKey,\n new Map()\n );\n this.messageStepHasToolCalls = resetIfNotEmpty(\n this.messageStepHasToolCalls,\n new Map()\n );\n this.messageStepHasTextDeltas = resetIfNotEmpty(\n this.messageStepHasTextDeltas,\n new Set()\n );\n this.reasoningStepHasDeltas = resetIfNotEmpty(\n this.reasoningStepHasDeltas,\n new Set()\n );\n this.prelimMessageIdsByStepKey = resetIfNotEmpty(\n this.prelimMessageIdsByStepKey,\n new Map()\n );\n this.invokedToolIds = resetIfNotEmpty(this.invokedToolIds, undefined);\n for (const context of this.agentContexts.values()) {\n context.reset();\n }\n }\n\n override clearHeavyState(): void {\n this.cachedRunMessages = this.messages.slice(this.startIndex);\n super.clearHeavyState();\n this.messages = [];\n this.overrideModel = undefined;\n for (const context of this.agentContexts.values()) {\n context.reset();\n }\n }\n\n /* Run Step Processing */\n\n getRunStep(stepId: string): t.RunStep | undefined {\n const index = this.contentIndexMap.get(stepId);\n if (index !== undefined) {\n return this.contentData[index];\n }\n return undefined;\n }\n\n getAgentContext(metadata: Record<string, unknown> | undefined): AgentContext {\n if (!metadata) {\n throw new Error('No metadata provided to retrieve agent context');\n }\n\n const currentNode = metadata.langgraph_node as string;\n if (!currentNode) {\n throw new Error(\n 'No langgraph_node in metadata to retrieve agent context'\n );\n }\n\n let agentId: string | undefined;\n if (currentNode.startsWith(AGENT)) {\n agentId = currentNode.substring(AGENT.length);\n } else if (currentNode.startsWith(TOOLS)) {\n agentId = currentNode.substring(TOOLS.length);\n } else if (currentNode.startsWith(SUMMARIZE)) {\n agentId = currentNode.substring(SUMMARIZE.length);\n }\n\n const agentContext = this.agentContexts.get(agentId ?? '');\n if (!agentContext) {\n throw new Error(`No agent context found for agent ID ${agentId}`);\n }\n\n return agentContext;\n }\n\n getStepBaseKey(metadata: Record<string, unknown> | undefined): string {\n if (!metadata) return '';\n\n const keyList = this.getInvocationKeyList(metadata);\n if (this.checkKeyList(keyList)) {\n throw new Error('Missing metadata');\n }\n\n return joinKeys(keyList);\n }\n\n getStepKey(metadata: Record<string, unknown> | undefined): string {\n if (!metadata) return '';\n\n const keyList = this.getKeyList(metadata);\n if (this.checkKeyList(keyList)) {\n throw new Error('Missing metadata');\n }\n\n return joinKeys(keyList);\n }\n\n getStepIdByKey(stepKey: string, index?: number): string {\n const stepIds = this.stepKeyIds.get(stepKey);\n if (!stepIds) {\n throw new Error(`No step IDs found for stepKey ${stepKey}`);\n }\n\n if (index === undefined) {\n return stepIds[stepIds.length - 1];\n }\n\n return stepIds[index];\n }\n\n generateStepId(stepKey: string): [string, number] {\n const stepIds = this.stepKeyIds.get(stepKey);\n let newStepId: string | undefined;\n let stepIndex = 0;\n if (stepIds) {\n stepIndex = stepIds.length;\n newStepId = `step_${nanoid()}`;\n stepIds.push(newStepId);\n this.stepKeyIds.set(stepKey, stepIds);\n } else {\n newStepId = `step_${nanoid()}`;\n this.stepKeyIds.set(stepKey, [newStepId]);\n }\n\n return [newStepId, stepIndex];\n }\n\n getKeyList(\n metadata: Record<string, unknown> | undefined\n ): (string | number | undefined)[] {\n if (!metadata) return [];\n\n const keyList = this.getInvocationKeyList(metadata);\n const agentContext = this.getAgentContext(metadata);\n if (\n agentContext.currentTokenType === ContentTypes.THINK ||\n agentContext.currentTokenType === 'think_and_text'\n ) {\n keyList.push('reasoning');\n } else if (agentContext.tokenTypeSwitch === 'content') {\n keyList.push(`post-reasoning-${agentContext.reasoningTransitionCount}`);\n }\n\n return keyList;\n }\n\n private getInvocationKeyList(\n metadata: Record<string, unknown>\n ): (string | number | undefined)[] {\n const keyList = this.getBaseKeyList(metadata);\n if (this.invokedToolIds != null && this.invokedToolIds.size > 0) {\n keyList.push(this.invokedToolIds.size + '');\n }\n return keyList;\n }\n\n private getBaseKeyList(\n metadata: Record<string, unknown>\n ): (string | number | undefined)[] {\n const configurable = this.config?.configurable;\n const runId =\n (metadata.run_id as string | undefined) ??\n (configurable?.run_id as string | undefined) ??\n this.runId;\n const threadId =\n (metadata.thread_id as string | undefined) ??\n (configurable?.thread_id as string | undefined) ??\n runId;\n const checkpointNs =\n (metadata.checkpoint_ns as string | undefined) ??\n (metadata.langgraph_checkpoint_ns as string | undefined) ??\n '';\n const keyList = [\n runId,\n threadId,\n metadata.langgraph_node as string,\n metadata.langgraph_step as number,\n checkpointNs,\n ];\n\n return keyList;\n }\n\n checkKeyList(keyList: (string | number | undefined)[]): boolean {\n return keyList.some((key) => key === undefined);\n }\n\n /* Misc.*/\n\n getRunMessages(): BaseMessage[] | undefined {\n if (this.messages.length === 0 && this.cachedRunMessages != null) {\n return this.cachedRunMessages;\n }\n return this.messages.slice(this.startIndex);\n }\n\n getContentParts(): t.MessageContentComplex[] | undefined {\n return convertMessagesToContent(this.messages.slice(this.startIndex));\n }\n\n getCalibrationRatio(): number {\n const context = this.agentContexts.get(this.defaultAgentId);\n return context?.calibrationRatio ?? 1;\n }\n\n getResolvedInstructionOverhead(): number | undefined {\n const context = this.agentContexts.get(this.defaultAgentId);\n return context?.resolvedInstructionOverhead;\n }\n\n getToolCount(): number {\n const context = this.agentContexts.get(this.defaultAgentId);\n return (\n (context?.tools?.length ?? 0) + (context?.toolDefinitions?.length ?? 0)\n );\n }\n\n /**\n * Get all run steps, optionally filtered by agent ID\n */\n getRunSteps(agentId?: string): t.RunStep[] {\n if (agentId == null || agentId === '') {\n return [...this.contentData];\n }\n return this.contentData.filter((step) => step.agentId === agentId);\n }\n\n /**\n * Get run steps grouped by agent ID\n */\n getRunStepsByAgent(): Map<string, t.RunStep[]> {\n const stepsByAgent = new Map<string, t.RunStep[]>();\n\n for (const step of this.contentData) {\n if (step.agentId == null || step.agentId === '') continue;\n\n const steps = stepsByAgent.get(step.agentId) ?? [];\n steps.push(step);\n stepsByAgent.set(step.agentId, steps);\n }\n\n return stepsByAgent;\n }\n\n /**\n * Get agent IDs that participated in this run\n */\n getActiveAgentIds(): string[] {\n const agentIds = new Set<string>();\n for (const step of this.contentData) {\n if (step.agentId != null && step.agentId !== '') {\n agentIds.add(step.agentId);\n }\n }\n return Array.from(agentIds);\n }\n\n /**\n * Maps contentPart indices to agent IDs for post-run analysis\n * Returns a map where key is the contentPart index and value is the agentId\n */\n getContentPartAgentMap(): Map<number, string> {\n const contentPartAgentMap = new Map<number, string>();\n\n for (const step of this.contentData) {\n if (\n step.agentId != null &&\n step.agentId !== '' &&\n Number.isFinite(step.index)\n ) {\n contentPartAgentMap.set(step.index, step.agentId);\n }\n }\n\n return contentPartAgentMap;\n }\n\n /* Graph */\n\n initializeTools({\n currentTools,\n currentToolMap,\n agentContext,\n }: {\n currentTools?: t.GraphTools;\n currentToolMap?: t.ToolMap;\n agentContext?: AgentContext;\n }): CustomToolNode<t.BaseGraphState> | ToolNode<t.BaseGraphState> {\n const toolDefinitions = agentContext?.toolDefinitions;\n const eventDrivenMode =\n toolDefinitions != null && toolDefinitions.length > 0;\n const traceToolNode = shouldTraceToolNodeForLangfuse({\n runLangfuse: this.langfuse,\n agentLangfuse: agentContext?.langfuse,\n });\n\n if (eventDrivenMode) {\n const schemaTools = createSchemaOnlyTools(toolDefinitions);\n const toolDefMap = new Map(toolDefinitions.map((def) => [def.name, def]));\n const graphTools = agentContext?.graphTools as\n | t.GenericTool[]\n | undefined;\n\n const directToolNames = new Set<string>();\n const allTools = [...schemaTools] as t.GenericTool[];\n const allToolMap: t.ToolMap = new Map(\n schemaTools.map((tool) => [tool.name, tool])\n );\n\n if (graphTools && graphTools.length > 0) {\n for (const tool of graphTools) {\n if ('name' in tool) {\n allTools.push(tool);\n allToolMap.set(tool.name, tool);\n directToolNames.add(tool.name);\n }\n }\n }\n\n const node = new CustomToolNode<t.BaseGraphState>({\n tools: allTools,\n toolMap: allToolMap,\n trace: traceToolNode,\n runLangfuse: this.langfuse,\n agentLangfuse: agentContext?.langfuse,\n eventDrivenMode: true,\n sessions: this.sessions,\n toolDefinitions: toolDefMap,\n agentId: agentContext?.agentId,\n executingAgentId: agentContext?.agentId,\n toolCallStepIds: this.toolCallStepIds,\n toolRegistry: agentContext?.toolRegistry,\n hookRegistry: this.hookRegistry,\n humanInTheLoop: this.humanInTheLoop,\n eagerEventToolExecution: this.eagerEventToolExecution,\n eagerEventToolExecutions: this.eagerEventToolExecutions,\n eagerEventToolUsageCount: this.getEagerEventToolUsageCount(\n agentContext?.agentId\n ),\n toolExecution: this.toolExecution,\n directToolNames: directToolNames.size > 0 ? directToolNames : undefined,\n maxContextTokens: agentContext?.maxContextTokens,\n maxToolResultChars: agentContext?.maxToolResultChars,\n toolOutputRegistry: this.getOrCreateToolOutputRegistry(),\n fileCheckpointer: this.getOrCreateFileCheckpointer(),\n errorHandler: (data, metadata): Promise<void> =>\n StandardGraph.handleToolCallErrorStatic(this, data, metadata),\n });\n this.registerCompiledToolNode(node);\n return node;\n }\n\n const graphTools = agentContext?.graphTools as t.GenericTool[] | undefined;\n const baseTools = (currentTools as t.GenericTool[] | undefined) ?? [];\n const allTraditionalTools =\n graphTools && graphTools.length > 0\n ? [...baseTools, ...graphTools]\n : baseTools;\n const traditionalToolMap =\n graphTools && graphTools.length > 0\n ? new Map([\n ...(currentToolMap ?? new Map()),\n ...graphTools\n .filter((t): t is t.GenericTool & { name: string } => 'name' in t)\n .map((t) => [t.name, t] as [string, t.GenericTool]),\n ])\n : currentToolMap;\n\n const node = new CustomToolNode<t.BaseGraphState>({\n tools: allTraditionalTools,\n toolMap: traditionalToolMap,\n trace: traceToolNode,\n runLangfuse: this.langfuse,\n agentLangfuse: agentContext?.langfuse,\n // `agentId` is intentionally left unset on this path (it is the\n // subagent-scope marker); `executingAgentId` always identifies the owning\n // agent so hooks can attribute the batch even at the top level.\n executingAgentId: agentContext?.agentId,\n toolCallStepIds: this.toolCallStepIds,\n errorHandler: (data, metadata): Promise<void> =>\n StandardGraph.handleToolCallErrorStatic(this, data, metadata),\n toolRegistry: agentContext?.toolRegistry,\n sessions: this.sessions,\n toolExecution: this.toolExecution,\n hookRegistry: this.hookRegistry,\n humanInTheLoop: this.humanInTheLoop,\n maxContextTokens: agentContext?.maxContextTokens,\n maxToolResultChars: agentContext?.maxToolResultChars,\n toolOutputRegistry: this.getOrCreateToolOutputRegistry(),\n fileCheckpointer: this.getOrCreateFileCheckpointer(),\n });\n this.registerCompiledToolNode(node);\n return node;\n }\n\n overrideTestModel(\n responses: string[],\n sleep?: number,\n toolCalls?: ToolCall[]\n ): void {\n this.overrideModel = createFakeStreamingLLM({\n responses,\n sleep,\n toolCalls,\n });\n }\n\n getUsageMetadata(\n finalMessage?: BaseMessage\n ): Partial<UsageMetadata> | undefined {\n if (\n finalMessage &&\n 'usage_metadata' in finalMessage &&\n finalMessage.usage_metadata != null\n ) {\n return finalMessage.usage_metadata as Partial<UsageMetadata>;\n }\n }\n\n cleanupSignalListener(currentModel?: t.ChatModel): void {\n if (!this.signal) {\n return;\n }\n const model = this.overrideModel ?? currentModel;\n if (!model) {\n return;\n }\n const client = (model as ChatOpenAI | undefined)?.exposedClient;\n if (!client?.abortHandler) {\n return;\n }\n this.signal.removeEventListener('abort', client.abortHandler);\n client.abortHandler = undefined;\n }\n\n createCallModel(agentId = 'default') {\n return async (\n state: t.AgentSubgraphState,\n config?: RunnableConfig\n ): Promise<Partial<t.AgentSubgraphState>> => {\n const agentContext = this.agentContexts.get(agentId);\n if (!agentContext) {\n throw new Error(`Agent context not found for agentId: ${agentId}`);\n }\n\n if (!config) {\n throw new Error('No config provided');\n }\n\n const { messages } = state;\n\n const discoveredNames = extractToolDiscoveries(messages);\n if (discoveredNames.length > 0) {\n agentContext.markToolsAsDiscovered(discoveredNames);\n }\n\n const rawToolsForBinding = resolveLocalToolsForBinding({\n tools: agentContext.getToolsForBinding(),\n toolExecution: this.toolExecution,\n });\n\n /**\n * Anthropic prompt-cache breakpoint on the tool definitions.\n *\n * Without this, the (often static) tool inventory shows up as\n * fresh input on every turn — measured at ~28k tokens/turn for\n * the local engine's coding-tool bundle, dominating per-turn\n * cost even when message-level caching is on.\n *\n * Strategy: partition tools into [static, deferred] and stamp\n * `cache_control: ephemeral` on the last static tool.\n * Discovered deferred tools that arrive across turns sit *after*\n * the breakpoint and don't invalidate the prefix.\n */\n let toolsForBinding = rawToolsForBinding;\n if (\n agentContext.provider === Providers.ANTHROPIC &&\n (agentContext.clientOptions as t.AnthropicClientOptions | undefined)\n ?.promptCache === true\n ) {\n toolsForBinding =\n partitionAndMarkAnthropicToolCache(\n rawToolsForBinding,\n makeIsDeferred(agentContext.toolDefinitions)\n ) ?? rawToolsForBinding;\n } else if (\n agentContext.provider === Providers.OPENROUTER &&\n (\n agentContext.clientOptions as\n | t.ProviderOptionsMap[Providers.OPENROUTER]\n | undefined\n )?.promptCache === true\n ) {\n toolsForBinding =\n partitionAndMarkOpenRouterToolCache(\n rawToolsForBinding,\n makeIsDeferred(agentContext.toolDefinitions)\n ) ?? rawToolsForBinding;\n } else if (\n agentContext.provider === Providers.BEDROCK &&\n (\n agentContext.clientOptions as\n | t.BedrockAnthropicClientOptions\n | undefined\n )?.promptCache === true\n ) {\n toolsForBinding =\n partitionAndMarkBedrockToolCache(\n rawToolsForBinding,\n makeIsDeferred(agentContext.toolDefinitions)\n ) ?? rawToolsForBinding;\n }\n\n let model =\n this.overrideModel ??\n initializeModel({\n tools: toolsForBinding,\n provider: agentContext.provider,\n clientOptions: agentContext.clientOptions,\n });\n\n if (agentContext.systemRunnable) {\n model = agentContext.systemRunnable.pipe(model as Runnable);\n }\n\n if (agentContext.tokenCalculationPromise) {\n await agentContext.tokenCalculationPromise;\n }\n if (!config.signal) {\n config.signal = this.signal;\n }\n this.config = config;\n\n let messagesToUse = messages;\n let contextUsage: t.ContextUsageEvent | null = null;\n if (\n !agentContext.pruneMessages &&\n agentContext.tokenCounter &&\n agentContext.maxContextTokens != null\n ) {\n agentContext.pruneMessages = createPruneMessages({\n startIndex:\n agentContext.indexTokenCountMap[0] != null ? this.startIndex : 0,\n provider: agentContext.provider,\n tokenCounter: agentContext.tokenCounter,\n maxTokens: agentContext.maxContextTokens,\n thinkingEnabled: isThinkingEnabled(\n agentContext.provider,\n agentContext.clientOptions\n ),\n indexTokenCountMap: agentContext.indexTokenCountMap,\n contextPruningConfig: agentContext.contextPruningConfig,\n summarizationEnabled: agentContext.summarizationEnabled,\n reserveRatio: agentContext.summarizationConfig?.reserveRatio,\n calibrationRatio: agentContext.calibrationRatio,\n getInstructionTokens: () => agentContext.instructionTokens,\n log: (level, message, data) => {\n emitAgentLog(config, level, 'prune', message, data, {\n runId: this.runId,\n agentId,\n });\n },\n });\n }\n if (agentContext.pruneMessages) {\n const {\n context,\n indexTokenCountMap,\n messagesToRefine,\n prePruneContextTokens,\n remainingContextTokens,\n originalToolContent,\n calibrationRatio,\n resolvedInstructionOverhead,\n contextBudget,\n effectiveInstructionTokens,\n } = agentContext.pruneMessages({\n messages,\n usageMetadata: agentContext.currentUsage,\n lastCallUsage: agentContext.lastCallUsage,\n totalTokensFresh: agentContext.totalTokensFresh,\n });\n agentContext.indexTokenCountMap = indexTokenCountMap;\n if (calibrationRatio != null && calibrationRatio > 0) {\n agentContext.calibrationRatio = calibrationRatio;\n }\n if (resolvedInstructionOverhead != null) {\n agentContext.resolvedInstructionOverhead =\n resolvedInstructionOverhead;\n const nonToolOverhead =\n agentContext.instructionTokens - agentContext.toolSchemaTokens;\n const calibratedToolTokens = Math.max(\n 0,\n resolvedInstructionOverhead - nonToolOverhead\n );\n const currentToolTokens = agentContext.toolSchemaTokens;\n const variance =\n currentToolTokens > 0\n ? Math.abs(calibratedToolTokens - currentToolTokens) /\n currentToolTokens\n : 1;\n if (variance > CALIBRATION_VARIANCE_THRESHOLD) {\n agentContext.toolSchemaTokens = calibratedToolTokens;\n /** Largest-remainder apportionment keeps the per-tool breakdown\n * summing exactly to the calibrated aggregate */\n if (agentContext.toolTokenCounts != null && currentToolTokens > 0) {\n agentContext.toolTokenCounts = apportionTokenCounts(\n agentContext.toolTokenCounts,\n calibratedToolTokens / currentToolTokens,\n calibratedToolTokens\n );\n }\n }\n }\n messagesToUse = context;\n\n /** Dispatched right before the model invoke — a summarization\n * detour returns from this node without an LLM call, and the\n * post-summary retry produces its own snapshot.\n *\n * The breakdown describes the post-prune prompt: counts from the\n * kept context, message tokens derived from the same calibrated\n * budget math as `remainingContextTokens` (the index map is keyed\n * by pre-prune state indices, so summing it over `context` would\n * missum); `prePruneContextTokens` carries the pre-prune metric. */\n const usageBreakdown = agentContext.getTokenBudgetBreakdown(messages);\n usageBreakdown.messageCount = context.length;\n contextUsage = {\n runId: this.runId,\n agentId,\n breakdown: usageBreakdown,\n contextBudget,\n effectiveInstructionTokens,\n prePruneContextTokens,\n remainingContextTokens,\n calibrationRatio: agentContext.calibrationRatio,\n };\n syncBudgetDerivedFields(contextUsage);\n\n const hasPrunedMessages =\n agentContext.summarizationEnabled === true &&\n Array.isArray(messagesToRefine) &&\n messagesToRefine.length > 0;\n\n if (hasPrunedMessages) {\n const shouldSkip = agentContext.shouldSkipSummarization(\n messages.length\n );\n const triggerResult =\n !shouldSkip &&\n shouldTriggerSummarization({\n trigger: agentContext.summarizationConfig?.trigger,\n maxContextTokens: agentContext.maxContextTokens,\n prePruneContextTokens:\n prePruneContextTokens != null\n ? prePruneContextTokens + agentContext.instructionTokens\n : undefined,\n remainingContextTokens,\n messagesToRefineCount: messagesToRefine.length,\n });\n\n if (triggerResult) {\n if (originalToolContent != null && originalToolContent.size > 0) {\n /**\n * Merge — never overwrite — the pruner's masking record\n * into pendingOriginalToolContent. Carry-over entries\n * from a prior summarize (preserved by the recency\n * window for masked tool messages still in the tail) and\n * the current pruner's new entries are both keyed by\n * indices in the current `state.messages`, so a key-wise\n * union is correct. Overwriting would discard the\n * carry-over and reduce summary fidelity when those\n * masked tail messages eventually move into the head.\n */\n if (agentContext.pendingOriginalToolContent == null) {\n agentContext.pendingOriginalToolContent = originalToolContent;\n } else {\n for (const [idx, content] of originalToolContent) {\n agentContext.pendingOriginalToolContent.set(idx, content);\n }\n /**\n * Re-apply the per-store char cap after the union. The\n * pruner enforces ORIGINAL_CONTENT_MAX_CHARS inside its\n * own map via the onContentStored callback, but a\n * key-wise merge with recency carry-over bypasses that\n * accounting and could let the merged map grow without\n * bound across long sessions.\n */\n enforceOriginalContentCap(\n agentContext.pendingOriginalToolContent\n );\n }\n }\n\n emitAgentLog(\n config,\n 'info',\n 'graph',\n 'Summarization triggered',\n undefined,\n { runId: this.runId, agentId }\n );\n emitAgentLog(\n config,\n 'debug',\n 'graph',\n 'Summarization trigger details',\n {\n totalMessages: messages.length,\n remainingContextTokens: remainingContextTokens ?? 0,\n summaryVersion: agentContext.summaryVersion + 1,\n toolSchemaTokens: agentContext.toolSchemaTokens,\n instructionTokens: agentContext.instructionTokens,\n systemMessageTokens: agentContext.systemMessageTokens,\n },\n { runId: this.runId, agentId }\n );\n agentContext.markSummarizationTriggered(messages.length);\n return {\n summarizationRequest: {\n remainingContextTokens: remainingContextTokens ?? 0,\n agentId: agentId || agentContext.agentId,\n },\n };\n }\n\n if (shouldSkip) {\n emitAgentLog(\n config,\n 'debug',\n 'graph',\n 'Summarization skipped — no new messages or per-run cap reached',\n {\n messageCount: messages.length,\n messagesToRefineCount: messagesToRefine.length,\n contextLength: context.length,\n },\n { runId: this.runId, agentId }\n );\n }\n }\n }\n\n let finalMessages = messagesToUse;\n /** Tail snapshot for the dispatch-time usage delta: in-place\n * formatters (artifact appends, Bedrock content rewrites, legacy\n * string conversion) mutate without changing length or identity —\n * capture before they run. Legacy string conversion can also touch\n * messages before the tail, so those convertible indices are\n * tracked separately (none exist in the common case). */\n const tailStart = trailingMutationStart(messagesToUse);\n let preFormatTailTokens: number | null = null;\n let legacyIndices: number[] | null = null;\n let preFormatLegacyTokens = 0;\n if (contextUsage != null && agentContext.tokenCounter != null) {\n preFormatTailTokens = 0;\n for (const message of messagesToUse.slice(tailStart)) {\n preFormatTailTokens += agentContext.tokenCounter(message);\n }\n if (agentContext.useLegacyContent) {\n legacyIndices = [];\n for (let i = 0; i < tailStart; i++) {\n if (isLegacyConvertible(messagesToUse[i])) {\n legacyIndices.push(i);\n preFormatLegacyTokens += agentContext.tokenCounter(\n messagesToUse[i]\n );\n }\n }\n }\n }\n if (agentContext.useLegacyContent) {\n finalMessages = formatContentStrings(finalMessages);\n }\n\n const lastMessageX =\n finalMessages.length >= 2\n ? finalMessages[finalMessages.length - 2]\n : null;\n const lastMessageY =\n finalMessages.length >= 1\n ? finalMessages[finalMessages.length - 1]\n : null;\n\n const anthropicLike = isAnthropicLike(\n agentContext.provider,\n agentContext.clientOptions as { model?: string }\n );\n\n if (\n agentContext.provider === Providers.BEDROCK &&\n lastMessageX instanceof AIMessageChunk &&\n lastMessageY instanceof ToolMessage &&\n typeof lastMessageX.content === 'string'\n ) {\n const trimmed = lastMessageX.content.trim();\n finalMessages[finalMessages.length - 2].content =\n trimmed.length > 0 ? [{ type: 'text' as const, text: trimmed }] : '';\n }\n\n if (lastMessageY instanceof ToolMessage) {\n if (anthropicLike) {\n formatAnthropicArtifactContent(finalMessages);\n } else if (\n (isOpenAILike(agentContext.provider) &&\n agentContext.provider !== Providers.DEEPSEEK) ||\n isGoogleLike(agentContext.provider)\n ) {\n formatArtifactPayload(finalMessages);\n }\n }\n\n if (\n isThinkingEnabled(agentContext.provider, agentContext.clientOptions)\n ) {\n /**\n * Pass `this.startIndex` so the function can distinguish CURRENT-run\n * AI messages (the agent's own iterations — possibly without a\n * leading thinking block, which Claude is allowed to skip) from\n * historical context that genuinely needs the\n * `[Previous agent context]` placeholder. Without this signal the\n * function would convert the agent's own in-run tool_use messages,\n * polluting the next iteration's prompt with a placeholder the\n * model treats as suspicious injected content.\n */\n finalMessages = ensureThinkingBlockInMessages(\n finalMessages,\n agentContext.provider,\n config,\n this.startIndex\n );\n }\n\n // Determine the prompt-cache strategy up front. Two distinct facts:\n //\n // `providerPromptCacheEnabled` — prompt caching is on for this provider\n // at all. This drives orphan cleanup, because EVERY cached send must be\n // sanitized — including the system-runnable path, where AgentContext (not\n // this node) adds the body marker.\n //\n // `willAddTailCache` — THIS node will add the marker itself. Anthropic /\n // OpenRouter defer to the system runnable when one owns the system-prompt\n // breakpoint, so they exclude that case; Bedrock always marks here.\n const anthropicPromptCacheEnabled =\n agentContext.provider === Providers.ANTHROPIC &&\n (agentContext.clientOptions as t.AnthropicClientOptions | undefined)\n ?.promptCache === true;\n const openRouterPromptCacheEnabled =\n agentContext.provider === Providers.OPENROUTER &&\n (\n agentContext.clientOptions as\n | t.ProviderOptionsMap[Providers.OPENROUTER]\n | undefined\n )?.promptCache === true;\n const bedrockPromptCacheEnabled =\n agentContext.provider === Providers.BEDROCK &&\n (\n agentContext.clientOptions as\n | t.BedrockAnthropicClientOptions\n | undefined\n )?.promptCache === true;\n const providerPromptCacheEnabled =\n anthropicPromptCacheEnabled ||\n openRouterPromptCacheEnabled ||\n bedrockPromptCacheEnabled;\n\n // Intentionally broad: runs when the pruner wasn't used, when any\n // post-pruning transform (ensureThinkingBlock, etc.) reassigned\n // finalMessages, OR when this is a prompt-cached send. The last clause\n // matters because the marker is now applied AFTER this gate (and, for the\n // system-runnable path, in AgentContext entirely): without it, a cached\n // send whose pruner returned the context unchanged would skip cleanup and\n // could ship orphaned AI/tool pairs from persisted history.\n // sanitizeOrphanToolBlocks fast-paths to a Set diff check when no orphans\n // exist, so the cost is negligible.\n const needsOrphanSanitize =\n anthropicLike &&\n (!agentContext.pruneMessages ||\n finalMessages !== messagesToUse ||\n providerPromptCacheEnabled);\n if (needsOrphanSanitize) {\n const beforeSanitize = finalMessages.length;\n finalMessages = sanitizeOrphanToolBlocks(finalMessages);\n if (finalMessages.length !== beforeSanitize) {\n emitAgentLog(\n config,\n 'warn',\n 'sanitize',\n 'Orphan tool blocks removed',\n {\n before: beforeSanitize,\n after: finalMessages.length,\n dropped: beforeSanitize - finalMessages.length,\n },\n { runId: this.runId, agentId }\n );\n }\n }\n\n // Place the single tail prompt-cache breakpoint LAST, after thinking\n // normalization and orphan sanitization. ensureThinkingBlockInMessages can\n // fold a trailing non-thinking AI→Tool chain into a `[Previous agent\n // context]` HumanMessage whose builder copies text but not cache_control /\n // cachePoint, and sanitizeOrphanToolBlocks can drop the anchored block — so\n // marking earlier would let the only breakpoint vanish before the model\n // call (zero message caching). Anchoring on the final message list keeps\n // the marker on a block that actually ships. The system-runnable path\n // adds its body marker in AgentContext, so this node skips it there.\n if (\n (anthropicPromptCacheEnabled || openRouterPromptCacheEnabled) &&\n !agentContext.systemRunnable\n ) {\n finalMessages = addTailCacheControl<BaseMessage>(finalMessages);\n } else if (bedrockPromptCacheEnabled) {\n finalMessages = addBedrockTailCacheControl<BaseMessage>(finalMessages);\n }\n\n if (\n agentContext.lastStreamCall != null &&\n agentContext.streamBuffer != null\n ) {\n const timeSinceLastCall = Date.now() - agentContext.lastStreamCall;\n if (timeSinceLastCall < agentContext.streamBuffer) {\n const timeToWait =\n Math.ceil((agentContext.streamBuffer - timeSinceLastCall) / 1000) *\n 1000;\n await sleep(timeToWait);\n }\n }\n\n agentContext.lastStreamCall = Date.now();\n agentContext.markTokensStale();\n\n let result: Partial<t.BaseGraphState> | undefined;\n const fallbacks =\n (agentContext.clientOptions as t.LLMConfig | undefined)?.fallbacks ??\n [];\n\n if (\n finalMessages.length === 0 &&\n !agentContext.hasPendingCompactionSummary()\n ) {\n const budgetBreakdown = agentContext.getTokenBudgetBreakdown(messages);\n const breakdown = agentContext.formatTokenBudgetBreakdown(messages);\n const instructionsExceedBudget =\n budgetBreakdown.instructionTokens > budgetBreakdown.maxContextTokens;\n\n let guidance: string;\n if (instructionsExceedBudget) {\n const toolPct =\n budgetBreakdown.toolSchemaTokens > 0\n ? Math.round(\n (budgetBreakdown.toolSchemaTokens /\n budgetBreakdown.instructionTokens) *\n 100\n )\n : 0;\n guidance =\n toolPct > 50\n ? `Tool definitions consume ${budgetBreakdown.toolSchemaTokens} tokens (${toolPct}% of instructions) across ${budgetBreakdown.toolCount} tools, exceeding maxContextTokens (${budgetBreakdown.maxContextTokens}). Reduce the number of tools or increase maxContextTokens.`\n : `Instructions (${budgetBreakdown.instructionTokens} tokens) exceed maxContextTokens (${budgetBreakdown.maxContextTokens}). Increase maxContextTokens or shorten the system prompt.`;\n if (agentContext.summarizationEnabled === true) {\n guidance +=\n ' Summarization was skipped because the summary would further increase the instruction overhead.';\n }\n } else {\n guidance =\n 'Please increase the context window size or make your message shorter.';\n }\n\n emitAgentLog(\n config,\n 'error',\n 'graph',\n 'Empty messages after pruning',\n {\n messageCount: messages.length,\n instructionsExceedBudget,\n breakdown,\n },\n { runId: this.runId, agentId }\n );\n throw new Error(\n JSON.stringify({\n type: 'empty_messages',\n info: `Message pruning removed all messages as none fit in the context window. ${guidance}\\n${breakdown}`,\n })\n );\n }\n\n /** Past the empty-prompt guard — a model call is now guaranteed */\n if (contextUsage != null) {\n const usageRatio =\n contextUsage.calibrationRatio != null &&\n contextUsage.calibrationRatio > 0\n ? contextUsage.calibrationRatio\n : 1;\n if (\n agentContext.tokenCounter != null &&\n finalMessages.length !== messagesToUse.length\n ) {\n /** Post-prune formatting restructured the payload (e.g. thinking\n * placeholder collapse, orphan drops) — recount so the gauge\n * reflects what is actually sent */\n let rawTokens = 0;\n for (const message of finalMessages) {\n rawTokens += agentContext.tokenCounter(message);\n }\n contextUsage.breakdown.messageCount = finalMessages.length;\n if (\n contextUsage.contextBudget != null &&\n contextUsage.effectiveInstructionTokens != null\n ) {\n contextUsage.remainingContextTokens = Math.max(\n 0,\n contextUsage.contextBudget -\n contextUsage.effectiveInstructionTokens -\n Math.round(rawTokens * usageRatio)\n );\n }\n } else if (\n preFormatTailTokens != null &&\n agentContext.tokenCounter != null &&\n contextUsage.remainingContextTokens != null\n ) {\n /** Same-length formatting can still mutate in place — the trailing\n * tool batch (artifacts, Bedrock rewrites) and any legacy-converted\n * messages before it — adjust remaining by the calibrated delta */\n let postFormatTailTokens = 0;\n for (const message of finalMessages.slice(tailStart)) {\n postFormatTailTokens += agentContext.tokenCounter(message);\n }\n let formatDelta = postFormatTailTokens - preFormatTailTokens;\n if (legacyIndices != null && legacyIndices.length > 0) {\n let postFormatLegacyTokens = 0;\n for (const index of legacyIndices) {\n postFormatLegacyTokens += agentContext.tokenCounter(\n finalMessages[index]\n );\n }\n formatDelta += postFormatLegacyTokens - preFormatLegacyTokens;\n }\n if (formatDelta !== 0) {\n contextUsage.remainingContextTokens = Math.max(\n 0,\n Math.min(\n contextUsage.contextBudget ?? Number.MAX_SAFE_INTEGER,\n contextUsage.remainingContextTokens -\n Math.round(formatDelta * usageRatio)\n )\n );\n }\n }\n syncBudgetDerivedFields(contextUsage);\n /** Awaited so async host handlers receive the pre-invoke snapshot\n * before any model deltas are emitted */\n await safeDispatchCustomEvent(\n GraphEvents.ON_CONTEXT_USAGE,\n contextUsage,\n config\n );\n }\n\n const invokeStart = Date.now();\n const invokeMeta = { runId: this.runId, agentId };\n emitAgentLog(\n config,\n 'debug',\n 'graph',\n 'Invoking LLM',\n {\n messageCount: finalMessages.length,\n provider: agentContext.provider,\n },\n invokeMeta,\n { force: true }\n );\n\n const langfuse = resolveLangfuseConfig(\n this.langfuse,\n agentContext.langfuse\n );\n const traceMetadata = createLangfuseTraceMetadata({\n messageId: this.runId,\n parentMessageId: config.configurable?.requestBody?.parentMessageId,\n agentId,\n agentName: agentContext.name,\n });\n let langfuseHandler: CallbackEntry | undefined;\n let invokeConfig = {\n ...config,\n metadata: {\n ...(config.metadata ?? {}),\n ...traceMetadata,\n },\n };\n initializeLangfuseTracing(langfuse);\n if (findCallback(config.callbacks, isLangfuseCallbackHandler) == null) {\n langfuseHandler = createLangfuseHandler({\n langfuse,\n userId: config.configurable?.user_id as string | undefined,\n sessionId: config.configurable?.thread_id as string | undefined,\n traceMetadata,\n tags: ['librechat', 'agent'],\n });\n if (langfuseHandler != null) {\n invokeConfig = {\n ...invokeConfig,\n callbacks: appendCallbacks(invokeConfig.callbacks, [\n langfuseHandler,\n ]),\n };\n }\n }\n const metadata = config.metadata as Record<string, unknown>;\n\n try {\n result = await withLangfuseToolOutputTracingConfig(\n this.langfuse,\n () =>\n attemptInvoke(\n {\n model: (this.overrideModel ?? model) as t.ChatModel,\n messages: finalMessages,\n provider: agentContext.provider,\n context: this,\n },\n invokeConfig\n ),\n agentContext.langfuse\n );\n } catch (primaryError) {\n clearCurrentDeltaStepMarkers({\n graph: this,\n metadata,\n });\n result = await withLangfuseToolOutputTracingConfig(\n this.langfuse,\n () =>\n tryFallbackProviders({\n fallbacks,\n tools: agentContext.tools,\n messages: finalMessages,\n config: invokeConfig,\n primaryError,\n context: this,\n }),\n agentContext.langfuse\n );\n } finally {\n await disposeLangfuseHandler(langfuseHandler);\n }\n\n if (!result) {\n throw new Error('No result after model invocation');\n }\n\n /**\n * Fallback: populate toolCallStepIds in the graph execution context.\n *\n * When model.stream() is available (the common case), attemptInvoke\n * processes all chunks through a local ChatModelStreamHandler which\n * creates run steps and populates toolCallStepIds before returning.\n * The code below is a fallback for the rare case where model.stream\n * is unavailable and model.invoke() was used instead.\n *\n * Text content is dispatched FIRST so that MESSAGE_CREATION is the\n * current step when handleToolCalls runs. handleToolCalls then creates\n * TOOL_CALLS on top of it. The dedup in getMessageId and\n * toolCallStepIds.has makes this safe when attemptInvoke already\n * handled everything — both paths become no-ops.\n */\n const responseMessage = result.messages?.[0];\n const toolCalls = (responseMessage as AIMessageChunk | undefined)\n ?.tool_calls;\n const hasToolCalls = Array.isArray(toolCalls) && toolCalls.length > 0;\n const responseReasoningContent = getResponseReasoningContent({\n responseMessage: responseMessage as Partial<AIMessageChunk> | undefined,\n reasoningKey: agentContext.reasoningKey,\n });\n const textMessageContent = getMessageDeltaContent(\n agentContext.provider,\n responseMessage?.content as MessageContent | undefined\n );\n const hasStreamedTextDeltaStep = hasCurrentTextDeltaStep({\n graph: this,\n metadata,\n });\n const hasStreamedReasoningDeltaStep = hasCurrentReasoningDeltaStep({\n graph: this,\n metadata,\n });\n const dispatchableFinalReasoningContent =\n getDispatchableFinalReasoningContent({\n agentContext,\n responseReasoningContent,\n hasStreamedTextDeltaStep,\n hasStreamedReasoningDeltaStep,\n });\n\n if (hasToolCalls) {\n const dispatchedReasoning =\n dispatchableFinalReasoningContent != null &&\n (await dispatchReasoningContent({\n graph: this,\n agentContext,\n reasoningContent: dispatchableFinalReasoningContent,\n metadata,\n }));\n if (dispatchedReasoning) {\n markPostReasoningContent(agentContext);\n }\n if (textMessageContent != null && !hasStreamedTextDeltaStep) {\n const stepKey = this.getStepKey(metadata);\n const dispatchedText = await dispatchTextMessageContent({\n graph: this,\n stepKey,\n provider: agentContext.provider,\n content: textMessageContent,\n metadata,\n });\n if (dispatchedText) {\n markPostReasoningContent(agentContext);\n }\n }\n\n await handleToolCalls(toolCalls as ToolCall[], metadata, this);\n }\n\n /**\n * When streaming events are unavailable, ChatModelStreamHandler never\n * fires. Dispatch final reasoning/text content here. getMessageId makes\n * this a no-op when the streaming path already handled the same step.\n */\n if (!hasToolCalls && responseMessage != null) {\n const dispatchedReasoning =\n dispatchableFinalReasoningContent != null &&\n (await dispatchReasoningContent({\n graph: this,\n agentContext,\n reasoningContent: dispatchableFinalReasoningContent,\n metadata,\n }));\n if (dispatchedReasoning && textMessageContent != null) {\n markPostReasoningContent(agentContext);\n }\n if (textMessageContent != null && !hasStreamedTextDeltaStep) {\n const stepKey = this.getStepKey(metadata);\n await dispatchTextMessageContent({\n graph: this,\n stepKey,\n provider: agentContext.provider,\n content: textMessageContent,\n metadata,\n });\n }\n }\n\n const invokeElapsed = ((Date.now() - invokeStart) / 1000).toFixed(2);\n agentContext.currentUsage = this.getUsageMetadata(result.messages?.[0]);\n if (agentContext.currentUsage) {\n agentContext.updateLastCallUsage(agentContext.currentUsage);\n emitAgentLog(\n config,\n 'debug',\n 'graph',\n `LLM call complete (${invokeElapsed}s)`,\n {\n ...agentContext.currentUsage,\n elapsedSeconds: Number(invokeElapsed),\n instructionTokens: agentContext.instructionTokens,\n toolSchemaTokens: agentContext.toolSchemaTokens,\n messageCount: finalMessages.length,\n },\n invokeMeta,\n { force: true }\n );\n } else {\n emitAgentLog(\n config,\n 'debug',\n 'graph',\n `LLM call complete (${invokeElapsed}s)`,\n {\n elapsedSeconds: Number(invokeElapsed),\n messageCount: finalMessages.length,\n },\n invokeMeta,\n { force: true }\n );\n }\n this.cleanupSignalListener();\n return result;\n };\n }\n\n createAgentNode(agentId: string): t.CompiledAgentWorfklow {\n const getConfig = (): RunnableConfig | undefined => this.config;\n const agentContext = this.agentContexts.get(agentId);\n if (!agentContext) {\n throw new Error(`Agent context not found for agentId: ${agentId}`);\n }\n\n /**\n * Depth countdown across graph boundaries: the parent's `maxSubagentDepth`\n * becomes this executor's `maxDepth`. When the child graph is constructed,\n * `buildChildInputs()` decrements `maxSubagentDepth` on the child's\n * `AgentInputs` (only when `allowNested: true`; otherwise subagentConfigs\n * are stripped entirely). The child graph's own `createAgentNode()` then\n * reads the decremented value here and creates a narrower executor —\n * recursion is bounded even though each graph has its own separate\n * executor instance.\n */\n const effectiveSubagentDepth = agentContext.maxSubagentDepth ?? 1;\n if (\n agentContext.subagentConfigs != null &&\n agentContext.subagentConfigs.length > 0 &&\n effectiveSubagentDepth > 0\n ) {\n const resolvedConfigs = resolveSubagentConfigs(\n agentContext.subagentConfigs,\n agentContext\n );\n if (resolvedConfigs.length > 0) {\n const getParentHandlerRegistry = (): HandlerRegistry | undefined =>\n this.handlerRegistry;\n const executor = new SubagentExecutor({\n configs: new Map(resolvedConfigs.map((c) => [c.type, c])),\n parentSignal: this.signal,\n hookRegistry: this.hookRegistry,\n /** Lazy — Run wires the registry onto the graph AFTER\n * `createWorkflow()` runs, so a direct capture here would be\n * `undefined` at construction time. */\n parentHandlerRegistry: getParentHandlerRegistry,\n parentRunId: this.runId ?? '',\n parentAgentId: agentContext.agentId,\n langfuse: this.langfuse,\n tokenCounter: agentContext.tokenCounter,\n usageSink: this.subagentUsageSink,\n maxDepth: effectiveSubagentDepth,\n createChildGraph: (input): StandardGraph => {\n const childGraph = new StandardGraph(input);\n childGraph.hookRegistry = this.hookRegistry;\n /**\n * Do not propagate `humanInTheLoop` into the child graph yet:\n * nested subagent interrupts need a stable child checkpoint and\n * resume bridge. Child hooks still fire; `ask` decisions fail\n * closed inside the subagent until that flow is implemented.\n */\n childGraph.toolOutputReferences = this.toolOutputReferences;\n childGraph.eagerEventToolExecution = this.eagerEventToolExecution;\n childGraph.toolExecution = this.toolExecution;\n childGraph.eventToolExecutionAvailable =\n this.handlerRegistry?.getHandler(GraphEvents.ON_TOOL_EXECUTE) !=\n null;\n return childGraph;\n },\n });\n\n const subagentTool = tool(async (rawInput, config) => {\n const input = rawInput as {\n description?: string;\n subagent_type?: string;\n };\n const description =\n typeof input.description === 'string' &&\n input.description.trim().length > 0\n ? input.description\n : 'No task description provided';\n const subagentType =\n typeof input.subagent_type === 'string' ? input.subagent_type : '';\n const threadId = config.configurable?.thread_id as string | undefined;\n /**\n * When the tool is dispatched from an LLM's `tool_call`, LangChain\n * threads the originating `ToolCall` onto the RunnableConfig as\n * `config.toolCall` (see `ToolRunnableConfig` in\n * `@langchain/core/tools` — internal but stable since ≥0.3.x).\n * Surfacing its id lets hosts correlate `SubagentUpdateEvent`s\n * back to the parent's `tool_call_id` deterministically — no\n * temporal heuristics needed. If a future LangChain version\n * changes the threading, the type-guarded read falls back to\n * `undefined` and the correlation degrades gracefully.\n */\n const toolCall = (config as { toolCall?: { id?: string } }).toolCall;\n const parentToolCallId =\n typeof toolCall?.id === 'string' ? toolCall.id : undefined;\n const result = await executor.execute({\n description,\n subagentType,\n threadId,\n parentToolCallId,\n /**\n * Forward the parent's `configurable` so host-set fields\n * (`requestBody`, `user`, etc.) propagate into the child\n * workflow. The executor scrubs run-identity fields before\n * forwarding — see `SubagentExecuteParams.parentConfigurable`.\n */\n parentConfigurable: config.configurable as\n | Record<string, unknown>\n | undefined,\n });\n return result.content;\n }, buildSubagentToolParams(resolvedConfigs));\n\n if (!agentContext.graphTools) {\n agentContext.graphTools = [];\n }\n (agentContext.graphTools as t.GenericTool[]).push(subagentTool);\n\n /**\n * Refresh toolSchemaTokens to include the subagent tool's schema.\n * `calculateInstructionTokens()` was kicked off in `fromConfig()`\n * before graphTools was populated, so its result did not count this\n * tool. Without this retrigger, token-budget/pruning logic\n * underestimates prompt overhead.\n */\n if (agentContext.tokenCounter) {\n const { tokenCounter, baseIndexTokenCountMap } = agentContext;\n agentContext.tokenCalculationPromise = agentContext\n .calculateInstructionTokens(tokenCounter)\n .then(() => {\n agentContext.updateTokenMapWithInstructions(\n baseIndexTokenCountMap\n );\n })\n .catch((err) => {\n console.error(\n 'Error recalculating instruction tokens after subagent tool injection:',\n err\n );\n });\n }\n }\n }\n\n const agentNode = `${AGENT}${agentId}` as const;\n const toolNode = `${TOOLS}${agentId}` as const;\n const summarizeNode = `${SUMMARIZE}${agentId}` as const;\n\n const routeMessage = (\n state: t.AgentSubgraphState,\n config?: RunnableConfig\n ): string => {\n this.config = config;\n if (state.summarizationRequest != null) {\n return summarizeNode;\n }\n return toolsCondition(\n state as t.BaseGraphState,\n toolNode,\n this.invokedToolIds\n );\n };\n\n const StateAnnotation = Annotation.Root({\n messages: Annotation<BaseMessage[]>({\n reducer: messagesStateReducer,\n default: () => [],\n }),\n summarizationRequest: Annotation<t.SummarizationNodeInput | undefined>({\n reducer: (\n _: t.SummarizationNodeInput | undefined,\n b: t.SummarizationNodeInput | undefined\n ) => b,\n default: () => undefined,\n }),\n });\n\n const workflow = new StateGraph(StateAnnotation)\n .addNode(agentNode, this.createCallModel(agentId))\n .addNode(\n toolNode,\n this.initializeTools({\n currentTools: agentContext.tools,\n currentToolMap: agentContext.toolMap,\n agentContext,\n })\n )\n .addNode(\n summarizeNode,\n createSummarizeNode({\n agentContext,\n graph: {\n contentData: this.contentData,\n contentIndexMap: this.contentIndexMap,\n get config() {\n return getConfig();\n },\n runId: this.runId,\n isMultiAgent: this.isMultiAgentGraph(),\n hookRegistry: this.hookRegistry,\n dispatchRunStep: async (runStep, nodeConfig) => {\n this.contentData.push(runStep);\n this.contentIndexMap.set(runStep.id, runStep.index);\n\n const resolvedConfig = nodeConfig ?? this.config;\n const handler = this.handlerRegistry?.getHandler(\n GraphEvents.ON_RUN_STEP\n );\n if (handler) {\n await handler.handle(\n GraphEvents.ON_RUN_STEP,\n runStep,\n resolvedConfig?.configurable,\n this\n );\n this.handlerDispatchedStepIds.add(runStep.id);\n }\n\n const unmarkHandlerDispatchedEvent = handler\n ? this.markHandlerDispatchedEvent(\n GraphEvents.ON_RUN_STEP,\n runStep.id\n )\n : undefined;\n try {\n if (resolvedConfig) {\n await safeDispatchCustomEvent(\n GraphEvents.ON_RUN_STEP,\n runStep,\n resolvedConfig\n );\n }\n } finally {\n unmarkHandlerDispatchedEvent?.();\n }\n },\n dispatchRunStepCompleted: async (\n stepId: string,\n result: t.StepCompleted,\n nodeConfig?: RunnableConfig\n ) => {\n const resolvedConfig = nodeConfig ?? this.config;\n const runStep = this.contentData.find((s) => s.id === stepId);\n const handler = this.handlerRegistry?.getHandler(\n GraphEvents.ON_RUN_STEP_COMPLETED\n );\n if (handler) {\n await handler.handle(\n GraphEvents.ON_RUN_STEP_COMPLETED,\n {\n result: {\n ...result,\n id: stepId,\n index: runStep?.index ?? 0,\n },\n },\n resolvedConfig?.configurable,\n this\n );\n }\n },\n },\n generateStepId: (stepKey: string) => this.generateStepId(stepKey),\n })\n )\n .addEdge(START, agentNode)\n .addConditionalEdges(agentNode, routeMessage)\n .addEdge(summarizeNode, agentNode)\n .addEdge(toolNode, agentContext.toolEnd ? END : agentNode);\n\n return workflow.compile();\n }\n\n createWorkflow(): t.CompiledStateWorkflow {\n const agentNode = this.createAgentNode(this.defaultAgentId);\n const StateAnnotation = Annotation.Root({\n messages: Annotation<BaseMessage[]>({\n reducer: (a, b) => {\n if (!this.messages.length) {\n this.startIndex = a.length + b.length;\n }\n const result = messagesStateReducer(a, b);\n this.messages = result;\n return result;\n },\n default: () => [],\n }),\n });\n const workflow = new StateGraph(StateAnnotation)\n .addNode(\n this.defaultAgentId,\n agentNode as Runnable<\n t.AgentSubgraphState,\n Partial<t.AgentSubgraphState>\n >,\n { ends: [END] }\n )\n .addEdge(START, this.defaultAgentId)\n // LangGraph compile() types are overly strict for opt-in options\n .compile(this.compileOptions as unknown as never);\n\n return workflow;\n }\n\n /**\n * Indicates if this is a multi-agent graph.\n * Override in MultiAgentGraph to return true.\n * Used to conditionally include agentId in RunStep for frontend rendering.\n */\n protected isMultiAgentGraph(): boolean {\n return false;\n }\n\n /**\n * Get the parallel group ID for an agent, if any.\n * Override in MultiAgentGraph to provide actual group IDs.\n * Group IDs are incrementing numbers (1, 2, 3...) reflecting execution order.\n * @param _agentId - The agent ID to look up\n * @returns undefined for StandardGraph (no parallel groups), or group number for MultiAgentGraph\n */\n protected getParallelGroupIdForAgent(_agentId: string): number | undefined {\n return undefined;\n }\n\n /* Dispatchers */\n\n /**\n * Dispatches a run step to the client, returns the step ID\n */\n async dispatchRunStep(\n stepKey: string,\n stepDetails: t.StepDetails,\n metadata?: Record<string, unknown>\n ): Promise<string> {\n if (!this.config) {\n throw new Error('No config provided');\n }\n\n const [stepId, stepIndex] = this.generateStepId(stepKey);\n if (stepDetails.type === StepTypes.TOOL_CALLS && stepDetails.tool_calls) {\n for (const tool_call of stepDetails.tool_calls) {\n const toolCallId = tool_call.id ?? '';\n if (!toolCallId || this.toolCallStepIds.has(toolCallId)) {\n continue;\n }\n this.toolCallStepIds.set(toolCallId, stepId);\n }\n }\n\n const runStep: t.RunStep = {\n stepIndex,\n id: stepId,\n type: stepDetails.type,\n index: this.contentData.length,\n stepDetails,\n usage: null,\n };\n\n const runId = this.runId ?? '';\n if (runId) {\n runStep.runId = runId;\n }\n\n if (metadata) {\n try {\n const agentContext = this.getAgentContext(metadata);\n if (this.isMultiAgentGraph() && agentContext.agentId) {\n runStep.agentId = agentContext.agentId;\n const groupId = this.getParallelGroupIdForAgent(agentContext.agentId);\n if (groupId != null) {\n runStep.groupId = groupId;\n }\n }\n } catch (_e) {\n /** If we can't get agent context, that's okay - agentId remains undefined */\n }\n }\n\n this.contentData.push(runStep);\n this.contentIndexMap.set(stepId, runStep.index);\n\n // Primary dispatch: handler registry (reliable, always works).\n // This mirrors how handleToolCallCompleted dispatches ON_RUN_STEP_COMPLETED\n // via the handler registry, ensuring the event always reaches the handler\n // even when LangGraph's callback system drops the custom event.\n const handler = this.handlerRegistry?.getHandler(GraphEvents.ON_RUN_STEP);\n if (handler) {\n await handler.handle(GraphEvents.ON_RUN_STEP, runStep, metadata, this);\n this.handlerDispatchedStepIds.add(stepId);\n }\n\n // Secondary dispatch: custom event for LangGraph callback chain\n // (tracing, Langfuse, external consumers). May be silently dropped\n // in some scenarios (stale run ID, subgraph callback propagation issues),\n // but the primary dispatch above guarantees the event reaches the handler.\n // The customEventCallback in run.ts skips events already dispatched above\n // to prevent double handling.\n const unmarkHandlerDispatchedEvent = handler\n ? this.markHandlerDispatchedEvent(GraphEvents.ON_RUN_STEP, stepId)\n : undefined;\n try {\n await safeDispatchCustomEvent(\n GraphEvents.ON_RUN_STEP,\n runStep,\n this.config\n );\n } finally {\n unmarkHandlerDispatchedEvent?.();\n }\n return stepId;\n }\n\n /**\n * Static version of handleToolCallError to avoid creating strong references\n * that prevent garbage collection\n */\n static async handleToolCallErrorStatic(\n graph: StandardGraph,\n data: t.ToolErrorData,\n metadata?: Record<string, unknown>\n ): Promise<void> {\n if (!graph.config) {\n throw new Error('No config provided');\n }\n\n if (!data.id) {\n console.warn('No Tool ID provided for Tool Error');\n return;\n }\n\n const stepId = graph.toolCallStepIds.get(data.id) ?? '';\n if (!stepId) {\n throw new Error(`No stepId found for tool_call_id ${data.id}`);\n }\n\n const { name, input: args, error } = data;\n\n const runStep = graph.getRunStep(stepId);\n if (!runStep) {\n throw new Error(`No run step found for stepId ${stepId}`);\n }\n\n const tool_call: t.ProcessedToolCall = {\n id: data.id,\n name: name || '',\n args: typeof args === 'string' ? args : JSON.stringify(args),\n output: `Error processing tool${error?.message != null ? `: ${error.message}` : ''}`,\n progress: 1,\n };\n\n await graph.handlerRegistry\n ?.getHandler(GraphEvents.ON_RUN_STEP_COMPLETED)\n ?.handle(\n GraphEvents.ON_RUN_STEP_COMPLETED,\n {\n result: {\n id: stepId,\n index: runStep.index,\n type: 'tool_call',\n tool_call,\n } as t.ToolCompleteEvent,\n },\n metadata,\n graph\n );\n }\n\n /**\n * Instance method that delegates to the static method\n * Kept for backward compatibility\n */\n async handleToolCallError(\n data: t.ToolErrorData,\n metadata?: Record<string, unknown>\n ): Promise<void> {\n await StandardGraph.handleToolCallErrorStatic(this, data, metadata);\n }\n\n async dispatchRunStepDelta(\n id: string,\n delta: t.ToolCallDelta,\n metadata?: Record<string, unknown>\n ): Promise<void> {\n if (!this.config) {\n throw new Error('No config provided');\n } else if (!id) {\n throw new Error('No step ID found');\n }\n const runStepDelta: t.RunStepDeltaEvent = {\n id,\n delta,\n };\n const handler = this.handlerRegistry?.getHandler(\n GraphEvents.ON_RUN_STEP_DELTA\n );\n if (handler) {\n await handler.handle(\n GraphEvents.ON_RUN_STEP_DELTA,\n runStepDelta,\n metadata,\n this\n );\n this.handlerDispatchedStepIds.add(id);\n }\n const unmarkHandlerDispatchedEvent = handler\n ? this.markHandlerDispatchedEvent(GraphEvents.ON_RUN_STEP_DELTA, id)\n : undefined;\n try {\n await safeDispatchCustomEvent(\n GraphEvents.ON_RUN_STEP_DELTA,\n runStepDelta,\n this.config\n );\n } finally {\n unmarkHandlerDispatchedEvent?.();\n }\n }\n\n async dispatchMessageDelta(\n id: string,\n delta: t.MessageDelta,\n metadata?: Record<string, unknown>\n ): Promise<void> {\n if (!this.config) {\n throw new Error('No config provided');\n }\n const messageDelta: t.MessageDeltaEvent = {\n id,\n delta,\n };\n if (hasTextDeltaContent(delta.content)) {\n this.messageStepHasTextDeltas.add(id);\n }\n const handler = this.handlerRegistry?.getHandler(\n GraphEvents.ON_MESSAGE_DELTA\n );\n if (handler) {\n await handler.handle(\n GraphEvents.ON_MESSAGE_DELTA,\n messageDelta,\n metadata,\n this\n );\n this.handlerDispatchedStepIds.add(id);\n }\n const unmarkHandlerDispatchedEvent = handler\n ? this.markHandlerDispatchedEvent(GraphEvents.ON_MESSAGE_DELTA, id)\n : undefined;\n try {\n await safeDispatchCustomEvent(\n GraphEvents.ON_MESSAGE_DELTA,\n messageDelta,\n this.config\n );\n } finally {\n unmarkHandlerDispatchedEvent?.();\n }\n }\n\n dispatchReasoningDelta = async (\n stepId: string,\n delta: t.ReasoningDelta,\n metadata?: Record<string, unknown>\n ): Promise<void> => {\n if (!this.config) {\n throw new Error('No config provided');\n }\n const reasoningDelta: t.ReasoningDeltaEvent = {\n id: stepId,\n delta,\n };\n if (hasReasoningDeltaContent(delta.content)) {\n this.reasoningStepHasDeltas.add(stepId);\n }\n const handler = this.handlerRegistry?.getHandler(\n GraphEvents.ON_REASONING_DELTA\n );\n if (handler) {\n await handler.handle(\n GraphEvents.ON_REASONING_DELTA,\n reasoningDelta,\n metadata,\n this\n );\n this.handlerDispatchedStepIds.add(stepId);\n }\n const unmarkHandlerDispatchedEvent = handler\n ? this.markHandlerDispatchedEvent(GraphEvents.ON_REASONING_DELTA, stepId)\n : undefined;\n try {\n await safeDispatchCustomEvent(\n GraphEvents.ON_REASONING_DELTA,\n reasoningDelta,\n this.config\n );\n } finally {\n unmarkHandlerDispatchedEvent?.();\n }\n };\n}\n"],"mappings":"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"}
|