@librechat/agents 3.0.42 → 3.0.43

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.
Files changed (51) hide show
  1. package/dist/cjs/agents/AgentContext.cjs +134 -70
  2. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  3. package/dist/cjs/common/enum.cjs +1 -1
  4. package/dist/cjs/common/enum.cjs.map +1 -1
  5. package/dist/cjs/graphs/Graph.cjs +7 -13
  6. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  7. package/dist/cjs/main.cjs +5 -0
  8. package/dist/cjs/main.cjs.map +1 -1
  9. package/dist/cjs/messages/tools.cjs +85 -0
  10. package/dist/cjs/messages/tools.cjs.map +1 -0
  11. package/dist/cjs/tools/ProgrammaticToolCalling.cjs +55 -32
  12. package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
  13. package/dist/cjs/tools/ToolNode.cjs +30 -13
  14. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  15. package/dist/esm/agents/AgentContext.mjs +134 -70
  16. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  17. package/dist/esm/common/enum.mjs +1 -1
  18. package/dist/esm/common/enum.mjs.map +1 -1
  19. package/dist/esm/graphs/Graph.mjs +8 -14
  20. package/dist/esm/graphs/Graph.mjs.map +1 -1
  21. package/dist/esm/main.mjs +2 -1
  22. package/dist/esm/main.mjs.map +1 -1
  23. package/dist/esm/messages/tools.mjs +82 -0
  24. package/dist/esm/messages/tools.mjs.map +1 -0
  25. package/dist/esm/tools/ProgrammaticToolCalling.mjs +54 -33
  26. package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
  27. package/dist/esm/tools/ToolNode.mjs +30 -13
  28. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  29. package/dist/types/agents/AgentContext.d.ts +37 -17
  30. package/dist/types/common/enum.d.ts +1 -1
  31. package/dist/types/messages/index.d.ts +1 -0
  32. package/dist/types/messages/tools.d.ts +17 -0
  33. package/dist/types/tools/ProgrammaticToolCalling.d.ts +15 -23
  34. package/dist/types/tools/ToolNode.d.ts +9 -7
  35. package/dist/types/types/tools.d.ts +5 -5
  36. package/package.json +1 -1
  37. package/src/agents/AgentContext.ts +157 -85
  38. package/src/agents/__tests__/AgentContext.test.ts +805 -0
  39. package/src/common/enum.ts +1 -1
  40. package/src/graphs/Graph.ts +9 -21
  41. package/src/messages/__tests__/tools.test.ts +473 -0
  42. package/src/messages/index.ts +1 -0
  43. package/src/messages/tools.ts +99 -0
  44. package/src/scripts/code_exec_ptc.ts +78 -21
  45. package/src/scripts/programmatic_exec.ts +3 -3
  46. package/src/scripts/programmatic_exec_agent.ts +4 -4
  47. package/src/tools/ProgrammaticToolCalling.ts +71 -39
  48. package/src/tools/ToolNode.ts +33 -14
  49. package/src/tools/__tests__/ProgrammaticToolCalling.integration.test.ts +9 -9
  50. package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +180 -5
  51. package/src/types/tools.ts +3 -5
