@illuma-ai/agents 1.0.89 → 1.0.93
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 +98 -49
- package/dist/cjs/agents/AgentContext.cjs.map +1 -1
- package/dist/cjs/common/constants.cjs +25 -0
- package/dist/cjs/common/constants.cjs.map +1 -0
- package/dist/cjs/common/enum.cjs +30 -0
- package/dist/cjs/common/enum.cjs.map +1 -1
- package/dist/cjs/events.cjs +9 -4
- package/dist/cjs/events.cjs.map +1 -1
- package/dist/cjs/graphs/Graph.cjs +397 -92
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/graphs/MultiAgentGraph.cjs +223 -92
- package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
- package/dist/cjs/instrumentation.cjs +30 -14
- package/dist/cjs/instrumentation.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/index.cjs +43 -11
- package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/types.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +10 -7
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +32 -0
- package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/tools.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/index.cjs +129 -101
- package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/utils/message_inputs.cjs +489 -0
- package/dist/cjs/llm/bedrock/utils/message_inputs.cjs.map +1 -0
- package/dist/cjs/llm/bedrock/utils/message_outputs.cjs +176 -0
- package/dist/cjs/llm/bedrock/utils/message_outputs.cjs.map +1 -0
- package/dist/cjs/llm/fake.cjs.map +1 -1
- package/dist/cjs/llm/google/index.cjs.map +1 -1
- package/dist/cjs/llm/google/utils/common.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.map +1 -1
- package/dist/cjs/llm/openrouter/index.cjs +59 -5
- package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
- package/dist/cjs/llm/providers.cjs.map +1 -1
- package/dist/cjs/llm/text.cjs.map +1 -1
- package/dist/cjs/llm/vertexai/index.cjs +80 -2
- package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
- package/dist/cjs/main.cjs +60 -27
- package/dist/cjs/main.cjs.map +1 -1
- package/dist/cjs/messages/cache.cjs +131 -108
- package/dist/cjs/messages/cache.cjs.map +1 -1
- package/dist/cjs/messages/content.cjs.map +1 -1
- package/dist/cjs/messages/core.cjs +3 -0
- package/dist/cjs/messages/core.cjs.map +1 -1
- package/dist/cjs/messages/format.cjs +265 -47
- package/dist/cjs/messages/format.cjs.map +1 -1
- package/dist/cjs/messages/ids.cjs.map +1 -1
- package/dist/cjs/messages/prune.cjs +55 -2
- package/dist/cjs/messages/prune.cjs.map +1 -1
- package/dist/cjs/messages/summarize.cjs +170 -0
- package/dist/cjs/messages/summarize.cjs.map +1 -0
- package/dist/cjs/messages/tools.cjs.map +1 -1
- package/dist/cjs/run.cjs +87 -30
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/schemas/validate.cjs.map +1 -1
- package/dist/cjs/splitStream.cjs.map +1 -1
- package/dist/cjs/stream.cjs +59 -25
- package/dist/cjs/stream.cjs.map +1 -1
- package/dist/cjs/tools/AskUser.cjs +131 -0
- package/dist/cjs/tools/AskUser.cjs.map +1 -0
- package/dist/cjs/tools/BrowserTools.cjs +11 -7
- package/dist/cjs/tools/BrowserTools.cjs.map +1 -1
- package/dist/cjs/tools/Calculator.cjs.map +1 -1
- package/dist/cjs/tools/CodeExecutor.cjs +46 -4
- package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs +36 -53
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
- package/dist/cjs/tools/StreamingToolCallBuffer.cjs +208 -0
- package/dist/cjs/tools/StreamingToolCallBuffer.cjs.map +1 -0
- package/dist/cjs/tools/ToolNode.cjs +333 -30
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/ToolSearch.cjs +66 -30
- package/dist/cjs/tools/ToolSearch.cjs.map +1 -1
- package/dist/cjs/tools/handlers.cjs +94 -8
- package/dist/cjs/tools/handlers.cjs.map +1 -1
- package/dist/cjs/tools/schema.cjs.map +1 -1
- package/dist/cjs/tools/search/content.cjs.map +1 -1
- package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
- package/dist/cjs/tools/search/format.cjs.map +1 -1
- package/dist/cjs/tools/search/highlights.cjs.map +1 -1
- package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
- package/dist/cjs/tools/search/schema.cjs.map +1 -1
- package/dist/cjs/tools/search/search.cjs +1 -0
- package/dist/cjs/tools/search/search.cjs.map +1 -1
- package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -1
- package/dist/cjs/tools/search/tool.cjs.map +1 -1
- package/dist/cjs/tools/search/utils.cjs.map +1 -1
- package/dist/cjs/types/graph.cjs +1 -1
- package/dist/cjs/types/graph.cjs.map +1 -1
- package/dist/cjs/utils/contextAnalytics.cjs +23 -6
- package/dist/cjs/utils/contextAnalytics.cjs.map +1 -1
- package/dist/cjs/utils/events.cjs.map +1 -1
- package/dist/cjs/utils/graph.cjs.map +1 -1
- package/dist/cjs/utils/handlers.cjs.map +1 -1
- package/dist/cjs/utils/llm.cjs.map +1 -1
- package/dist/cjs/utils/misc.cjs.map +1 -1
- package/dist/cjs/utils/run.cjs +3 -1
- package/dist/cjs/utils/run.cjs.map +1 -1
- package/dist/cjs/utils/schema.cjs.map +1 -1
- package/dist/cjs/utils/title.cjs.map +1 -1
- package/dist/cjs/utils/tokens.cjs +33 -58
- package/dist/cjs/utils/tokens.cjs.map +1 -1
- package/dist/cjs/utils/toolCallContinuation.cjs +55 -0
- package/dist/cjs/utils/toolCallContinuation.cjs.map +1 -0
- package/dist/cjs/utils/toonFormat.cjs.map +1 -1
- package/dist/esm/agents/AgentContext.mjs +98 -49
- package/dist/esm/agents/AgentContext.mjs.map +1 -1
- package/dist/esm/common/constants.mjs +22 -0
- package/dist/esm/common/constants.mjs.map +1 -0
- package/dist/esm/common/enum.mjs +31 -1
- package/dist/esm/common/enum.mjs.map +1 -1
- package/dist/esm/events.mjs +9 -4
- package/dist/esm/events.mjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +393 -88
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/graphs/MultiAgentGraph.mjs +224 -93
- package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
- package/dist/esm/instrumentation.mjs +30 -14
- package/dist/esm/instrumentation.mjs.map +1 -1
- package/dist/esm/llm/anthropic/index.mjs +43 -11
- package/dist/esm/llm/anthropic/index.mjs.map +1 -1
- package/dist/esm/llm/anthropic/types.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs +10 -7
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_outputs.mjs +32 -0
- package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/tools.mjs.map +1 -1
- package/dist/esm/llm/bedrock/index.mjs +128 -101
- package/dist/esm/llm/bedrock/index.mjs.map +1 -1
- package/dist/esm/llm/bedrock/utils/message_inputs.mjs +484 -0
- package/dist/esm/llm/bedrock/utils/message_inputs.mjs.map +1 -0
- package/dist/esm/llm/bedrock/utils/message_outputs.mjs +171 -0
- package/dist/esm/llm/bedrock/utils/message_outputs.mjs.map +1 -0
- package/dist/esm/llm/fake.mjs.map +1 -1
- package/dist/esm/llm/google/index.mjs.map +1 -1
- package/dist/esm/llm/google/utils/common.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.map +1 -1
- package/dist/esm/llm/openrouter/index.mjs +59 -5
- package/dist/esm/llm/openrouter/index.mjs.map +1 -1
- package/dist/esm/llm/providers.mjs.map +1 -1
- package/dist/esm/llm/text.mjs.map +1 -1
- package/dist/esm/llm/vertexai/index.mjs +80 -2
- package/dist/esm/llm/vertexai/index.mjs.map +1 -1
- package/dist/esm/main.mjs +8 -3
- package/dist/esm/main.mjs.map +1 -1
- package/dist/esm/messages/cache.mjs +131 -108
- package/dist/esm/messages/cache.mjs.map +1 -1
- package/dist/esm/messages/content.mjs.map +1 -1
- package/dist/esm/messages/core.mjs +4 -1
- package/dist/esm/messages/core.mjs.map +1 -1
- package/dist/esm/messages/format.mjs +267 -49
- package/dist/esm/messages/format.mjs.map +1 -1
- package/dist/esm/messages/ids.mjs.map +1 -1
- package/dist/esm/messages/prune.mjs +56 -4
- package/dist/esm/messages/prune.mjs.map +1 -1
- package/dist/esm/messages/summarize.mjs +161 -0
- package/dist/esm/messages/summarize.mjs.map +1 -0
- package/dist/esm/messages/tools.mjs.map +1 -1
- package/dist/esm/run.mjs +88 -31
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/schemas/validate.mjs.map +1 -1
- package/dist/esm/splitStream.mjs.map +1 -1
- package/dist/esm/stream.mjs +60 -26
- package/dist/esm/stream.mjs.map +1 -1
- package/dist/esm/tools/AskUser.mjs +125 -0
- package/dist/esm/tools/AskUser.mjs.map +1 -0
- package/dist/esm/tools/BrowserTools.mjs +11 -7
- package/dist/esm/tools/BrowserTools.mjs.map +1 -1
- package/dist/esm/tools/Calculator.mjs.map +1 -1
- package/dist/esm/tools/CodeExecutor.mjs +46 -4
- package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
- package/dist/esm/tools/ProgrammaticToolCalling.mjs +37 -54
- package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
- package/dist/esm/tools/StreamingToolCallBuffer.mjs +206 -0
- package/dist/esm/tools/StreamingToolCallBuffer.mjs.map +1 -0
- package/dist/esm/tools/ToolNode.mjs +333 -30
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/ToolSearch.mjs +66 -30
- package/dist/esm/tools/ToolSearch.mjs.map +1 -1
- package/dist/esm/tools/handlers.mjs +95 -9
- package/dist/esm/tools/handlers.mjs.map +1 -1
- package/dist/esm/tools/schema.mjs.map +1 -1
- package/dist/esm/tools/search/content.mjs.map +1 -1
- package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
- package/dist/esm/tools/search/format.mjs.map +1 -1
- package/dist/esm/tools/search/highlights.mjs.map +1 -1
- package/dist/esm/tools/search/rerankers.mjs.map +1 -1
- package/dist/esm/tools/search/schema.mjs.map +1 -1
- package/dist/esm/tools/search/search.mjs +1 -0
- package/dist/esm/tools/search/search.mjs.map +1 -1
- package/dist/esm/tools/search/serper-scraper.mjs.map +1 -1
- package/dist/esm/tools/search/tool.mjs.map +1 -1
- package/dist/esm/tools/search/utils.mjs.map +1 -1
- package/dist/esm/types/graph.mjs +1 -1
- package/dist/esm/types/graph.mjs.map +1 -1
- package/dist/esm/utils/contextAnalytics.mjs +23 -6
- package/dist/esm/utils/contextAnalytics.mjs.map +1 -1
- package/dist/esm/utils/events.mjs.map +1 -1
- package/dist/esm/utils/graph.mjs.map +1 -1
- package/dist/esm/utils/handlers.mjs.map +1 -1
- package/dist/esm/utils/llm.mjs.map +1 -1
- package/dist/esm/utils/misc.mjs.map +1 -1
- package/dist/esm/utils/run.mjs +3 -1
- package/dist/esm/utils/run.mjs.map +1 -1
- package/dist/esm/utils/schema.mjs.map +1 -1
- package/dist/esm/utils/title.mjs.map +1 -1
- package/dist/esm/utils/tokens.mjs +33 -59
- package/dist/esm/utils/tokens.mjs.map +1 -1
- package/dist/esm/utils/toolCallContinuation.mjs +52 -0
- package/dist/esm/utils/toolCallContinuation.mjs.map +1 -0
- package/dist/esm/utils/toonFormat.mjs.map +1 -1
- package/dist/types/agents/AgentContext.d.ts +14 -7
- package/dist/types/common/constants.d.ts +18 -0
- package/dist/types/common/enum.d.ts +28 -0
- package/dist/types/common/index.d.ts +1 -0
- package/dist/types/events.d.ts +10 -3
- package/dist/types/graphs/Graph.d.ts +37 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/llm/anthropic/index.d.ts +7 -1
- package/dist/types/llm/anthropic/types.d.ts +5 -2
- package/dist/types/llm/anthropic/utils/message_outputs.d.ts +1 -1
- package/dist/types/llm/bedrock/index.d.ts +40 -33
- package/dist/types/llm/bedrock/utils/message_outputs.d.ts +1 -1
- package/dist/types/llm/google/index.d.ts +2 -3
- package/dist/types/llm/openrouter/index.d.ts +21 -1
- package/dist/types/llm/vertexai/index.d.ts +3 -2
- package/dist/types/messages/cache.d.ts +1 -1
- package/dist/types/messages/index.d.ts +1 -0
- package/dist/types/messages/prune.d.ts +2 -7
- package/dist/types/messages/summarize.d.ts +33 -0
- package/dist/types/run.d.ts +6 -0
- package/dist/types/tools/AskUser.d.ts +408 -0
- package/dist/types/tools/BrowserTools.d.ts +2 -2
- package/dist/types/tools/CodeExecutor.d.ts +2 -2
- package/dist/types/tools/StreamingToolCallBuffer.d.ts +106 -0
- package/dist/types/tools/ToolNode.d.ts +55 -3
- package/dist/types/tools/ToolSearch.d.ts +9 -5
- package/dist/types/tools/handlers.d.ts +2 -2
- package/dist/types/types/graph.d.ts +9 -2
- package/dist/types/types/llm.d.ts +8 -3
- package/dist/types/types/run.d.ts +2 -0
- package/dist/types/types/tools.d.ts +20 -2
- package/dist/types/utils/contextAnalytics.d.ts +5 -4
- package/dist/types/utils/index.d.ts +1 -0
- package/dist/types/utils/tokens.d.ts +6 -19
- package/dist/types/utils/toolCallContinuation.d.ts +30 -0
- package/package.json +15 -8
- package/src/agents/AgentContext.js +782 -0
- package/src/agents/AgentContext.js.map +1 -0
- package/src/agents/AgentContext.test.js +421 -0
- package/src/agents/AgentContext.test.js.map +1 -0
- package/src/agents/AgentContext.ts +132 -64
- package/src/agents/__tests__/AgentContext.test.js +678 -0
- package/src/agents/__tests__/AgentContext.test.js.map +1 -0
- package/src/agents/__tests__/AgentContext.test.ts +25 -4
- package/src/agents/__tests__/resolveStructuredOutputMode.test.js +117 -0
- package/src/agents/__tests__/resolveStructuredOutputMode.test.js.map +1 -0
- package/src/common/__tests__/enum.test.ts +135 -0
- package/src/common/constants.ts +21 -0
- package/src/common/enum.js +192 -0
- package/src/common/enum.js.map +1 -0
- package/src/common/enum.ts +30 -0
- package/src/common/index.js +3 -0
- package/src/common/index.js.map +1 -0
- package/src/common/index.ts +2 -1
- package/src/events.js +166 -0
- package/src/events.js.map +1 -0
- package/src/events.ts +11 -14
- package/src/graphs/Graph.js +1857 -0
- package/src/graphs/Graph.js.map +1 -0
- package/src/graphs/Graph.ts +580 -162
- package/src/graphs/MultiAgentGraph.js +1092 -0
- package/src/graphs/MultiAgentGraph.js.map +1 -0
- package/src/graphs/MultiAgentGraph.ts +331 -112
- package/src/graphs/__tests__/adaptive-thinking.test.ts +369 -0
- package/src/graphs/__tests__/graph-direct-tool-names.test.ts +210 -0
- package/src/graphs/__tests__/multi-agent-edges.test.ts +237 -0
- package/src/graphs/__tests__/structured-output.integration.test.js +624 -0
- package/src/graphs/__tests__/structured-output.integration.test.js.map +1 -0
- package/src/graphs/__tests__/structured-output.test.js +144 -0
- package/src/graphs/__tests__/structured-output.test.js.map +1 -0
- package/src/graphs/contextManagement.e2e.test.js +718 -0
- package/src/graphs/contextManagement.e2e.test.js.map +1 -0
- package/src/graphs/contextManagement.e2e.test.ts +990 -0
- package/src/graphs/contextManagement.test.js +485 -0
- package/src/graphs/contextManagement.test.js.map +1 -0
- package/src/graphs/contextManagement.test.ts +625 -0
- package/src/graphs/handoffValidation.test.js +276 -0
- package/src/graphs/handoffValidation.test.js.map +1 -0
- package/src/graphs/handoffValidation.test.ts +353 -0
- package/src/graphs/index.js +3 -0
- package/src/graphs/index.js.map +1 -0
- package/src/index.js +28 -0
- package/src/index.js.map +1 -0
- package/src/index.ts +13 -0
- package/src/instrumentation.js +21 -0
- package/src/instrumentation.js.map +1 -0
- package/src/instrumentation.ts +38 -17
- package/src/llm/anthropic/index.js +319 -0
- package/src/llm/anthropic/index.js.map +1 -0
- package/src/llm/anthropic/index.ts +68 -15
- package/src/llm/anthropic/llm.spec.ts +402 -0
- package/src/llm/anthropic/types.js +46 -0
- package/src/llm/anthropic/types.js.map +1 -0
- package/src/llm/anthropic/types.ts +8 -2
- package/src/llm/anthropic/utils/message_inputs.js +627 -0
- package/src/llm/anthropic/utils/message_inputs.js.map +1 -0
- package/src/llm/anthropic/utils/message_inputs.ts +16 -33
- package/src/llm/anthropic/utils/message_outputs.js +290 -0
- package/src/llm/anthropic/utils/message_outputs.js.map +1 -0
- package/src/llm/anthropic/utils/message_outputs.ts +40 -1
- package/src/llm/anthropic/utils/output_parsers.js +89 -0
- package/src/llm/anthropic/utils/output_parsers.js.map +1 -0
- package/src/llm/anthropic/utils/tools.js +25 -0
- package/src/llm/anthropic/utils/tools.js.map +1 -0
- package/src/llm/bedrock/__tests__/bedrock-caching.test.js +392 -0
- package/src/llm/bedrock/__tests__/bedrock-caching.test.js.map +1 -0
- package/src/llm/bedrock/__tests__/bedrock-caching.test.ts +24 -40
- package/src/llm/bedrock/index.js +303 -0
- package/src/llm/bedrock/index.js.map +1 -0
- package/src/llm/bedrock/index.ts +171 -134
- package/src/llm/bedrock/llm.spec.ts +395 -52
- package/src/llm/bedrock/types.js +2 -0
- package/src/llm/bedrock/types.js.map +1 -0
- package/src/llm/bedrock/utils/index.js +6 -0
- package/src/llm/bedrock/utils/index.js.map +1 -0
- package/src/llm/bedrock/utils/message_inputs.js +463 -0
- package/src/llm/bedrock/utils/message_inputs.js.map +1 -0
- package/src/llm/bedrock/utils/message_inputs.ts +30 -5
- package/src/llm/bedrock/utils/message_outputs.js +269 -0
- package/src/llm/bedrock/utils/message_outputs.js.map +1 -0
- package/src/llm/bedrock/utils/message_outputs.ts +70 -22
- package/src/llm/fake.js +92 -0
- package/src/llm/fake.js.map +1 -0
- package/src/llm/google/index.js +215 -0
- package/src/llm/google/index.js.map +1 -0
- package/src/llm/google/index.ts +2 -3
- package/src/llm/google/types.js +12 -0
- package/src/llm/google/types.js.map +1 -0
- package/src/llm/google/utils/common.js +670 -0
- package/src/llm/google/utils/common.js.map +1 -0
- package/src/llm/google/utils/tools.js +111 -0
- package/src/llm/google/utils/tools.js.map +1 -0
- package/src/llm/google/utils/zod_to_genai_parameters.js +47 -0
- package/src/llm/google/utils/zod_to_genai_parameters.js.map +1 -0
- package/src/llm/openai/index.js +1033 -0
- package/src/llm/openai/index.js.map +1 -0
- package/src/llm/openai/types.js +2 -0
- package/src/llm/openai/types.js.map +1 -0
- package/src/llm/openai/utils/index.js +756 -0
- package/src/llm/openai/utils/index.js.map +1 -0
- package/src/llm/openai/utils/isReasoningModel.test.js +79 -0
- package/src/llm/openai/utils/isReasoningModel.test.js.map +1 -0
- package/src/llm/openrouter/index.js +261 -0
- package/src/llm/openrouter/index.js.map +1 -0
- package/src/llm/openrouter/index.ts +117 -6
- package/src/llm/openrouter/reasoning.test.js +181 -0
- package/src/llm/openrouter/reasoning.test.js.map +1 -0
- package/src/llm/openrouter/reasoning.test.ts +207 -0
- package/src/llm/providers.js +36 -0
- package/src/llm/providers.js.map +1 -0
- package/src/llm/text.js +65 -0
- package/src/llm/text.js.map +1 -0
- package/src/llm/vertexai/index.js +402 -0
- package/src/llm/vertexai/index.js.map +1 -0
- package/src/llm/vertexai/index.ts +115 -5
- package/src/llm/vertexai/llm.spec.ts +114 -0
- package/src/messages/__tests__/tools.test.js +392 -0
- package/src/messages/__tests__/tools.test.js.map +1 -0
- package/src/messages/cache.js +404 -0
- package/src/messages/cache.js.map +1 -0
- package/src/messages/cache.test.js +1167 -0
- package/src/messages/cache.test.js.map +1 -0
- package/src/messages/cache.test.ts +178 -16
- package/src/messages/cache.ts +152 -147
- package/src/messages/content.js +48 -0
- package/src/messages/content.js.map +1 -0
- package/src/messages/content.test.js +314 -0
- package/src/messages/content.test.js.map +1 -0
- package/src/messages/core.js +359 -0
- package/src/messages/core.js.map +1 -0
- package/src/messages/core.ts +5 -0
- package/src/messages/ensureThinkingBlock.test.js +997 -0
- package/src/messages/ensureThinkingBlock.test.js.map +1 -0
- package/src/messages/ensureThinkingBlock.test.ts +751 -10
- package/src/messages/format.js +973 -0
- package/src/messages/format.js.map +1 -0
- package/src/messages/format.ts +334 -57
- package/src/messages/formatAgentMessages.test.js +2278 -0
- package/src/messages/formatAgentMessages.test.js.map +1 -0
- package/src/messages/formatAgentMessages.test.ts +1175 -1
- package/src/messages/formatAgentMessages.tools.test.js +362 -0
- package/src/messages/formatAgentMessages.tools.test.js.map +1 -0
- package/src/messages/formatMessage.test.js +608 -0
- package/src/messages/formatMessage.test.js.map +1 -0
- package/src/messages/ids.js +18 -0
- package/src/messages/ids.js.map +1 -0
- package/src/messages/index.js +9 -0
- package/src/messages/index.js.map +1 -0
- package/src/messages/index.ts +1 -0
- package/src/messages/labelContentByAgent.test.js +725 -0
- package/src/messages/labelContentByAgent.test.js.map +1 -0
- package/src/messages/prune.js +438 -0
- package/src/messages/prune.js.map +1 -0
- package/src/messages/prune.ts +87 -25
- package/src/messages/reducer.js +60 -0
- package/src/messages/reducer.js.map +1 -0
- package/src/messages/shiftIndexTokenCountMap.test.js +63 -0
- package/src/messages/shiftIndexTokenCountMap.test.js.map +1 -0
- package/src/messages/summarize.js +146 -0
- package/src/messages/summarize.js.map +1 -0
- package/src/messages/summarize.test.js +332 -0
- package/src/messages/summarize.test.js.map +1 -0
- package/src/messages/summarize.test.ts +466 -0
- package/src/messages/summarize.ts +222 -0
- package/src/messages/tools.js +90 -0
- package/src/messages/tools.js.map +1 -0
- package/src/mockStream.js +81 -0
- package/src/mockStream.js.map +1 -0
- package/src/prompts/collab.js +7 -0
- package/src/prompts/collab.js.map +1 -0
- package/src/prompts/index.js +3 -0
- package/src/prompts/index.js.map +1 -0
- package/src/prompts/taskmanager.js +58 -0
- package/src/prompts/taskmanager.js.map +1 -0
- package/src/run.js +427 -0
- package/src/run.js.map +1 -0
- package/src/run.ts +101 -33
- package/src/schemas/index.js +3 -0
- package/src/schemas/index.js.map +1 -0
- package/src/schemas/schema-preparation.test.js +370 -0
- package/src/schemas/schema-preparation.test.js.map +1 -0
- package/src/schemas/validate.js +314 -0
- package/src/schemas/validate.js.map +1 -0
- package/src/schemas/validate.test.js +264 -0
- package/src/schemas/validate.test.js.map +1 -0
- package/src/scripts/abort.js +127 -0
- package/src/scripts/abort.js.map +1 -0
- package/src/scripts/ant_web_search.js +130 -0
- package/src/scripts/ant_web_search.js.map +1 -0
- package/src/scripts/ant_web_search.ts +1 -0
- package/src/scripts/ant_web_search_edge_case.js +133 -0
- package/src/scripts/ant_web_search_edge_case.js.map +1 -0
- package/src/scripts/ant_web_search_edge_case.ts +1 -0
- package/src/scripts/ant_web_search_error_edge_case.js +119 -0
- package/src/scripts/ant_web_search_error_edge_case.js.map +1 -0
- package/src/scripts/ant_web_search_error_edge_case.ts +1 -0
- package/src/scripts/args.js +41 -0
- package/src/scripts/args.js.map +1 -0
- package/src/scripts/bedrock-cache-debug.js +186 -0
- package/src/scripts/bedrock-cache-debug.js.map +1 -0
- package/src/scripts/bedrock-cache-debug.ts +250 -0
- package/src/scripts/bedrock-content-aggregation-test.js +195 -0
- package/src/scripts/bedrock-content-aggregation-test.js.map +1 -0
- package/src/scripts/bedrock-content-aggregation-test.ts +266 -0
- package/src/scripts/bedrock-merge-test.js +80 -0
- package/src/scripts/bedrock-merge-test.js.map +1 -0
- package/src/scripts/bedrock-merge-test.ts +107 -0
- package/src/scripts/bedrock-parallel-tools-test.js +150 -0
- package/src/scripts/bedrock-parallel-tools-test.js.map +1 -0
- package/src/scripts/bedrock-parallel-tools-test.ts +204 -0
- package/src/scripts/caching.js +106 -0
- package/src/scripts/caching.js.map +1 -0
- package/src/scripts/caching.ts +1 -0
- package/src/scripts/cli.js +152 -0
- package/src/scripts/cli.js.map +1 -0
- package/src/scripts/cli2.js +119 -0
- package/src/scripts/cli2.js.map +1 -0
- package/src/scripts/cli3.js +163 -0
- package/src/scripts/cli3.js.map +1 -0
- package/src/scripts/cli4.js +165 -0
- package/src/scripts/cli4.js.map +1 -0
- package/src/scripts/cli5.js +165 -0
- package/src/scripts/cli5.js.map +1 -0
- package/src/scripts/code_exec.js +171 -0
- package/src/scripts/code_exec.js.map +1 -0
- package/src/scripts/code_exec.ts +1 -0
- package/src/scripts/code_exec_files.js +180 -0
- package/src/scripts/code_exec_files.js.map +1 -0
- package/src/scripts/code_exec_files.ts +1 -0
- package/src/scripts/code_exec_multi_session.js +185 -0
- package/src/scripts/code_exec_multi_session.js.map +1 -0
- package/src/scripts/code_exec_multi_session.ts +9 -13
- package/src/scripts/code_exec_ptc.js +265 -0
- package/src/scripts/code_exec_ptc.js.map +1 -0
- package/src/scripts/code_exec_ptc.ts +1 -0
- package/src/scripts/code_exec_session.js +217 -0
- package/src/scripts/code_exec_session.js.map +1 -0
- package/src/scripts/code_exec_session.ts +1 -0
- package/src/scripts/code_exec_simple.js +120 -0
- package/src/scripts/code_exec_simple.js.map +1 -0
- package/src/scripts/code_exec_simple.ts +1 -0
- package/src/scripts/content.js +111 -0
- package/src/scripts/content.js.map +1 -0
- package/src/scripts/content.ts +1 -0
- package/src/scripts/empty_input.js +125 -0
- package/src/scripts/empty_input.js.map +1 -0
- package/src/scripts/handoff-test.js +96 -0
- package/src/scripts/handoff-test.js.map +1 -0
- package/src/scripts/image.js +138 -0
- package/src/scripts/image.js.map +1 -0
- package/src/scripts/image.ts +3 -1
- package/src/scripts/memory.js +83 -0
- package/src/scripts/memory.js.map +1 -0
- package/src/scripts/memory.ts +16 -6
- package/src/scripts/multi-agent-chain.js +271 -0
- package/src/scripts/multi-agent-chain.js.map +1 -0
- package/src/scripts/multi-agent-chain.ts +1 -0
- package/src/scripts/multi-agent-conditional.js +185 -0
- package/src/scripts/multi-agent-conditional.js.map +1 -0
- package/src/scripts/multi-agent-conditional.ts +1 -0
- package/src/scripts/multi-agent-document-review-chain.js +171 -0
- package/src/scripts/multi-agent-document-review-chain.js.map +1 -0
- package/src/scripts/multi-agent-document-review-chain.ts +1 -0
- package/src/scripts/multi-agent-hybrid-flow.js +264 -0
- package/src/scripts/multi-agent-hybrid-flow.js.map +1 -0
- package/src/scripts/multi-agent-hybrid-flow.ts +1 -0
- package/src/scripts/multi-agent-parallel-start.js +214 -0
- package/src/scripts/multi-agent-parallel-start.js.map +1 -0
- package/src/scripts/multi-agent-parallel-start.ts +4 -4
- package/src/scripts/multi-agent-parallel.js +346 -0
- package/src/scripts/multi-agent-parallel.js.map +1 -0
- package/src/scripts/multi-agent-parallel.ts +1 -0
- package/src/scripts/multi-agent-sequence.js +184 -0
- package/src/scripts/multi-agent-sequence.js.map +1 -0
- package/src/scripts/multi-agent-sequence.ts +4 -4
- package/src/scripts/multi-agent-supervisor.js +324 -0
- package/src/scripts/multi-agent-supervisor.js.map +1 -0
- package/src/scripts/multi-agent-supervisor.ts +1 -0
- package/src/scripts/multi-agent-test.js +147 -0
- package/src/scripts/multi-agent-test.js.map +1 -0
- package/src/scripts/multi-agent-test.ts +1 -0
- package/src/scripts/parallel-asymmetric-tools-test.js +202 -0
- package/src/scripts/parallel-asymmetric-tools-test.js.map +1 -0
- package/src/scripts/parallel-asymmetric-tools-test.ts +1 -0
- package/src/scripts/parallel-full-metadata-test.js +176 -0
- package/src/scripts/parallel-full-metadata-test.js.map +1 -0
- package/src/scripts/parallel-full-metadata-test.ts +1 -0
- package/src/scripts/parallel-tools-test.js +256 -0
- package/src/scripts/parallel-tools-test.js.map +1 -0
- package/src/scripts/parallel-tools-test.ts +1 -0
- package/src/scripts/poc-multi-agent-comprehensive.ts +1222 -0
- package/src/scripts/programmatic_exec.js +277 -0
- package/src/scripts/programmatic_exec.js.map +1 -0
- package/src/scripts/programmatic_exec_agent.js +168 -0
- package/src/scripts/programmatic_exec_agent.js.map +1 -0
- package/src/scripts/programmatic_exec_agent.ts +1 -0
- package/src/scripts/search.js +118 -0
- package/src/scripts/search.js.map +1 -0
- package/src/scripts/search.ts +1 -0
- package/src/scripts/sequential-full-metadata-test.js +143 -0
- package/src/scripts/sequential-full-metadata-test.js.map +1 -0
- package/src/scripts/sequential-full-metadata-test.ts +1 -0
- package/src/scripts/simple.js +174 -0
- package/src/scripts/simple.js.map +1 -0
- package/src/scripts/simple.ts +2 -1
- package/src/scripts/single-agent-metadata-test.js +152 -0
- package/src/scripts/single-agent-metadata-test.js.map +1 -0
- package/src/scripts/single-agent-metadata-test.ts +4 -6
- package/src/scripts/stream.js +113 -0
- package/src/scripts/stream.js.map +1 -0
- package/src/scripts/stream.ts +1 -0
- package/src/scripts/test-custom-prompt-key.js +132 -0
- package/src/scripts/test-custom-prompt-key.js.map +1 -0
- package/src/scripts/test-handoff-input.js +143 -0
- package/src/scripts/test-handoff-input.js.map +1 -0
- package/src/scripts/test-handoff-preamble.js +227 -0
- package/src/scripts/test-handoff-preamble.js.map +1 -0
- package/src/scripts/test-handoff-preamble.ts +1 -0
- package/src/scripts/test-handoff-steering.js +353 -0
- package/src/scripts/test-handoff-steering.js.map +1 -0
- package/src/scripts/test-handoff-steering.ts +430 -0
- package/src/scripts/test-multi-agent-list-handoff.js +318 -0
- package/src/scripts/test-multi-agent-list-handoff.js.map +1 -0
- package/src/scripts/test-multi-agent-list-handoff.ts +1 -0
- package/src/scripts/test-parallel-agent-labeling.js +253 -0
- package/src/scripts/test-parallel-agent-labeling.js.map +1 -0
- package/src/scripts/test-parallel-agent-labeling.ts +2 -0
- package/src/scripts/test-parallel-handoffs.js +229 -0
- package/src/scripts/test-parallel-handoffs.js.map +1 -0
- package/src/scripts/test-parallel-handoffs.ts +1 -0
- package/src/scripts/test-thinking-handoff-bedrock.js +132 -0
- package/src/scripts/test-thinking-handoff-bedrock.js.map +1 -0
- package/src/scripts/test-thinking-handoff-bedrock.ts +1 -0
- package/src/scripts/test-thinking-handoff.js +132 -0
- package/src/scripts/test-thinking-handoff.js.map +1 -0
- package/src/scripts/test-thinking-handoff.ts +1 -0
- package/src/scripts/test-thinking-to-thinking-handoff-bedrock.js +140 -0
- package/src/scripts/test-thinking-to-thinking-handoff-bedrock.js.map +1 -0
- package/src/scripts/test-thinking-to-thinking-handoff-bedrock.ts +166 -0
- package/src/scripts/test-tool-before-handoff-role-order.js +223 -0
- package/src/scripts/test-tool-before-handoff-role-order.js.map +1 -0
- package/src/scripts/test-tool-before-handoff-role-order.ts +276 -0
- package/src/scripts/test-tools-before-handoff.js +187 -0
- package/src/scripts/test-tools-before-handoff.js.map +1 -0
- package/src/scripts/test-tools-before-handoff.ts +4 -8
- package/src/scripts/test_code_api.js +263 -0
- package/src/scripts/test_code_api.js.map +1 -0
- package/src/scripts/thinking-bedrock.js +128 -0
- package/src/scripts/thinking-bedrock.js.map +1 -0
- package/src/scripts/thinking-bedrock.ts +1 -0
- package/src/scripts/thinking-vertexai.js +130 -0
- package/src/scripts/thinking-vertexai.js.map +1 -0
- package/src/scripts/thinking-vertexai.ts +168 -0
- package/src/scripts/thinking.js +134 -0
- package/src/scripts/thinking.js.map +1 -0
- package/src/scripts/thinking.ts +1 -0
- package/src/scripts/tool_search.js +114 -0
- package/src/scripts/tool_search.js.map +1 -0
- package/src/scripts/tools.js +125 -0
- package/src/scripts/tools.js.map +1 -0
- package/src/scripts/tools.ts +5 -19
- package/src/specs/agent-handoffs-bedrock.integration.test.js +280 -0
- package/src/specs/agent-handoffs-bedrock.integration.test.js.map +1 -0
- package/src/specs/agent-handoffs-bedrock.integration.test.ts +412 -375
- package/src/specs/agent-handoffs.test.js +924 -0
- package/src/specs/agent-handoffs.test.js.map +1 -0
- package/src/specs/agent-handoffs.test.ts +152 -39
- package/src/specs/anthropic.simple.test.js +287 -0
- package/src/specs/anthropic.simple.test.js.map +1 -0
- package/src/specs/anthropic.simple.test.ts +7 -4
- package/src/specs/azure.simple.test.js +381 -0
- package/src/specs/azure.simple.test.js.map +1 -0
- package/src/specs/azure.simple.test.ts +143 -5
- package/src/specs/cache.simple.test.js +282 -0
- package/src/specs/cache.simple.test.js.map +1 -0
- package/src/specs/cache.simple.test.ts +9 -2
- package/src/specs/custom-event-await.test.js +148 -0
- package/src/specs/custom-event-await.test.js.map +1 -0
- package/src/specs/custom-event-await.test.ts +215 -0
- package/src/specs/deepseek.simple.test.js +189 -0
- package/src/specs/deepseek.simple.test.js.map +1 -0
- package/src/specs/deepseek.simple.test.ts +4 -2
- package/src/specs/emergency-prune.test.js +308 -0
- package/src/specs/emergency-prune.test.js.map +1 -0
- package/src/specs/moonshot.simple.test.js +237 -0
- package/src/specs/moonshot.simple.test.js.map +1 -0
- package/src/specs/moonshot.simple.test.ts +6 -2
- package/src/specs/observability.integration.test.js +1337 -0
- package/src/specs/observability.integration.test.js.map +1 -0
- package/src/specs/observability.integration.test.ts +2223 -0
- package/src/specs/openai.simple.test.js +233 -0
- package/src/specs/openai.simple.test.js.map +1 -0
- package/src/specs/openai.simple.test.ts +4 -2
- package/src/specs/openrouter.simple.test.js +202 -0
- package/src/specs/openrouter.simple.test.js.map +1 -0
- package/src/specs/openrouter.simple.test.ts +165 -4
- package/src/specs/prune.test.js +733 -0
- package/src/specs/prune.test.js.map +1 -0
- package/src/specs/prune.test.ts +1 -0
- package/src/specs/reasoning.test.js +144 -0
- package/src/specs/reasoning.test.js.map +1 -0
- package/src/specs/reasoning.test.ts +2 -2
- package/src/specs/spec.utils.js +4 -0
- package/src/specs/spec.utils.js.map +1 -0
- package/src/specs/thinking-handoff.test.js +486 -0
- package/src/specs/thinking-handoff.test.js.map +1 -0
- package/src/specs/thinking-handoff.test.ts +3 -2
- package/src/specs/thinking-prune.test.js +600 -0
- package/src/specs/thinking-prune.test.js.map +1 -0
- package/src/specs/token-distribution-edge-case.test.js +246 -0
- package/src/specs/token-distribution-edge-case.test.js.map +1 -0
- package/src/specs/token-memoization.test.js +32 -0
- package/src/specs/token-memoization.test.js.map +1 -0
- package/src/specs/token-memoization.test.ts +14 -5
- package/src/specs/tokens.test.js +49 -0
- package/src/specs/tokens.test.js.map +1 -0
- package/src/specs/tokens.test.ts +64 -0
- package/src/specs/tool-error.test.js +139 -0
- package/src/specs/tool-error.test.js.map +1 -0
- package/src/specs/tool-error.test.ts +2 -2
- package/src/splitStream.js +204 -0
- package/src/splitStream.js.map +1 -0
- package/src/splitStream.test.js +504 -0
- package/src/splitStream.test.js.map +1 -0
- package/src/stream.js +650 -0
- package/src/stream.js.map +1 -0
- package/src/stream.test.js +225 -0
- package/src/stream.test.js.map +1 -0
- package/src/stream.test.ts +25 -15
- package/src/stream.ts +82 -32
- package/src/test/mockTools.js +340 -0
- package/src/test/mockTools.js.map +1 -0
- package/src/tools/AskUser.ts +159 -0
- package/src/tools/BrowserTools.js +245 -0
- package/src/tools/BrowserTools.js.map +1 -0
- package/src/tools/BrowserTools.ts +12 -8
- package/src/tools/Calculator.js +38 -0
- package/src/tools/Calculator.js.map +1 -0
- package/src/tools/Calculator.test.js +225 -0
- package/src/tools/Calculator.test.js.map +1 -0
- package/src/tools/CodeExecutor.js +233 -0
- package/src/tools/CodeExecutor.js.map +1 -0
- package/src/tools/CodeExecutor.selfhealing.test.ts +435 -0
- package/src/tools/CodeExecutor.ts +62 -4
- package/src/tools/ProgrammaticToolCalling.js +602 -0
- package/src/tools/ProgrammaticToolCalling.js.map +1 -0
- package/src/tools/ProgrammaticToolCalling.ts +40 -52
- package/src/tools/StreamingToolCallBuffer.js +179 -0
- package/src/tools/StreamingToolCallBuffer.js.map +1 -0
- package/src/tools/StreamingToolCallBuffer.ts +218 -0
- package/src/tools/ToolNode.js +930 -0
- package/src/tools/ToolNode.js.map +1 -0
- package/src/tools/ToolNode.ts +454 -41
- package/src/tools/ToolSearch.js +904 -0
- package/src/tools/ToolSearch.js.map +1 -0
- package/src/tools/ToolSearch.ts +84 -33
- package/src/tools/__tests__/AskUser.test.ts +537 -0
- package/src/tools/__tests__/BrowserTools.test.js +306 -0
- package/src/tools/__tests__/BrowserTools.test.js.map +1 -0
- package/src/tools/__tests__/BrowserTools.test.ts +131 -6
- package/src/tools/__tests__/ProgrammaticToolCalling.integration.test.js +276 -0
- package/src/tools/__tests__/ProgrammaticToolCalling.integration.test.js.map +1 -0
- package/src/tools/__tests__/ProgrammaticToolCalling.test.js +807 -0
- package/src/tools/__tests__/ProgrammaticToolCalling.test.js.map +1 -0
- package/src/tools/__tests__/StreamingToolCallBuffer.test.js +175 -0
- package/src/tools/__tests__/StreamingToolCallBuffer.test.js.map +1 -0
- package/src/tools/__tests__/StreamingToolCallBuffer.test.ts +263 -0
- package/src/tools/__tests__/ToolApproval.test.js +675 -0
- package/src/tools/__tests__/ToolApproval.test.js.map +1 -0
- package/src/tools/__tests__/ToolApproval.test.ts +194 -20
- package/src/tools/__tests__/ToolNode.hitl.test.ts +267 -0
- package/src/tools/__tests__/ToolNode.recovery.test.js +200 -0
- package/src/tools/__tests__/ToolNode.recovery.test.js.map +1 -0
- package/src/tools/__tests__/ToolNode.recovery.test.ts +276 -0
- package/src/tools/__tests__/ToolNode.session.test.js +319 -0
- package/src/tools/__tests__/ToolNode.session.test.js.map +1 -0
- package/src/tools/__tests__/ToolNode.session.test.ts +465 -0
- package/src/tools/__tests__/ToolSearch.integration.test.js +125 -0
- package/src/tools/__tests__/ToolSearch.integration.test.js.map +1 -0
- package/src/tools/__tests__/ToolSearch.test.js +812 -0
- package/src/tools/__tests__/ToolSearch.test.js.map +1 -0
- package/src/tools/__tests__/ToolSearch.test.ts +78 -5
- package/src/tools/__tests__/handlers.test.js +799 -0
- package/src/tools/__tests__/handlers.test.js.map +1 -0
- package/src/tools/__tests__/handlers.test.ts +1100 -0
- package/src/tools/__tests__/truncation-recovery.integration.test.js +362 -0
- package/src/tools/__tests__/truncation-recovery.integration.test.js.map +1 -0
- package/src/tools/__tests__/truncation-recovery.integration.test.ts +560 -0
- package/src/tools/handlers.js +306 -0
- package/src/tools/handlers.js.map +1 -0
- package/src/tools/handlers.ts +119 -16
- package/src/tools/schema.js +25 -0
- package/src/tools/schema.js.map +1 -0
- package/src/tools/search/anthropic.js +34 -0
- package/src/tools/search/anthropic.js.map +1 -0
- package/src/tools/search/content.js +116 -0
- package/src/tools/search/content.js.map +1 -0
- package/src/tools/search/content.test.js +133 -0
- package/src/tools/search/content.test.js.map +1 -0
- package/src/tools/search/firecrawl.js +173 -0
- package/src/tools/search/firecrawl.js.map +1 -0
- package/src/tools/search/format.js +198 -0
- package/src/tools/search/format.js.map +1 -0
- package/src/tools/search/highlights.js +241 -0
- package/src/tools/search/highlights.js.map +1 -0
- package/src/tools/search/index.js +3 -0
- package/src/tools/search/index.js.map +1 -0
- package/src/tools/search/jina-reranker.test.js +106 -0
- package/src/tools/search/jina-reranker.test.js.map +1 -0
- package/src/tools/search/rerankers.js +165 -0
- package/src/tools/search/rerankers.js.map +1 -0
- package/src/tools/search/schema.js +102 -0
- package/src/tools/search/schema.js.map +1 -0
- package/src/tools/search/search.js +561 -0
- package/src/tools/search/search.js.map +1 -0
- package/src/tools/search/serper-scraper.js +126 -0
- package/src/tools/search/serper-scraper.js.map +1 -0
- package/src/tools/search/test.js +129 -0
- package/src/tools/search/test.js.map +1 -0
- package/src/tools/search/tool.js +453 -0
- package/src/tools/search/tool.js.map +1 -0
- package/src/tools/search/types.js +2 -0
- package/src/tools/search/types.js.map +1 -0
- package/src/tools/search/utils.js +59 -0
- package/src/tools/search/utils.js.map +1 -0
- package/src/types/graph.js +24 -0
- package/src/types/graph.js.map +1 -0
- package/src/types/graph.test.js +192 -0
- package/src/types/graph.test.js.map +1 -0
- package/src/types/graph.ts +26 -6
- package/src/types/index.js +7 -0
- package/src/types/index.js.map +1 -0
- package/src/types/llm.js +2 -0
- package/src/types/llm.js.map +1 -0
- package/src/types/llm.ts +8 -3
- package/src/types/messages.js +2 -0
- package/src/types/messages.js.map +1 -0
- package/src/types/run.js +2 -0
- package/src/types/run.js.map +1 -0
- package/src/types/run.ts +2 -0
- package/src/types/stream.js +2 -0
- package/src/types/stream.js.map +1 -0
- package/src/types/tools.js +2 -0
- package/src/types/tools.js.map +1 -0
- package/src/types/tools.ts +21 -2
- package/src/utils/contextAnalytics.js +79 -0
- package/src/utils/contextAnalytics.js.map +1 -0
- package/src/utils/contextAnalytics.test.js +166 -0
- package/src/utils/contextAnalytics.test.js.map +1 -0
- package/src/utils/contextAnalytics.test.ts +222 -0
- package/src/utils/contextAnalytics.ts +27 -9
- package/src/utils/events.js +26 -0
- package/src/utils/events.js.map +1 -0
- package/src/utils/graph.js +11 -0
- package/src/utils/graph.js.map +1 -0
- package/src/utils/handlers.js +65 -0
- package/src/utils/handlers.js.map +1 -0
- package/src/utils/index.js +10 -0
- package/src/utils/index.js.map +1 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/llm.js +21 -0
- package/src/utils/llm.js.map +1 -0
- package/src/utils/llmConfig.js +205 -0
- package/src/utils/llmConfig.js.map +1 -0
- package/src/utils/llmConfig.ts +5 -5
- package/src/utils/logging.js +37 -0
- package/src/utils/logging.js.map +1 -0
- package/src/utils/misc.js +51 -0
- package/src/utils/misc.js.map +1 -0
- package/src/utils/run.js +69 -0
- package/src/utils/run.js.map +1 -0
- package/src/utils/run.ts +108 -106
- package/src/utils/schema.js +21 -0
- package/src/utils/schema.js.map +1 -0
- package/src/utils/title.js +119 -0
- package/src/utils/title.js.map +1 -0
- package/src/utils/tokens.js +92 -0
- package/src/utils/tokens.js.map +1 -0
- package/src/utils/tokens.ts +118 -142
- package/src/utils/toolCallContinuation.ts +55 -0
- package/src/utils/toonFormat.js +379 -0
- package/src/utils/toonFormat.js.map +1 -0
|
@@ -1,22 +1,26 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var nanoid = require('nanoid');
|
|
4
|
-
var stream = require('@langchain/core/utils/stream');
|
|
4
|
+
var stream$1 = require('@langchain/core/utils/stream');
|
|
5
5
|
var googleVertexai = require('@langchain/google-vertexai');
|
|
6
6
|
var langgraph = require('@langchain/langgraph');
|
|
7
7
|
var runnables = require('@langchain/core/runnables');
|
|
8
8
|
var messages = require('@langchain/core/messages');
|
|
9
|
-
var _enum = require('../common/enum.cjs');
|
|
10
9
|
var core = require('../messages/core.cjs');
|
|
10
|
+
var ids = require('../messages/ids.cjs');
|
|
11
11
|
var prune = require('../messages/prune.cjs');
|
|
12
12
|
var format = require('../messages/format.cjs');
|
|
13
13
|
var cache = require('../messages/cache.cjs');
|
|
14
14
|
var content = require('../messages/content.cjs');
|
|
15
15
|
var tools = require('../messages/tools.cjs');
|
|
16
|
+
var _enum = require('../common/enum.cjs');
|
|
17
|
+
var constants = require('../common/constants.cjs');
|
|
16
18
|
var graph = require('../utils/graph.cjs');
|
|
17
19
|
var llm = require('../utils/llm.cjs');
|
|
20
|
+
var stream = require('../stream.cjs');
|
|
21
|
+
var handlers = require('../tools/handlers.cjs');
|
|
18
22
|
var run = require('../utils/run.cjs');
|
|
19
|
-
require('
|
|
23
|
+
require('ai-tokenizer');
|
|
20
24
|
require('../utils/toonFormat.cjs');
|
|
21
25
|
var contextAnalytics = require('../utils/contextAnalytics.cjs');
|
|
22
26
|
require('zod-to-json-schema');
|
|
@@ -29,6 +33,7 @@ var validate = require('../schemas/validate.cjs');
|
|
|
29
33
|
var AgentContext = require('../agents/AgentContext.cjs');
|
|
30
34
|
var graph$1 = require('../types/graph.cjs');
|
|
31
35
|
var fake = require('../llm/fake.cjs');
|
|
36
|
+
var StreamingToolCallBuffer = require('../tools/StreamingToolCallBuffer.cjs');
|
|
32
37
|
|
|
33
38
|
/* eslint-disable no-console */
|
|
34
39
|
// src/graphs/Graph.ts
|
|
@@ -52,6 +57,32 @@ class Graph {
|
|
|
52
57
|
* Currently supports code execution session tracking (session_id, files).
|
|
53
58
|
*/
|
|
54
59
|
sessions = new Map();
|
|
60
|
+
/**
|
|
61
|
+
* Streaming tool call buffer — accumulates raw arg strings during streaming
|
|
62
|
+
* so that truncated tool call content can be recovered by the ToolNode.
|
|
63
|
+
* Fed by handleToolCallChunks, consumed by ToolNode.run when args are incomplete.
|
|
64
|
+
*/
|
|
65
|
+
streamingToolCallBuffer = new StreamingToolCallBuffer.StreamingToolCallBuffer();
|
|
66
|
+
/**
|
|
67
|
+
* Clears heavy references to allow GC to reclaim memory held by
|
|
68
|
+
* LangGraph's internal config / AsyncLocalStorage RunTree chain.
|
|
69
|
+
* Call after a run completes and content has been extracted.
|
|
70
|
+
*/
|
|
71
|
+
clearHeavyState() {
|
|
72
|
+
this.config = undefined;
|
|
73
|
+
this.signal = undefined;
|
|
74
|
+
this.contentData = [];
|
|
75
|
+
this.contentIndexMap = new Map();
|
|
76
|
+
this.stepKeyIds = new Map();
|
|
77
|
+
this.toolCallStepIds.clear();
|
|
78
|
+
this.messageIdsByStepKey = new Map();
|
|
79
|
+
this.messageStepHasToolCalls = new Map();
|
|
80
|
+
this.prelimMessageIdsByStepKey = new Map();
|
|
81
|
+
this.invokedToolIds = undefined;
|
|
82
|
+
this.handlerRegistry = undefined;
|
|
83
|
+
this.sessions.clear();
|
|
84
|
+
this.streamingToolCallBuffer.clearAll();
|
|
85
|
+
}
|
|
55
86
|
}
|
|
56
87
|
class StandardGraph extends Graph {
|
|
57
88
|
overrideModel;
|
|
@@ -92,7 +123,13 @@ class StandardGraph extends Graph {
|
|
|
92
123
|
this.contentIndexMap = graph.resetIfNotEmpty(this.contentIndexMap, new Map());
|
|
93
124
|
}
|
|
94
125
|
this.stepKeyIds = graph.resetIfNotEmpty(this.stepKeyIds, new Map());
|
|
95
|
-
|
|
126
|
+
/**
|
|
127
|
+
* Clear in-place instead of replacing with a new Map to preserve the
|
|
128
|
+
* shared reference held by ToolNode (passed at construction time).
|
|
129
|
+
* Using resetIfNotEmpty would create a new Map, leaving ToolNode with
|
|
130
|
+
* a stale reference on 2nd+ processStream calls.
|
|
131
|
+
*/
|
|
132
|
+
this.toolCallStepIds.clear();
|
|
96
133
|
this.messageIdsByStepKey = graph.resetIfNotEmpty(this.messageIdsByStepKey, new Map());
|
|
97
134
|
this.messageStepHasToolCalls = graph.resetIfNotEmpty(this.messageStepHasToolCalls, new Map());
|
|
98
135
|
this.prelimMessageIdsByStepKey = graph.resetIfNotEmpty(this.prelimMessageIdsByStepKey, new Map());
|
|
@@ -101,6 +138,90 @@ class StandardGraph extends Graph {
|
|
|
101
138
|
context.reset();
|
|
102
139
|
}
|
|
103
140
|
}
|
|
141
|
+
clearHeavyState() {
|
|
142
|
+
super.clearHeavyState();
|
|
143
|
+
this.messages = [];
|
|
144
|
+
this.overrideModel = undefined;
|
|
145
|
+
for (const context of this.agentContexts.values()) {
|
|
146
|
+
context.reset();
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Returns clientOptions with a reduced thinking budget for subsequent
|
|
151
|
+
* ReAct loop iterations (tool-result turns).
|
|
152
|
+
*
|
|
153
|
+
* **Rationale:** The first LLM call in a conversation processes the user's
|
|
154
|
+
* original query and may benefit from deep extended thinking. Subsequent
|
|
155
|
+
* iterations — where the model receives tool results and decides whether
|
|
156
|
+
* to call another tool or produce a final response — require minimal
|
|
157
|
+
* reasoning. Reducing the thinking budget from the user's configured
|
|
158
|
+
* value to TOOL_TURN_THINKING_BUDGET (1024 tokens) cuts wall-clock
|
|
159
|
+
* latency by ~15-20s per iteration, compounding across multi-tool flows.
|
|
160
|
+
*
|
|
161
|
+
* Provider handling:
|
|
162
|
+
* - **Anthropic (direct):** Reduces `thinking.budget_tokens` if > threshold
|
|
163
|
+
* - **Bedrock (Anthropic models):** Reduces `additionalModelRequestFields.thinking.budget_tokens`
|
|
164
|
+
* - **VertexAI / Google:** Reduces `thinkingConfig.thinkingBudget` if > threshold
|
|
165
|
+
* - **All others:** Returns clientOptions unchanged (no-op)
|
|
166
|
+
*
|
|
167
|
+
* @param clientOptions - The original client options from AgentContext
|
|
168
|
+
* @param provider - The LLM provider enum value
|
|
169
|
+
* @returns Shallow-cloned clientOptions with reduced thinking budget, or the original if no reduction needed
|
|
170
|
+
*/
|
|
171
|
+
getAdaptiveClientOptions(clientOptions, provider) {
|
|
172
|
+
if (provider === _enum.Providers.ANTHROPIC) {
|
|
173
|
+
const anthropicOpts = clientOptions;
|
|
174
|
+
if (anthropicOpts.thinking != null &&
|
|
175
|
+
typeof anthropicOpts.thinking === 'object' &&
|
|
176
|
+
'type' in anthropicOpts.thinking &&
|
|
177
|
+
(anthropicOpts.thinking.type === 'enabled' ||
|
|
178
|
+
anthropicOpts.thinking.type === 'adaptive') &&
|
|
179
|
+
'budget_tokens' in anthropicOpts.thinking &&
|
|
180
|
+
anthropicOpts.thinking.budget_tokens >
|
|
181
|
+
constants.TOOL_TURN_THINKING_BUDGET) {
|
|
182
|
+
return {
|
|
183
|
+
...anthropicOpts,
|
|
184
|
+
thinking: {
|
|
185
|
+
...anthropicOpts.thinking,
|
|
186
|
+
budget_tokens: constants.TOOL_TURN_THINKING_BUDGET,
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (provider === _enum.Providers.BEDROCK) {
|
|
192
|
+
const bedrockOpts = clientOptions;
|
|
193
|
+
const thinkingField = bedrockOpts.additionalModelRequestFields?.thinking;
|
|
194
|
+
if (thinkingField != null &&
|
|
195
|
+
typeof thinkingField === 'object' &&
|
|
196
|
+
'budget_tokens' in thinkingField &&
|
|
197
|
+
thinkingField.budget_tokens > constants.TOOL_TURN_THINKING_BUDGET) {
|
|
198
|
+
return {
|
|
199
|
+
...bedrockOpts,
|
|
200
|
+
additionalModelRequestFields: {
|
|
201
|
+
...(bedrockOpts.additionalModelRequestFields ?? {}),
|
|
202
|
+
thinking: {
|
|
203
|
+
...thinkingField,
|
|
204
|
+
budget_tokens: constants.TOOL_TURN_THINKING_BUDGET,
|
|
205
|
+
},
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
if (provider === _enum.Providers.VERTEXAI || provider === _enum.Providers.GOOGLE) {
|
|
211
|
+
const googleOpts = clientOptions;
|
|
212
|
+
if (googleOpts.thinkingConfig?.thinkingBudget != null &&
|
|
213
|
+
googleOpts.thinkingConfig.thinkingBudget > constants.TOOL_TURN_THINKING_BUDGET) {
|
|
214
|
+
return {
|
|
215
|
+
...googleOpts,
|
|
216
|
+
thinkingConfig: {
|
|
217
|
+
...googleOpts.thinkingConfig,
|
|
218
|
+
thinkingBudget: constants.TOOL_TURN_THINKING_BUDGET,
|
|
219
|
+
},
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return clientOptions;
|
|
224
|
+
}
|
|
104
225
|
/**
|
|
105
226
|
* Returns the normalized finish/stop reason from the last LLM invocation.
|
|
106
227
|
* Used by callers to detect when the response was truncated due to max_tokens.
|
|
@@ -137,7 +258,7 @@ class StandardGraph extends Graph {
|
|
|
137
258
|
return 'the past few hours';
|
|
138
259
|
}
|
|
139
260
|
else if (messageCount <= 300) {
|
|
140
|
-
return
|
|
261
|
+
return "roughly a day's worth";
|
|
141
262
|
}
|
|
142
263
|
else if (messageCount <= 700) {
|
|
143
264
|
return 'the past few days';
|
|
@@ -226,7 +347,7 @@ class StandardGraph extends Graph {
|
|
|
226
347
|
keyList.push('reasoning');
|
|
227
348
|
}
|
|
228
349
|
else if (agentContext.tokenTypeSwitch === 'content') {
|
|
229
|
-
keyList.push(
|
|
350
|
+
keyList.push(`post-reasoning-${agentContext.reasoningTransitionCount}`);
|
|
230
351
|
}
|
|
231
352
|
if (this.invokedToolIds != null && this.invokedToolIds.size > 0) {
|
|
232
353
|
keyList.push(this.invokedToolIds.size + '');
|
|
@@ -238,7 +359,9 @@ class StandardGraph extends Graph {
|
|
|
238
359
|
}
|
|
239
360
|
/* Misc.*/
|
|
240
361
|
getRunMessages() {
|
|
241
|
-
|
|
362
|
+
const result = this.messages.slice(this.startIndex);
|
|
363
|
+
console.debug(`[Graph] getRunMessages() | totalMessages=${this.messages.length} | startIndex=${this.startIndex} | runMessages=${result.length}`);
|
|
364
|
+
return result;
|
|
242
365
|
}
|
|
243
366
|
getContentParts() {
|
|
244
367
|
return core.convertMessagesToContent(this.messages.slice(this.startIndex));
|
|
@@ -351,26 +474,77 @@ class StandardGraph extends Graph {
|
|
|
351
474
|
if (eventDrivenMode) {
|
|
352
475
|
const schemaTools = schema.createSchemaOnlyTools(toolDefinitions);
|
|
353
476
|
const toolDefMap = new Map(toolDefinitions.map((def) => [def.name, def]));
|
|
477
|
+
const graphTools = agentContext?.graphTools;
|
|
478
|
+
const directToolNames = new Set();
|
|
479
|
+
const allTools = [...schemaTools];
|
|
480
|
+
const allToolMap = new Map(schemaTools.map((tool) => [tool.name, tool]));
|
|
481
|
+
if (graphTools && graphTools.length > 0) {
|
|
482
|
+
for (const tool of graphTools) {
|
|
483
|
+
if ('name' in tool) {
|
|
484
|
+
allTools.push(tool);
|
|
485
|
+
allToolMap.set(tool.name, tool);
|
|
486
|
+
directToolNames.add(tool.name);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
}
|
|
354
490
|
return new ToolNode.ToolNode({
|
|
355
|
-
tools:
|
|
356
|
-
toolMap:
|
|
357
|
-
toolCallStepIds: this.toolCallStepIds,
|
|
358
|
-
errorHandler: (data, metadata) => StandardGraph.handleToolCallErrorStatic(this, data, metadata),
|
|
359
|
-
toolRegistry: agentContext?.toolRegistry,
|
|
360
|
-
sessions: this.sessions,
|
|
491
|
+
tools: allTools,
|
|
492
|
+
toolMap: allToolMap,
|
|
361
493
|
eventDrivenMode: true,
|
|
494
|
+
sessions: this.sessions,
|
|
362
495
|
toolDefinitions: toolDefMap,
|
|
363
496
|
agentId: agentContext?.agentId,
|
|
497
|
+
toolCallStepIds: this.toolCallStepIds,
|
|
498
|
+
toolRegistry: agentContext?.toolRegistry,
|
|
499
|
+
directToolNames: directToolNames.size > 0 ? directToolNames : undefined,
|
|
500
|
+
streamingToolCallBuffer: this.streamingToolCallBuffer,
|
|
501
|
+
errorHandler: (data, metadata) => StandardGraph.handleToolCallErrorStatic(this, data, metadata),
|
|
364
502
|
toolApprovalConfig,
|
|
365
503
|
});
|
|
366
504
|
}
|
|
505
|
+
const graphTools = agentContext?.graphTools;
|
|
506
|
+
const baseTools = currentTools ?? [];
|
|
507
|
+
const allTraditionalTools = graphTools && graphTools.length > 0
|
|
508
|
+
? [...baseTools, ...graphTools]
|
|
509
|
+
: baseTools;
|
|
510
|
+
/**
|
|
511
|
+
* Build tool map from all sources: agent's toolMap, agent's tools array, and graph tools.
|
|
512
|
+
* Previously, baseTools were missing from the map when no explicit toolMap was provided,
|
|
513
|
+
* causing ToolNode to not find agent-defined tools (e.g., custom DynamicStructuredTools).
|
|
514
|
+
*/
|
|
515
|
+
const traditionalToolMap = graphTools && graphTools.length > 0
|
|
516
|
+
? new Map([
|
|
517
|
+
...(currentToolMap ?? new Map()),
|
|
518
|
+
...baseTools
|
|
519
|
+
.filter((t) => 'name' in t)
|
|
520
|
+
.map((t) => [t.name, t]),
|
|
521
|
+
...graphTools
|
|
522
|
+
.filter((t) => 'name' in t)
|
|
523
|
+
.map((t) => [t.name, t]),
|
|
524
|
+
])
|
|
525
|
+
: currentToolMap;
|
|
526
|
+
/** Build directToolNames from graph-managed tools (handoff/transfer) so HITL can bypass them */
|
|
527
|
+
let directToolNames;
|
|
528
|
+
if (graphTools && graphTools.length > 0) {
|
|
529
|
+
directToolNames = new Set();
|
|
530
|
+
for (const tool of graphTools) {
|
|
531
|
+
if ('name' in tool) {
|
|
532
|
+
directToolNames.add(tool.name);
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
if (directToolNames.size === 0) {
|
|
536
|
+
directToolNames = undefined;
|
|
537
|
+
}
|
|
538
|
+
}
|
|
367
539
|
return new ToolNode.ToolNode({
|
|
368
|
-
tools:
|
|
369
|
-
toolMap:
|
|
540
|
+
tools: allTraditionalTools,
|
|
541
|
+
toolMap: traditionalToolMap,
|
|
370
542
|
toolCallStepIds: this.toolCallStepIds,
|
|
543
|
+
streamingToolCallBuffer: this.streamingToolCallBuffer,
|
|
371
544
|
errorHandler: (data, metadata) => StandardGraph.handleToolCallErrorStatic(this, data, metadata),
|
|
372
545
|
toolRegistry: agentContext?.toolRegistry,
|
|
373
546
|
sessions: this.sessions,
|
|
547
|
+
directToolNames,
|
|
374
548
|
toolApprovalConfig,
|
|
375
549
|
});
|
|
376
550
|
}
|
|
@@ -427,25 +601,50 @@ class StandardGraph extends Graph {
|
|
|
427
601
|
}
|
|
428
602
|
}
|
|
429
603
|
/** Execute model invocation with streaming support */
|
|
430
|
-
async attemptInvoke({ currentModel, finalMessages, provider, tools, }, config) {
|
|
604
|
+
async attemptInvoke({ currentModel, finalMessages, provider, tools: _tools, }, config) {
|
|
431
605
|
const model = this.overrideModel ?? currentModel;
|
|
432
606
|
if (!model) {
|
|
433
607
|
throw new Error('No model found');
|
|
434
608
|
}
|
|
435
|
-
if (
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
609
|
+
if (model.stream) {
|
|
610
|
+
/**
|
|
611
|
+
* Process all model output through a local ChatModelStreamHandler in the
|
|
612
|
+
* graph execution context. Each chunk is awaited before the next one is
|
|
613
|
+
* consumed, so by the time the stream is exhausted every run step
|
|
614
|
+
* (MESSAGE_CREATION, TOOL_CALLS) has been created and toolCallStepIds is
|
|
615
|
+
* fully populated — the graph will not transition to ToolNode until this
|
|
616
|
+
* is done.
|
|
617
|
+
*
|
|
618
|
+
* This replaces the previous pattern where ChatModelStreamHandler lived
|
|
619
|
+
* in the for-await stream consumer (handler registry). That consumer
|
|
620
|
+
* runs concurrently with graph execution, so the graph could advance to
|
|
621
|
+
* ToolNode before the consumer had processed all events. By handling
|
|
622
|
+
* chunks here, inside the agent node, the race is eliminated.
|
|
623
|
+
*
|
|
624
|
+
* The for-await consumer no longer needs a ChatModelStreamHandler; its
|
|
625
|
+
* on_chat_model_stream events are simply ignored (no handler registered).
|
|
626
|
+
* The dispatched custom events (ON_RUN_STEP, ON_MESSAGE_DELTA, etc.)
|
|
627
|
+
* still reach the content aggregator and SSE handlers through the custom
|
|
628
|
+
* event callback in Run.createCustomEventCallback.
|
|
629
|
+
*/
|
|
630
|
+
const metadata = config?.metadata;
|
|
631
|
+
const streamHandler = new stream.ChatModelStreamHandler();
|
|
632
|
+
const stream$2 = await model.stream(finalMessages, config);
|
|
440
633
|
let finalChunk;
|
|
441
|
-
for await (const chunk of stream$
|
|
442
|
-
await
|
|
443
|
-
finalChunk = finalChunk ? stream.concat(finalChunk, chunk) : chunk;
|
|
634
|
+
for await (const chunk of stream$2) {
|
|
635
|
+
await streamHandler.handle(_enum.GraphEvents.CHAT_MODEL_STREAM, { chunk }, metadata, this);
|
|
636
|
+
finalChunk = finalChunk ? stream$1.concat(finalChunk, chunk) : chunk;
|
|
637
|
+
}
|
|
638
|
+
if (providers.manualToolStreamProviders.has(provider)) {
|
|
639
|
+
finalChunk = core.modifyDeltaProperties(provider, finalChunk);
|
|
640
|
+
}
|
|
641
|
+
if ((finalChunk?.tool_calls?.length ?? 0) > 0) {
|
|
642
|
+
finalChunk.tool_calls = finalChunk.tool_calls?.filter((tool_call) => !!tool_call.name);
|
|
444
643
|
}
|
|
445
|
-
finalChunk = core.modifyDeltaProperties(provider, finalChunk);
|
|
446
644
|
return { messages: [finalChunk] };
|
|
447
645
|
}
|
|
448
646
|
else {
|
|
647
|
+
/** Fallback for models without stream support. */
|
|
449
648
|
const finalMessage = await model.invoke(finalMessages, config);
|
|
450
649
|
if ((finalMessage.tool_calls?.length ?? 0) > 0) {
|
|
451
650
|
finalMessage.tool_calls = finalMessage.tool_calls?.filter((tool_call) => !!tool_call.name);
|
|
@@ -465,15 +664,12 @@ class StandardGraph extends Graph {
|
|
|
465
664
|
*/
|
|
466
665
|
async attemptStructuredInvoke({ currentModel, finalMessages, schema, structuredOutputConfig, provider, agentContext, }, config) {
|
|
467
666
|
const model = this.overrideModel ?? currentModel;
|
|
468
|
-
if (!model) {
|
|
469
|
-
throw new Error('No model found');
|
|
470
|
-
}
|
|
471
667
|
// Check if model supports withStructuredOutput
|
|
472
668
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
473
669
|
if (typeof model.withStructuredOutput !== 'function') {
|
|
474
|
-
throw new Error(
|
|
475
|
-
|
|
476
|
-
|
|
670
|
+
throw new Error('The selected model does not support structured output. ' +
|
|
671
|
+
'Please use a model that supports JSON schema output (e.g., OpenAI GPT-4, Anthropic Claude, Google Gemini) ' +
|
|
672
|
+
'or disable structured output for this agent.');
|
|
477
673
|
}
|
|
478
674
|
const { name = 'StructuredResponse', includeRaw: _includeRaw = false, handleErrors = true, maxRetries = 2, } = structuredOutputConfig;
|
|
479
675
|
// Resolve the structured output method using AgentContext's provider-aware logic
|
|
@@ -492,7 +688,8 @@ class StandardGraph extends Graph {
|
|
|
492
688
|
method = 'functionCalling';
|
|
493
689
|
}
|
|
494
690
|
else if (mode === 'provider') {
|
|
495
|
-
method =
|
|
691
|
+
method =
|
|
692
|
+
provider === _enum.Providers.BEDROCK ? 'functionCalling' : 'jsonMode';
|
|
496
693
|
}
|
|
497
694
|
else {
|
|
498
695
|
method = undefined;
|
|
@@ -500,11 +697,11 @@ class StandardGraph extends Graph {
|
|
|
500
697
|
}
|
|
501
698
|
// Prepare schema for provider-specific constraints when using native/jsonSchema mode
|
|
502
699
|
let preparedSchema = schema;
|
|
503
|
-
if (method === 'jsonSchema' && provider) {
|
|
700
|
+
if (method === 'jsonSchema' && provider != null) {
|
|
504
701
|
const { schema: prepared, warnings } = validate.prepareSchemaForProvider(schema, provider, structuredOutputConfig.strict !== false);
|
|
505
702
|
preparedSchema = prepared;
|
|
506
703
|
if (warnings.length > 0) {
|
|
507
|
-
console.
|
|
704
|
+
console.warn('[Graph] Schema preparation warnings:', warnings);
|
|
508
705
|
}
|
|
509
706
|
}
|
|
510
707
|
// Use withStructuredOutput to bind the schema
|
|
@@ -516,14 +713,6 @@ class StandardGraph extends Graph {
|
|
|
516
713
|
includeRaw: true, // Always true internally for debugging
|
|
517
714
|
strict: structuredOutputConfig.strict !== false,
|
|
518
715
|
});
|
|
519
|
-
console.log('[Graph] Structured output config:', {
|
|
520
|
-
name,
|
|
521
|
-
method,
|
|
522
|
-
provider,
|
|
523
|
-
schemaKeys: Object.keys(preparedSchema),
|
|
524
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
525
|
-
modelName: model.model || model.modelId || 'unknown',
|
|
526
|
-
});
|
|
527
716
|
let lastError;
|
|
528
717
|
let attempts = 0;
|
|
529
718
|
while (attempts <= maxRetries) {
|
|
@@ -531,18 +720,11 @@ class StandardGraph extends Graph {
|
|
|
531
720
|
// Note: We pass the original config here. The stream aggregator will filter out
|
|
532
721
|
// the synthetic "response" tool call events from withStructuredOutput()
|
|
533
722
|
const result = await structuredModel.invoke(finalMessages, config);
|
|
534
|
-
// Debug: log what we got back
|
|
535
|
-
console.log('[Graph] Structured output raw result type:', typeof result);
|
|
536
723
|
// Check for refusal or truncation in the raw message
|
|
537
|
-
if (result?.raw) {
|
|
724
|
+
if (result?.raw != null) {
|
|
538
725
|
const rawMsg = result.raw;
|
|
539
|
-
console.log('[Graph] Raw message content type:', typeof rawMsg?.content);
|
|
540
|
-
console.log('[Graph] Raw message tool_calls:', rawMsg?.tool_calls?.length ?? 0);
|
|
541
|
-
if (rawMsg?.content && typeof rawMsg.content === 'string' && rawMsg.content.length > 0) {
|
|
542
|
-
console.log('[Graph] Raw message text content (first 200):', rawMsg.content.substring(0, 200));
|
|
543
|
-
}
|
|
544
726
|
// Check stop reason for refusal or truncation
|
|
545
|
-
const responseMetadata = rawMsg.response_metadata
|
|
727
|
+
const responseMetadata = rawMsg.response_metadata;
|
|
546
728
|
const stopReason = responseMetadata.stop_reason ?? // Anthropic
|
|
547
729
|
responseMetadata.finish_reason ?? // OpenAI
|
|
548
730
|
responseMetadata.stopReason; // Bedrock
|
|
@@ -551,13 +733,14 @@ class StandardGraph extends Graph {
|
|
|
551
733
|
}
|
|
552
734
|
// Check for Anthropic refusal (stop_reason won't be 'refusal' but content may indicate it)
|
|
553
735
|
// OpenAI uses message.refusal field
|
|
554
|
-
const refusal = rawMsg
|
|
555
|
-
|
|
736
|
+
const refusal = rawMsg
|
|
737
|
+
.refusal;
|
|
738
|
+
if (refusal != null && refusal !== '') {
|
|
556
739
|
throw new graph$1.StructuredOutputRefusalError(refusal);
|
|
557
740
|
}
|
|
558
741
|
}
|
|
559
742
|
// Handle response - we always use includeRaw internally
|
|
560
|
-
if (result?.raw && result?.parsed !== undefined) {
|
|
743
|
+
if (result?.raw != null && result?.parsed !== undefined) {
|
|
561
744
|
return {
|
|
562
745
|
structuredResponse: result.parsed,
|
|
563
746
|
rawMessage: result.raw,
|
|
@@ -630,7 +813,9 @@ class StandardGraph extends Graph {
|
|
|
630
813
|
// Get a fresh model WITHOUT tools bound
|
|
631
814
|
// bindTools() returns RunnableBinding which lacks withStructuredOutput
|
|
632
815
|
// Also disable thinking mode - Anthropic/Bedrock doesn't allow tool_choice with thinking enabled
|
|
633
|
-
const structuredClientOptions = {
|
|
816
|
+
const structuredClientOptions = {
|
|
817
|
+
...agentContext.clientOptions,
|
|
818
|
+
};
|
|
634
819
|
// Determine if streaming is possible for this structured output mode
|
|
635
820
|
// Native/jsonSchema modes can stream; tool/functionCalling modes cannot (synthetic tool calls break UX)
|
|
636
821
|
const resolved = agentContext.resolveStructuredOutputMode();
|
|
@@ -648,12 +833,12 @@ class StandardGraph extends Graph {
|
|
|
648
833
|
// Remove thinking configuration for Bedrock
|
|
649
834
|
if (agentContext.provider === _enum.Providers.BEDROCK) {
|
|
650
835
|
const bedrockOpts = structuredClientOptions;
|
|
651
|
-
if (bedrockOpts.additionalModelRequestFields) {
|
|
652
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
836
|
+
if (bedrockOpts.additionalModelRequestFields != null) {
|
|
653
837
|
const additionalFields = Object.assign({}, bedrockOpts.additionalModelRequestFields);
|
|
654
838
|
delete additionalFields.thinking;
|
|
655
839
|
delete additionalFields.budgetTokens;
|
|
656
|
-
bedrockOpts.additionalModelRequestFields =
|
|
840
|
+
bedrockOpts.additionalModelRequestFields =
|
|
841
|
+
additionalFields;
|
|
657
842
|
}
|
|
658
843
|
}
|
|
659
844
|
// Remove thinking configuration for Anthropic direct API
|
|
@@ -717,7 +902,8 @@ class StandardGraph extends Graph {
|
|
|
717
902
|
// This keeps the system message static (cacheable) while providing dynamic context
|
|
718
903
|
// (timestamps, user info, tool context) as conversation content instead.
|
|
719
904
|
// Only inject on the first turn when messages don't already have the context marker.
|
|
720
|
-
if (agentContext.dynamicContext &&
|
|
905
|
+
if (agentContext.dynamicContext != null &&
|
|
906
|
+
agentContext.dynamicContext !== '' &&
|
|
721
907
|
messages$1.length > 0 &&
|
|
722
908
|
!messages$1.some((m) => m instanceof messages.HumanMessage &&
|
|
723
909
|
typeof m.content === 'string' &&
|
|
@@ -736,11 +922,20 @@ class StandardGraph extends Graph {
|
|
|
736
922
|
agentContext.markToolsAsDiscovered(discoveredNames);
|
|
737
923
|
}
|
|
738
924
|
const toolsForBinding = agentContext.getToolsForBinding();
|
|
925
|
+
// PERF: Detect subsequent ReAct iterations (tool results present in messages)
|
|
926
|
+
// and reduce thinking budget to minimize per-iteration latency.
|
|
927
|
+
// First iteration gets the user's configured budget; follow-up turns
|
|
928
|
+
// use TOOL_TURN_THINKING_BUDGET (1024) since they only need to route
|
|
929
|
+
// "call next tool" or "produce final response".
|
|
930
|
+
const isSubsequentIteration = messages$1.some((m) => m._getType() === 'tool');
|
|
931
|
+
const effectiveClientOptions = isSubsequentIteration && agentContext.clientOptions
|
|
932
|
+
? this.getAdaptiveClientOptions(agentContext.clientOptions, agentContext.provider)
|
|
933
|
+
: agentContext.clientOptions;
|
|
739
934
|
let model = this.overrideModel ??
|
|
740
935
|
this.initializeModel({
|
|
741
936
|
tools: toolsForBinding,
|
|
742
937
|
provider: agentContext.provider,
|
|
743
|
-
clientOptions:
|
|
938
|
+
clientOptions: effectiveClientOptions,
|
|
744
939
|
});
|
|
745
940
|
if (agentContext.systemRunnable) {
|
|
746
941
|
model = agentContext.systemRunnable.pipe(model);
|
|
@@ -767,7 +962,7 @@ class StandardGraph extends Graph {
|
|
|
767
962
|
: '';
|
|
768
963
|
return toolName === 'task';
|
|
769
964
|
});
|
|
770
|
-
if (hasTaskToolPrePrune &&
|
|
965
|
+
if (hasTaskToolPrePrune === true &&
|
|
771
966
|
agentContext.tokenCounter &&
|
|
772
967
|
agentContext.maxContextTokens != null) {
|
|
773
968
|
// Estimate total tokens in messages BEFORE pruning
|
|
@@ -776,12 +971,12 @@ class StandardGraph extends Graph {
|
|
|
776
971
|
prePruneTokens += agentContext.tokenCounter(msg);
|
|
777
972
|
}
|
|
778
973
|
// Add instruction tokens (system prompt)
|
|
779
|
-
prePruneTokens += agentContext.instructionTokens
|
|
974
|
+
prePruneTokens += agentContext.instructionTokens;
|
|
780
975
|
const prePruneUtilization = (prePruneTokens / agentContext.maxContextTokens) * 100;
|
|
781
976
|
if (prePruneUtilization > 70) {
|
|
782
977
|
console.warn(`[Graph] PRE-PRUNE delegation check: ${prePruneUtilization.toFixed(1)}% utilization ` +
|
|
783
978
|
`(${prePruneTokens}/${agentContext.maxContextTokens} tokens). ` +
|
|
784
|
-
|
|
979
|
+
'Injecting delegation hint INSTEAD of pruning.');
|
|
785
980
|
delegationInjectedPrePrune = true;
|
|
786
981
|
}
|
|
787
982
|
}
|
|
@@ -808,6 +1003,7 @@ class StandardGraph extends Graph {
|
|
|
808
1003
|
});
|
|
809
1004
|
}
|
|
810
1005
|
if (agentContext.pruneMessages && !delegationInjectedPrePrune) {
|
|
1006
|
+
console.info(`[Graph:ContextMgmt] Pruning messages | inputCount=${messages$1.length} | maxTokens=${agentContext.maxContextTokens}`);
|
|
811
1007
|
const { context, indexTokenCountMap, messagesToRefine } = agentContext.pruneMessages({
|
|
812
1008
|
messages: messages$1,
|
|
813
1009
|
usageMetadata: agentContext.currentUsage,
|
|
@@ -815,11 +1011,14 @@ class StandardGraph extends Graph {
|
|
|
815
1011
|
});
|
|
816
1012
|
agentContext.indexTokenCountMap = indexTokenCountMap;
|
|
817
1013
|
messagesToUse = context;
|
|
1014
|
+
console.info(`[Graph:ContextMgmt] Pruned | kept=${context.length} | discarded=${messagesToRefine.length} | originalCount=${messages$1.length}`);
|
|
818
1015
|
// Summarize discarded messages if callback provided
|
|
819
|
-
if (messagesToRefine
|
|
1016
|
+
if (messagesToRefine.length > 0 && agentContext.summarizeCallback) {
|
|
1017
|
+
console.info(`[Graph:ContextMgmt] Summarizing ${messagesToRefine.length} discarded messages`);
|
|
820
1018
|
try {
|
|
821
1019
|
const summary = await agentContext.summarizeCallback(messagesToRefine);
|
|
822
|
-
|
|
1020
|
+
console.info(`[Graph:ContextMgmt] Summary received | len=${summary?.length ?? 0} | hasContent=${summary != null && summary !== ''}`);
|
|
1021
|
+
if (summary != null && summary !== '') {
|
|
823
1022
|
const summaryMsg = new messages.SystemMessage(`[Conversation Summary]\n${summary}`);
|
|
824
1023
|
// Insert after system message (if present), before conversation messages
|
|
825
1024
|
const systemIdx = messagesToUse[0]?.getType() === 'system' ? 1 : 0;
|
|
@@ -828,6 +1027,7 @@ class StandardGraph extends Graph {
|
|
|
828
1027
|
summaryMsg,
|
|
829
1028
|
...messagesToUse.slice(systemIdx),
|
|
830
1029
|
];
|
|
1030
|
+
console.info(`[Graph:ContextMgmt] Summary injected at index ${systemIdx} | finalMsgCount=${messagesToUse.length}`);
|
|
831
1031
|
}
|
|
832
1032
|
}
|
|
833
1033
|
catch (err) {
|
|
@@ -926,10 +1126,10 @@ class StandardGraph extends Graph {
|
|
|
926
1126
|
}
|
|
927
1127
|
// Get model info for analytics
|
|
928
1128
|
const bedrockOpts = agentContext.clientOptions;
|
|
929
|
-
const modelId = bedrockOpts?.model
|
|
1129
|
+
const modelId = bedrockOpts?.model ??
|
|
930
1130
|
agentContext.clientOptions
|
|
931
1131
|
?.modelName;
|
|
932
|
-
const thinkingConfig = bedrockOpts?.additionalModelRequestFields?.['thinking']
|
|
1132
|
+
const thinkingConfig = bedrockOpts?.additionalModelRequestFields?.['thinking'] ??
|
|
933
1133
|
agentContext.clientOptions
|
|
934
1134
|
?.thinking;
|
|
935
1135
|
// Build and emit context analytics for traces
|
|
@@ -968,7 +1168,7 @@ class StandardGraph extends Graph {
|
|
|
968
1168
|
: '';
|
|
969
1169
|
return toolName === 'task';
|
|
970
1170
|
});
|
|
971
|
-
if (hasTaskToolInContext &&
|
|
1171
|
+
if (hasTaskToolInContext === true &&
|
|
972
1172
|
contextAnalytics$1.utilizationPercent != null &&
|
|
973
1173
|
contextAnalytics$1.maxContextTokens != null) {
|
|
974
1174
|
const utilization = contextAnalytics$1.utilizationPercent;
|
|
@@ -985,10 +1185,12 @@ class StandardGraph extends Graph {
|
|
|
985
1185
|
const content = typeof msg.content === 'string'
|
|
986
1186
|
? msg.content
|
|
987
1187
|
: Array.isArray(msg.content)
|
|
988
|
-
? msg.content
|
|
1188
|
+
? msg.content
|
|
1189
|
+
.map((p) => {
|
|
989
1190
|
const part = p;
|
|
990
|
-
return String(part.text
|
|
991
|
-
})
|
|
1191
|
+
return String(part.text ?? part.content ?? '');
|
|
1192
|
+
})
|
|
1193
|
+
.join(' ')
|
|
992
1194
|
: '';
|
|
993
1195
|
// Pattern 1: # "filename" headers in attached document blocks
|
|
994
1196
|
const docMatches = content.match(/# "([^"]+)"/g);
|
|
@@ -1004,7 +1206,10 @@ class StandardGraph extends Graph {
|
|
|
1004
1206
|
// Pattern 2: "The user has attached: **file1, file2**" (embedded files)
|
|
1005
1207
|
const attachedMatch = content.match(/user has attached:\s*\*\*([^*]+)\*\*/i);
|
|
1006
1208
|
if (attachedMatch) {
|
|
1007
|
-
const names = attachedMatch[1]
|
|
1209
|
+
const names = attachedMatch[1]
|
|
1210
|
+
.split(',')
|
|
1211
|
+
.map((n) => n.trim())
|
|
1212
|
+
.filter(Boolean);
|
|
1008
1213
|
for (const name of names) {
|
|
1009
1214
|
if (!documentNames.includes(name)) {
|
|
1010
1215
|
documentNames.push(name);
|
|
@@ -1019,16 +1224,16 @@ class StandardGraph extends Graph {
|
|
|
1019
1224
|
`hasTaskTool: true | messages: ${finalMessages.length} | docs: ${documentCount}`);
|
|
1020
1225
|
// TRIGGER 1: Multi-document delegation (3+ documents detected)
|
|
1021
1226
|
// Only inject on first iteration (no AI messages yet = agent hasn't responded)
|
|
1022
|
-
const hasAiResponse = finalMessages.some((m) => m._getType
|
|
1227
|
+
const hasAiResponse = finalMessages.some((m) => m._getType() === 'ai' || m._getType() === 'tool');
|
|
1023
1228
|
if (documentCount >= 3 && !hasAiResponse) {
|
|
1024
1229
|
const pressureMsg = new messages.HumanMessage({
|
|
1025
1230
|
content: `[MULTI-DOCUMENT PROCESSING — ${documentCount} documents detected]\n` +
|
|
1026
1231
|
`Documents: ${documentNames.join(', ')}\n\n` +
|
|
1027
1232
|
`You have ${documentCount} documents attached. For thorough analysis, use the "task" tool ` +
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1233
|
+
'to delegate each document (or group of related documents) to a sub-agent.\n' +
|
|
1234
|
+
'Each sub-agent has its own fresh context window and can use file_search to retrieve the full document content.\n' +
|
|
1235
|
+
'After all sub-agents complete, synthesize their results into a comprehensive response.\n\n' +
|
|
1236
|
+
'This approach ensures each document gets full attention without context limitations.',
|
|
1032
1237
|
});
|
|
1033
1238
|
finalMessages = [...finalMessages, pressureMsg];
|
|
1034
1239
|
console.info(`[Graph] Multi-document delegation hint injected for ${documentCount} documents: ` +
|
|
@@ -1036,14 +1241,15 @@ class StandardGraph extends Graph {
|
|
|
1036
1241
|
}
|
|
1037
1242
|
// TRIGGER 2: Token utilization thresholds (mid-chain safety net)
|
|
1038
1243
|
// Also fires when we skipped pruning due to delegationInjectedPrePrune
|
|
1039
|
-
if (utilization > 85 ||
|
|
1244
|
+
if (utilization > 85 ||
|
|
1245
|
+
(delegationInjectedPrePrune && utilization > 50)) {
|
|
1040
1246
|
// CRITICAL: Context is high — MANDATE delegation
|
|
1041
1247
|
const pressureMsg = new messages.HumanMessage({
|
|
1042
1248
|
content: `[CONTEXT BUDGET CRITICAL — ${utilization.toFixed(0)}% used]\n` +
|
|
1043
1249
|
`You have used ${totalTokens} of ${maxTokens} tokens (${remainingTokens} remaining).\n` +
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1250
|
+
'Your context is very large. You MUST use the "task" tool to delegate work to sub-agents.\n' +
|
|
1251
|
+
'Each sub-agent runs in its own fresh context window and can use file_search to access documents.\n' +
|
|
1252
|
+
'Do NOT attempt to process documents directly — delegate each document to a sub-agent, then synthesize results.',
|
|
1047
1253
|
});
|
|
1048
1254
|
finalMessages = [...finalMessages, pressureMsg];
|
|
1049
1255
|
console.warn(`[Graph] Context pressure CRITICAL (${utilization.toFixed(0)}%): ` +
|
|
@@ -1055,8 +1261,8 @@ class StandardGraph extends Graph {
|
|
|
1055
1261
|
const pressureMsg = new messages.HumanMessage({
|
|
1056
1262
|
content: `[CONTEXT BUDGET WARNING — ${utilization.toFixed(0)}% used]\n` +
|
|
1057
1263
|
`You have used ${totalTokens} of ${maxTokens} tokens (${remainingTokens} remaining).\n` +
|
|
1058
|
-
|
|
1059
|
-
|
|
1264
|
+
'Your context is filling up. Consider using the "task" tool to delegate complex operations to sub-agents.\n' +
|
|
1265
|
+
"Sub-agents run in fresh context windows and won't consume your remaining budget.",
|
|
1060
1266
|
});
|
|
1061
1267
|
finalMessages = [...finalMessages, pressureMsg];
|
|
1062
1268
|
console.info(`[Graph] Context pressure WARNING (${utilization.toFixed(0)}%): ` +
|
|
@@ -1095,7 +1301,7 @@ class StandardGraph extends Graph {
|
|
|
1095
1301
|
}
|
|
1096
1302
|
catch (primaryError) {
|
|
1097
1303
|
// Check if this is a "input too long" error from Bedrock/Anthropic
|
|
1098
|
-
const errorMessage = primaryError.message.toLowerCase()
|
|
1304
|
+
const errorMessage = primaryError.message.toLowerCase();
|
|
1099
1305
|
const isInputTooLongError = errorMessage.includes('too long') ||
|
|
1100
1306
|
errorMessage.includes('input is too long') ||
|
|
1101
1307
|
errorMessage.includes('context length') ||
|
|
@@ -1115,7 +1321,9 @@ class StandardGraph extends Graph {
|
|
|
1115
1321
|
}
|
|
1116
1322
|
// If input too long and we have pruning capability OR tokenCounter, retry with progressively more aggressive pruning
|
|
1117
1323
|
// Note: We can create emergency pruneMessages dynamically if we have tokenCounter and maxContextTokens
|
|
1118
|
-
const canPrune = agentContext.tokenCounter &&
|
|
1324
|
+
const canPrune = agentContext.tokenCounter != null &&
|
|
1325
|
+
agentContext.maxContextTokens != null &&
|
|
1326
|
+
agentContext.maxContextTokens > 0;
|
|
1119
1327
|
if (isInputTooLongError && canPrune) {
|
|
1120
1328
|
// Progressive reduction: 50% -> 25% -> 10% of original context
|
|
1121
1329
|
const reductionLevels = [0.5, 0.25, 0.1];
|
|
@@ -1203,7 +1411,7 @@ If I seem to be missing something we discussed earlier, just give me a quick rem
|
|
|
1203
1411
|
console.info(`[Graph] ✅ Retry successful at ${reductionFactor * 100}% with ${reducedMessages.length} messages (reduced from ${finalMessages.length})`);
|
|
1204
1412
|
}
|
|
1205
1413
|
catch (retryError) {
|
|
1206
|
-
const retryErrorMsg = retryError.message.toLowerCase()
|
|
1414
|
+
const retryErrorMsg = retryError.message.toLowerCase();
|
|
1207
1415
|
const stillTooLong = retryErrorMsg.includes('too long') ||
|
|
1208
1416
|
retryErrorMsg.includes('context length') ||
|
|
1209
1417
|
retryErrorMsg.includes('validationexception');
|
|
@@ -1252,6 +1460,101 @@ If I seem to be missing something we discussed earlier, just give me a quick rem
|
|
|
1252
1460
|
if (!result) {
|
|
1253
1461
|
throw new Error('No result after model invocation');
|
|
1254
1462
|
}
|
|
1463
|
+
/**
|
|
1464
|
+
* Fallback: populate toolCallStepIds in the graph execution context.
|
|
1465
|
+
*
|
|
1466
|
+
* When model.stream() is available (the common case), attemptInvoke
|
|
1467
|
+
* processes all chunks through a local ChatModelStreamHandler which
|
|
1468
|
+
* creates run steps and populates toolCallStepIds before returning.
|
|
1469
|
+
* The code below is a fallback for the rare case where model.stream
|
|
1470
|
+
* is unavailable and model.invoke() was used instead.
|
|
1471
|
+
*
|
|
1472
|
+
* Text content is dispatched FIRST so that MESSAGE_CREATION is the
|
|
1473
|
+
* current step when handleToolCalls runs. handleToolCalls then creates
|
|
1474
|
+
* TOOL_CALLS on top of it. The dedup in getMessageId and
|
|
1475
|
+
* toolCallStepIds.has makes this safe when attemptInvoke already
|
|
1476
|
+
* handled everything — both paths become no-ops.
|
|
1477
|
+
*/
|
|
1478
|
+
const responseMessage = result.messages?.[0];
|
|
1479
|
+
const toolCalls = responseMessage
|
|
1480
|
+
?.tool_calls;
|
|
1481
|
+
const hasToolCalls = Array.isArray(toolCalls) && toolCalls.length > 0;
|
|
1482
|
+
if (hasToolCalls) {
|
|
1483
|
+
const metadata = config.metadata;
|
|
1484
|
+
const stepKey = this.getStepKey(metadata);
|
|
1485
|
+
const content = responseMessage?.content;
|
|
1486
|
+
const hasTextContent = content != null &&
|
|
1487
|
+
(typeof content === 'string'
|
|
1488
|
+
? content !== ''
|
|
1489
|
+
: Array.isArray(content) && content.length > 0);
|
|
1490
|
+
/**
|
|
1491
|
+
* Dispatch text content BEFORE creating TOOL_CALLS steps.
|
|
1492
|
+
* getMessageId returns a new ID only on the first call for a step key;
|
|
1493
|
+
* if the for-await consumer already claimed it, this is a no-op.
|
|
1494
|
+
*/
|
|
1495
|
+
if (hasTextContent) {
|
|
1496
|
+
const messageId = ids.getMessageId(stepKey, this) ?? '';
|
|
1497
|
+
if (messageId) {
|
|
1498
|
+
await this.dispatchRunStep(stepKey, {
|
|
1499
|
+
type: _enum.StepTypes.MESSAGE_CREATION,
|
|
1500
|
+
message_creation: { message_id: messageId },
|
|
1501
|
+
}, metadata);
|
|
1502
|
+
const stepId = this.getStepIdByKey(stepKey);
|
|
1503
|
+
if (typeof content === 'string') {
|
|
1504
|
+
await this.dispatchMessageDelta(stepId, {
|
|
1505
|
+
content: [{ type: _enum.ContentTypes.TEXT, text: content }],
|
|
1506
|
+
});
|
|
1507
|
+
}
|
|
1508
|
+
else if (Array.isArray(content) &&
|
|
1509
|
+
content.every((c) => typeof c === 'object' &&
|
|
1510
|
+
'type' in c &&
|
|
1511
|
+
typeof c.type === 'string' &&
|
|
1512
|
+
c.type.startsWith('text'))) {
|
|
1513
|
+
await this.dispatchMessageDelta(stepId, {
|
|
1514
|
+
content: content,
|
|
1515
|
+
});
|
|
1516
|
+
}
|
|
1517
|
+
}
|
|
1518
|
+
}
|
|
1519
|
+
await handlers.handleToolCalls(toolCalls, metadata, this);
|
|
1520
|
+
}
|
|
1521
|
+
/**
|
|
1522
|
+
* When streaming is disabled, on_chat_model_stream events are never
|
|
1523
|
+
* emitted so ChatModelStreamHandler never fires. Dispatch the text
|
|
1524
|
+
* content as MESSAGE_CREATION + MESSAGE_DELTA here.
|
|
1525
|
+
*/
|
|
1526
|
+
const disableStreaming = agentContext.clientOptions
|
|
1527
|
+
?.disableStreaming === true;
|
|
1528
|
+
if (disableStreaming &&
|
|
1529
|
+
!hasToolCalls &&
|
|
1530
|
+
responseMessage != null &&
|
|
1531
|
+
responseMessage.content != null) {
|
|
1532
|
+
const metadata = config.metadata;
|
|
1533
|
+
const stepKey = this.getStepKey(metadata);
|
|
1534
|
+
const messageId = ids.getMessageId(stepKey, this) ?? '';
|
|
1535
|
+
if (messageId) {
|
|
1536
|
+
await this.dispatchRunStep(stepKey, {
|
|
1537
|
+
type: _enum.StepTypes.MESSAGE_CREATION,
|
|
1538
|
+
message_creation: { message_id: messageId },
|
|
1539
|
+
}, metadata);
|
|
1540
|
+
const stepId = this.getStepIdByKey(stepKey);
|
|
1541
|
+
const content = responseMessage.content;
|
|
1542
|
+
if (typeof content === 'string') {
|
|
1543
|
+
await this.dispatchMessageDelta(stepId, {
|
|
1544
|
+
content: [{ type: _enum.ContentTypes.TEXT, text: content }],
|
|
1545
|
+
});
|
|
1546
|
+
}
|
|
1547
|
+
else if (Array.isArray(content) &&
|
|
1548
|
+
content.every((c) => typeof c === 'object' &&
|
|
1549
|
+
'type' in c &&
|
|
1550
|
+
typeof c.type === 'string' &&
|
|
1551
|
+
c.type.startsWith('text'))) {
|
|
1552
|
+
await this.dispatchMessageDelta(stepId, {
|
|
1553
|
+
content: content,
|
|
1554
|
+
});
|
|
1555
|
+
}
|
|
1556
|
+
}
|
|
1557
|
+
}
|
|
1255
1558
|
agentContext.currentUsage = this.getUsageMetadata(result.messages?.[0]);
|
|
1256
1559
|
// Extract and normalize the LLM's finish/stop reason for auto-continuation support
|
|
1257
1560
|
const finalMsg = result.messages?.[0];
|
|
@@ -1264,21 +1567,19 @@ If I seem to be missing something we discussed earlier, just give me a quick rem
|
|
|
1264
1567
|
meta.stop_reason ?? // Anthropic direct API
|
|
1265
1568
|
meta.stopReason ?? // Bedrock invoke (non-streaming)
|
|
1266
1569
|
messageStop?.stopReason ?? // Bedrock streaming
|
|
1267
|
-
meta.finishReason
|
|
1268
|
-
undefined;
|
|
1570
|
+
meta.finishReason; // VertexAI/Google
|
|
1269
1571
|
}
|
|
1270
1572
|
this.cleanupSignalListener();
|
|
1271
1573
|
// DEFERRED STRUCTURED OUTPUT: When the agent has tools AND structured output configured,
|
|
1272
1574
|
// we let the agent use tools normally via attemptInvoke(). Once the agent's response
|
|
1273
1575
|
// has NO tool_calls (it's done with tools), we produce the final structured JSON response.
|
|
1274
1576
|
if (agentContext.isStructuredOutputMode &&
|
|
1275
|
-
agentContext.structuredOutput
|
|
1276
|
-
result) {
|
|
1577
|
+
agentContext.structuredOutput != null) {
|
|
1277
1578
|
const lastMessage = result.messages?.[0];
|
|
1278
|
-
const resultHasToolCalls = lastMessage &&
|
|
1579
|
+
const resultHasToolCalls = lastMessage != null &&
|
|
1279
1580
|
'tool_calls' in lastMessage &&
|
|
1280
1581
|
(lastMessage.tool_calls?.length ?? 0) > 0;
|
|
1281
|
-
if (
|
|
1582
|
+
if (resultHasToolCalls !== true) {
|
|
1282
1583
|
try {
|
|
1283
1584
|
// Build messages for structured output: include the full conversation
|
|
1284
1585
|
// plus the agent's text response from attemptInvoke, so the structured
|
|
@@ -1360,6 +1661,10 @@ If I seem to be missing something we discussed earlier, just give me a quick rem
|
|
|
1360
1661
|
reducer: (a, b) => {
|
|
1361
1662
|
if (!a.length) {
|
|
1362
1663
|
this.startIndex = a.length + b.length;
|
|
1664
|
+
console.info(`[Graph:Reducer] Initial messages | startIndex=${this.startIndex} | inputMsgCount=${b.length}`);
|
|
1665
|
+
}
|
|
1666
|
+
else {
|
|
1667
|
+
console.debug(`[Graph:Reducer] Appending messages | existing=${a.length} | new=${b.length} | startIndex=${this.startIndex}`);
|
|
1363
1668
|
}
|
|
1364
1669
|
const result = langgraph.messagesStateReducer(a, b);
|
|
1365
1670
|
this.messages = result;
|