@librechat/agents 3.2.21 → 3.2.32
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 +3 -2
- package/dist/cjs/agents/AgentContext.cjs.map +1 -1
- package/dist/cjs/events.cjs.map +1 -1
- package/dist/cjs/graphs/Graph.cjs +200 -54
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
- package/dist/cjs/hooks/createWorkspacePolicyHook.cjs +13 -7
- package/dist/cjs/hooks/createWorkspacePolicyHook.cjs.map +1 -1
- package/dist/cjs/hooks/executeHooks.cjs.map +1 -1
- package/dist/cjs/hooks/types.cjs.map +1 -1
- package/dist/cjs/instrumentation.cjs +2 -2
- package/dist/cjs/instrumentation.cjs.map +1 -1
- package/dist/cjs/langfuse.cjs +17 -1
- package/dist/cjs/langfuse.cjs.map +1 -1
- package/dist/cjs/langfuseToolOutputTracing.cjs +2 -2
- package/dist/cjs/langfuseToolOutputTracing.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/index.cjs +1 -1
- package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +38 -3
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +6 -2
- package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/index.cjs +2 -2
- package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/toolCache.cjs +8 -5
- package/dist/cjs/llm/bedrock/toolCache.cjs.map +1 -1
- package/dist/cjs/llm/fake.cjs +16 -14
- package/dist/cjs/llm/fake.cjs.map +1 -1
- package/dist/cjs/llm/google/index.cjs +22 -0
- package/dist/cjs/llm/google/index.cjs.map +1 -1
- package/dist/cjs/llm/google/utils/common.cjs +88 -27
- package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
- package/dist/cjs/llm/init.cjs +2 -2
- package/dist/cjs/llm/invoke.cjs +108 -11
- package/dist/cjs/llm/invoke.cjs.map +1 -1
- package/dist/cjs/llm/openai/index.cjs +1 -1
- package/dist/cjs/llm/openai/index.cjs.map +1 -1
- package/dist/cjs/llm/openai/utils/index.cjs +1 -1
- package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
- package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
- package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
- package/dist/cjs/main.cjs +1 -0
- package/dist/cjs/main.cjs.map +1 -1
- package/dist/cjs/messages/cache.cjs +29 -8
- package/dist/cjs/messages/cache.cjs.map +1 -1
- package/dist/cjs/messages/content.cjs.map +1 -1
- package/dist/cjs/messages/contextPruning.cjs.map +1 -1
- package/dist/cjs/messages/format.cjs +129 -17
- package/dist/cjs/messages/format.cjs.map +1 -1
- package/dist/cjs/messages/prune.cjs.map +1 -1
- package/dist/cjs/messages/reducer.cjs +1 -1
- package/dist/cjs/messages/reducer.cjs.map +1 -1
- package/dist/cjs/messages/tools.cjs +1 -1
- package/dist/cjs/messages/tools.cjs.map +1 -1
- package/dist/cjs/openai/index.cjs.map +1 -1
- package/dist/cjs/responses/index.cjs.map +1 -1
- package/dist/cjs/run.cjs +41 -20
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/session/AgentSession.cjs +4 -4
- package/dist/cjs/session/AgentSession.cjs.map +1 -1
- package/dist/cjs/session/JsonlSessionStore.cjs +2 -2
- package/dist/cjs/session/JsonlSessionStore.cjs.map +1 -1
- package/dist/cjs/session/handlers.cjs +2 -2
- package/dist/cjs/session/handlers.cjs.map +1 -1
- package/dist/cjs/stream.cjs +248 -25
- package/dist/cjs/stream.cjs.map +1 -1
- package/dist/cjs/summarization/node.cjs.map +1 -1
- package/dist/cjs/tools/BashProgrammaticToolCalling.cjs +1 -1
- package/dist/cjs/tools/BashProgrammaticToolCalling.cjs.map +1 -1
- package/dist/cjs/tools/Calculator.cjs +1 -1
- package/dist/cjs/tools/Calculator.cjs.map +1 -1
- package/dist/cjs/tools/CodeExecutor.cjs +1 -1
- package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
- package/dist/cjs/tools/SubagentTool.cjs.map +1 -1
- package/dist/cjs/tools/ToolNode.cjs +37 -18
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/ToolSearch.cjs +1 -1
- package/dist/cjs/tools/ToolSearch.cjs.map +1 -1
- package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs +7 -4
- package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs.map +1 -1
- package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs +4 -4
- package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs.map +1 -1
- package/dist/cjs/tools/handlers.cjs +2 -1
- package/dist/cjs/tools/handlers.cjs.map +1 -1
- package/dist/cjs/tools/local/CompileCheckTool.cjs.map +1 -1
- package/dist/cjs/tools/local/FileCheckpointer.cjs +2 -1
- package/dist/cjs/tools/local/FileCheckpointer.cjs.map +1 -1
- package/dist/cjs/tools/local/LocalCodingTools.cjs +45 -19
- package/dist/cjs/tools/local/LocalCodingTools.cjs.map +1 -1
- package/dist/cjs/tools/local/LocalExecutionEngine.cjs +3 -3
- package/dist/cjs/tools/local/LocalExecutionEngine.cjs.map +1 -1
- package/dist/cjs/tools/local/LocalExecutionTools.cjs +2 -2
- package/dist/cjs/tools/local/LocalExecutionTools.cjs.map +1 -1
- package/dist/cjs/tools/local/LocalProgrammaticToolCalling.cjs +4 -3
- package/dist/cjs/tools/local/LocalProgrammaticToolCalling.cjs.map +1 -1
- package/dist/cjs/tools/local/attachments.cjs +0 -5
- package/dist/cjs/tools/local/attachments.cjs.map +1 -1
- package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs +4 -4
- package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs.map +1 -1
- package/dist/cjs/tools/search/firecrawl.cjs +1 -1
- package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
- package/dist/cjs/tools/search/rerankers.cjs +7 -3
- package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
- package/dist/cjs/tools/search/tavily-search.cjs +1 -1
- package/dist/cjs/tools/search/tavily-search.cjs.map +1 -1
- package/dist/cjs/tools/search/utils.cjs +76 -8
- package/dist/cjs/tools/search/utils.cjs.map +1 -1
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs +1 -1
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
- package/dist/cjs/utils/handlers.cjs +1 -1
- package/dist/cjs/utils/handlers.cjs.map +1 -1
- package/dist/cjs/utils/run.cjs +1 -1
- package/dist/cjs/utils/run.cjs.map +1 -1
- package/dist/esm/agents/AgentContext.mjs +3 -2
- package/dist/esm/agents/AgentContext.mjs.map +1 -1
- package/dist/esm/events.mjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +200 -54
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
- package/dist/esm/hooks/createWorkspacePolicyHook.mjs +13 -7
- package/dist/esm/hooks/createWorkspacePolicyHook.mjs.map +1 -1
- package/dist/esm/hooks/executeHooks.mjs.map +1 -1
- package/dist/esm/hooks/types.mjs.map +1 -1
- package/dist/esm/instrumentation.mjs +2 -2
- package/dist/esm/instrumentation.mjs.map +1 -1
- package/dist/esm/langfuse.mjs +17 -2
- package/dist/esm/langfuse.mjs.map +1 -1
- package/dist/esm/langfuseToolOutputTracing.mjs +2 -2
- package/dist/esm/langfuseToolOutputTracing.mjs.map +1 -1
- package/dist/esm/llm/anthropic/index.mjs +1 -1
- package/dist/esm/llm/anthropic/index.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs +38 -3
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_outputs.mjs +6 -2
- package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -1
- package/dist/esm/llm/bedrock/index.mjs +2 -2
- package/dist/esm/llm/bedrock/index.mjs.map +1 -1
- package/dist/esm/llm/bedrock/toolCache.mjs +8 -5
- package/dist/esm/llm/bedrock/toolCache.mjs.map +1 -1
- package/dist/esm/llm/fake.mjs +16 -14
- package/dist/esm/llm/fake.mjs.map +1 -1
- package/dist/esm/llm/google/index.mjs +23 -1
- package/dist/esm/llm/google/index.mjs.map +1 -1
- package/dist/esm/llm/google/utils/common.mjs +88 -27
- package/dist/esm/llm/google/utils/common.mjs.map +1 -1
- package/dist/esm/llm/init.mjs +2 -2
- package/dist/esm/llm/invoke.mjs +104 -7
- package/dist/esm/llm/invoke.mjs.map +1 -1
- package/dist/esm/llm/openai/index.mjs +1 -1
- package/dist/esm/llm/openai/index.mjs.map +1 -1
- package/dist/esm/llm/openai/utils/index.mjs +1 -1
- package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
- package/dist/esm/llm/openrouter/index.mjs.map +1 -1
- package/dist/esm/llm/vertexai/index.mjs.map +1 -1
- package/dist/esm/main.mjs +1 -1
- package/dist/esm/messages/cache.mjs +29 -8
- package/dist/esm/messages/cache.mjs.map +1 -1
- package/dist/esm/messages/content.mjs.map +1 -1
- package/dist/esm/messages/contextPruning.mjs.map +1 -1
- package/dist/esm/messages/format.mjs +129 -18
- package/dist/esm/messages/format.mjs.map +1 -1
- package/dist/esm/messages/prune.mjs.map +1 -1
- package/dist/esm/messages/reducer.mjs +1 -1
- package/dist/esm/messages/reducer.mjs.map +1 -1
- package/dist/esm/messages/tools.mjs +1 -1
- package/dist/esm/messages/tools.mjs.map +1 -1
- package/dist/esm/openai/index.mjs.map +1 -1
- package/dist/esm/responses/index.mjs.map +1 -1
- package/dist/esm/run.mjs +41 -20
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/session/AgentSession.mjs +4 -4
- package/dist/esm/session/AgentSession.mjs.map +1 -1
- package/dist/esm/session/JsonlSessionStore.mjs +2 -2
- package/dist/esm/session/JsonlSessionStore.mjs.map +1 -1
- package/dist/esm/session/handlers.mjs +2 -2
- package/dist/esm/session/handlers.mjs.map +1 -1
- package/dist/esm/stream.mjs +248 -25
- package/dist/esm/stream.mjs.map +1 -1
- package/dist/esm/summarization/node.mjs.map +1 -1
- package/dist/esm/tools/BashProgrammaticToolCalling.mjs +1 -1
- package/dist/esm/tools/BashProgrammaticToolCalling.mjs.map +1 -1
- package/dist/esm/tools/Calculator.mjs +1 -1
- package/dist/esm/tools/Calculator.mjs.map +1 -1
- package/dist/esm/tools/CodeExecutor.mjs +1 -1
- package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
- package/dist/esm/tools/SubagentTool.mjs.map +1 -1
- package/dist/esm/tools/ToolNode.mjs +37 -18
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/ToolSearch.mjs +1 -1
- package/dist/esm/tools/ToolSearch.mjs.map +1 -1
- package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs +7 -4
- package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs.map +1 -1
- package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs +4 -4
- package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs.map +1 -1
- package/dist/esm/tools/handlers.mjs +2 -1
- package/dist/esm/tools/handlers.mjs.map +1 -1
- package/dist/esm/tools/local/CompileCheckTool.mjs.map +1 -1
- package/dist/esm/tools/local/FileCheckpointer.mjs +2 -1
- package/dist/esm/tools/local/FileCheckpointer.mjs.map +1 -1
- package/dist/esm/tools/local/LocalCodingTools.mjs +45 -19
- package/dist/esm/tools/local/LocalCodingTools.mjs.map +1 -1
- package/dist/esm/tools/local/LocalExecutionEngine.mjs +3 -3
- package/dist/esm/tools/local/LocalExecutionEngine.mjs.map +1 -1
- package/dist/esm/tools/local/LocalExecutionTools.mjs +2 -2
- package/dist/esm/tools/local/LocalExecutionTools.mjs.map +1 -1
- package/dist/esm/tools/local/LocalProgrammaticToolCalling.mjs +4 -3
- package/dist/esm/tools/local/LocalProgrammaticToolCalling.mjs.map +1 -1
- package/dist/esm/tools/local/attachments.mjs +0 -5
- package/dist/esm/tools/local/attachments.mjs.map +1 -1
- package/dist/esm/tools/local/resolveLocalExecutionTools.mjs +4 -4
- package/dist/esm/tools/local/resolveLocalExecutionTools.mjs.map +1 -1
- package/dist/esm/tools/search/firecrawl.mjs +1 -1
- package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
- package/dist/esm/tools/search/rerankers.mjs +8 -4
- package/dist/esm/tools/search/rerankers.mjs.map +1 -1
- package/dist/esm/tools/search/tavily-search.mjs +1 -1
- package/dist/esm/tools/search/tavily-search.mjs.map +1 -1
- package/dist/esm/tools/search/utils.mjs +76 -9
- package/dist/esm/tools/search/utils.mjs.map +1 -1
- package/dist/esm/tools/subagent/SubagentExecutor.mjs +1 -1
- package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
- package/dist/esm/utils/handlers.mjs +1 -1
- package/dist/esm/utils/handlers.mjs.map +1 -1
- package/dist/esm/utils/run.mjs +1 -1
- package/dist/esm/utils/run.mjs.map +1 -1
- package/dist/types/agents/__tests__/promptCacheLiveHelpers.d.ts +1 -1
- package/dist/types/events.d.ts +1 -1
- package/dist/types/graphs/Graph.d.ts +7 -1
- package/dist/types/hooks/executeHooks.d.ts +1 -1
- package/dist/types/hooks/types.d.ts +5 -0
- package/dist/types/langfuse.d.ts +4 -0
- package/dist/types/llm/anthropic/utils/message_inputs.d.ts +1 -1
- package/dist/types/llm/anthropic/utils/message_outputs.d.ts +1 -1
- package/dist/types/llm/anthropic/utils/output_parsers.d.ts +2 -2
- package/dist/types/llm/bedrock/index.d.ts +2 -2
- package/dist/types/llm/fake.d.ts +3 -3
- package/dist/types/llm/google/index.d.ts +1 -0
- package/dist/types/llm/google/types.d.ts +1 -1
- package/dist/types/llm/google/utils/common.d.ts +2 -2
- package/dist/types/llm/google/utils/tools.d.ts +1 -1
- package/dist/types/llm/google/utils/zod_to_genai_parameters.d.ts +1 -1
- package/dist/types/llm/openai/index.d.ts +2 -2
- package/dist/types/llm/openai/utils/index.d.ts +1 -1
- package/dist/types/llm/openrouter/index.d.ts +4 -4
- package/dist/types/messages/contextPruning.d.ts +1 -1
- package/dist/types/messages/format.d.ts +14 -4
- package/dist/types/messages/prune.d.ts +1 -1
- package/dist/types/session/JsonlSessionStore.d.ts +1 -1
- package/dist/types/session/handlers.d.ts +1 -1
- package/dist/types/session/types.d.ts +1 -1
- package/dist/types/summarization/node.d.ts +1 -1
- package/dist/types/tools/SubagentTool.d.ts +2 -2
- package/dist/types/tools/ToolNode.d.ts +9 -2
- package/dist/types/tools/cloudflare/CloudflareSandboxExecutionEngine.d.ts +1 -1
- package/dist/types/tools/search/types.d.ts +1 -1
- package/dist/types/tools/search/utils.d.ts +11 -0
- package/dist/types/types/graph.d.ts +4 -4
- package/dist/types/types/llm.d.ts +4 -3
- package/dist/types/types/messages.d.ts +1 -1
- package/dist/types/types/run.d.ts +6 -6
- package/dist/types/types/stream.d.ts +2 -2
- package/dist/types/types/tools.d.ts +5 -1
- package/dist/types/utils/handlers.d.ts +2 -2
- package/dist/types/utils/run.d.ts +1 -1
- package/package.json +13 -10
- package/src/__tests__/stream.eagerEventExecution.test.ts +543 -6
- package/src/agents/AgentContext.ts +2 -2
- package/src/agents/__tests__/AgentContext.test.ts +3 -3
- package/src/agents/__tests__/promptCacheLiveHelpers.ts +1 -1
- package/src/events.ts +1 -1
- package/src/graphs/Graph.ts +329 -72
- package/src/graphs/MultiAgentGraph.ts +1 -1
- package/src/graphs/__tests__/Graph.reasoning.test.ts +919 -6
- package/src/graphs/__tests__/MultiAgentGraph.test.ts +1 -1
- package/src/graphs/__tests__/composition.smoke.test.ts +1 -1
- package/src/hooks/__tests__/HookRegistry.test.ts +1 -1
- package/src/hooks/__tests__/compactHooks.test.ts +8 -8
- package/src/hooks/__tests__/createWorkspacePolicyHook.test.ts +34 -22
- package/src/hooks/__tests__/executeHooks.test.ts +3 -3
- package/src/hooks/__tests__/integration.test.ts +3 -3
- package/src/hooks/__tests__/toolHooks.test.ts +10 -10
- package/src/hooks/createWorkspacePolicyHook.ts +17 -14
- package/src/hooks/executeHooks.ts +1 -1
- package/src/hooks/types.ts +5 -0
- package/src/instrumentation.ts +11 -11
- package/src/langfuse.ts +35 -1
- package/src/langfuseToolOutputTracing.ts +2 -2
- package/src/llm/anthropic/index.ts +1 -1
- package/src/llm/anthropic/llm.spec.ts +36 -0
- package/src/llm/anthropic/utils/message_inputs.ts +46 -4
- package/src/llm/anthropic/utils/message_outputs.ts +9 -7
- package/src/llm/anthropic/utils/output_parsers.ts +5 -5
- package/src/llm/anthropic/utils/streaming-tool-input.test.ts +186 -0
- package/src/llm/bedrock/index.ts +4 -4
- package/src/llm/bedrock/toolCache.test.ts +48 -9
- package/src/llm/bedrock/toolCache.ts +11 -6
- package/src/llm/fake.ts +30 -25
- package/src/llm/google/index.ts +43 -1
- package/src/llm/google/llm.spec.ts +173 -1
- package/src/llm/google/types.ts +1 -1
- package/src/llm/google/utils/common.ts +154 -45
- package/src/llm/google/utils/tools.ts +8 -8
- package/src/llm/google/utils/zod_to_genai_parameters.ts +4 -4
- package/src/llm/invoke.test.ts +3 -3
- package/src/llm/invoke.ts +170 -10
- package/src/llm/openai/index.ts +4 -4
- package/src/llm/openai/utils/index.ts +14 -14
- package/src/llm/openrouter/index.ts +4 -4
- package/src/llm/openrouter/reasoning.test.ts +2 -2
- package/src/llm/vertexai/fixThoughtSignatures.test.ts +1 -1
- package/src/llm/vertexai/index.ts +1 -1
- package/src/messages/cache.test.ts +144 -0
- package/src/messages/cache.ts +50 -13
- package/src/messages/content.ts +1 -1
- package/src/messages/contextPruning.ts +1 -1
- package/src/messages/format.ts +236 -43
- package/src/messages/formatAgentMessages.skills.test.ts +205 -26
- package/src/messages/formatAgentMessages.test.ts +841 -10
- package/src/messages/labelContentByAgent.test.ts +2 -2
- package/src/messages/prune.ts +1 -1
- package/src/messages/reducer.ts +1 -1
- package/src/messages/tools.ts +1 -1
- package/src/openai/__tests__/openai.test.ts +2 -2
- package/src/openai/index.ts +1 -1
- package/src/responses/__tests__/responses.test.ts +2 -2
- package/src/responses/index.ts +1 -1
- package/src/run.ts +68 -41
- package/src/session/AgentSession.ts +6 -6
- package/src/session/JsonlSessionStore.ts +3 -3
- package/src/session/__tests__/JsonlSessionStore.test.ts +5 -5
- package/src/session/__tests__/handlers.test.ts +2 -2
- package/src/session/handlers.ts +5 -5
- package/src/session/types.ts +1 -1
- package/src/specs/agent-handoffs.test.ts +1 -1
- package/src/specs/langfuse-callbacks.test.ts +2 -2
- package/src/specs/langfuse-metadata.test.ts +39 -0
- package/src/specs/langfuse-tool-output-tracing.test.ts +1 -1
- package/src/specs/multi-agent-summarization.test.ts +4 -4
- package/src/specs/subagent.test.ts +3 -3
- package/src/specs/summarization-unit.test.ts +1 -1
- package/src/specs/thinking-handoff.test.ts +1 -1
- package/src/splitStream.test.ts +48 -0
- package/src/stream.test.ts +53 -3
- package/src/stream.ts +450 -39
- package/src/summarization/__tests__/aggregator.test.ts +2 -2
- package/src/summarization/__tests__/node.test.ts +2 -2
- package/src/summarization/node.ts +1 -1
- package/src/tools/BashProgrammaticToolCalling.ts +5 -5
- package/src/tools/Calculator.ts +1 -1
- package/src/tools/CodeExecutor.ts +2 -4
- package/src/tools/SubagentTool.ts +2 -2
- package/src/tools/ToolNode.ts +37 -16
- package/src/tools/ToolSearch.ts +1 -1
- package/src/tools/__tests__/CloudflareSandboxExecution.test.ts +4 -4
- package/src/tools/__tests__/CodeApiAuthHeaders.test.ts +12 -12
- package/src/tools/__tests__/LocalExecutionTools.test.ts +125 -93
- package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +29 -5
- package/src/tools/__tests__/ReadFile.test.ts +1 -1
- package/src/tools/__tests__/SkillTool.test.ts +4 -4
- package/src/tools/__tests__/SubagentExecutor.test.ts +17 -13
- package/src/tools/__tests__/SubagentTool.test.ts +2 -2
- package/src/tools/__tests__/ToolNode.eagerEventExecution.test.ts +1 -1
- package/src/tools/__tests__/ToolNode.outputReferences.test.ts +2 -5
- package/src/tools/__tests__/ToolNode.session.test.ts +1 -1
- package/src/tools/__tests__/ToolSearch.test.ts +1 -1
- package/src/tools/__tests__/annotateMessagesForLLM.test.ts +1 -1
- package/src/tools/__tests__/directToolHITLResumeScope.test.ts +35 -32
- package/src/tools/__tests__/directToolHooks.test.ts +41 -0
- package/src/tools/__tests__/handlers.test.ts +2 -2
- package/src/tools/__tests__/hitl.test.ts +11 -11
- package/src/tools/__tests__/localToolNames.test.ts +8 -6
- package/src/tools/__tests__/skillCatalog.test.ts +1 -1
- package/src/tools/__tests__/subagentHooks.test.ts +20 -10
- package/src/tools/__tests__/workspaceSeam.test.ts +20 -7
- package/src/tools/cloudflare/CloudflareSandboxExecutionEngine.ts +9 -6
- package/src/tools/cloudflare/CloudflareSandboxTools.ts +19 -19
- package/src/tools/handlers.ts +5 -5
- package/src/tools/local/CompileCheckTool.ts +4 -7
- package/src/tools/local/FileCheckpointer.ts +6 -5
- package/src/tools/local/LocalCodingTools.ts +100 -45
- package/src/tools/local/LocalExecutionEngine.ts +5 -5
- package/src/tools/local/LocalExecutionTools.ts +9 -9
- package/src/tools/local/LocalProgrammaticToolCalling.ts +5 -4
- package/src/tools/local/attachments.ts +0 -6
- package/src/tools/local/resolveLocalExecutionTools.ts +15 -15
- package/src/tools/search/firecrawl.ts +1 -1
- package/src/tools/search/jina-reranker.test.ts +148 -37
- package/src/tools/search/rerankers.ts +14 -4
- package/src/tools/search/tavily-search.ts +2 -2
- package/src/tools/search/types.ts +1 -1
- package/src/tools/search/utils.ts +99 -9
- package/src/tools/subagent/SubagentExecutor.ts +12 -6
- package/src/types/graph.ts +12 -12
- package/src/types/llm.ts +7 -6
- package/src/types/messages.ts +1 -1
- package/src/types/run.ts +7 -7
- package/src/types/stream.ts +2 -2
- package/src/types/tools.ts +5 -1
- package/src/utils/handlers.ts +2 -2
- package/src/utils/llmConfig.ts +1 -1
- package/src/utils/logging.ts +20 -10
- package/src/utils/run.ts +2 -2
|
@@ -11,51 +11,50 @@ import { partitionAndMarkAnthropicToolCache, makeIsDeferred } from '../messages/
|
|
|
11
11
|
import { formatContentStrings } from '../messages/content.mjs';
|
|
12
12
|
import { extractToolDiscoveries } from '../messages/tools.mjs';
|
|
13
13
|
import { messagesStateReducer } from '../messages/reducer.mjs';
|
|
14
|
-
import {
|
|
14
|
+
import { shouldTraceToolNodeForLangfuse, resolveLangfuseConfig, withLangfuseToolOutputTracingConfig } from '../langfuseToolOutputTracing.mjs';
|
|
15
|
+
import { createLangfuseTraceMetadata, createLangfuseHandler, disposeLangfuseHandler, isLangfuseCallbackHandler } from '../langfuse.mjs';
|
|
15
16
|
import { resetIfNotEmpty, joinKeys } from '../utils/graph.mjs';
|
|
16
17
|
import { isAnthropicLike, isOpenAILike, isGoogleLike } from '../utils/llm.mjs';
|
|
17
18
|
import '../stream.mjs';
|
|
19
|
+
import { GraphNodeKeys, ContentTypes, Providers, GraphEvents, StepTypes } from '../common/enum.mjs';
|
|
18
20
|
import { sleep } from '../utils/run.mjs';
|
|
19
21
|
import 'ai-tokenizer';
|
|
20
22
|
import 'zod-to-json-schema';
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
+
import { findCallback, appendCallbacks } from '../utils/callbacks.mjs';
|
|
24
|
+
import { partitionAndMarkOpenRouterToolCache } from '../llm/openrouter/toolCache.mjs';
|
|
23
25
|
import { ToolNode, toolsCondition } from '../tools/ToolNode.mjs';
|
|
26
|
+
import { createLocalCodingToolBundle } from '../tools/local/LocalCodingTools.mjs';
|
|
27
|
+
import { resolveSubagentConfigs, SubagentExecutor } from '../tools/subagent/SubagentExecutor.mjs';
|
|
24
28
|
import { ToolOutputReferenceRegistry } from '../tools/toolOutputReferences.mjs';
|
|
29
|
+
import { partitionAndMarkBedrockToolCache } from '../llm/bedrock/toolCache.mjs';
|
|
25
30
|
import { emitAgentLog, safeDispatchCustomEvent } from '../utils/events.mjs';
|
|
31
|
+
import 'path';
|
|
32
|
+
import '../tools/cloudflare/CloudflareProgrammaticToolCalling.mjs';
|
|
33
|
+
import 'stream';
|
|
34
|
+
import 'events';
|
|
35
|
+
import '../tools/local/LocalExecutionEngine.mjs';
|
|
36
|
+
import { createCloudflareCodingToolBundle } from '../tools/cloudflare/CloudflareSandboxTools.mjs';
|
|
26
37
|
import { attemptInvoke, tryFallbackProviders } from '../llm/invoke.mjs';
|
|
38
|
+
import { buildSubagentToolParams } from '../tools/SubagentTool.mjs';
|
|
39
|
+
import { initializeLangfuseTracing } from '../instrumentation.mjs';
|
|
27
40
|
import { shouldTriggerSummarization } from '../summarization/index.mjs';
|
|
28
|
-
import { createSummarizeNode } from '../summarization/node.mjs';
|
|
29
|
-
import { findCallback, appendCallbacks } from '../utils/callbacks.mjs';
|
|
30
|
-
import { createSchemaOnlyTools } from '../tools/schema.mjs';
|
|
31
|
-
import { AgentContext } from '../agents/AgentContext.mjs';
|
|
32
|
-
import { createFakeStreamingLLM } from '../llm/fake.mjs';
|
|
33
|
-
import { handleToolCalls } from '../tools/handlers.mjs';
|
|
34
41
|
import '../tools/local/CompileCheckTool.mjs';
|
|
35
|
-
import 'path';
|
|
36
42
|
import 'fs/promises';
|
|
37
|
-
import { createLocalCodingToolBundle } from '../tools/local/LocalCodingTools.mjs';
|
|
38
|
-
import '../tools/local/LocalExecutionEngine.mjs';
|
|
39
|
-
import '../tools/CodeExecutor.mjs';
|
|
40
43
|
import '../tools/BashExecutor.mjs';
|
|
41
|
-
import '
|
|
44
|
+
import '../tools/CodeExecutor.mjs';
|
|
42
45
|
import 'http';
|
|
43
|
-
import '
|
|
46
|
+
import 'crypto';
|
|
44
47
|
import '../tools/ProgrammaticToolCalling.mjs';
|
|
45
48
|
import '../tools/BashProgrammaticToolCalling.mjs';
|
|
49
|
+
import '../hooks/createWorkspacePolicyHook.mjs';
|
|
46
50
|
import { resolveLocalToolsForBinding } from '../tools/local/resolveLocalExecutionTools.mjs';
|
|
47
|
-
import '../
|
|
48
|
-
import '../tools/
|
|
49
|
-
import '
|
|
50
|
-
import '
|
|
51
|
-
import {
|
|
51
|
+
import { createSummarizeNode } from '../summarization/node.mjs';
|
|
52
|
+
import { createSchemaOnlyTools } from '../tools/schema.mjs';
|
|
53
|
+
import { AgentContext } from '../agents/AgentContext.mjs';
|
|
54
|
+
import { createFakeStreamingLLM } from '../llm/fake.mjs';
|
|
55
|
+
import { handleToolCalls } from '../tools/handlers.mjs';
|
|
52
56
|
import { isThinkingEnabled } from '../llm/request.mjs';
|
|
53
57
|
import { initializeModel } from '../llm/init.mjs';
|
|
54
|
-
import { createLangfuseTraceMetadata, createLangfuseHandler, disposeLangfuseHandler, isLangfuseCallbackHandler } from '../langfuse.mjs';
|
|
55
|
-
import { initializeLangfuseTracing } from '../instrumentation.mjs';
|
|
56
|
-
import { shouldTraceToolNodeForLangfuse, resolveLangfuseConfig, withLangfuseToolOutputTracingConfig } from '../langfuseToolOutputTracing.mjs';
|
|
57
|
-
import { partitionAndMarkOpenRouterToolCache } from '../llm/openrouter/toolCache.mjs';
|
|
58
|
-
import { partitionAndMarkBedrockToolCache } from '../llm/bedrock/toolCache.mjs';
|
|
59
58
|
|
|
60
59
|
/* eslint-disable no-console */
|
|
61
60
|
const { AGENT, TOOLS, SUMMARIZE } = GraphNodeKeys;
|
|
@@ -104,7 +103,23 @@ function getResponseReasoningContent({ responseMessage, reasoningKey, }) {
|
|
|
104
103
|
}
|
|
105
104
|
return getReasoningDetailsText(additionalKwargs.reasoning_details);
|
|
106
105
|
}
|
|
107
|
-
function
|
|
106
|
+
function isTextMessageContentPart(contentPart) {
|
|
107
|
+
return (typeof contentPart === 'object' &&
|
|
108
|
+
'type' in contentPart &&
|
|
109
|
+
typeof contentPart.type === 'string' &&
|
|
110
|
+
contentPart.type.startsWith('text'));
|
|
111
|
+
}
|
|
112
|
+
function isGoogleServerSideToolMessageContentPart(contentPart) {
|
|
113
|
+
return (typeof contentPart === 'object' &&
|
|
114
|
+
'type' in contentPart &&
|
|
115
|
+
(contentPart.type === 'toolCall' || contentPart.type === 'toolResponse'));
|
|
116
|
+
}
|
|
117
|
+
function hasGoogleServerSideToolDeltaContent(provider, content) {
|
|
118
|
+
return (isGoogleLike(provider) &&
|
|
119
|
+
Array.isArray(content) &&
|
|
120
|
+
content.some((contentPart) => isGoogleServerSideToolMessageContentPart(contentPart)));
|
|
121
|
+
}
|
|
122
|
+
function getMessageDeltaContent(provider, content) {
|
|
108
123
|
if (content == null) {
|
|
109
124
|
return undefined;
|
|
110
125
|
}
|
|
@@ -116,24 +131,91 @@ function getTextMessageDeltaContent(content) {
|
|
|
116
131
|
if (content.length === 0) {
|
|
117
132
|
return undefined;
|
|
118
133
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
134
|
+
const hasGoogleServerSideToolPart = isGoogleLike(provider) &&
|
|
135
|
+
content.some((contentPart) => isGoogleServerSideToolMessageContentPart(contentPart));
|
|
136
|
+
if (content.every((contentPart) => isTextMessageContentPart(contentPart))) {
|
|
137
|
+
return content;
|
|
138
|
+
}
|
|
139
|
+
if (!hasGoogleServerSideToolPart) {
|
|
123
140
|
return undefined;
|
|
124
141
|
}
|
|
125
|
-
|
|
142
|
+
const messageContent = content.filter((contentPart) => isTextMessageContentPart(contentPart) ||
|
|
143
|
+
isGoogleServerSideToolMessageContentPart(contentPart));
|
|
144
|
+
return messageContent.length > 0
|
|
145
|
+
? messageContent
|
|
146
|
+
: undefined;
|
|
126
147
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
if (!messageId) {
|
|
148
|
+
function hasTextDeltaContent(content) {
|
|
149
|
+
if (content == null) {
|
|
130
150
|
return false;
|
|
131
151
|
}
|
|
152
|
+
return content.some((contentPart) => {
|
|
153
|
+
if (contentPart.type?.startsWith(ContentTypes.TEXT) !== true) {
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
const text = contentPart.text;
|
|
157
|
+
return typeof text === 'string' && text !== '';
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
function hasReasoningDeltaContent(content) {
|
|
161
|
+
if (content == null) {
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
return content.some((contentPart) => contentPart.type === ContentTypes.THINK && contentPart.think !== '');
|
|
165
|
+
}
|
|
166
|
+
function getCurrentStepIds({ graph, metadata, }) {
|
|
167
|
+
const baseStepKey = graph.getStepBaseKey(metadata);
|
|
168
|
+
const currentStepIds = [];
|
|
169
|
+
for (const [stepKey, stepIds] of graph.stepKeyIds) {
|
|
170
|
+
if (stepKey !== baseStepKey && !stepKey.startsWith(`${baseStepKey}_`)) {
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
currentStepIds.push(...stepIds);
|
|
174
|
+
}
|
|
175
|
+
return currentStepIds;
|
|
176
|
+
}
|
|
177
|
+
function hasCurrentTextDeltaStep({ graph, metadata, }) {
|
|
178
|
+
return getCurrentStepIds({ graph, metadata }).some((stepId) => graph.messageStepHasTextDeltas.has(stepId));
|
|
179
|
+
}
|
|
180
|
+
function hasCurrentReasoningDeltaStep({ graph, metadata, }) {
|
|
181
|
+
return getCurrentStepIds({ graph, metadata }).some((stepId) => graph.reasoningStepHasDeltas.has(stepId));
|
|
182
|
+
}
|
|
183
|
+
function clearCurrentDeltaStepMarkers({ graph, metadata, }) {
|
|
184
|
+
for (const stepId of getCurrentStepIds({ graph, metadata })) {
|
|
185
|
+
graph.messageStepHasTextDeltas.delete(stepId);
|
|
186
|
+
graph.reasoningStepHasDeltas.delete(stepId);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
async function dispatchMessageCreationStep({ graph, stepKey, messageId, metadata, }) {
|
|
132
190
|
await graph.dispatchRunStep(stepKey, {
|
|
133
191
|
type: StepTypes.MESSAGE_CREATION,
|
|
134
192
|
message_creation: { message_id: messageId },
|
|
135
193
|
}, metadata);
|
|
136
|
-
|
|
194
|
+
return graph.getStepIdByKey(stepKey);
|
|
195
|
+
}
|
|
196
|
+
async function dispatchTextMessageContent({ graph, stepKey, provider, content, metadata, }) {
|
|
197
|
+
const messageId = getMessageId(stepKey, graph) ?? '';
|
|
198
|
+
if (!messageId) {
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
if (hasGoogleServerSideToolDeltaContent(provider, content)) {
|
|
202
|
+
for (const contentPart of content) {
|
|
203
|
+
const stepId = await dispatchMessageCreationStep({
|
|
204
|
+
graph,
|
|
205
|
+
stepKey,
|
|
206
|
+
messageId,
|
|
207
|
+
metadata,
|
|
208
|
+
});
|
|
209
|
+
await graph.dispatchMessageDelta(stepId, { content: [contentPart] }, metadata);
|
|
210
|
+
}
|
|
211
|
+
return true;
|
|
212
|
+
}
|
|
213
|
+
const stepId = await dispatchMessageCreationStep({
|
|
214
|
+
graph,
|
|
215
|
+
stepKey,
|
|
216
|
+
messageId,
|
|
217
|
+
metadata,
|
|
218
|
+
});
|
|
137
219
|
await graph.dispatchMessageDelta(stepId, { content }, metadata);
|
|
138
220
|
return true;
|
|
139
221
|
}
|
|
@@ -170,7 +252,18 @@ function markPostReasoningContent(agentContext) {
|
|
|
170
252
|
agentContext.tokenTypeSwitch = 'content';
|
|
171
253
|
agentContext.reasoningTransitionCount++;
|
|
172
254
|
}
|
|
255
|
+
function getDispatchableFinalReasoningContent({ agentContext, responseReasoningContent, hasStreamedTextDeltaStep, hasStreamedReasoningDeltaStep, }) {
|
|
256
|
+
if (responseReasoningContent == null || hasStreamedReasoningDeltaStep) {
|
|
257
|
+
return undefined;
|
|
258
|
+
}
|
|
259
|
+
if (agentContext.provider === Providers.OPENROUTER &&
|
|
260
|
+
hasStreamedTextDeltaStep) {
|
|
261
|
+
return undefined;
|
|
262
|
+
}
|
|
263
|
+
return responseReasoningContent;
|
|
264
|
+
}
|
|
173
265
|
class Graph {
|
|
266
|
+
messageStepHasTextDeltas = new Set();
|
|
174
267
|
messageStepHasToolCalls = new Map();
|
|
175
268
|
messageIdsByStepKey = new Map();
|
|
176
269
|
prelimMessageIdsByStepKey = new Map();
|
|
@@ -185,6 +278,7 @@ class Graph {
|
|
|
185
278
|
* the same step are scoped to the active custom event dispatch.
|
|
186
279
|
*/
|
|
187
280
|
handlerDispatchedStepIds = new Set();
|
|
281
|
+
reasoningStepHasDeltas = new Set();
|
|
188
282
|
handlerDispatchedEventCounts = new Map();
|
|
189
283
|
signal;
|
|
190
284
|
/** Set of invoked tool call IDs from non-message run steps completed mid-run, if any */
|
|
@@ -257,6 +351,8 @@ class Graph {
|
|
|
257
351
|
this.stepKeyIds = new Map();
|
|
258
352
|
this.toolCallStepIds.clear();
|
|
259
353
|
this.messageIdsByStepKey = new Map();
|
|
354
|
+
this.messageStepHasTextDeltas = new Set();
|
|
355
|
+
this.reasoningStepHasDeltas = new Set();
|
|
260
356
|
this.messageStepHasToolCalls = new Map();
|
|
261
357
|
this.prelimMessageIdsByStepKey = new Map();
|
|
262
358
|
this.invokedToolIds = undefined;
|
|
@@ -477,6 +573,8 @@ class StandardGraph extends Graph {
|
|
|
477
573
|
this.handlerDispatchedEventCounts = resetIfNotEmpty(this.handlerDispatchedEventCounts, new Map());
|
|
478
574
|
this.messageIdsByStepKey = resetIfNotEmpty(this.messageIdsByStepKey, new Map());
|
|
479
575
|
this.messageStepHasToolCalls = resetIfNotEmpty(this.messageStepHasToolCalls, new Map());
|
|
576
|
+
this.messageStepHasTextDeltas = resetIfNotEmpty(this.messageStepHasTextDeltas, new Set());
|
|
577
|
+
this.reasoningStepHasDeltas = resetIfNotEmpty(this.reasoningStepHasDeltas, new Set());
|
|
480
578
|
this.prelimMessageIdsByStepKey = resetIfNotEmpty(this.prelimMessageIdsByStepKey, new Map());
|
|
481
579
|
this.invokedToolIds = resetIfNotEmpty(this.invokedToolIds, undefined);
|
|
482
580
|
for (const context of this.agentContexts.values()) {
|
|
@@ -524,6 +622,15 @@ class StandardGraph extends Graph {
|
|
|
524
622
|
}
|
|
525
623
|
return agentContext;
|
|
526
624
|
}
|
|
625
|
+
getStepBaseKey(metadata) {
|
|
626
|
+
if (!metadata)
|
|
627
|
+
return '';
|
|
628
|
+
const keyList = this.getInvocationKeyList(metadata);
|
|
629
|
+
if (this.checkKeyList(keyList)) {
|
|
630
|
+
throw new Error('Missing metadata');
|
|
631
|
+
}
|
|
632
|
+
return joinKeys(keyList);
|
|
633
|
+
}
|
|
527
634
|
getStepKey(metadata) {
|
|
528
635
|
if (!metadata)
|
|
529
636
|
return '';
|
|
@@ -562,6 +669,25 @@ class StandardGraph extends Graph {
|
|
|
562
669
|
getKeyList(metadata) {
|
|
563
670
|
if (!metadata)
|
|
564
671
|
return [];
|
|
672
|
+
const keyList = this.getInvocationKeyList(metadata);
|
|
673
|
+
const agentContext = this.getAgentContext(metadata);
|
|
674
|
+
if (agentContext.currentTokenType === ContentTypes.THINK ||
|
|
675
|
+
agentContext.currentTokenType === 'think_and_text') {
|
|
676
|
+
keyList.push('reasoning');
|
|
677
|
+
}
|
|
678
|
+
else if (agentContext.tokenTypeSwitch === 'content') {
|
|
679
|
+
keyList.push(`post-reasoning-${agentContext.reasoningTransitionCount}`);
|
|
680
|
+
}
|
|
681
|
+
return keyList;
|
|
682
|
+
}
|
|
683
|
+
getInvocationKeyList(metadata) {
|
|
684
|
+
const keyList = this.getBaseKeyList(metadata);
|
|
685
|
+
if (this.invokedToolIds != null && this.invokedToolIds.size > 0) {
|
|
686
|
+
keyList.push(this.invokedToolIds.size + '');
|
|
687
|
+
}
|
|
688
|
+
return keyList;
|
|
689
|
+
}
|
|
690
|
+
getBaseKeyList(metadata) {
|
|
565
691
|
const configurable = this.config?.configurable;
|
|
566
692
|
const runId = metadata.run_id ??
|
|
567
693
|
configurable?.run_id ??
|
|
@@ -579,17 +705,6 @@ class StandardGraph extends Graph {
|
|
|
579
705
|
metadata.langgraph_step,
|
|
580
706
|
checkpointNs,
|
|
581
707
|
];
|
|
582
|
-
const agentContext = this.getAgentContext(metadata);
|
|
583
|
-
if (agentContext.currentTokenType === ContentTypes.THINK ||
|
|
584
|
-
agentContext.currentTokenType === 'think_and_text') {
|
|
585
|
-
keyList.push('reasoning');
|
|
586
|
-
}
|
|
587
|
-
else if (agentContext.tokenTypeSwitch === 'content') {
|
|
588
|
-
keyList.push(`post-reasoning-${agentContext.reasoningTransitionCount}`);
|
|
589
|
-
}
|
|
590
|
-
if (this.invokedToolIds != null && this.invokedToolIds.size > 0) {
|
|
591
|
-
keyList.push(this.invokedToolIds.size + '');
|
|
592
|
-
}
|
|
593
708
|
return keyList;
|
|
594
709
|
}
|
|
595
710
|
checkKeyList(keyList) {
|
|
@@ -701,6 +816,7 @@ class StandardGraph extends Graph {
|
|
|
701
816
|
sessions: this.sessions,
|
|
702
817
|
toolDefinitions: toolDefMap,
|
|
703
818
|
agentId: agentContext?.agentId,
|
|
819
|
+
executingAgentId: agentContext?.agentId,
|
|
704
820
|
toolCallStepIds: this.toolCallStepIds,
|
|
705
821
|
toolRegistry: agentContext?.toolRegistry,
|
|
706
822
|
hookRegistry: this.hookRegistry,
|
|
@@ -738,6 +854,10 @@ class StandardGraph extends Graph {
|
|
|
738
854
|
trace: traceToolNode,
|
|
739
855
|
runLangfuse: this.langfuse,
|
|
740
856
|
agentLangfuse: agentContext?.langfuse,
|
|
857
|
+
// `agentId` is intentionally left unset on this path (it is the
|
|
858
|
+
// subagent-scope marker); `executingAgentId` always identifies the owning
|
|
859
|
+
// agent so hooks can attribute the batch even at the top level.
|
|
860
|
+
executingAgentId: agentContext?.agentId,
|
|
741
861
|
toolCallStepIds: this.toolCallStepIds,
|
|
742
862
|
errorHandler: (data, metadata) => StandardGraph.handleToolCallErrorStatic(this, data, metadata),
|
|
743
863
|
toolRegistry: agentContext?.toolRegistry,
|
|
@@ -1135,6 +1255,7 @@ class StandardGraph extends Graph {
|
|
|
1135
1255
|
};
|
|
1136
1256
|
}
|
|
1137
1257
|
}
|
|
1258
|
+
const metadata = config.metadata;
|
|
1138
1259
|
try {
|
|
1139
1260
|
result = await withLangfuseToolOutputTracingConfig(this.langfuse, () => attemptInvoke({
|
|
1140
1261
|
model: (this.overrideModel ?? model),
|
|
@@ -1144,6 +1265,10 @@ class StandardGraph extends Graph {
|
|
|
1144
1265
|
}, invokeConfig), agentContext.langfuse);
|
|
1145
1266
|
}
|
|
1146
1267
|
catch (primaryError) {
|
|
1268
|
+
clearCurrentDeltaStepMarkers({
|
|
1269
|
+
graph: this,
|
|
1270
|
+
metadata,
|
|
1271
|
+
});
|
|
1147
1272
|
result = await withLangfuseToolOutputTracingConfig(this.langfuse, () => tryFallbackProviders({
|
|
1148
1273
|
fallbacks,
|
|
1149
1274
|
tools: agentContext.tools,
|
|
@@ -1178,28 +1303,42 @@ class StandardGraph extends Graph {
|
|
|
1178
1303
|
const toolCalls = responseMessage
|
|
1179
1304
|
?.tool_calls;
|
|
1180
1305
|
const hasToolCalls = Array.isArray(toolCalls) && toolCalls.length > 0;
|
|
1181
|
-
const metadata = config.metadata;
|
|
1182
1306
|
const responseReasoningContent = getResponseReasoningContent({
|
|
1183
1307
|
responseMessage: responseMessage,
|
|
1184
1308
|
reasoningKey: agentContext.reasoningKey,
|
|
1185
1309
|
});
|
|
1186
|
-
const textMessageContent =
|
|
1310
|
+
const textMessageContent = getMessageDeltaContent(agentContext.provider, responseMessage?.content);
|
|
1311
|
+
const hasStreamedTextDeltaStep = hasCurrentTextDeltaStep({
|
|
1312
|
+
graph: this,
|
|
1313
|
+
metadata,
|
|
1314
|
+
});
|
|
1315
|
+
const hasStreamedReasoningDeltaStep = hasCurrentReasoningDeltaStep({
|
|
1316
|
+
graph: this,
|
|
1317
|
+
metadata,
|
|
1318
|
+
});
|
|
1319
|
+
const dispatchableFinalReasoningContent = getDispatchableFinalReasoningContent({
|
|
1320
|
+
agentContext,
|
|
1321
|
+
responseReasoningContent,
|
|
1322
|
+
hasStreamedTextDeltaStep,
|
|
1323
|
+
hasStreamedReasoningDeltaStep,
|
|
1324
|
+
});
|
|
1187
1325
|
if (hasToolCalls) {
|
|
1188
|
-
const dispatchedReasoning =
|
|
1326
|
+
const dispatchedReasoning = dispatchableFinalReasoningContent != null &&
|
|
1189
1327
|
(await dispatchReasoningContent({
|
|
1190
1328
|
graph: this,
|
|
1191
1329
|
agentContext,
|
|
1192
|
-
reasoningContent:
|
|
1330
|
+
reasoningContent: dispatchableFinalReasoningContent,
|
|
1193
1331
|
metadata,
|
|
1194
1332
|
}));
|
|
1195
1333
|
if (dispatchedReasoning) {
|
|
1196
1334
|
markPostReasoningContent(agentContext);
|
|
1197
1335
|
}
|
|
1198
|
-
if (textMessageContent != null) {
|
|
1336
|
+
if (textMessageContent != null && !hasStreamedTextDeltaStep) {
|
|
1199
1337
|
const stepKey = this.getStepKey(metadata);
|
|
1200
1338
|
const dispatchedText = await dispatchTextMessageContent({
|
|
1201
1339
|
graph: this,
|
|
1202
1340
|
stepKey,
|
|
1341
|
+
provider: agentContext.provider,
|
|
1203
1342
|
content: textMessageContent,
|
|
1204
1343
|
metadata,
|
|
1205
1344
|
});
|
|
@@ -1215,21 +1354,22 @@ class StandardGraph extends Graph {
|
|
|
1215
1354
|
* this a no-op when the streaming path already handled the same step.
|
|
1216
1355
|
*/
|
|
1217
1356
|
if (!hasToolCalls && responseMessage != null) {
|
|
1218
|
-
const dispatchedReasoning =
|
|
1357
|
+
const dispatchedReasoning = dispatchableFinalReasoningContent != null &&
|
|
1219
1358
|
(await dispatchReasoningContent({
|
|
1220
1359
|
graph: this,
|
|
1221
1360
|
agentContext,
|
|
1222
|
-
reasoningContent:
|
|
1361
|
+
reasoningContent: dispatchableFinalReasoningContent,
|
|
1223
1362
|
metadata,
|
|
1224
1363
|
}));
|
|
1225
1364
|
if (dispatchedReasoning && textMessageContent != null) {
|
|
1226
1365
|
markPostReasoningContent(agentContext);
|
|
1227
1366
|
}
|
|
1228
|
-
if (textMessageContent != null) {
|
|
1367
|
+
if (textMessageContent != null && !hasStreamedTextDeltaStep) {
|
|
1229
1368
|
const stepKey = this.getStepKey(metadata);
|
|
1230
1369
|
await dispatchTextMessageContent({
|
|
1231
1370
|
graph: this,
|
|
1232
1371
|
stepKey,
|
|
1372
|
+
provider: agentContext.provider,
|
|
1233
1373
|
content: textMessageContent,
|
|
1234
1374
|
metadata,
|
|
1235
1375
|
});
|
|
@@ -1646,6 +1786,9 @@ class StandardGraph extends Graph {
|
|
|
1646
1786
|
id,
|
|
1647
1787
|
delta,
|
|
1648
1788
|
};
|
|
1789
|
+
if (hasTextDeltaContent(delta.content)) {
|
|
1790
|
+
this.messageStepHasTextDeltas.add(id);
|
|
1791
|
+
}
|
|
1649
1792
|
const handler = this.handlerRegistry?.getHandler(GraphEvents.ON_MESSAGE_DELTA);
|
|
1650
1793
|
if (handler) {
|
|
1651
1794
|
await handler.handle(GraphEvents.ON_MESSAGE_DELTA, messageDelta, metadata, this);
|
|
@@ -1669,6 +1812,9 @@ class StandardGraph extends Graph {
|
|
|
1669
1812
|
id: stepId,
|
|
1670
1813
|
delta,
|
|
1671
1814
|
};
|
|
1815
|
+
if (hasReasoningDeltaContent(delta.content)) {
|
|
1816
|
+
this.reasoningStepHasDeltas.add(stepId);
|
|
1817
|
+
}
|
|
1672
1818
|
const handler = this.handlerRegistry?.getHandler(GraphEvents.ON_REASONING_DELTA);
|
|
1673
1819
|
if (handler) {
|
|
1674
1820
|
await handler.handle(GraphEvents.ON_REASONING_DELTA, reasoningDelta, metadata, this);
|