@@ -1 +1 @@
1
- {"version":3,"file":"Graph.cjs","sources":["../../../src/graphs/Graph.ts"],"sourcesContent":["/* eslint-disable no-console */\n// src/graphs/Graph.ts\nimport { nanoid } from 'nanoid';\nimport { concat } from '@langchain/core/utils/stream';\nimport { ToolNode } from '@langchain/langgraph/prebuilt';\nimport { ChatVertexAI } from '@langchain/google-vertexai';\nimport {\n START,\n END,\n Command,\n StateGraph,\n Annotation,\n messagesStateReducer,\n} from '@langchain/langgraph';\nimport {\n Runnable,\n RunnableConfig,\n RunnableLambda,\n} from '@langchain/core/runnables';\nimport {\n ToolMessage,\n SystemMessage,\n AIMessageChunk,\n} from '@langchain/core/messages';\nimport type {\n BaseMessageFields,\n UsageMetadata,\n BaseMessage,\n} from '@langchain/core/messages';\nimport type { ToolCall } from '@langchain/core/messages/tool';\nimport type * as t from '@/types';\nimport {\n GraphNodeKeys,\n ContentTypes,\n GraphEvents,\n Providers,\n StepTypes,\n Constants,\n} from '@/common';\nimport {\n formatAnthropicArtifactContent,\n ensureThinkingBlockInMessages,\n convertMessagesToContent,\n addBedrockCacheControl,\n modifyDeltaProperties,\n formatArtifactPayload,\n formatContentStrings,\n createPruneMessages,\n addCacheControl,\n} from '@/messages';\nimport {\n resetIfNotEmpty,\n isOpenAILike,\n isGoogleLike,\n joinKeys,\n sleep,\n} from '@/utils';\nimport { getChatModelClass, manualToolStreamProviders } from '@/llm/providers';\nimport { ToolNode as CustomToolNode, toolsCondition } from '@/tools/ToolNode';\nimport { ChatOpenAI, AzureChatOpenAI } from '@/llm/openai';\nimport { safeDispatchCustomEvent } from '@/utils/events';\nimport { AgentContext } from '@/agents/AgentContext';\nimport { createFakeStreamingLLM } from '@/llm/fake';\nimport { HandlerRegistry } from '@/events';\n\nconst { AGENT, TOOLS } = GraphNodeKeys;\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 initializeModel({\n currentModel,\n tools,\n clientOptions,\n }: {\n currentModel?: t.ChatModel;\n tools?: t.GraphTools;\n clientOptions?: t.ClientOptions;\n }): Runnable;\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 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 ): Promise<void>;\n abstract dispatchMessageDelta(\n id: string,\n delta: t.MessageDelta\n ): Promise<void>;\n abstract dispatchReasoningDelta(\n stepId: string,\n delta: t.ReasoningDelta\n ): Promise<void>;\n abstract handleToolCallCompleted(\n data: t.ToolEndData,\n metadata?: Record<string, unknown>,\n omitOutput?: boolean\n ): Promise<void>;\n\n abstract createCallModel(\n agentId?: string,\n currentModel?: t.ChatModel\n ): (state: T, config?: RunnableConfig) => Promise<Partial<T>>;\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 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\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 runId: string | undefined;\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 constructor({\n // parent-level graph inputs\n runId,\n signal,\n agents,\n tokenCounter,\n indexTokenCountMap,\n }: t.StandardGraphInput) {\n super();\n this.runId = runId;\n this.signal = signal;\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\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.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 this.toolCallStepIds = resetIfNotEmpty(this.toolCallStepIds, new Map());\n this.messageIdsByStepKey = resetIfNotEmpty(\n this.messageIdsByStepKey,\n new Map()\n );\n this.messageStepHasToolCalls = resetIfNotEmpty(\n this.messageStepHasToolCalls,\n new Map()\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 /* 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 }\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 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 = [\n metadata.run_id as string,\n metadata.thread_id as string,\n metadata.langgraph_node as string,\n metadata.langgraph_step as number,\n metadata.checkpoint_ns as string,\n ];\n\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');\n }\n\n if (this.invokedToolIds != null && this.invokedToolIds.size > 0) {\n keyList.push(this.invokedToolIds.size + '');\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 return this.messages.slice(this.startIndex);\n }\n\n getContentParts(): t.MessageContentComplex[] | undefined {\n return convertMessagesToContent(this.messages.slice(this.startIndex));\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 createSystemRunnable({\n provider,\n clientOptions,\n instructions,\n additional_instructions,\n }: {\n provider?: Providers;\n clientOptions?: t.ClientOptions;\n instructions?: string;\n additional_instructions?: string;\n }): t.SystemRunnable | undefined {\n let finalInstructions: string | BaseMessageFields | undefined =\n instructions;\n if (additional_instructions != null && additional_instructions !== '') {\n finalInstructions =\n finalInstructions != null && finalInstructions\n ? `${finalInstructions}\\n\\n${additional_instructions}`\n : additional_instructions;\n }\n\n if (\n finalInstructions != null &&\n finalInstructions &&\n provider === Providers.ANTHROPIC &&\n ((\n (clientOptions as t.AnthropicClientOptions).clientOptions\n ?.defaultHeaders as Record<string, string> | undefined\n )?.['anthropic-beta']?.includes('prompt-caching') ??\n false)\n ) {\n finalInstructions = {\n content: [\n {\n type: 'text',\n text: instructions,\n cache_control: { type: 'ephemeral' },\n },\n ],\n };\n }\n\n if (finalInstructions != null && finalInstructions !== '') {\n const systemMessage = new SystemMessage(finalInstructions);\n return RunnableLambda.from((messages: BaseMessage[]) => {\n return [systemMessage, ...messages];\n }).withConfig({ runName: 'prompt' });\n }\n }\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 return new CustomToolNode<t.BaseGraphState>({\n tools: (currentTools as t.GenericTool[] | undefined) ?? [],\n toolMap: currentToolMap,\n toolCallStepIds: this.toolCallStepIds,\n errorHandler: (data, metadata) =>\n StandardGraph.handleToolCallErrorStatic(this, data, metadata),\n toolRegistry: agentContext?.toolRegistry,\n programmaticToolMap: agentContext?.getProgrammaticToolMap(),\n programmaticToolDefs: agentContext?.getProgrammaticToolDefs(),\n });\n }\n\n initializeModel({\n provider,\n tools,\n clientOptions,\n }: {\n provider: Providers;\n tools?: t.GraphTools;\n clientOptions?: t.ClientOptions;\n }): Runnable {\n const ChatModelClass = getChatModelClass(provider);\n const model = new ChatModelClass(clientOptions ?? {});\n\n if (\n isOpenAILike(provider) &&\n (model instanceof ChatOpenAI || model instanceof AzureChatOpenAI)\n ) {\n model.temperature = (clientOptions as t.OpenAIClientOptions)\n .temperature as number;\n model.topP = (clientOptions as t.OpenAIClientOptions).topP as number;\n model.frequencyPenalty = (clientOptions as t.OpenAIClientOptions)\n .frequencyPenalty as number;\n model.presencePenalty = (clientOptions as t.OpenAIClientOptions)\n .presencePenalty as number;\n model.n = (clientOptions as t.OpenAIClientOptions).n as number;\n } else if (\n provider === Providers.VERTEXAI &&\n model instanceof ChatVertexAI\n ) {\n model.temperature = (clientOptions as t.VertexAIClientOptions)\n .temperature as number;\n model.topP = (clientOptions as t.VertexAIClientOptions).topP as number;\n model.topK = (clientOptions as t.VertexAIClientOptions).topK as number;\n model.topLogprobs = (clientOptions as t.VertexAIClientOptions)\n .topLogprobs as number;\n model.frequencyPenalty = (clientOptions as t.VertexAIClientOptions)\n .frequencyPenalty as number;\n model.presencePenalty = (clientOptions as t.VertexAIClientOptions)\n .presencePenalty as number;\n model.maxOutputTokens = (clientOptions as t.VertexAIClientOptions)\n .maxOutputTokens as number;\n }\n\n if (!tools || tools.length === 0) {\n return model as unknown as Runnable;\n }\n\n return (model as t.ModelWithTools).bindTools(tools);\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 getNewModel({\n provider,\n clientOptions,\n }: {\n provider: Providers;\n clientOptions?: t.ClientOptions;\n }): t.ChatModelInstance {\n const ChatModelClass = getChatModelClass(provider);\n return new ChatModelClass(clientOptions ?? {});\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 /** Execute model invocation with streaming support */\n private async attemptInvoke(\n {\n currentModel,\n finalMessages,\n provider,\n tools,\n }: {\n currentModel?: t.ChatModel;\n finalMessages: BaseMessage[];\n provider: Providers;\n tools?: t.GraphTools;\n },\n config?: RunnableConfig\n ): Promise<Partial<t.BaseGraphState>> {\n const model = this.overrideModel ?? currentModel;\n if (!model) {\n throw new Error('No model found');\n }\n\n if ((tools?.length ?? 0) > 0 && manualToolStreamProviders.has(provider)) {\n if (!model.stream) {\n throw new Error('Model does not support stream');\n }\n const stream = await model.stream(finalMessages, config);\n let finalChunk: AIMessageChunk | undefined;\n for await (const chunk of stream) {\n await safeDispatchCustomEvent(\n GraphEvents.CHAT_MODEL_STREAM,\n { chunk, emitted: true },\n config\n );\n finalChunk = finalChunk ? concat(finalChunk, chunk) : chunk;\n }\n finalChunk = modifyDeltaProperties(provider, finalChunk);\n return { messages: [finalChunk as AIMessageChunk] };\n } else {\n const finalMessage = await model.invoke(finalMessages, config);\n if ((finalMessage.tool_calls?.length ?? 0) > 0) {\n finalMessage.tool_calls = finalMessage.tool_calls?.filter(\n (tool_call: ToolCall) => !!tool_call.name\n );\n }\n return { messages: [finalMessage] };\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.BaseGraphState,\n config?: RunnableConfig\n ): Promise<Partial<t.BaseGraphState>> => {\n /**\n * Get agent context - it must exist by this point\n */\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 toolsForBinding = agentContext.getToolsForBinding();\n let model =\n this.overrideModel ??\n this.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 const { messages } = state;\n\n let messagesToUse = messages;\n if (\n !agentContext.pruneMessages &&\n agentContext.tokenCounter &&\n agentContext.maxContextTokens != null &&\n agentContext.indexTokenCountMap[0] != null\n ) {\n const isAnthropicWithThinking =\n (agentContext.provider === Providers.ANTHROPIC &&\n (agentContext.clientOptions as t.AnthropicClientOptions).thinking !=\n null) ||\n (agentContext.provider === Providers.BEDROCK &&\n (agentContext.clientOptions as t.BedrockAnthropicInput)\n .additionalModelRequestFields?.['thinking'] != null) ||\n (agentContext.provider === Providers.OPENAI &&\n (\n (agentContext.clientOptions as t.OpenAIClientOptions).modelKwargs\n ?.thinking as t.AnthropicClientOptions['thinking']\n )?.type === 'enabled');\n\n agentContext.pruneMessages = createPruneMessages({\n startIndex: this.startIndex,\n provider: agentContext.provider,\n tokenCounter: agentContext.tokenCounter,\n maxTokens: agentContext.maxContextTokens,\n thinkingEnabled: isAnthropicWithThinking,\n indexTokenCountMap: agentContext.indexTokenCountMap,\n });\n }\n if (agentContext.pruneMessages) {\n const { context, indexTokenCountMap } = agentContext.pruneMessages({\n messages,\n usageMetadata: agentContext.currentUsage,\n // startOnMessageType: 'human',\n });\n agentContext.indexTokenCountMap = indexTokenCountMap;\n messagesToUse = context;\n }\n\n let finalMessages = messagesToUse;\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 if (\n agentContext.provider === Providers.BEDROCK &&\n lastMessageX instanceof AIMessageChunk &&\n lastMessageY instanceof ToolMessage &&\n typeof lastMessageX.content === 'string'\n ) {\n finalMessages[finalMessages.length - 2].content = '';\n }\n\n const isLatestToolMessage = lastMessageY instanceof ToolMessage;\n\n if (\n isLatestToolMessage &&\n lastMessageY.name === Constants.TOOL_SEARCH_REGEX &&\n typeof lastMessageY.artifact === 'object' &&\n lastMessageY.artifact != null\n ) {\n const artifact = lastMessageY.artifact as {\n tool_references?: Array<{ tool_name: string }>;\n };\n if (artifact.tool_references && artifact.tool_references.length > 0) {\n const discoveredNames = artifact.tool_references.map(\n (ref) => ref.tool_name\n );\n agentContext.markToolsAsDiscovered(discoveredNames);\n }\n }\n\n if (\n isLatestToolMessage &&\n agentContext.provider === Providers.ANTHROPIC\n ) {\n formatAnthropicArtifactContent(finalMessages);\n } else if (\n isLatestToolMessage &&\n ((isOpenAILike(agentContext.provider) &&\n agentContext.provider !== Providers.DEEPSEEK) ||\n isGoogleLike(agentContext.provider))\n ) {\n formatArtifactPayload(finalMessages);\n }\n\n if (agentContext.provider === Providers.ANTHROPIC) {\n const anthropicOptions = agentContext.clientOptions as\n | t.AnthropicClientOptions\n | undefined;\n const defaultHeaders = anthropicOptions?.clientOptions\n ?.defaultHeaders as Record<string, string> | undefined;\n const anthropicBeta = defaultHeaders?.['anthropic-beta'];\n\n if (\n typeof anthropicBeta === 'string' &&\n anthropicBeta.includes('prompt-caching')\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 }\n\n /**\n * Handle edge case: when switching from a non-thinking agent to a thinking-enabled agent,\n * convert AI messages with tool calls to HumanMessages to avoid thinking block requirements.\n * This is required by Anthropic/Bedrock when thinking is enabled.\n */\n const isAnthropicWithThinking =\n (agentContext.provider === Providers.ANTHROPIC &&\n (agentContext.clientOptions as t.AnthropicClientOptions).thinking !=\n null) ||\n (agentContext.provider === Providers.BEDROCK &&\n (agentContext.clientOptions as t.BedrockAnthropicInput)\n .additionalModelRequestFields?.['thinking'] != null);\n\n if (isAnthropicWithThinking) {\n finalMessages = ensureThinkingBlockInMessages(\n finalMessages,\n agentContext.provider\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\n let result: Partial<t.BaseGraphState> | undefined;\n const fallbacks =\n (agentContext.clientOptions as t.LLMConfig | undefined)?.fallbacks ??\n [];\n\n if (finalMessages.length === 0) {\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. Please increase the context window size or make your message shorter.',\n })\n );\n }\n\n try {\n result = await this.attemptInvoke(\n {\n currentModel: model,\n finalMessages,\n provider: agentContext.provider,\n tools: agentContext.tools,\n },\n config\n );\n } catch (primaryError) {\n let lastError: unknown = primaryError;\n for (const fb of fallbacks) {\n try {\n let model = this.getNewModel({\n provider: fb.provider,\n clientOptions: fb.clientOptions,\n });\n const bindableTools = agentContext.tools;\n model = (\n !bindableTools || bindableTools.length === 0\n ? model\n : model.bindTools(bindableTools)\n ) as t.ChatModelInstance;\n result = await this.attemptInvoke(\n {\n currentModel: model,\n finalMessages,\n provider: fb.provider,\n tools: agentContext.tools,\n },\n config\n );\n lastError = undefined;\n break;\n } catch (e) {\n lastError = e;\n continue;\n }\n }\n if (lastError !== undefined) {\n throw lastError;\n }\n }\n\n if (!result) {\n throw new Error('No result after model invocation');\n }\n agentContext.currentUsage = this.getUsageMetadata(result.messages?.[0]);\n this.cleanupSignalListener();\n return result;\n };\n }\n\n createAgentNode(agentId: string): t.CompiledAgentWorfklow {\n const agentContext = this.agentContexts.get(agentId);\n if (!agentContext) {\n throw new Error(`Agent context not found for agentId: ${agentId}`);\n }\n\n const agentNode = `${AGENT}${agentId}` as const;\n const toolNode = `${TOOLS}${agentId}` as const;\n\n const routeMessage = (\n state: t.BaseGraphState,\n config?: RunnableConfig\n ): string => {\n this.config = config;\n return toolsCondition(state, toolNode, this.invokedToolIds);\n };\n\n const StateAnnotation = Annotation.Root({\n messages: Annotation<BaseMessage[]>({\n reducer: messagesStateReducer,\n default: () => [],\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 .addEdge(START, agentNode)\n .addConditionalEdges(agentNode, routeMessage)\n .addEdge(toolNode, agentContext.toolEnd ? END : agentNode);\n\n // Cast to unknown to avoid tight coupling to external types; options are opt-in\n return workflow.compile(this.compileOptions as unknown as never);\n }\n\n createWorkflow(): t.CompiledStateWorkflow {\n /** Use the default (first) agent for now */\n const agentNode = this.createAgentNode(this.defaultAgentId);\n const StateAnnotation = Annotation.Root({\n messages: Annotation<BaseMessage[]>({\n reducer: (a, b) => {\n if (!a.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(this.defaultAgentId, agentNode, { ends: [END] })\n .addEdge(START, this.defaultAgentId)\n .compile();\n\n return workflow;\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 /**\n * Extract and store agentId from metadata\n */\n if (metadata) {\n try {\n const agentContext = this.getAgentContext(metadata);\n if (agentContext.agentId) {\n runStep.agentId = agentContext.agentId;\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 await safeDispatchCustomEvent(\n GraphEvents.ON_RUN_STEP,\n runStep,\n this.config\n );\n return stepId;\n }\n\n async handleToolCallCompleted(\n data: t.ToolEndData,\n metadata?: Record<string, unknown>,\n omitOutput?: boolean\n ): Promise<void> {\n if (!this.config) {\n throw new Error('No config provided');\n }\n\n if (!data.output) {\n return;\n }\n\n const { input, output: _output } = data;\n if ((_output as Command | undefined)?.lg_name === 'Command') {\n return;\n }\n const output = _output as ToolMessage;\n const { tool_call_id } = output;\n const stepId = this.toolCallStepIds.get(tool_call_id) ?? '';\n if (!stepId) {\n throw new Error(`No stepId found for tool_call_id ${tool_call_id}`);\n }\n\n const runStep = this.getRunStep(stepId);\n if (!runStep) {\n throw new Error(`No run step found for stepId ${stepId}`);\n }\n\n const dispatchedOutput =\n typeof output.content === 'string'\n ? output.content\n : JSON.stringify(output.content);\n\n const args = typeof input === 'string' ? input : input.input;\n const tool_call = {\n args: typeof args === 'string' ? args : JSON.stringify(args),\n name: output.name ?? '',\n id: output.tool_call_id,\n output: omitOutput === true ? '' : dispatchedOutput,\n progress: 1,\n };\n\n await this.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 this\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 ): 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 await safeDispatchCustomEvent(\n GraphEvents.ON_RUN_STEP_DELTA,\n runStepDelta,\n this.config\n );\n }\n\n async dispatchMessageDelta(id: string, delta: t.MessageDelta): 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 await safeDispatchCustomEvent(\n GraphEvents.ON_MESSAGE_DELTA,\n messageDelta,\n this.config\n );\n }\n\n dispatchReasoningDelta = async (\n stepId: string,\n delta: t.ReasoningDelta\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 await safeDispatchCustomEvent(\n GraphEvents.ON_REASONING_DELTA,\n reasoningDelta,\n this.config\n );\n };\n}\n"],"names":["GraphNodeKeys","AgentContext","resetIfNotEmpty","joinKeys","nanoid","ContentTypes","convertMessagesToContent","Providers","SystemMessage","RunnableLambda","CustomToolNode","getChatModelClass","isOpenAILike","ChatOpenAI","AzureChatOpenAI","ChatVertexAI","createFakeStreamingLLM","manualToolStreamProviders","stream","safeDispatchCustomEvent","GraphEvents","concat","modifyDeltaProperties","messages","createPruneMessages","formatContentStrings","AIMessageChunk","ToolMessage","Constants","formatAnthropicArtifactContent","isGoogleLike","formatArtifactPayload","addCacheControl","addBedrockCacheControl","ensureThinkingBlockInMessages","sleep","toolsCondition","Annotation","messagesStateReducer","StateGraph","START","END","StepTypes"],"mappings":"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"}
1
+ {"version":3,"file":"Graph.cjs","sources":["../../../src/graphs/Graph.ts"],"sourcesContent":["/* eslint-disable no-console */\n// src/graphs/Graph.ts\nimport { nanoid } from 'nanoid';\nimport { concat } from '@langchain/core/utils/stream';\nimport { ToolNode } from '@langchain/langgraph/prebuilt';\nimport { ChatVertexAI } from '@langchain/google-vertexai';\nimport {\n START,\n END,\n Command,\n StateGraph,\n Annotation,\n messagesStateReducer,\n} from '@langchain/langgraph';\nimport {\n Runnable,\n RunnableConfig,\n RunnableLambda,\n} from '@langchain/core/runnables';\nimport {\n ToolMessage,\n SystemMessage,\n AIMessageChunk,\n} from '@langchain/core/messages';\nimport type {\n BaseMessageFields,\n UsageMetadata,\n BaseMessage,\n} from '@langchain/core/messages';\nimport type { ToolCall } from '@langchain/core/messages/tool';\nimport type * as t from '@/types';\nimport {\n GraphNodeKeys,\n ContentTypes,\n GraphEvents,\n Providers,\n StepTypes,\n} from '@/common';\nimport {\n formatAnthropicArtifactContent,\n ensureThinkingBlockInMessages,\n convertMessagesToContent,\n addBedrockCacheControl,\n modifyDeltaProperties,\n formatArtifactPayload,\n formatContentStrings,\n createPruneMessages,\n addCacheControl,\n extractToolDiscoveries,\n} from '@/messages';\nimport {\n resetIfNotEmpty,\n isOpenAILike,\n isGoogleLike,\n joinKeys,\n sleep,\n} from '@/utils';\nimport { getChatModelClass, manualToolStreamProviders } from '@/llm/providers';\nimport { ToolNode as CustomToolNode, toolsCondition } from '@/tools/ToolNode';\nimport { ChatOpenAI, AzureChatOpenAI } from '@/llm/openai';\nimport { safeDispatchCustomEvent } from '@/utils/events';\nimport { AgentContext } from '@/agents/AgentContext';\nimport { createFakeStreamingLLM } from '@/llm/fake';\nimport { HandlerRegistry } from '@/events';\n\nconst { AGENT, TOOLS } = GraphNodeKeys;\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 initializeModel({\n currentModel,\n tools,\n clientOptions,\n }: {\n currentModel?: t.ChatModel;\n tools?: t.GraphTools;\n clientOptions?: t.ClientOptions;\n }): Runnable;\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 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 ): Promise<void>;\n abstract dispatchMessageDelta(\n id: string,\n delta: t.MessageDelta\n ): Promise<void>;\n abstract dispatchReasoningDelta(\n stepId: string,\n delta: t.ReasoningDelta\n ): Promise<void>;\n abstract handleToolCallCompleted(\n data: t.ToolEndData,\n metadata?: Record<string, unknown>,\n omitOutput?: boolean\n ): Promise<void>;\n\n abstract createCallModel(\n agentId?: string,\n currentModel?: t.ChatModel\n ): (state: T, config?: RunnableConfig) => Promise<Partial<T>>;\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 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\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 runId: string | undefined;\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 constructor({\n // parent-level graph inputs\n runId,\n signal,\n agents,\n tokenCounter,\n indexTokenCountMap,\n }: t.StandardGraphInput) {\n super();\n this.runId = runId;\n this.signal = signal;\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\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.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 this.toolCallStepIds = resetIfNotEmpty(this.toolCallStepIds, new Map());\n this.messageIdsByStepKey = resetIfNotEmpty(\n this.messageIdsByStepKey,\n new Map()\n );\n this.messageStepHasToolCalls = resetIfNotEmpty(\n this.messageStepHasToolCalls,\n new Map()\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 /* 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 }\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 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 = [\n metadata.run_id as string,\n metadata.thread_id as string,\n metadata.langgraph_node as string,\n metadata.langgraph_step as number,\n metadata.checkpoint_ns as string,\n ];\n\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');\n }\n\n if (this.invokedToolIds != null && this.invokedToolIds.size > 0) {\n keyList.push(this.invokedToolIds.size + '');\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 return this.messages.slice(this.startIndex);\n }\n\n getContentParts(): t.MessageContentComplex[] | undefined {\n return convertMessagesToContent(this.messages.slice(this.startIndex));\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 createSystemRunnable({\n provider,\n clientOptions,\n instructions,\n additional_instructions,\n }: {\n provider?: Providers;\n clientOptions?: t.ClientOptions;\n instructions?: string;\n additional_instructions?: string;\n }): t.SystemRunnable | undefined {\n let finalInstructions: string | BaseMessageFields | undefined =\n instructions;\n if (additional_instructions != null && additional_instructions !== '') {\n finalInstructions =\n finalInstructions != null && finalInstructions\n ? `${finalInstructions}\\n\\n${additional_instructions}`\n : additional_instructions;\n }\n\n if (\n finalInstructions != null &&\n finalInstructions &&\n provider === Providers.ANTHROPIC &&\n ((\n (clientOptions as t.AnthropicClientOptions).clientOptions\n ?.defaultHeaders as Record<string, string> | undefined\n )?.['anthropic-beta']?.includes('prompt-caching') ??\n false)\n ) {\n finalInstructions = {\n content: [\n {\n type: 'text',\n text: instructions,\n cache_control: { type: 'ephemeral' },\n },\n ],\n };\n }\n\n if (finalInstructions != null && finalInstructions !== '') {\n const systemMessage = new SystemMessage(finalInstructions);\n return RunnableLambda.from((messages: BaseMessage[]) => {\n return [systemMessage, ...messages];\n }).withConfig({ runName: 'prompt' });\n }\n }\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 return new CustomToolNode<t.BaseGraphState>({\n tools: (currentTools as t.GenericTool[] | undefined) ?? [],\n toolMap: currentToolMap,\n toolCallStepIds: this.toolCallStepIds,\n errorHandler: (data, metadata) =>\n StandardGraph.handleToolCallErrorStatic(this, data, metadata),\n toolRegistry: agentContext?.toolRegistry,\n });\n }\n\n initializeModel({\n provider,\n tools,\n clientOptions,\n }: {\n provider: Providers;\n tools?: t.GraphTools;\n clientOptions?: t.ClientOptions;\n }): Runnable {\n const ChatModelClass = getChatModelClass(provider);\n const model = new ChatModelClass(clientOptions ?? {});\n\n if (\n isOpenAILike(provider) &&\n (model instanceof ChatOpenAI || model instanceof AzureChatOpenAI)\n ) {\n model.temperature = (clientOptions as t.OpenAIClientOptions)\n .temperature as number;\n model.topP = (clientOptions as t.OpenAIClientOptions).topP as number;\n model.frequencyPenalty = (clientOptions as t.OpenAIClientOptions)\n .frequencyPenalty as number;\n model.presencePenalty = (clientOptions as t.OpenAIClientOptions)\n .presencePenalty as number;\n model.n = (clientOptions as t.OpenAIClientOptions).n as number;\n } else if (\n provider === Providers.VERTEXAI &&\n model instanceof ChatVertexAI\n ) {\n model.temperature = (clientOptions as t.VertexAIClientOptions)\n .temperature as number;\n model.topP = (clientOptions as t.VertexAIClientOptions).topP as number;\n model.topK = (clientOptions as t.VertexAIClientOptions).topK as number;\n model.topLogprobs = (clientOptions as t.VertexAIClientOptions)\n .topLogprobs as number;\n model.frequencyPenalty = (clientOptions as t.VertexAIClientOptions)\n .frequencyPenalty as number;\n model.presencePenalty = (clientOptions as t.VertexAIClientOptions)\n .presencePenalty as number;\n model.maxOutputTokens = (clientOptions as t.VertexAIClientOptions)\n .maxOutputTokens as number;\n }\n\n if (!tools || tools.length === 0) {\n return model as unknown as Runnable;\n }\n\n return (model as t.ModelWithTools).bindTools(tools);\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 getNewModel({\n provider,\n clientOptions,\n }: {\n provider: Providers;\n clientOptions?: t.ClientOptions;\n }): t.ChatModelInstance {\n const ChatModelClass = getChatModelClass(provider);\n return new ChatModelClass(clientOptions ?? {});\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 /** Execute model invocation with streaming support */\n private async attemptInvoke(\n {\n currentModel,\n finalMessages,\n provider,\n tools,\n }: {\n currentModel?: t.ChatModel;\n finalMessages: BaseMessage[];\n provider: Providers;\n tools?: t.GraphTools;\n },\n config?: RunnableConfig\n ): Promise<Partial<t.BaseGraphState>> {\n const model = this.overrideModel ?? currentModel;\n if (!model) {\n throw new Error('No model found');\n }\n\n if ((tools?.length ?? 0) > 0 && manualToolStreamProviders.has(provider)) {\n if (!model.stream) {\n throw new Error('Model does not support stream');\n }\n const stream = await model.stream(finalMessages, config);\n let finalChunk: AIMessageChunk | undefined;\n for await (const chunk of stream) {\n await safeDispatchCustomEvent(\n GraphEvents.CHAT_MODEL_STREAM,\n { chunk, emitted: true },\n config\n );\n finalChunk = finalChunk ? concat(finalChunk, chunk) : chunk;\n }\n finalChunk = modifyDeltaProperties(provider, finalChunk);\n return { messages: [finalChunk as AIMessageChunk] };\n } else {\n const finalMessage = await model.invoke(finalMessages, config);\n if ((finalMessage.tool_calls?.length ?? 0) > 0) {\n finalMessage.tool_calls = finalMessage.tool_calls?.filter(\n (tool_call: ToolCall) => !!tool_call.name\n );\n }\n return { messages: [finalMessage] };\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.BaseGraphState,\n config?: RunnableConfig\n ): Promise<Partial<t.BaseGraphState>> => {\n /**\n * Get agent context - it must exist by this point\n */\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 // Extract tool discoveries from current turn only (similar to formatArtifactPayload pattern)\n const discoveredNames = extractToolDiscoveries(messages);\n if (discoveredNames.length > 0) {\n agentContext.markToolsAsDiscovered(discoveredNames);\n }\n\n const toolsForBinding = agentContext.getToolsForBinding();\n let model =\n this.overrideModel ??\n this.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 if (\n !agentContext.pruneMessages &&\n agentContext.tokenCounter &&\n agentContext.maxContextTokens != null &&\n agentContext.indexTokenCountMap[0] != null\n ) {\n const isAnthropicWithThinking =\n (agentContext.provider === Providers.ANTHROPIC &&\n (agentContext.clientOptions as t.AnthropicClientOptions).thinking !=\n null) ||\n (agentContext.provider === Providers.BEDROCK &&\n (agentContext.clientOptions as t.BedrockAnthropicInput)\n .additionalModelRequestFields?.['thinking'] != null) ||\n (agentContext.provider === Providers.OPENAI &&\n (\n (agentContext.clientOptions as t.OpenAIClientOptions).modelKwargs\n ?.thinking as t.AnthropicClientOptions['thinking']\n )?.type === 'enabled');\n\n agentContext.pruneMessages = createPruneMessages({\n startIndex: this.startIndex,\n provider: agentContext.provider,\n tokenCounter: agentContext.tokenCounter,\n maxTokens: agentContext.maxContextTokens,\n thinkingEnabled: isAnthropicWithThinking,\n indexTokenCountMap: agentContext.indexTokenCountMap,\n });\n }\n if (agentContext.pruneMessages) {\n const { context, indexTokenCountMap } = agentContext.pruneMessages({\n messages,\n usageMetadata: agentContext.currentUsage,\n // startOnMessageType: 'human',\n });\n agentContext.indexTokenCountMap = indexTokenCountMap;\n messagesToUse = context;\n }\n\n let finalMessages = messagesToUse;\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 if (\n agentContext.provider === Providers.BEDROCK &&\n lastMessageX instanceof AIMessageChunk &&\n lastMessageY instanceof ToolMessage &&\n typeof lastMessageX.content === 'string'\n ) {\n finalMessages[finalMessages.length - 2].content = '';\n }\n\n const isLatestToolMessage = lastMessageY instanceof ToolMessage;\n\n if (\n isLatestToolMessage &&\n agentContext.provider === Providers.ANTHROPIC\n ) {\n formatAnthropicArtifactContent(finalMessages);\n } else if (\n isLatestToolMessage &&\n ((isOpenAILike(agentContext.provider) &&\n agentContext.provider !== Providers.DEEPSEEK) ||\n isGoogleLike(agentContext.provider))\n ) {\n formatArtifactPayload(finalMessages);\n }\n\n if (agentContext.provider === Providers.ANTHROPIC) {\n const anthropicOptions = agentContext.clientOptions as\n | t.AnthropicClientOptions\n | undefined;\n const defaultHeaders = anthropicOptions?.clientOptions\n ?.defaultHeaders as Record<string, string> | undefined;\n const anthropicBeta = defaultHeaders?.['anthropic-beta'];\n\n if (\n typeof anthropicBeta === 'string' &&\n anthropicBeta.includes('prompt-caching')\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 }\n\n /**\n * Handle edge case: when switching from a non-thinking agent to a thinking-enabled agent,\n * convert AI messages with tool calls to HumanMessages to avoid thinking block requirements.\n * This is required by Anthropic/Bedrock when thinking is enabled.\n */\n const isAnthropicWithThinking =\n (agentContext.provider === Providers.ANTHROPIC &&\n (agentContext.clientOptions as t.AnthropicClientOptions).thinking !=\n null) ||\n (agentContext.provider === Providers.BEDROCK &&\n (agentContext.clientOptions as t.BedrockAnthropicInput)\n .additionalModelRequestFields?.['thinking'] != null);\n\n if (isAnthropicWithThinking) {\n finalMessages = ensureThinkingBlockInMessages(\n finalMessages,\n agentContext.provider\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\n let result: Partial<t.BaseGraphState> | undefined;\n const fallbacks =\n (agentContext.clientOptions as t.LLMConfig | undefined)?.fallbacks ??\n [];\n\n if (finalMessages.length === 0) {\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. Please increase the context window size or make your message shorter.',\n })\n );\n }\n\n try {\n result = await this.attemptInvoke(\n {\n currentModel: model,\n finalMessages,\n provider: agentContext.provider,\n tools: agentContext.tools,\n },\n config\n );\n } catch (primaryError) {\n let lastError: unknown = primaryError;\n for (const fb of fallbacks) {\n try {\n let model = this.getNewModel({\n provider: fb.provider,\n clientOptions: fb.clientOptions,\n });\n const bindableTools = agentContext.tools;\n model = (\n !bindableTools || bindableTools.length === 0\n ? model\n : model.bindTools(bindableTools)\n ) as t.ChatModelInstance;\n result = await this.attemptInvoke(\n {\n currentModel: model,\n finalMessages,\n provider: fb.provider,\n tools: agentContext.tools,\n },\n config\n );\n lastError = undefined;\n break;\n } catch (e) {\n lastError = e;\n continue;\n }\n }\n if (lastError !== undefined) {\n throw lastError;\n }\n }\n\n if (!result) {\n throw new Error('No result after model invocation');\n }\n agentContext.currentUsage = this.getUsageMetadata(result.messages?.[0]);\n this.cleanupSignalListener();\n return result;\n };\n }\n\n createAgentNode(agentId: string): t.CompiledAgentWorfklow {\n const agentContext = this.agentContexts.get(agentId);\n if (!agentContext) {\n throw new Error(`Agent context not found for agentId: ${agentId}`);\n }\n\n const agentNode = `${AGENT}${agentId}` as const;\n const toolNode = `${TOOLS}${agentId}` as const;\n\n const routeMessage = (\n state: t.BaseGraphState,\n config?: RunnableConfig\n ): string => {\n this.config = config;\n return toolsCondition(state, toolNode, this.invokedToolIds);\n };\n\n const StateAnnotation = Annotation.Root({\n messages: Annotation<BaseMessage[]>({\n reducer: messagesStateReducer,\n default: () => [],\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 .addEdge(START, agentNode)\n .addConditionalEdges(agentNode, routeMessage)\n .addEdge(toolNode, agentContext.toolEnd ? END : agentNode);\n\n // Cast to unknown to avoid tight coupling to external types; options are opt-in\n return workflow.compile(this.compileOptions as unknown as never);\n }\n\n createWorkflow(): t.CompiledStateWorkflow {\n /** Use the default (first) agent for now */\n const agentNode = this.createAgentNode(this.defaultAgentId);\n const StateAnnotation = Annotation.Root({\n messages: Annotation<BaseMessage[]>({\n reducer: (a, b) => {\n if (!a.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(this.defaultAgentId, agentNode, { ends: [END] })\n .addEdge(START, this.defaultAgentId)\n .compile();\n\n return workflow;\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 /**\n * Extract and store agentId from metadata\n */\n if (metadata) {\n try {\n const agentContext = this.getAgentContext(metadata);\n if (agentContext.agentId) {\n runStep.agentId = agentContext.agentId;\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 await safeDispatchCustomEvent(\n GraphEvents.ON_RUN_STEP,\n runStep,\n this.config\n );\n return stepId;\n }\n\n async handleToolCallCompleted(\n data: t.ToolEndData,\n metadata?: Record<string, unknown>,\n omitOutput?: boolean\n ): Promise<void> {\n if (!this.config) {\n throw new Error('No config provided');\n }\n\n if (!data.output) {\n return;\n }\n\n const { input, output: _output } = data;\n if ((_output as Command | undefined)?.lg_name === 'Command') {\n return;\n }\n const output = _output as ToolMessage;\n const { tool_call_id } = output;\n const stepId = this.toolCallStepIds.get(tool_call_id) ?? '';\n if (!stepId) {\n throw new Error(`No stepId found for tool_call_id ${tool_call_id}`);\n }\n\n const runStep = this.getRunStep(stepId);\n if (!runStep) {\n throw new Error(`No run step found for stepId ${stepId}`);\n }\n\n const dispatchedOutput =\n typeof output.content === 'string'\n ? output.content\n : JSON.stringify(output.content);\n\n const args = typeof input === 'string' ? input : input.input;\n const tool_call = {\n args: typeof args === 'string' ? args : JSON.stringify(args),\n name: output.name ?? '',\n id: output.tool_call_id,\n output: omitOutput === true ? '' : dispatchedOutput,\n progress: 1,\n };\n\n await this.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 this\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 ): 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 await safeDispatchCustomEvent(\n GraphEvents.ON_RUN_STEP_DELTA,\n runStepDelta,\n this.config\n );\n }\n\n async dispatchMessageDelta(id: string, delta: t.MessageDelta): 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 await safeDispatchCustomEvent(\n GraphEvents.ON_MESSAGE_DELTA,\n messageDelta,\n this.config\n );\n }\n\n dispatchReasoningDelta = async (\n stepId: string,\n delta: t.ReasoningDelta\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 await safeDispatchCustomEvent(\n GraphEvents.ON_REASONING_DELTA,\n reasoningDelta,\n this.config\n );\n };\n}\n"],"names":["GraphNodeKeys","AgentContext","resetIfNotEmpty","joinKeys","nanoid","ContentTypes","convertMessagesToContent","Providers","SystemMessage","RunnableLambda","CustomToolNode","getChatModelClass","isOpenAILike","ChatOpenAI","AzureChatOpenAI","ChatVertexAI","createFakeStreamingLLM","manualToolStreamProviders","stream","safeDispatchCustomEvent","GraphEvents","concat","modifyDeltaProperties","messages","extractToolDiscoveries","createPruneMessages","formatContentStrings","AIMessageChunk","ToolMessage","formatAnthropicArtifactContent","isGoogleLike","formatArtifactPayload","addCacheControl","addBedrockCacheControl","ensureThinkingBlockInMessages","sleep","toolsCondition","Annotation","messagesStateReducer","StateGraph","START","END","StepTypes"],"mappings":"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"}
package/dist/cjs/main.cjs CHANGED
@@ -10,6 +10,7 @@ var prune = require('./messages/prune.cjs');
10
10
  var format = require('./messages/format.cjs');
