@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
package/src/messages/format.ts
CHANGED
|
@@ -11,6 +11,7 @@ import type {
|
|
|
11
11
|
MessageContent,
|
|
12
12
|
MessageContentImageUrl,
|
|
13
13
|
} from '@langchain/core/messages';
|
|
14
|
+
import type { RunnableConfig } from '@langchain/core/runnables';
|
|
14
15
|
import type { ToolCall } from '@langchain/core/messages/tool';
|
|
15
16
|
import type {
|
|
16
17
|
BedrockReasoningContentText,
|
|
@@ -25,10 +26,10 @@ import type {
|
|
|
25
26
|
TPayload,
|
|
26
27
|
TMessage,
|
|
27
28
|
} from '@/types';
|
|
28
|
-
import
|
|
29
|
-
import { emitAgentLog } from '@/utils/events';
|
|
30
|
-
import { Providers, ContentTypes, Constants } from '@/common';
|
|
29
|
+
import { normalizeAnthropicToolCallId } from '@/llm/anthropic/utils/message_inputs';
|
|
31
30
|
import { toLangChainContent, toLangChainMessageFields } from './langchain';
|
|
31
|
+
import { Providers, ContentTypes, Constants } from '@/common';
|
|
32
|
+
import { emitAgentLog } from '@/utils/events';
|
|
32
33
|
|
|
33
34
|
interface MediaMessageParams {
|
|
34
35
|
message: {
|
|
@@ -106,6 +107,29 @@ interface FormatMessageParams {
|
|
|
106
107
|
langChain?: boolean;
|
|
107
108
|
}
|
|
108
109
|
|
|
110
|
+
export type LangChainMessageRole = 'system' | 'user' | 'assistant' | 'tool';
|
|
111
|
+
|
|
112
|
+
export type RoleBearingMessage<T extends BaseMessage = BaseMessage> = T & {
|
|
113
|
+
role: LangChainMessageRole;
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
export function withMessageRole<T extends BaseMessage>(
|
|
117
|
+
message: T,
|
|
118
|
+
role: LangChainMessageRole
|
|
119
|
+
): RoleBearingMessage<T> {
|
|
120
|
+
const roleMessage = message as T & { role?: LangChainMessageRole };
|
|
121
|
+
if (roleMessage.role === role) {
|
|
122
|
+
return roleMessage as RoleBearingMessage<T>;
|
|
123
|
+
}
|
|
124
|
+
Object.defineProperty(roleMessage, 'role', {
|
|
125
|
+
value: role,
|
|
126
|
+
writable: true,
|
|
127
|
+
enumerable: false,
|
|
128
|
+
configurable: true,
|
|
129
|
+
});
|
|
130
|
+
return roleMessage as RoleBearingMessage<T>;
|
|
131
|
+
}
|
|
132
|
+
|
|
109
133
|
interface FormattedMessage {
|
|
110
134
|
role: string;
|
|
111
135
|
content: string | MessageContentComplex[];
|
|
@@ -127,9 +151,9 @@ export const formatMessage = ({
|
|
|
127
151
|
langChain = false,
|
|
128
152
|
}: FormatMessageParams):
|
|
129
153
|
| FormattedMessage
|
|
130
|
-
| HumanMessage
|
|
131
|
-
| AIMessage
|
|
132
|
-
| SystemMessage => {
|
|
154
|
+
| RoleBearingMessage<HumanMessage>
|
|
155
|
+
| RoleBearingMessage<AIMessage>
|
|
156
|
+
| RoleBearingMessage<SystemMessage> => {
|
|
133
157
|
// eslint-disable-next-line prefer-const
|
|
134
158
|
let { role: _role, _name, sender, text, content: _content, lc_id } = message;
|
|
135
159
|
if (lc_id && lc_id[2] && !langChain) {
|
|
@@ -217,7 +241,10 @@ export const formatMessage = ({
|
|
|
217
241
|
return mediaMessage;
|
|
218
242
|
}
|
|
219
243
|
|
|
220
|
-
return
|
|
244
|
+
return withMessageRole(
|
|
245
|
+
new HumanMessage(toLangChainMessageFields(mediaMessage)),
|
|
246
|
+
'user'
|
|
247
|
+
);
|
|
221
248
|
}
|
|
222
249
|
|
|
223
250
|
if (!langChain) {
|
|
@@ -225,11 +252,20 @@ export const formatMessage = ({
|
|
|
225
252
|
}
|
|
226
253
|
|
|
227
254
|
if (role === 'user') {
|
|
228
|
-
return
|
|
255
|
+
return withMessageRole(
|
|
256
|
+
new HumanMessage(toLangChainMessageFields(formattedMessage)),
|
|
257
|
+
'user'
|
|
258
|
+
);
|
|
229
259
|
} else if (role === 'assistant') {
|
|
230
|
-
return
|
|
260
|
+
return withMessageRole(
|
|
261
|
+
new AIMessage(toLangChainMessageFields(formattedMessage)),
|
|
262
|
+
'assistant'
|
|
263
|
+
);
|
|
231
264
|
} else {
|
|
232
|
-
return
|
|
265
|
+
return withMessageRole(
|
|
266
|
+
new SystemMessage(toLangChainMessageFields(formattedMessage)),
|
|
267
|
+
'system'
|
|
268
|
+
);
|
|
233
269
|
}
|
|
234
270
|
};
|
|
235
271
|
|
|
@@ -243,14 +279,21 @@ export const formatMessage = ({
|
|
|
243
279
|
export const formatLangChainMessages = (
|
|
244
280
|
messages: Array<MessageInput>,
|
|
245
281
|
formatOptions: Omit<FormatMessageParams, 'message' | 'langChain'>
|
|
246
|
-
): Array<
|
|
282
|
+
): Array<
|
|
283
|
+
| RoleBearingMessage<HumanMessage>
|
|
284
|
+
| RoleBearingMessage<AIMessage>
|
|
285
|
+
| RoleBearingMessage<SystemMessage>
|
|
286
|
+
> => {
|
|
247
287
|
return messages.map((msg) => {
|
|
248
288
|
const formatted = formatMessage({
|
|
249
289
|
...formatOptions,
|
|
250
290
|
message: msg,
|
|
251
291
|
langChain: true,
|
|
252
292
|
});
|
|
253
|
-
return formatted as
|
|
293
|
+
return formatted as
|
|
294
|
+
| RoleBearingMessage<HumanMessage>
|
|
295
|
+
| RoleBearingMessage<AIMessage>
|
|
296
|
+
| RoleBearingMessage<SystemMessage>;
|
|
254
297
|
});
|
|
255
298
|
};
|
|
256
299
|
|
|
@@ -284,12 +327,17 @@ export const formatFromLangChain = (
|
|
|
284
327
|
};
|
|
285
328
|
|
|
286
329
|
interface FormatAssistantMessageOptions {
|
|
330
|
+
preserveUnpairedServerToolUses?: boolean;
|
|
287
331
|
preserveReasoningContent?: boolean;
|
|
288
332
|
provider?: Providers;
|
|
289
333
|
}
|
|
290
334
|
|
|
291
335
|
interface FormatAgentMessagesOptions {
|
|
292
336
|
provider?: Providers;
|
|
337
|
+
/** Skill names already primed fresh this turn (manual/always-apply). Their
|
|
338
|
+
* historical `skill` tool_calls are not reconstructed into a HumanMessage,
|
|
339
|
+
* so the same SKILL.md body is not injected twice in one request. */
|
|
340
|
+
skipSkillBodyNames?: Set<string>;
|
|
293
341
|
}
|
|
294
342
|
|
|
295
343
|
function extractReasoningContent(
|
|
@@ -371,6 +419,40 @@ function getToolUseId(part: MessageContentComplex): string | undefined {
|
|
|
371
419
|
return part.tool_use_id;
|
|
372
420
|
}
|
|
373
421
|
|
|
422
|
+
function isValidServerToolResult(part: MessageContentComplex): boolean {
|
|
423
|
+
const toolUseId = getToolUseId(part);
|
|
424
|
+
if (
|
|
425
|
+
toolUseId?.startsWith(Constants.ANTHROPIC_SERVER_TOOL_PREFIX) !== true ||
|
|
426
|
+
!('content' in part)
|
|
427
|
+
) {
|
|
428
|
+
return false;
|
|
429
|
+
}
|
|
430
|
+
const { content } = part as { content?: unknown };
|
|
431
|
+
return (
|
|
432
|
+
Array.isArray(content) ||
|
|
433
|
+
(content != null &&
|
|
434
|
+
typeof content === 'object' &&
|
|
435
|
+
'type' in content &&
|
|
436
|
+
(content as { type?: unknown }).type === 'web_search_tool_result_error')
|
|
437
|
+
);
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
function getToolCallId(part: MessageContentComplex): string | undefined {
|
|
441
|
+
if (part.type !== ContentTypes.TOOL_CALL) {
|
|
442
|
+
return undefined;
|
|
443
|
+
}
|
|
444
|
+
const id = part.tool_call?.id;
|
|
445
|
+
return typeof id === 'string' && id !== '' ? id : undefined;
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
function hasToolCallOutput(part: MessageContentComplex): boolean {
|
|
449
|
+
if (part.type !== ContentTypes.TOOL_CALL) {
|
|
450
|
+
return false;
|
|
451
|
+
}
|
|
452
|
+
const output = part.tool_call?.output;
|
|
453
|
+
return output != null && output !== '';
|
|
454
|
+
}
|
|
455
|
+
|
|
374
456
|
/**
|
|
375
457
|
* Helper function to format an assistant message
|
|
376
458
|
* @param message The message to format
|
|
@@ -380,16 +462,20 @@ function getToolUseId(part: MessageContentComplex): string | undefined {
|
|
|
380
462
|
function formatAssistantMessage(
|
|
381
463
|
message: Partial<TMessage>,
|
|
382
464
|
options?: FormatAssistantMessageOptions
|
|
383
|
-
): Array<AIMessage | ToolMessage
|
|
384
|
-
const formattedMessages: Array<
|
|
465
|
+
): Array<RoleBearingMessage<AIMessage> | RoleBearingMessage<ToolMessage>> {
|
|
466
|
+
const formattedMessages: Array<
|
|
467
|
+
RoleBearingMessage<AIMessage> | RoleBearingMessage<ToolMessage>
|
|
468
|
+
> = [];
|
|
385
469
|
let currentContent: MessageContentComplex[] = [];
|
|
386
|
-
let lastAIMessage: AIMessage | null = null;
|
|
470
|
+
let lastAIMessage: RoleBearingMessage<AIMessage> | null = null;
|
|
387
471
|
let hasReasoning = false;
|
|
388
472
|
let pendingReasoningContent = '';
|
|
389
473
|
const emittedServerToolUseIds = new Set<string>();
|
|
390
474
|
const pendingServerToolUses = new Map<string, MessageContentComplex>();
|
|
391
475
|
const shouldPreserveReasoningContent =
|
|
392
476
|
options?.preserveReasoningContent === true;
|
|
477
|
+
const serverToolResultIds = new Set<string>();
|
|
478
|
+
const preferredToolCallParts = new Map<string, MessageContentComplex>();
|
|
393
479
|
|
|
394
480
|
const takePendingReasoningContent = (): string | undefined => {
|
|
395
481
|
if (!shouldPreserveReasoningContent || !pendingReasoningContent) {
|
|
@@ -400,14 +486,19 @@ function formatAssistantMessage(
|
|
|
400
486
|
return reasoningContent;
|
|
401
487
|
};
|
|
402
488
|
|
|
403
|
-
const createAIMessage = (
|
|
489
|
+
const createAIMessage = (
|
|
490
|
+
content: MessageContent
|
|
491
|
+
): RoleBearingMessage<AIMessage> => {
|
|
404
492
|
const reasoningContent = takePendingReasoningContent();
|
|
405
|
-
return
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
493
|
+
return withMessageRole(
|
|
494
|
+
new AIMessage({
|
|
495
|
+
content,
|
|
496
|
+
...(reasoningContent != null && {
|
|
497
|
+
additional_kwargs: { reasoning_content: reasoningContent },
|
|
498
|
+
}),
|
|
409
499
|
}),
|
|
410
|
-
|
|
500
|
+
'assistant'
|
|
501
|
+
);
|
|
411
502
|
};
|
|
412
503
|
|
|
413
504
|
const attachPendingReasoningContent = (aiMessage: AIMessage): void => {
|
|
@@ -437,15 +528,52 @@ function formatAssistantMessage(
|
|
|
437
528
|
MessageContentComplex | undefined | null
|
|
438
529
|
>;
|
|
439
530
|
|
|
531
|
+
for (const part of contentParts) {
|
|
532
|
+
if (part == null) {
|
|
533
|
+
continue;
|
|
534
|
+
}
|
|
535
|
+
if (isValidServerToolResult(part)) {
|
|
536
|
+
serverToolResultIds.add(getToolUseId(part) ?? '');
|
|
537
|
+
}
|
|
538
|
+
if (options?.provider === Providers.ANTHROPIC) {
|
|
539
|
+
const toolCallId = getToolCallId(part);
|
|
540
|
+
if (toolCallId == null) {
|
|
541
|
+
continue;
|
|
542
|
+
}
|
|
543
|
+
const preferredPart = preferredToolCallParts.get(toolCallId);
|
|
544
|
+
if (
|
|
545
|
+
preferredPart == null ||
|
|
546
|
+
(!hasToolCallOutput(preferredPart) && hasToolCallOutput(part))
|
|
547
|
+
) {
|
|
548
|
+
preferredToolCallParts.set(toolCallId, part);
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
|
|
440
553
|
for (const part of contentParts) {
|
|
441
554
|
if (part == null) {
|
|
442
555
|
continue;
|
|
443
556
|
}
|
|
444
557
|
const toolUseId = getToolUseId(part);
|
|
445
558
|
if (toolUseId != null) {
|
|
559
|
+
const isServerToolResult = isValidServerToolResult(part);
|
|
560
|
+
if (
|
|
561
|
+
toolUseId.startsWith(Constants.ANTHROPIC_SERVER_TOOL_PREFIX) &&
|
|
562
|
+
!isServerToolResult
|
|
563
|
+
) {
|
|
564
|
+
continue;
|
|
565
|
+
}
|
|
446
566
|
flushPendingServerToolUse(toolUseId);
|
|
567
|
+
if (isServerToolResult) {
|
|
568
|
+
currentContent.push(part);
|
|
569
|
+
continue;
|
|
570
|
+
}
|
|
447
571
|
} else if (hasMeaningfulAssistantContent(part)) {
|
|
448
|
-
pendingServerToolUses.
|
|
572
|
+
for (const id of pendingServerToolUses.keys()) {
|
|
573
|
+
if (!serverToolResultIds.has(id)) {
|
|
574
|
+
pendingServerToolUses.delete(id);
|
|
575
|
+
}
|
|
576
|
+
}
|
|
449
577
|
}
|
|
450
578
|
if (part.type === ContentTypes.TEXT && part.tool_call_ids) {
|
|
451
579
|
/*
|
|
@@ -453,6 +581,15 @@ function formatAssistantMessage(
|
|
|
453
581
|
For Anthropic models, the "tool_calls" field on a message is only respected if content is a string.
|
|
454
582
|
*/
|
|
455
583
|
if (currentContent.length > 0) {
|
|
584
|
+
if (
|
|
585
|
+
currentContent.some((content) => content.type !== ContentTypes.TEXT)
|
|
586
|
+
) {
|
|
587
|
+
currentContent.push(part);
|
|
588
|
+
lastAIMessage = createAIMessage(toLangChainContent(currentContent));
|
|
589
|
+
formattedMessages.push(lastAIMessage);
|
|
590
|
+
currentContent = [];
|
|
591
|
+
continue;
|
|
592
|
+
}
|
|
456
593
|
let content = currentContent.reduce((acc, curr) => {
|
|
457
594
|
if (curr.type === ContentTypes.TEXT) {
|
|
458
595
|
return `${acc}${getTextContent(curr)}\n`;
|
|
@@ -473,6 +610,14 @@ function formatAssistantMessage(
|
|
|
473
610
|
if (part.tool_call == null) {
|
|
474
611
|
continue;
|
|
475
612
|
}
|
|
613
|
+
const toolCallId = getToolCallId(part);
|
|
614
|
+
if (
|
|
615
|
+
options?.provider === Providers.ANTHROPIC &&
|
|
616
|
+
toolCallId != null &&
|
|
617
|
+
preferredToolCallParts.get(toolCallId) !== part
|
|
618
|
+
) {
|
|
619
|
+
continue;
|
|
620
|
+
}
|
|
476
621
|
|
|
477
622
|
// Note: `tool_calls` list is defined when constructed by `AIMessage` class, and outputs should be excluded from it
|
|
478
623
|
const {
|
|
@@ -494,6 +639,12 @@ function formatAssistantMessage(
|
|
|
494
639
|
typeof _tool_call.id === 'string' &&
|
|
495
640
|
_tool_call.id.startsWith(Constants.ANTHROPIC_SERVER_TOOL_PREFIX)
|
|
496
641
|
) {
|
|
642
|
+
if (
|
|
643
|
+
!serverToolResultIds.has(_tool_call.id) &&
|
|
644
|
+
options.preserveUnpairedServerToolUses !== true
|
|
645
|
+
) {
|
|
646
|
+
continue;
|
|
647
|
+
}
|
|
497
648
|
if (
|
|
498
649
|
emittedServerToolUseIds.has(_tool_call.id) ||
|
|
499
650
|
pendingServerToolUses.has(_tool_call.id)
|
|
@@ -531,17 +682,34 @@ function formatAssistantMessage(
|
|
|
531
682
|
}
|
|
532
683
|
|
|
533
684
|
tool_call.args = args;
|
|
534
|
-
if (
|
|
535
|
-
|
|
685
|
+
if (
|
|
686
|
+
options?.provider === Providers.ANTHROPIC &&
|
|
687
|
+
Array.isArray(lastAIMessage.content)
|
|
688
|
+
) {
|
|
689
|
+
const content = lastAIMessage.content as MessageContentComplex[];
|
|
690
|
+
content.push({
|
|
691
|
+
type: 'tool_use',
|
|
692
|
+
id: normalizeAnthropicToolCallId(tool_call.id ?? ''),
|
|
693
|
+
name: tool_call.name,
|
|
694
|
+
input: args,
|
|
695
|
+
} as MessageContentComplex);
|
|
696
|
+
lastAIMessage.content = content as MessageContent;
|
|
697
|
+
} else {
|
|
698
|
+
if (!lastAIMessage.tool_calls) {
|
|
699
|
+
lastAIMessage.tool_calls = [];
|
|
700
|
+
}
|
|
701
|
+
lastAIMessage.tool_calls.push(tool_call as ToolCall);
|
|
536
702
|
}
|
|
537
|
-
lastAIMessage.tool_calls.push(tool_call as ToolCall);
|
|
538
703
|
|
|
539
704
|
formattedMessages.push(
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
705
|
+
withMessageRole(
|
|
706
|
+
new ToolMessage({
|
|
707
|
+
tool_call_id: tool_call.id ?? '',
|
|
708
|
+
name: tool_call.name,
|
|
709
|
+
content: output != null ? output : '',
|
|
710
|
+
}),
|
|
711
|
+
'tool'
|
|
712
|
+
)
|
|
545
713
|
);
|
|
546
714
|
} else if (
|
|
547
715
|
part.type === ContentTypes.THINK ||
|
|
@@ -995,6 +1163,7 @@ function extractSkillName(args: unknown): string | undefined {
|
|
|
995
1163
|
* @param indexTokenCountMap - Optional map of message indices to token counts.
|
|
996
1164
|
* @param tools - Optional set of tool names that are allowed in the request.
|
|
997
1165
|
* @param skills - Optional map of skill name to body for reconstructing skill HumanMessages.
|
|
1166
|
+
* @param options - Optional formatting options (provider, skipSkillBodyNames).
|
|
998
1167
|
* @returns - Object containing formatted messages and updated indexTokenCountMap if provided.
|
|
999
1168
|
*/
|
|
1000
1169
|
export const formatAgentMessages = (
|
|
@@ -1007,7 +1176,12 @@ export const formatAgentMessages = (
|
|
|
1007
1176
|
skills?: Map<string, string>,
|
|
1008
1177
|
options?: FormatAgentMessagesOptions
|
|
1009
1178
|
): {
|
|
1010
|
-
messages: Array<
|
|
1179
|
+
messages: Array<
|
|
1180
|
+
| RoleBearingMessage<HumanMessage>
|
|
1181
|
+
| RoleBearingMessage<AIMessage>
|
|
1182
|
+
| RoleBearingMessage<SystemMessage>
|
|
1183
|
+
| RoleBearingMessage<ToolMessage>
|
|
1184
|
+
>;
|
|
1011
1185
|
indexTokenCountMap?: Record<number, number>;
|
|
1012
1186
|
/** Cross-run summary extracted from the payload. Should be forwarded to the
|
|
1013
1187
|
* agent run so it can be included in the system message via AgentContext. */
|
|
@@ -1022,7 +1196,10 @@ export const formatAgentMessages = (
|
|
|
1022
1196
|
};
|
|
1023
1197
|
} => {
|
|
1024
1198
|
const messages: Array<
|
|
1025
|
-
|
|
1199
|
+
| RoleBearingMessage<HumanMessage>
|
|
1200
|
+
| RoleBearingMessage<AIMessage>
|
|
1201
|
+
| RoleBearingMessage<SystemMessage>
|
|
1202
|
+
| RoleBearingMessage<ToolMessage>
|
|
1026
1203
|
> = [];
|
|
1027
1204
|
// If indexTokenCountMap is provided, create a new map to track the updated indices
|
|
1028
1205
|
const updatedIndexTokenCountMap: Record<number, number> = {};
|
|
@@ -1078,7 +1255,10 @@ export const formatAgentMessages = (
|
|
|
1078
1255
|
const formattedMessage = formatMessage({
|
|
1079
1256
|
message: message as MessageInput,
|
|
1080
1257
|
langChain: true,
|
|
1081
|
-
}) as
|
|
1258
|
+
}) as
|
|
1259
|
+
| RoleBearingMessage<HumanMessage>
|
|
1260
|
+
| RoleBearingMessage<AIMessage>
|
|
1261
|
+
| RoleBearingMessage<SystemMessage>;
|
|
1082
1262
|
if (sourceMessageId != null && sourceMessageId !== '') {
|
|
1083
1263
|
formattedMessage.id = sourceMessageId;
|
|
1084
1264
|
}
|
|
@@ -1254,6 +1434,7 @@ export const formatAgentMessages = (
|
|
|
1254
1434
|
}
|
|
1255
1435
|
|
|
1256
1436
|
const formattedMessages = formatAssistantMessage(processedMessage, {
|
|
1437
|
+
preserveUnpairedServerToolUses: i === payload.length - 1,
|
|
1257
1438
|
preserveReasoningContent: options?.provider === Providers.DEEPSEEK,
|
|
1258
1439
|
provider: options?.provider,
|
|
1259
1440
|
});
|
|
@@ -1269,19 +1450,26 @@ export const formatAgentMessages = (
|
|
|
1269
1450
|
const endMessageIndex = messages.length;
|
|
1270
1451
|
|
|
1271
1452
|
if (pendingSkillNames?.size != null && pendingSkillNames.size > 0) {
|
|
1453
|
+
const skipSkillBodyNames = options?.skipSkillBodyNames;
|
|
1272
1454
|
for (const skillName of pendingSkillNames) {
|
|
1455
|
+
if (skipSkillBodyNames != null && skipSkillBodyNames.has(skillName)) {
|
|
1456
|
+
continue;
|
|
1457
|
+
}
|
|
1273
1458
|
const body = skills?.get(skillName) ?? '';
|
|
1274
1459
|
if (body) {
|
|
1275
1460
|
messages.push(
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1461
|
+
withMessageRole(
|
|
1462
|
+
new HumanMessage({
|
|
1463
|
+
content: body,
|
|
1464
|
+
additional_kwargs: {
|
|
1465
|
+
role: 'user',
|
|
1466
|
+
isMeta: true,
|
|
1467
|
+
source: 'skill',
|
|
1468
|
+
skillName,
|
|
1469
|
+
},
|
|
1470
|
+
}),
|
|
1471
|
+
'user'
|
|
1472
|
+
)
|
|
1285
1473
|
);
|
|
1286
1474
|
}
|
|
1287
1475
|
}
|
|
@@ -1721,7 +1909,12 @@ export function ensureThinkingBlockInMessages(
|
|
|
1721
1909
|
'ensureThinkingBlockInMessages: injecting [Previous agent context] HumanMessage' +
|
|
1722
1910
|
` (${parts.length} msgs at index ${i}, no thinking block in chain)`
|
|
1723
1911
|
);
|
|
1724
|
-
result.push(
|
|
1912
|
+
result.push(
|
|
1913
|
+
withMessageRole(
|
|
1914
|
+
new HumanMessage({ content: toLangChainContent(parts) }),
|
|
1915
|
+
'user'
|
|
1916
|
+
)
|
|
1917
|
+
);
|
|
1725
1918
|
i = j;
|
|
1726
1919
|
} else {
|
|
1727
1920
|
// Keep the message as is
|