11
11
  var cache = require('./messages/cache.cjs');
12
12
  var content = require('./messages/content.cjs');
13
+ var tools = require('./messages/tools.cjs');
13
14
  var Graph = require('./graphs/Graph.cjs');
14
15
  var MultiAgentGraph = require('./graphs/MultiAgentGraph.cjs');
15
16
  var Calculator = require('./tools/Calculator.cjs');
@@ -68,6 +69,8 @@ exports.addCacheControl = cache.addCacheControl;
68
69
  exports.stripAnthropicCacheControl = cache.stripAnthropicCacheControl;
69
70
  exports.stripBedrockCacheControl = cache.stripBedrockCacheControl;
70
71
  exports.formatContentStrings = content.formatContentStrings;
72
+ exports.extractToolDiscoveries = tools.extractToolDiscoveries;
73
+ exports.hasToolSearchInCurrentTurn = tools.hasToolSearchInCurrentTurn;
71
74
  exports.Graph = Graph.Graph;
72
75
  exports.StandardGraph = Graph.StandardGraph;
73
76
  exports.MultiAgentGraph = MultiAgentGraph.MultiAgentGraph;
@@ -77,6 +80,8 @@ exports.getCodeBaseURL = CodeExecutor.getCodeBaseURL;
77
80
  exports.imageExtRegex = CodeExecutor.imageExtRegex;
78
81
  exports.createProgrammaticToolCallingTool = ProgrammaticToolCalling.createProgrammaticToolCallingTool;
79
82
  exports.executeTools = ProgrammaticToolCalling.executeTools;
83
+ exports.extractUsedToolNames = ProgrammaticToolCalling.extractUsedToolNames;
84
+ exports.filterToolsByUsage = ProgrammaticToolCalling.filterToolsByUsage;
80
85
  exports.formatCompletedResponse = ProgrammaticToolCalling.formatCompletedResponse;
81
86
  exports.makeRequest = ProgrammaticToolCalling.makeRequest;
82
87
  exports.countNestedGroups = ToolSearchRegex.countNestedGroups;
@@ -1 +1 @@
1
- {"version":3,"file":"main.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"main.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,85 @@
1
+ 'use strict';
2
+
3
+ var messages = require('@langchain/core/messages');
4
+ var _enum = require('../common/enum.cjs');
5
+ var core = require('./core.cjs');
6
+
7
+ // src/messages/toolDiscovery.ts
8
+ /**
9
+ * Extracts discovered tool names from tool search results in the current turn.
10
+ * Only processes tool search messages after the latest AI message with tool calls.
11
+ *
12
+ * Similar pattern to formatArtifactPayload - finds relevant messages efficiently
13
+ * by identifying the latest AI parent and only processing subsequent tool messages.
14
+ *
15
+ * @param messages - All messages in the conversation
16
+ * @returns Array of discovered tool names (empty if no new discoveries)
17
+ */
18
+ function extractToolDiscoveries(messages$1) {
19
+ const lastMessage = messages$1[messages$1.length - 1];
20
+ if (!(lastMessage instanceof messages.ToolMessage))
21
+ return [];
22
+ // Find the latest AIMessage with tool_calls that this tool message belongs to
23
+ const latestAIParentIndex = core.findLastIndex(messages$1, (msg) => (msg instanceof messages.AIMessageChunk &&
24
+ (msg.tool_calls?.length ?? 0) > 0 &&
25
+ msg.tool_calls?.some((tc) => tc.id === lastMessage.tool_call_id)) ??
26
+ false);
27
+ if (latestAIParentIndex === -1)
28
+ return [];
29
+ // Collect tool_call_ids from the AI message
30
+ const aiMessage = messages$1[latestAIParentIndex];
31
+ const toolCallIds = new Set(aiMessage.tool_calls?.map((tc) => tc.id) ?? []);
32
+ // Only process tool search results after the AI message that belong to this turn
33
+ const discoveredNames = [];
34
+ for (let i = latestAIParentIndex + 1; i < messages$1.length; i++) {
35
+ const msg = messages$1[i];
36
+ if (!(msg instanceof messages.ToolMessage))
37
+ continue;
38
+ if (msg.name !== _enum.Constants.TOOL_SEARCH_REGEX)
39
+ continue;
40
+ if (!toolCallIds.has(msg.tool_call_id))
41
+ continue;
42
+ // This is a tool search result from the current turn
43
+ if (typeof msg.artifact === 'object' && msg.artifact != null) {
44
+ const artifact = msg.artifact;
45
+ if (artifact.tool_references && artifact.tool_references.length > 0) {
46
+ for (const ref of artifact.tool_references) {
47
+ discoveredNames.push(ref.tool_name);
48
+ }
49
+ }
50
+ }
51
+ }
52
+ return discoveredNames;
53
+ }
54
+ /**
55
+ * Checks if the current turn has any tool search results.
56
+ * Quick check to avoid full extraction when not needed.
57
+ */
58
+ function hasToolSearchInCurrentTurn(messages$1) {
59
+ const lastMessage = messages$1[messages$1.length - 1];
60
+ if (!(lastMessage instanceof messages.ToolMessage))
61
+ return false;
62
+ // Find the latest AIMessage with tool_calls
63
+ const latestAIParentIndex = core.findLastIndex(messages$1, (msg) => (msg instanceof messages.AIMessageChunk &&
64
+ (msg.tool_calls?.length ?? 0) > 0 &&
65
+ msg.tool_calls?.some((tc) => tc.id === lastMessage.tool_call_id)) ??
66
+ false);
67
+ if (latestAIParentIndex === -1)
68
+ return false;
69
+ const aiMessage = messages$1[latestAIParentIndex];
70
+ const toolCallIds = new Set(aiMessage.tool_calls?.map((tc) => tc.id) ?? []);
71
+ // Check if any tool search results exist after the AI message
72
+ for (let i = latestAIParentIndex + 1; i < messages$1.length; i++) {
73
+ const msg = messages$1[i];
74
+ if (msg instanceof messages.ToolMessage &&
75
+ msg.name === _enum.Constants.TOOL_SEARCH_REGEX &&
76
+ toolCallIds.has(msg.tool_call_id)) {
77
+ return true;
78
+ }
79
+ }
80
+ return false;
81
+ }
82
+
83
+ exports.extractToolDiscoveries = extractToolDiscoveries;
84
+ exports.hasToolSearchInCurrentTurn = hasToolSearchInCurrentTurn;
85
+ //# sourceMappingURL=tools.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.cjs","sources":["../../../src/messages/tools.ts"],"sourcesContent":["// src/messages/toolDiscovery.ts\nimport { AIMessageChunk, ToolMessage } from '@langchain/core/messages';\nimport type { BaseMessage } from '@langchain/core/messages';\nimport { Constants } from '@/common';\nimport { findLastIndex } from './core';\n\ntype ToolSearchArtifact = {\n tool_references?: Array<{ tool_name: string }>;\n};\n\n/**\n * Extracts discovered tool names from tool search results in the current turn.\n * Only processes tool search messages after the latest AI message with tool calls.\n *\n * Similar pattern to formatArtifactPayload - finds relevant messages efficiently\n * by identifying the latest AI parent and only processing subsequent tool messages.\n *\n * @param messages - All messages in the conversation\n * @returns Array of discovered tool names (empty if no new discoveries)\n */\nexport function extractToolDiscoveries(messages: BaseMessage[]): string[] {\n const lastMessage = messages[messages.length - 1];\n if (!(lastMessage instanceof ToolMessage)) return [];\n\n // Find the latest AIMessage with tool_calls that this tool message belongs to\n const latestAIParentIndex = findLastIndex(\n messages,\n (msg) =>\n (msg instanceof AIMessageChunk &&\n (msg.tool_calls?.length ?? 0) > 0 &&\n msg.tool_calls?.some((tc) => tc.id === lastMessage.tool_call_id)) ??\n false\n );\n\n if (latestAIParentIndex === -1) return [];\n\n // Collect tool_call_ids from the AI message\n const aiMessage = messages[latestAIParentIndex] as AIMessageChunk;\n const toolCallIds = new Set(aiMessage.tool_calls?.map((tc) => tc.id) ?? []);\n\n // Only process tool search results after the AI message that belong to this turn\n const discoveredNames: string[] = [];\n for (let i = latestAIParentIndex + 1; i < messages.length; i++) {\n const msg = messages[i];\n if (!(msg instanceof ToolMessage)) continue;\n if (msg.name !== Constants.TOOL_SEARCH_REGEX) continue;\n if (!toolCallIds.has(msg.tool_call_id)) continue;\n\n // This is a tool search result from the current turn\n if (typeof msg.artifact === 'object' && msg.artifact != null) {\n const artifact = msg.artifact as ToolSearchArtifact;\n if (artifact.tool_references && artifact.tool_references.length > 0) {\n for (const ref of artifact.tool_references) {\n discoveredNames.push(ref.tool_name);\n }\n }\n }\n }\n\n return discoveredNames;\n}\n\n/**\n * Checks if the current turn has any tool search results.\n * Quick check to avoid full extraction when not needed.\n */\nexport function hasToolSearchInCurrentTurn(messages: BaseMessage[]): boolean {\n const lastMessage = messages[messages.length - 1];\n if (!(lastMessage instanceof ToolMessage)) return false;\n\n // Find the latest AIMessage with tool_calls\n const latestAIParentIndex = findLastIndex(\n messages,\n (msg) =>\n (msg instanceof AIMessageChunk &&\n (msg.tool_calls?.length ?? 0) > 0 &&\n msg.tool_calls?.some((tc) => tc.id === lastMessage.tool_call_id)) ??\n false\n );\n\n if (latestAIParentIndex === -1) return false;\n\n const aiMessage = messages[latestAIParentIndex] as AIMessageChunk;\n const toolCallIds = new Set(aiMessage.tool_calls?.map((tc) => tc.id) ?? []);\n\n // Check if any tool search results exist after the AI message\n for (let i = latestAIParentIndex + 1; i < messages.length; i++) {\n const msg = messages[i];\n if (\n msg instanceof ToolMessage &&\n msg.name === Constants.TOOL_SEARCH_REGEX &&\n toolCallIds.has(msg.tool_call_id)\n ) {\n return true;\n }\n }\n\n return false;\n}\n"],"names":["messages","ToolMessage","findLastIndex","AIMessageChunk","Constants"],"mappings":"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"}
@@ -65,14 +65,6 @@ Requirements:
65
65
  - Use asyncio.gather() for parallel execution of independent calls
66
66
  - Only print() output flows back to the context window
67
67
  - Tool results from programmatic calls do NOT consume context tokens`),
68
- tools: zod.z
69
- .array(zod.z.object({
70
- name: zod.z.string(),
71
- description: zod.z.string().optional(),
72
- parameters: zod.z.any(), // JsonSchemaType
73
- }))
74
- .optional()
75
- .describe('Optional array of tool definitions that can be called from the code. If not provided, uses programmatic tools configured in the agent context. Tool names must match tools available in the toolMap.'),
76
68
  session_id: zod.z
77
69
  .string()
78
70
  .optional()
@@ -89,6 +81,38 @@ Requirements:
89
81
  // ============================================================================
90
82
  // Helper Functions
91
83
  // ============================================================================
84
+ /**
85
+ * Extracts tool names that are actually called in the Python code.
86
+ * Matches patterns like `await tool_name(`, `tool_name(`, and asyncio.gather calls.
87
+ * @param code - The Python code to analyze
88
+ * @param availableToolNames - Set of available tool names to match against
89
+ * @returns Set of tool names found in the code
90
+ */
91
+ function extractUsedToolNames(code, availableToolNames) {
92
+ const usedTools = new Set();
93
+ for (const toolName of availableToolNames) {
94
+ const escapedName = toolName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
95
+ const pattern = new RegExp(`\\b${escapedName}\\s*\\(`, 'g');
96
+ if (pattern.test(code)) {
97
+ usedTools.add(toolName);
98
+ }
99
+ }
100
+ return usedTools;
101
+ }
102
+ /**
103
+ * Filters tool definitions to only include tools actually used in the code.
104
+ * @param toolDefs - All available tool definitions
105
+ * @param code - The Python code to analyze
106
+ * @returns Filtered array of tool definitions
107
+ */
108
+ function filterToolsByUsage(toolDefs, code) {
109
+ const availableToolNames = new Set(toolDefs.map((tool) => tool.name));
110
+ const usedToolNames = extractUsedToolNames(code, availableToolNames);
111
+ if (usedToolNames.size === 0) {
112
+ return toolDefs;
113
+ }
114
+ return toolDefs.filter((tool) => usedToolNames.has(tool.name));
115
+ }
92
116
  /**
93
117
  * Makes an HTTP request to the Code API.
94
118
  * @param endpoint - The API endpoint URL
@@ -232,47 +256,44 @@ function createProgrammaticToolCallingTool(initParams = {}) {
232
256
  const proxy = initParams.proxy ?? process.env.PROXY;
233
257
  const EXEC_ENDPOINT = `${baseUrl}/exec/programmatic`;
234
258
  const description = `
235
- Executes Python code with programmatic tool calling. Tools are automatically generated as async Python functions from the tool definitions - DO NOT define them in your code.
259
+ Run tools by writing Python code. Tools are available as async functions - just call them with await.
260
+
261
+ This is different from execute_code: here you can call your tools (like get_weather, get_expenses, etc.) directly in Python code.
236
262
 
237
263
  Usage:
238
- - Write Python code that calls tools using await: result = await get_data()
239
- - Tools are pre-defined as async functions - just call them
240
- - Use asyncio.gather() for parallel execution (single round-trip!)
241
- - Only print() output flows through the context window
242
- - Tool results from programmatic calls do NOT consume context tokens
264
+ - Tools are pre-defined as async functions - call them with await
265
+ - Use asyncio.gather() to run multiple tools in parallel
266
+ - Only print() output is returned - tool results stay in Python
243
267
 
244
- When to use:
245
- - Processing multiple records with tool calls (10+ items)
246
- - Loops, conditionals, or aggregation based on tool results
247
- - Any workflow requiring 3+ sequential tool calls
248
- - Parallel execution of independent tool calls
249
- - Filtering/summarizing large data before returning to context
268
+ Examples:
269
+ - Simple: result = await get_weather(city="NYC")
270
+ - Loop: for user in users: data = await get_expenses(user_id=user['id'])
271
+ - Parallel: sf, ny = await asyncio.gather(get_weather(city="SF"), get_weather(city="NY"))
250
272
 
251
- Patterns:
252
- - Simple: result = await get_data()
253
- - Loop: for item in items: data = await fetch(item)
254
- - Parallel: results = await asyncio.gather(t1(), t2(), t3())
255
- - Conditional: if x: await tool_a() else: await tool_b()
273
+ When to use this instead of calling tools directly:
274
+ - You need to call tools in a loop (process many items)
275
+ - You want parallel execution (asyncio.gather)
276
+ - You need conditionals based on tool results
277
+ - You want to aggregate/filter data before returning
256
278
  `.trim();
257
279
  return tools.tool(async (params, config) => {
258
- const { code, tools, session_id, timeout = DEFAULT_TIMEOUT } = params;
280
+ const { code, session_id, timeout = DEFAULT_TIMEOUT } = params;
259
281
  // Extra params injected by ToolNode (follows web_search pattern)
260
- const { toolMap, programmaticToolDefs } = config.toolCall ?? {};
282
+ const { toolMap, toolDefs } = (config.toolCall ?? {});
261
283
  if (toolMap == null || toolMap.size === 0) {
262
284
  throw new Error('No toolMap provided. ' +
263
285
  'ToolNode should inject this from AgentContext when invoked through the graph.');
264
286
  }
265
- // Use provided tools or fall back to programmaticToolDefs from ToolNode
266
- const effectiveTools = tools ?? programmaticToolDefs;
267
- if (effectiveTools == null || effectiveTools.length === 0) {
287
+ if (toolDefs == null || toolDefs.length === 0) {
268
288
  throw new Error('No tool definitions provided. ' +
269
- 'Either pass tools in the input or ensure ToolNode injects programmaticToolDefs.');
289
+ 'Either pass tools in the input or ensure ToolNode injects toolDefs.');
270
290
  }
271
291
  let roundTrip = 0;
272
292
  try {
273
293
  // ====================================================================
274
- // Phase 1: Initial request
294
+ // Phase 1: Filter tools and make initial request
275
295
  // ====================================================================
296
+ const effectiveTools = filterToolsByUsage(toolDefs, code);
276
297
  let response = await makeRequest(EXEC_ENDPOINT, apiKey, {
277
298
  code,
278
299
  tools: effectiveTools,
@@ -324,6 +345,8 @@ Patterns:
324
345
 
325
346
  exports.createProgrammaticToolCallingTool = createProgrammaticToolCallingTool;
326
347
  exports.executeTools = executeTools;
348
+ exports.extractUsedToolNames = extractUsedToolNames;
349
+ exports.filterToolsByUsage = filterToolsByUsage;
327
350
  exports.formatCompletedResponse = formatCompletedResponse;
328
351
  exports.makeRequest = makeRequest;
329
352
  //# sourceMappingURL=ProgrammaticToolCalling.cjs.map