@illuma-ai/agents 1.0.81
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/README.md +485 -0
- package/dist/cjs/agents/AgentContext.cjs +734 -0
- package/dist/cjs/agents/AgentContext.cjs.map +1 -0
- package/dist/cjs/common/enum.cjs +190 -0
- package/dist/cjs/common/enum.cjs.map +1 -0
- package/dist/cjs/events.cjs +172 -0
- package/dist/cjs/events.cjs.map +1 -0
- package/dist/cjs/graphs/Graph.cjs +1615 -0
- package/dist/cjs/graphs/Graph.cjs.map +1 -0
- package/dist/cjs/graphs/MultiAgentGraph.cjs +890 -0
- package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -0
- package/dist/cjs/instrumentation.cjs +21 -0
- package/dist/cjs/instrumentation.cjs.map +1 -0
- package/dist/cjs/llm/anthropic/index.cjs +292 -0
- package/dist/cjs/llm/anthropic/index.cjs.map +1 -0
- package/dist/cjs/llm/anthropic/types.cjs +50 -0
- package/dist/cjs/llm/anthropic/types.cjs.map +1 -0
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +630 -0
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -0
- package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +218 -0
- package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -0
- package/dist/cjs/llm/anthropic/utils/tools.cjs +29 -0
- package/dist/cjs/llm/anthropic/utils/tools.cjs.map +1 -0
- package/dist/cjs/llm/bedrock/index.cjs +282 -0
- package/dist/cjs/llm/bedrock/index.cjs.map +1 -0
- package/dist/cjs/llm/fake.cjs +97 -0
- package/dist/cjs/llm/fake.cjs.map +1 -0
- package/dist/cjs/llm/google/index.cjs +216 -0
- package/dist/cjs/llm/google/index.cjs.map +1 -0
- package/dist/cjs/llm/google/utils/common.cjs +647 -0
- package/dist/cjs/llm/google/utils/common.cjs.map +1 -0
- package/dist/cjs/llm/openai/index.cjs +1028 -0
- package/dist/cjs/llm/openai/index.cjs.map +1 -0
- package/dist/cjs/llm/openai/utils/index.cjs +765 -0
- package/dist/cjs/llm/openai/utils/index.cjs.map +1 -0
- package/dist/cjs/llm/openrouter/index.cjs +212 -0
- package/dist/cjs/llm/openrouter/index.cjs.map +1 -0
- package/dist/cjs/llm/providers.cjs +43 -0
- package/dist/cjs/llm/providers.cjs.map +1 -0
- package/dist/cjs/llm/text.cjs +69 -0
- package/dist/cjs/llm/text.cjs.map +1 -0
- package/dist/cjs/llm/vertexai/index.cjs +329 -0
- package/dist/cjs/llm/vertexai/index.cjs.map +1 -0
- package/dist/cjs/main.cjs +240 -0
- package/dist/cjs/main.cjs.map +1 -0
- package/dist/cjs/messages/cache.cjs +387 -0
- package/dist/cjs/messages/cache.cjs.map +1 -0
- package/dist/cjs/messages/content.cjs +53 -0
- package/dist/cjs/messages/content.cjs.map +1 -0
- package/dist/cjs/messages/core.cjs +367 -0
- package/dist/cjs/messages/core.cjs.map +1 -0
- package/dist/cjs/messages/format.cjs +761 -0
- package/dist/cjs/messages/format.cjs.map +1 -0
- package/dist/cjs/messages/ids.cjs +23 -0
- package/dist/cjs/messages/ids.cjs.map +1 -0
- package/dist/cjs/messages/prune.cjs +398 -0
- package/dist/cjs/messages/prune.cjs.map +1 -0
- package/dist/cjs/messages/tools.cjs +96 -0
- package/dist/cjs/messages/tools.cjs.map +1 -0
- package/dist/cjs/run.cjs +328 -0
- package/dist/cjs/run.cjs.map +1 -0
- package/dist/cjs/schemas/validate.cjs +324 -0
- package/dist/cjs/schemas/validate.cjs.map +1 -0
- package/dist/cjs/splitStream.cjs +210 -0
- package/dist/cjs/splitStream.cjs.map +1 -0
- package/dist/cjs/stream.cjs +620 -0
- package/dist/cjs/stream.cjs.map +1 -0
- package/dist/cjs/tools/BrowserTools.cjs +248 -0
- package/dist/cjs/tools/BrowserTools.cjs.map +1 -0
- package/dist/cjs/tools/Calculator.cjs +66 -0
- package/dist/cjs/tools/Calculator.cjs.map +1 -0
- package/dist/cjs/tools/CodeExecutor.cjs +234 -0
- package/dist/cjs/tools/CodeExecutor.cjs.map +1 -0
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs +636 -0
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -0
- package/dist/cjs/tools/ToolNode.cjs +548 -0
- package/dist/cjs/tools/ToolNode.cjs.map +1 -0
- package/dist/cjs/tools/ToolSearch.cjs +909 -0
- package/dist/cjs/tools/ToolSearch.cjs.map +1 -0
- package/dist/cjs/tools/handlers.cjs +255 -0
- package/dist/cjs/tools/handlers.cjs.map +1 -0
- package/dist/cjs/tools/schema.cjs +31 -0
- package/dist/cjs/tools/schema.cjs.map +1 -0
- package/dist/cjs/tools/search/anthropic.cjs +40 -0
- package/dist/cjs/tools/search/anthropic.cjs.map +1 -0
- package/dist/cjs/tools/search/content.cjs +140 -0
- package/dist/cjs/tools/search/content.cjs.map +1 -0
- package/dist/cjs/tools/search/firecrawl.cjs +179 -0
- package/dist/cjs/tools/search/firecrawl.cjs.map +1 -0
- package/dist/cjs/tools/search/format.cjs +203 -0
- package/dist/cjs/tools/search/format.cjs.map +1 -0
- package/dist/cjs/tools/search/highlights.cjs +245 -0
- package/dist/cjs/tools/search/highlights.cjs.map +1 -0
- package/dist/cjs/tools/search/rerankers.cjs +174 -0
- package/dist/cjs/tools/search/rerankers.cjs.map +1 -0
- package/dist/cjs/tools/search/schema.cjs +117 -0
- package/dist/cjs/tools/search/schema.cjs.map +1 -0
- package/dist/cjs/tools/search/search.cjs +566 -0
- package/dist/cjs/tools/search/search.cjs.map +1 -0
- package/dist/cjs/tools/search/serper-scraper.cjs +132 -0
- package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -0
- package/dist/cjs/tools/search/tool.cjs +456 -0
- package/dist/cjs/tools/search/tool.cjs.map +1 -0
- package/dist/cjs/tools/search/utils.cjs +66 -0
- package/dist/cjs/tools/search/utils.cjs.map +1 -0
- package/dist/cjs/types/graph.cjs +29 -0
- package/dist/cjs/types/graph.cjs.map +1 -0
- package/dist/cjs/utils/contextAnalytics.cjs +66 -0
- package/dist/cjs/utils/contextAnalytics.cjs.map +1 -0
- package/dist/cjs/utils/events.cjs +31 -0
- package/dist/cjs/utils/events.cjs.map +1 -0
- package/dist/cjs/utils/graph.cjs +16 -0
- package/dist/cjs/utils/graph.cjs.map +1 -0
- package/dist/cjs/utils/handlers.cjs +70 -0
- package/dist/cjs/utils/handlers.cjs.map +1 -0
- package/dist/cjs/utils/llm.cjs +27 -0
- package/dist/cjs/utils/llm.cjs.map +1 -0
- package/dist/cjs/utils/misc.cjs +56 -0
- package/dist/cjs/utils/misc.cjs.map +1 -0
- package/dist/cjs/utils/run.cjs +73 -0
- package/dist/cjs/utils/run.cjs.map +1 -0
- package/dist/cjs/utils/schema.cjs +27 -0
- package/dist/cjs/utils/schema.cjs.map +1 -0
- package/dist/cjs/utils/title.cjs +125 -0
- package/dist/cjs/utils/title.cjs.map +1 -0
- package/dist/cjs/utils/tokens.cjs +125 -0
- package/dist/cjs/utils/tokens.cjs.map +1 -0
- package/dist/cjs/utils/toonFormat.cjs +388 -0
- package/dist/cjs/utils/toonFormat.cjs.map +1 -0
- package/dist/esm/agents/AgentContext.mjs +732 -0
- package/dist/esm/agents/AgentContext.mjs.map +1 -0
- package/dist/esm/common/enum.mjs +190 -0
- package/dist/esm/common/enum.mjs.map +1 -0
- package/dist/esm/events.mjs +164 -0
- package/dist/esm/events.mjs.map +1 -0
- package/dist/esm/graphs/Graph.mjs +1612 -0
- package/dist/esm/graphs/Graph.mjs.map +1 -0
- package/dist/esm/graphs/MultiAgentGraph.mjs +888 -0
- package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -0
- package/dist/esm/instrumentation.mjs +19 -0
- package/dist/esm/instrumentation.mjs.map +1 -0
- package/dist/esm/llm/anthropic/index.mjs +290 -0
- package/dist/esm/llm/anthropic/index.mjs.map +1 -0
- package/dist/esm/llm/anthropic/types.mjs +48 -0
- package/dist/esm/llm/anthropic/types.mjs.map +1 -0
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs +627 -0
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -0
- package/dist/esm/llm/anthropic/utils/message_outputs.mjs +216 -0
- package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -0
- package/dist/esm/llm/anthropic/utils/tools.mjs +27 -0
- package/dist/esm/llm/anthropic/utils/tools.mjs.map +1 -0
- package/dist/esm/llm/bedrock/index.mjs +280 -0
- package/dist/esm/llm/bedrock/index.mjs.map +1 -0
- package/dist/esm/llm/fake.mjs +94 -0
- package/dist/esm/llm/fake.mjs.map +1 -0
- package/dist/esm/llm/google/index.mjs +214 -0
- package/dist/esm/llm/google/index.mjs.map +1 -0
- package/dist/esm/llm/google/utils/common.mjs +638 -0
- package/dist/esm/llm/google/utils/common.mjs.map +1 -0
- package/dist/esm/llm/openai/index.mjs +1018 -0
- package/dist/esm/llm/openai/index.mjs.map +1 -0
- package/dist/esm/llm/openai/utils/index.mjs +759 -0
- package/dist/esm/llm/openai/utils/index.mjs.map +1 -0
- package/dist/esm/llm/openrouter/index.mjs +210 -0
- package/dist/esm/llm/openrouter/index.mjs.map +1 -0
- package/dist/esm/llm/providers.mjs +39 -0
- package/dist/esm/llm/providers.mjs.map +1 -0
- package/dist/esm/llm/text.mjs +67 -0
- package/dist/esm/llm/text.mjs.map +1 -0
- package/dist/esm/llm/vertexai/index.mjs +327 -0
- package/dist/esm/llm/vertexai/index.mjs.map +1 -0
- package/dist/esm/main.mjs +37 -0
- package/dist/esm/main.mjs.map +1 -0
- package/dist/esm/messages/cache.mjs +382 -0
- package/dist/esm/messages/cache.mjs.map +1 -0
- package/dist/esm/messages/content.mjs +51 -0
- package/dist/esm/messages/content.mjs.map +1 -0
- package/dist/esm/messages/core.mjs +359 -0
- package/dist/esm/messages/core.mjs.map +1 -0
- package/dist/esm/messages/format.mjs +752 -0
- package/dist/esm/messages/format.mjs.map +1 -0
- package/dist/esm/messages/ids.mjs +21 -0
- package/dist/esm/messages/ids.mjs.map +1 -0
- package/dist/esm/messages/prune.mjs +393 -0
- package/dist/esm/messages/prune.mjs.map +1 -0
- package/dist/esm/messages/tools.mjs +93 -0
- package/dist/esm/messages/tools.mjs.map +1 -0
- package/dist/esm/run.mjs +325 -0
- package/dist/esm/run.mjs.map +1 -0
- package/dist/esm/schemas/validate.mjs +317 -0
- package/dist/esm/schemas/validate.mjs.map +1 -0
- package/dist/esm/splitStream.mjs +207 -0
- package/dist/esm/splitStream.mjs.map +1 -0
- package/dist/esm/stream.mjs +616 -0
- package/dist/esm/stream.mjs.map +1 -0
- package/dist/esm/tools/BrowserTools.mjs +244 -0
- package/dist/esm/tools/BrowserTools.mjs.map +1 -0
- package/dist/esm/tools/Calculator.mjs +41 -0
- package/dist/esm/tools/Calculator.mjs.map +1 -0
- package/dist/esm/tools/CodeExecutor.mjs +226 -0
- package/dist/esm/tools/CodeExecutor.mjs.map +1 -0
- package/dist/esm/tools/ProgrammaticToolCalling.mjs +622 -0
- package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -0
- package/dist/esm/tools/ToolNode.mjs +545 -0
- package/dist/esm/tools/ToolNode.mjs.map +1 -0
- package/dist/esm/tools/ToolSearch.mjs +870 -0
- package/dist/esm/tools/ToolSearch.mjs.map +1 -0
- package/dist/esm/tools/handlers.mjs +250 -0
- package/dist/esm/tools/handlers.mjs.map +1 -0
- package/dist/esm/tools/schema.mjs +28 -0
- package/dist/esm/tools/schema.mjs.map +1 -0
- package/dist/esm/tools/search/anthropic.mjs +37 -0
- package/dist/esm/tools/search/anthropic.mjs.map +1 -0
- package/dist/esm/tools/search/content.mjs +119 -0
- package/dist/esm/tools/search/content.mjs.map +1 -0
- package/dist/esm/tools/search/firecrawl.mjs +176 -0
- package/dist/esm/tools/search/firecrawl.mjs.map +1 -0
- package/dist/esm/tools/search/format.mjs +201 -0
- package/dist/esm/tools/search/format.mjs.map +1 -0
- package/dist/esm/tools/search/highlights.mjs +243 -0
- package/dist/esm/tools/search/highlights.mjs.map +1 -0
- package/dist/esm/tools/search/rerankers.mjs +168 -0
- package/dist/esm/tools/search/rerankers.mjs.map +1 -0
- package/dist/esm/tools/search/schema.mjs +104 -0
- package/dist/esm/tools/search/schema.mjs.map +1 -0
- package/dist/esm/tools/search/search.mjs +563 -0
- package/dist/esm/tools/search/search.mjs.map +1 -0
- package/dist/esm/tools/search/serper-scraper.mjs +129 -0
- package/dist/esm/tools/search/serper-scraper.mjs.map +1 -0
- package/dist/esm/tools/search/tool.mjs +454 -0
- package/dist/esm/tools/search/tool.mjs.map +1 -0
- package/dist/esm/tools/search/utils.mjs +61 -0
- package/dist/esm/tools/search/utils.mjs.map +1 -0
- package/dist/esm/types/graph.mjs +26 -0
- package/dist/esm/types/graph.mjs.map +1 -0
- package/dist/esm/utils/contextAnalytics.mjs +64 -0
- package/dist/esm/utils/contextAnalytics.mjs.map +1 -0
- package/dist/esm/utils/events.mjs +29 -0
- package/dist/esm/utils/events.mjs.map +1 -0
- package/dist/esm/utils/graph.mjs +13 -0
- package/dist/esm/utils/graph.mjs.map +1 -0
- package/dist/esm/utils/handlers.mjs +68 -0
- package/dist/esm/utils/handlers.mjs.map +1 -0
- package/dist/esm/utils/llm.mjs +24 -0
- package/dist/esm/utils/llm.mjs.map +1 -0
- package/dist/esm/utils/misc.mjs +53 -0
- package/dist/esm/utils/misc.mjs.map +1 -0
- package/dist/esm/utils/run.mjs +70 -0
- package/dist/esm/utils/run.mjs.map +1 -0
- package/dist/esm/utils/schema.mjs +24 -0
- package/dist/esm/utils/schema.mjs.map +1 -0
- package/dist/esm/utils/title.mjs +122 -0
- package/dist/esm/utils/title.mjs.map +1 -0
- package/dist/esm/utils/tokens.mjs +121 -0
- package/dist/esm/utils/tokens.mjs.map +1 -0
- package/dist/esm/utils/toonFormat.mjs +381 -0
- package/dist/esm/utils/toonFormat.mjs.map +1 -0
- package/dist/types/agents/AgentContext.d.ts +293 -0
- package/dist/types/common/enum.d.ts +155 -0
- package/dist/types/common/index.d.ts +1 -0
- package/dist/types/events.d.ts +31 -0
- package/dist/types/graphs/Graph.d.ts +216 -0
- package/dist/types/graphs/MultiAgentGraph.d.ts +104 -0
- package/dist/types/graphs/index.d.ts +2 -0
- package/dist/types/index.d.ts +21 -0
- package/dist/types/instrumentation.d.ts +1 -0
- package/dist/types/llm/anthropic/index.d.ts +39 -0
- package/dist/types/llm/anthropic/types.d.ts +37 -0
- package/dist/types/llm/anthropic/utils/message_inputs.d.ts +14 -0
- package/dist/types/llm/anthropic/utils/message_outputs.d.ts +14 -0
- package/dist/types/llm/anthropic/utils/output_parsers.d.ts +22 -0
- package/dist/types/llm/anthropic/utils/tools.d.ts +3 -0
- package/dist/types/llm/bedrock/index.d.ts +141 -0
- package/dist/types/llm/bedrock/types.d.ts +27 -0
- package/dist/types/llm/bedrock/utils/index.d.ts +5 -0
- package/dist/types/llm/bedrock/utils/message_inputs.d.ts +31 -0
- package/dist/types/llm/bedrock/utils/message_outputs.d.ts +33 -0
- package/dist/types/llm/fake.d.ts +31 -0
- package/dist/types/llm/google/index.d.ts +24 -0
- package/dist/types/llm/google/types.d.ts +42 -0
- package/dist/types/llm/google/utils/common.d.ts +34 -0
- package/dist/types/llm/google/utils/tools.d.ts +10 -0
- package/dist/types/llm/google/utils/zod_to_genai_parameters.d.ts +14 -0
- package/dist/types/llm/openai/index.d.ts +127 -0
- package/dist/types/llm/openai/types.d.ts +10 -0
- package/dist/types/llm/openai/utils/index.d.ts +29 -0
- package/dist/types/llm/openrouter/index.d.ts +15 -0
- package/dist/types/llm/providers.d.ts +5 -0
- package/dist/types/llm/text.d.ts +21 -0
- package/dist/types/llm/vertexai/index.d.ts +293 -0
- package/dist/types/messages/cache.d.ts +54 -0
- package/dist/types/messages/content.d.ts +7 -0
- package/dist/types/messages/core.d.ts +14 -0
- package/dist/types/messages/format.d.ts +137 -0
- package/dist/types/messages/ids.d.ts +3 -0
- package/dist/types/messages/index.d.ts +7 -0
- package/dist/types/messages/prune.d.ts +52 -0
- package/dist/types/messages/reducer.d.ts +9 -0
- package/dist/types/messages/tools.d.ts +17 -0
- package/dist/types/mockStream.d.ts +32 -0
- package/dist/types/prompts/collab.d.ts +1 -0
- package/dist/types/prompts/index.d.ts +2 -0
- package/dist/types/prompts/taskmanager.d.ts +41 -0
- package/dist/types/run.d.ts +41 -0
- package/dist/types/schemas/index.d.ts +1 -0
- package/dist/types/schemas/validate.d.ts +59 -0
- package/dist/types/splitStream.d.ts +37 -0
- package/dist/types/stream.d.ts +15 -0
- package/dist/types/test/mockTools.d.ts +28 -0
- package/dist/types/tools/BrowserTools.d.ts +87 -0
- package/dist/types/tools/Calculator.d.ts +34 -0
- package/dist/types/tools/CodeExecutor.d.ts +57 -0
- package/dist/types/tools/ProgrammaticToolCalling.d.ts +138 -0
- package/dist/types/tools/ToolNode.d.ts +51 -0
- package/dist/types/tools/ToolSearch.d.ts +219 -0
- package/dist/types/tools/handlers.d.ts +22 -0
- package/dist/types/tools/schema.d.ts +12 -0
- package/dist/types/tools/search/anthropic.d.ts +16 -0
- package/dist/types/tools/search/content.d.ts +4 -0
- package/dist/types/tools/search/firecrawl.d.ts +54 -0
- package/dist/types/tools/search/format.d.ts +5 -0
- package/dist/types/tools/search/highlights.d.ts +13 -0
- package/dist/types/tools/search/index.d.ts +3 -0
- package/dist/types/tools/search/rerankers.d.ts +38 -0
- package/dist/types/tools/search/schema.d.ts +103 -0
- package/dist/types/tools/search/search.d.ts +8 -0
- package/dist/types/tools/search/serper-scraper.d.ts +59 -0
- package/dist/types/tools/search/test.d.ts +1 -0
- package/dist/types/tools/search/tool.d.ts +3 -0
- package/dist/types/tools/search/types.d.ts +575 -0
- package/dist/types/tools/search/utils.d.ts +10 -0
- package/dist/types/types/graph.d.ts +399 -0
- package/dist/types/types/index.d.ts +5 -0
- package/dist/types/types/llm.d.ts +105 -0
- package/dist/types/types/messages.d.ts +4 -0
- package/dist/types/types/run.d.ts +112 -0
- package/dist/types/types/stream.d.ts +308 -0
- package/dist/types/types/tools.d.ts +296 -0
- package/dist/types/utils/contextAnalytics.d.ts +37 -0
- package/dist/types/utils/events.d.ts +6 -0
- package/dist/types/utils/graph.d.ts +2 -0
- package/dist/types/utils/handlers.d.ts +34 -0
- package/dist/types/utils/index.d.ts +9 -0
- package/dist/types/utils/llm.d.ts +3 -0
- package/dist/types/utils/llmConfig.d.ts +3 -0
- package/dist/types/utils/logging.d.ts +1 -0
- package/dist/types/utils/misc.d.ts +7 -0
- package/dist/types/utils/run.d.ts +27 -0
- package/dist/types/utils/schema.d.ts +8 -0
- package/dist/types/utils/title.d.ts +4 -0
- package/dist/types/utils/tokens.d.ts +28 -0
- package/dist/types/utils/toonFormat.d.ts +111 -0
- package/package.json +190 -0
- package/src/agents/AgentContext.test.ts +458 -0
- package/src/agents/AgentContext.ts +972 -0
- package/src/agents/__tests__/AgentContext.test.ts +805 -0
- package/src/agents/__tests__/resolveStructuredOutputMode.test.ts +137 -0
- package/src/common/enum.ts +203 -0
- package/src/common/index.ts +2 -0
- package/src/events.ts +223 -0
- package/src/graphs/Graph.ts +2228 -0
- package/src/graphs/MultiAgentGraph.ts +1063 -0
- package/src/graphs/__tests__/structured-output.integration.test.ts +809 -0
- package/src/graphs/__tests__/structured-output.test.ts +183 -0
- package/src/graphs/index.ts +2 -0
- package/src/index.ts +34 -0
- package/src/instrumentation.ts +22 -0
- package/src/llm/anthropic/Jacob_Lee_Resume_2023.pdf +0 -0
- package/src/llm/anthropic/index.ts +413 -0
- package/src/llm/anthropic/llm.spec.ts +1442 -0
- package/src/llm/anthropic/types.ts +140 -0
- package/src/llm/anthropic/utils/message_inputs.ts +757 -0
- package/src/llm/anthropic/utils/message_outputs.ts +289 -0
- package/src/llm/anthropic/utils/output_parsers.ts +133 -0
- package/src/llm/anthropic/utils/tools.ts +29 -0
- package/src/llm/bedrock/__tests__/bedrock-caching.test.ts +495 -0
- package/src/llm/bedrock/index.ts +411 -0
- package/src/llm/bedrock/llm.spec.ts +616 -0
- package/src/llm/bedrock/types.ts +51 -0
- package/src/llm/bedrock/utils/index.ts +18 -0
- package/src/llm/bedrock/utils/message_inputs.ts +563 -0
- package/src/llm/bedrock/utils/message_outputs.ts +310 -0
- package/src/llm/fake.ts +133 -0
- package/src/llm/google/data/gettysburg10.wav +0 -0
- package/src/llm/google/data/hotdog.jpg +0 -0
- package/src/llm/google/index.ts +337 -0
- package/src/llm/google/llm.spec.ts +934 -0
- package/src/llm/google/types.ts +56 -0
- package/src/llm/google/utils/common.ts +873 -0
- package/src/llm/google/utils/tools.ts +160 -0
- package/src/llm/google/utils/zod_to_genai_parameters.ts +86 -0
- package/src/llm/openai/index.ts +1366 -0
- package/src/llm/openai/types.ts +24 -0
- package/src/llm/openai/utils/index.ts +1035 -0
- package/src/llm/openai/utils/isReasoningModel.test.ts +90 -0
- package/src/llm/openrouter/index.ts +291 -0
- package/src/llm/providers.ts +52 -0
- package/src/llm/text.ts +94 -0
- package/src/llm/vertexai/index.ts +359 -0
- package/src/messages/__tests__/tools.test.ts +473 -0
- package/src/messages/cache.test.ts +1261 -0
- package/src/messages/cache.ts +518 -0
- package/src/messages/content.test.ts +362 -0
- package/src/messages/content.ts +63 -0
- package/src/messages/core.ts +473 -0
- package/src/messages/ensureThinkingBlock.test.ts +468 -0
- package/src/messages/format.ts +1029 -0
- package/src/messages/formatAgentMessages.test.ts +1513 -0
- package/src/messages/formatAgentMessages.tools.test.ts +419 -0
- package/src/messages/formatMessage.test.ts +693 -0
- package/src/messages/ids.ts +26 -0
- package/src/messages/index.ts +7 -0
- package/src/messages/labelContentByAgent.test.ts +887 -0
- package/src/messages/prune.ts +568 -0
- package/src/messages/reducer.ts +80 -0
- package/src/messages/shiftIndexTokenCountMap.test.ts +81 -0
- package/src/messages/tools.ts +108 -0
- package/src/mockStream.ts +99 -0
- package/src/prompts/collab.ts +6 -0
- package/src/prompts/index.ts +2 -0
- package/src/prompts/taskmanager.ts +61 -0
- package/src/run.ts +467 -0
- package/src/schemas/index.ts +2 -0
- package/src/schemas/schema-preparation.test.ts +500 -0
- package/src/schemas/validate.test.ts +358 -0
- package/src/schemas/validate.ts +454 -0
- package/src/scripts/abort.ts +157 -0
- package/src/scripts/ant_web_search.ts +158 -0
- package/src/scripts/ant_web_search_edge_case.ts +162 -0
- package/src/scripts/ant_web_search_error_edge_case.ts +148 -0
- package/src/scripts/args.ts +48 -0
- package/src/scripts/caching.ts +132 -0
- package/src/scripts/cli.ts +172 -0
- package/src/scripts/cli2.ts +133 -0
- package/src/scripts/cli3.ts +184 -0
- package/src/scripts/cli4.ts +191 -0
- package/src/scripts/cli5.ts +191 -0
- package/src/scripts/code_exec.ts +213 -0
- package/src/scripts/code_exec_files.ts +236 -0
- package/src/scripts/code_exec_multi_session.ts +241 -0
- package/src/scripts/code_exec_ptc.ts +334 -0
- package/src/scripts/code_exec_session.ts +282 -0
- package/src/scripts/code_exec_simple.ts +147 -0
- package/src/scripts/content.ts +138 -0
- package/src/scripts/empty_input.ts +137 -0
- package/src/scripts/handoff-test.ts +135 -0
- package/src/scripts/image.ts +178 -0
- package/src/scripts/memory.ts +97 -0
- package/src/scripts/multi-agent-chain.ts +331 -0
- package/src/scripts/multi-agent-conditional.ts +221 -0
- package/src/scripts/multi-agent-document-review-chain.ts +197 -0
- package/src/scripts/multi-agent-hybrid-flow.ts +310 -0
- package/src/scripts/multi-agent-parallel-start.ts +265 -0
- package/src/scripts/multi-agent-parallel.ts +394 -0
- package/src/scripts/multi-agent-sequence.ts +217 -0
- package/src/scripts/multi-agent-supervisor.ts +365 -0
- package/src/scripts/multi-agent-test.ts +186 -0
- package/src/scripts/parallel-asymmetric-tools-test.ts +274 -0
- package/src/scripts/parallel-full-metadata-test.ts +240 -0
- package/src/scripts/parallel-tools-test.ts +340 -0
- package/src/scripts/programmatic_exec.ts +396 -0
- package/src/scripts/programmatic_exec_agent.ts +231 -0
- package/src/scripts/search.ts +146 -0
- package/src/scripts/sequential-full-metadata-test.ts +197 -0
- package/src/scripts/simple.ts +225 -0
- package/src/scripts/single-agent-metadata-test.ts +198 -0
- package/src/scripts/stream.ts +140 -0
- package/src/scripts/test-custom-prompt-key.ts +145 -0
- package/src/scripts/test-handoff-input.ts +170 -0
- package/src/scripts/test-handoff-preamble.ts +277 -0
- package/src/scripts/test-multi-agent-list-handoff.ts +417 -0
- package/src/scripts/test-parallel-agent-labeling.ts +325 -0
- package/src/scripts/test-parallel-handoffs.ts +291 -0
- package/src/scripts/test-thinking-handoff-bedrock.ts +153 -0
- package/src/scripts/test-thinking-handoff.ts +155 -0
- package/src/scripts/test-tools-before-handoff.ts +226 -0
- package/src/scripts/test_code_api.ts +361 -0
- package/src/scripts/thinking-bedrock.ts +159 -0
- package/src/scripts/thinking.ts +171 -0
- package/src/scripts/tool_search.ts +162 -0
- package/src/scripts/tools.ts +177 -0
- package/src/specs/agent-handoffs.test.ts +888 -0
- package/src/specs/anthropic.simple.test.ts +387 -0
- package/src/specs/azure.simple.test.ts +364 -0
- package/src/specs/cache.simple.test.ts +396 -0
- package/src/specs/deepseek.simple.test.ts +283 -0
- package/src/specs/emergency-prune.test.ts +407 -0
- package/src/specs/moonshot.simple.test.ts +358 -0
- package/src/specs/openai.simple.test.ts +311 -0
- package/src/specs/openrouter.simple.test.ts +107 -0
- package/src/specs/prune.test.ts +901 -0
- package/src/specs/reasoning.test.ts +201 -0
- package/src/specs/spec.utils.ts +3 -0
- package/src/specs/thinking-handoff.test.ts +620 -0
- package/src/specs/thinking-prune.test.ts +703 -0
- package/src/specs/token-distribution-edge-case.test.ts +316 -0
- package/src/specs/token-memoization.test.ts +32 -0
- package/src/specs/tool-error.test.ts +198 -0
- package/src/splitStream.test.ts +691 -0
- package/src/splitStream.ts +234 -0
- package/src/stream.test.ts +94 -0
- package/src/stream.ts +801 -0
- package/src/test/mockTools.ts +386 -0
- package/src/tools/BrowserTools.ts +393 -0
- package/src/tools/Calculator.test.ts +278 -0
- package/src/tools/Calculator.ts +46 -0
- package/src/tools/CodeExecutor.ts +270 -0
- package/src/tools/ProgrammaticToolCalling.ts +785 -0
- package/src/tools/ToolNode.ts +674 -0
- package/src/tools/ToolSearch.ts +1095 -0
- package/src/tools/__tests__/BrowserTools.test.ts +265 -0
- package/src/tools/__tests__/ProgrammaticToolCalling.integration.test.ts +319 -0
- package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +1006 -0
- package/src/tools/__tests__/ToolSearch.integration.test.ts +162 -0
- package/src/tools/__tests__/ToolSearch.test.ts +1003 -0
- package/src/tools/handlers.ts +363 -0
- package/src/tools/schema.ts +37 -0
- package/src/tools/search/anthropic.ts +51 -0
- package/src/tools/search/content.test.ts +173 -0
- package/src/tools/search/content.ts +147 -0
- package/src/tools/search/firecrawl.ts +210 -0
- package/src/tools/search/format.ts +250 -0
- package/src/tools/search/highlights.ts +320 -0
- package/src/tools/search/index.ts +3 -0
- package/src/tools/search/jina-reranker.test.ts +130 -0
- package/src/tools/search/output.md +2775 -0
- package/src/tools/search/rerankers.ts +242 -0
- package/src/tools/search/schema.ts +113 -0
- package/src/tools/search/search.ts +768 -0
- package/src/tools/search/serper-scraper.ts +155 -0
- package/src/tools/search/test.html +884 -0
- package/src/tools/search/test.md +643 -0
- package/src/tools/search/test.ts +159 -0
- package/src/tools/search/tool.ts +657 -0
- package/src/tools/search/types.ts +665 -0
- package/src/tools/search/utils.ts +79 -0
- package/src/types/graph.test.ts +218 -0
- package/src/types/graph.ts +533 -0
- package/src/types/index.ts +6 -0
- package/src/types/llm.ts +140 -0
- package/src/types/messages.ts +4 -0
- package/src/types/run.ts +128 -0
- package/src/types/stream.ts +417 -0
- package/src/types/tools.ts +355 -0
- package/src/utils/contextAnalytics.ts +103 -0
- package/src/utils/events.ts +32 -0
- package/src/utils/graph.ts +11 -0
- package/src/utils/handlers.ts +107 -0
- package/src/utils/index.ts +9 -0
- package/src/utils/llm.ts +26 -0
- package/src/utils/llmConfig.ts +208 -0
- package/src/utils/logging.ts +48 -0
- package/src/utils/misc.ts +57 -0
- package/src/utils/run.ts +106 -0
- package/src/utils/schema.ts +35 -0
- package/src/utils/title.ts +177 -0
- package/src/utils/tokens.ts +142 -0
- package/src/utils/toonFormat.ts +475 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
|
|
3
|
+
import { config } from 'dotenv';
|
|
4
|
+
config();
|
|
5
|
+
|
|
6
|
+
import { HumanMessage, BaseMessage } from '@langchain/core/messages';
|
|
7
|
+
import { Run } from '@/run';
|
|
8
|
+
import { ChatModelStreamHandler } from '@/stream';
|
|
9
|
+
import { Providers, GraphEvents } from '@/common';
|
|
10
|
+
import { ToolEndHandler, ModelEndHandler } from '@/events';
|
|
11
|
+
import type * as t from '@/types';
|
|
12
|
+
|
|
13
|
+
const conversationHistory: BaseMessage[] = [];
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Test edge case: switching from OpenAI supervisor (no thinking) to Bedrock specialist (with thinking enabled)
|
|
17
|
+
* This should not throw an error about missing thinking blocks
|
|
18
|
+
*/
|
|
19
|
+
async function testBedrockThinkingHandoff() {
|
|
20
|
+
console.log('Testing OpenAI ā Bedrock (with thinking) handoff...\n');
|
|
21
|
+
|
|
22
|
+
// Create custom handlers
|
|
23
|
+
const customHandlers = {
|
|
24
|
+
[GraphEvents.TOOL_END]: new ToolEndHandler(),
|
|
25
|
+
[GraphEvents.CHAT_MODEL_END]: new ModelEndHandler(),
|
|
26
|
+
[GraphEvents.CHAT_MODEL_STREAM]: new ChatModelStreamHandler(),
|
|
27
|
+
[GraphEvents.TOOL_START]: {
|
|
28
|
+
handle: (_event: string, data: t.StreamEventData): void => {
|
|
29
|
+
const toolData = data as any;
|
|
30
|
+
if (toolData?.name) {
|
|
31
|
+
console.log(`\nš§ Tool called: ${toolData.name}`);
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
// Create the graph configuration
|
|
38
|
+
function createGraphConfig(): t.RunConfig {
|
|
39
|
+
console.log(
|
|
40
|
+
'Creating graph with OpenAI supervisor and Bedrock specialist with thinking enabled.\n'
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
const agents: t.AgentInputs[] = [
|
|
44
|
+
{
|
|
45
|
+
agentId: 'supervisor',
|
|
46
|
+
provider: Providers.OPENAI,
|
|
47
|
+
clientOptions: {
|
|
48
|
+
modelName: 'gpt-4o-mini',
|
|
49
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
50
|
+
},
|
|
51
|
+
instructions: `You are a task supervisor. When the user asks about code review, use transfer_to_code_reviewer to hand off to the specialist.`,
|
|
52
|
+
maxContextTokens: 8000,
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
agentId: 'code_reviewer',
|
|
56
|
+
provider: Providers.BEDROCK,
|
|
57
|
+
clientOptions: {
|
|
58
|
+
region: process.env.BEDROCK_AWS_REGION || 'us-east-1',
|
|
59
|
+
model: 'us.anthropic.claude-3-7-sonnet-20250219-v1:0',
|
|
60
|
+
credentials: {
|
|
61
|
+
accessKeyId: process.env.BEDROCK_AWS_ACCESS_KEY_ID!,
|
|
62
|
+
secretAccessKey: process.env.BEDROCK_AWS_SECRET_ACCESS_KEY!,
|
|
63
|
+
},
|
|
64
|
+
additionalModelRequestFields: {
|
|
65
|
+
thinking: {
|
|
66
|
+
type: 'enabled',
|
|
67
|
+
budget_tokens: 2000,
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
instructions: `You are a code review specialist using Bedrock with extended thinking. Think carefully about the code quality, best practices, and potential issues. Provide thoughtful feedback.`,
|
|
72
|
+
maxContextTokens: 8000,
|
|
73
|
+
},
|
|
74
|
+
];
|
|
75
|
+
|
|
76
|
+
const edges: t.GraphEdge[] = [
|
|
77
|
+
{
|
|
78
|
+
from: 'supervisor',
|
|
79
|
+
to: ['code_reviewer'],
|
|
80
|
+
description: 'Transfer to code review specialist',
|
|
81
|
+
edgeType: 'handoff',
|
|
82
|
+
},
|
|
83
|
+
];
|
|
84
|
+
|
|
85
|
+
return {
|
|
86
|
+
runId: `bedrock-thinking-handoff-test-${Date.now()}`,
|
|
87
|
+
graphConfig: {
|
|
88
|
+
type: 'multi-agent',
|
|
89
|
+
agents,
|
|
90
|
+
edges,
|
|
91
|
+
},
|
|
92
|
+
customHandlers,
|
|
93
|
+
returnContent: true,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
try {
|
|
98
|
+
// Test query that should trigger a handoff
|
|
99
|
+
const query =
|
|
100
|
+
'Can you review this function and tell me if there are any issues?\n\nfunction add(a, b) { return a + b; }';
|
|
101
|
+
|
|
102
|
+
console.log(`${'='.repeat(60)}`);
|
|
103
|
+
console.log(`USER QUERY: "${query}"`);
|
|
104
|
+
console.log('='.repeat(60));
|
|
105
|
+
|
|
106
|
+
// Initialize conversation
|
|
107
|
+
conversationHistory.push(new HumanMessage(query));
|
|
108
|
+
|
|
109
|
+
// Create and run the graph
|
|
110
|
+
const runConfig = createGraphConfig();
|
|
111
|
+
const run = await Run.create(runConfig);
|
|
112
|
+
|
|
113
|
+
const config = {
|
|
114
|
+
configurable: {
|
|
115
|
+
thread_id: 'bedrock-thinking-handoff-test-1',
|
|
116
|
+
},
|
|
117
|
+
streamMode: 'values',
|
|
118
|
+
version: 'v2' as const,
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
console.log('\nProcessing request...\n');
|
|
122
|
+
|
|
123
|
+
// Process with streaming
|
|
124
|
+
const inputs = {
|
|
125
|
+
messages: conversationHistory,
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
await run.processStream(inputs, config);
|
|
129
|
+
const finalMessages = run.getRunMessages();
|
|
130
|
+
|
|
131
|
+
if (finalMessages) {
|
|
132
|
+
conversationHistory.push(...finalMessages);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Success!
|
|
136
|
+
console.log(`\n${'='.repeat(60)}`);
|
|
137
|
+
console.log('ā
TEST PASSED');
|
|
138
|
+
console.log('='.repeat(60));
|
|
139
|
+
console.log('\nSuccessfully handed off from OpenAI (no thinking) to');
|
|
140
|
+
console.log('Bedrock with thinking enabled without errors!');
|
|
141
|
+
console.log('\nThe ensureThinkingBlockInMessages() function correctly');
|
|
142
|
+
console.log('handled the transition by converting tool sequences to');
|
|
143
|
+
console.log('HumanMessages before calling the Bedrock API.');
|
|
144
|
+
} catch (error) {
|
|
145
|
+
console.error('\nā TEST FAILED');
|
|
146
|
+
console.error('='.repeat(60));
|
|
147
|
+
console.error('Error:', error);
|
|
148
|
+
process.exit(1);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Run the test
|
|
153
|
+
testBedrockThinkingHandoff();
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
|
|
3
|
+
import { config } from 'dotenv';
|
|
4
|
+
config();
|
|
5
|
+
|
|
6
|
+
import { HumanMessage, BaseMessage } from '@langchain/core/messages';
|
|
7
|
+
import type * as t from '@/types';
|
|
8
|
+
import { ToolEndHandler, ModelEndHandler } from '@/events';
|
|
9
|
+
import { ChatModelStreamHandler } from '@/stream';
|
|
10
|
+
import { Providers, GraphEvents } from '@/common';
|
|
11
|
+
import { Run } from '@/run';
|
|
12
|
+
|
|
13
|
+
const conversationHistory: BaseMessage[] = [];
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Test edge case: switching from OpenAI supervisor (no thinking) to Anthropic specialist (with thinking enabled)
|
|
17
|
+
* This should not throw an error about missing thinking blocks
|
|
18
|
+
*/
|
|
19
|
+
async function testThinkingHandoff() {
|
|
20
|
+
console.log('Testing OpenAI ā Anthropic (with thinking) handoff...\n');
|
|
21
|
+
|
|
22
|
+
// Create custom handlers
|
|
23
|
+
const customHandlers = {
|
|
24
|
+
[GraphEvents.TOOL_END]: new ToolEndHandler(),
|
|
25
|
+
[GraphEvents.CHAT_MODEL_END]: new ModelEndHandler(),
|
|
26
|
+
[GraphEvents.CHAT_MODEL_STREAM]: new ChatModelStreamHandler(),
|
|
27
|
+
[GraphEvents.TOOL_START]: {
|
|
28
|
+
handle: (_event: string, data: t.StreamEventData): void => {
|
|
29
|
+
const toolData = data as any;
|
|
30
|
+
if (toolData?.name) {
|
|
31
|
+
console.log(`\nš§ Tool called: ${toolData.name}`);
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
[GraphEvents.ON_RUN_STEP]: {
|
|
36
|
+
handle: (_event: string, data: t.StreamEventData): void => {
|
|
37
|
+
const runStep = data as t.RunStep;
|
|
38
|
+
console.log(
|
|
39
|
+
`\nš ON_RUN_STEP: agentId=${runStep.agentId}, groupId=${runStep.groupId}`
|
|
40
|
+
);
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
// Create the graph configuration
|
|
46
|
+
function createGraphConfig(): t.RunConfig {
|
|
47
|
+
console.log(
|
|
48
|
+
'Creating graph with OpenAI supervisor and Anthropic specialist with thinking enabled.\n'
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
const agents: t.AgentInputs[] = [
|
|
52
|
+
{
|
|
53
|
+
agentId: 'supervisor',
|
|
54
|
+
provider: Providers.OPENAI,
|
|
55
|
+
clientOptions: {
|
|
56
|
+
modelName: 'gpt-4o-mini',
|
|
57
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
58
|
+
},
|
|
59
|
+
instructions: `You are a task supervisor. When the user asks about code review, use transfer_to_code_reviewer to hand off to the specialist.`,
|
|
60
|
+
maxContextTokens: 8000,
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
agentId: 'code_reviewer',
|
|
64
|
+
provider: Providers.ANTHROPIC,
|
|
65
|
+
clientOptions: {
|
|
66
|
+
modelName: 'claude-3-7-sonnet-20250219',
|
|
67
|
+
apiKey: process.env.ANTHROPIC_API_KEY,
|
|
68
|
+
thinking: {
|
|
69
|
+
type: 'enabled',
|
|
70
|
+
budget_tokens: 2000,
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
instructions: `You are a code review specialist. Think carefully about the code quality, best practices, and potential issues. Provide thoughtful feedback.`,
|
|
74
|
+
maxContextTokens: 8000,
|
|
75
|
+
},
|
|
76
|
+
];
|
|
77
|
+
|
|
78
|
+
const edges: t.GraphEdge[] = [
|
|
79
|
+
{
|
|
80
|
+
from: 'supervisor',
|
|
81
|
+
to: ['code_reviewer'],
|
|
82
|
+
description: 'Transfer to code review specialist',
|
|
83
|
+
edgeType: 'handoff',
|
|
84
|
+
},
|
|
85
|
+
];
|
|
86
|
+
|
|
87
|
+
return {
|
|
88
|
+
runId: `thinking-handoff-test-${Date.now()}`,
|
|
89
|
+
graphConfig: {
|
|
90
|
+
type: 'multi-agent',
|
|
91
|
+
agents,
|
|
92
|
+
edges,
|
|
93
|
+
},
|
|
94
|
+
customHandlers,
|
|
95
|
+
returnContent: true,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
try {
|
|
100
|
+
// Test query that should trigger a handoff
|
|
101
|
+
const query =
|
|
102
|
+
'Can you review this function and tell me if there are any issues?\n\nfunction add(a, b) { return a + b; }';
|
|
103
|
+
|
|
104
|
+
console.log(`${'='.repeat(60)}`);
|
|
105
|
+
console.log(`USER QUERY: "${query}"`);
|
|
106
|
+
console.log('='.repeat(60));
|
|
107
|
+
|
|
108
|
+
// Initialize conversation
|
|
109
|
+
conversationHistory.push(new HumanMessage(query));
|
|
110
|
+
|
|
111
|
+
// Create and run the graph
|
|
112
|
+
const runConfig = createGraphConfig();
|
|
113
|
+
const run = await Run.create(runConfig);
|
|
114
|
+
|
|
115
|
+
const config = {
|
|
116
|
+
configurable: {
|
|
117
|
+
thread_id: 'thinking-handoff-test-1',
|
|
118
|
+
},
|
|
119
|
+
streamMode: 'values',
|
|
120
|
+
version: 'v2' as const,
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
console.log('\nProcessing request...\n');
|
|
124
|
+
|
|
125
|
+
// Process with streaming
|
|
126
|
+
const inputs = {
|
|
127
|
+
messages: conversationHistory,
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
await run.processStream(inputs, config);
|
|
131
|
+
const finalMessages = run.getRunMessages();
|
|
132
|
+
|
|
133
|
+
if (finalMessages) {
|
|
134
|
+
conversationHistory.push(...finalMessages);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Success!
|
|
138
|
+
console.log(`\n${'='.repeat(60)}`);
|
|
139
|
+
console.log('ā
TEST PASSED');
|
|
140
|
+
console.log('='.repeat(60));
|
|
141
|
+
console.log('\nSuccessfully handed off from OpenAI (no thinking) to');
|
|
142
|
+
console.log('Anthropic with thinking enabled without errors!');
|
|
143
|
+
console.log('\nThe ensureThinkingBlockInMessages() function correctly');
|
|
144
|
+
console.log('added a placeholder thinking block to the last assistant');
|
|
145
|
+
console.log('message before calling the Anthropic API.');
|
|
146
|
+
} catch (error) {
|
|
147
|
+
console.error('\nā TEST FAILED');
|
|
148
|
+
console.error('='.repeat(60));
|
|
149
|
+
console.error('Error:', error);
|
|
150
|
+
process.exit(1);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Run the test
|
|
155
|
+
testThinkingHandoff();
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { config } from 'dotenv';
|
|
2
|
+
config();
|
|
3
|
+
|
|
4
|
+
import { HumanMessage, BaseMessage } from '@langchain/core/messages';
|
|
5
|
+
import { Run } from '@/run';
|
|
6
|
+
import { Providers, GraphEvents } from '@/common';
|
|
7
|
+
import { ChatModelStreamHandler, createContentAggregator } from '@/stream';
|
|
8
|
+
import { ToolEndHandler, ModelEndHandler } from '@/events';
|
|
9
|
+
import type * as t from '@/types';
|
|
10
|
+
|
|
11
|
+
const conversationHistory: BaseMessage[] = [];
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Test edge case: Agent performs 2 web searches before handing off
|
|
15
|
+
*
|
|
16
|
+
* This tests how the system behaves when an agent with handoff capabilities
|
|
17
|
+
* uses tools before transferring control to another agent.
|
|
18
|
+
*/
|
|
19
|
+
async function testToolsBeforeHandoff() {
|
|
20
|
+
console.log('Testing Tools Before Handoff Edge Case...\n');
|
|
21
|
+
|
|
22
|
+
// Set up content aggregator
|
|
23
|
+
const { contentParts, aggregateContent } = createContentAggregator();
|
|
24
|
+
|
|
25
|
+
// Track tool calls and handoffs
|
|
26
|
+
let toolCallCount = 0;
|
|
27
|
+
let handoffOccurred = false;
|
|
28
|
+
|
|
29
|
+
// Create custom handlers
|
|
30
|
+
const customHandlers = {
|
|
31
|
+
[GraphEvents.TOOL_END]: new ToolEndHandler(
|
|
32
|
+
undefined,
|
|
33
|
+
undefined,
|
|
34
|
+
(name?: string) => {
|
|
35
|
+
console.log(`\nā
Tool completed: ${name}`);
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
),
|
|
39
|
+
[GraphEvents.CHAT_MODEL_END]: new ModelEndHandler(),
|
|
40
|
+
[GraphEvents.CHAT_MODEL_STREAM]: new ChatModelStreamHandler(),
|
|
41
|
+
[GraphEvents.ON_RUN_STEP]: {
|
|
42
|
+
handle: (
|
|
43
|
+
event: GraphEvents.ON_RUN_STEP,
|
|
44
|
+
data: t.StreamEventData
|
|
45
|
+
): void => {
|
|
46
|
+
const runStepData = data as any;
|
|
47
|
+
if (runStepData?.name) {
|
|
48
|
+
console.log(`\n[${runStepData.name}] Processing...`);
|
|
49
|
+
}
|
|
50
|
+
aggregateContent({ event, data: data as t.RunStep });
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
[GraphEvents.ON_RUN_STEP_COMPLETED]: {
|
|
54
|
+
handle: (
|
|
55
|
+
event: GraphEvents.ON_RUN_STEP_COMPLETED,
|
|
56
|
+
data: t.StreamEventData
|
|
57
|
+
): void => {
|
|
58
|
+
aggregateContent({
|
|
59
|
+
event,
|
|
60
|
+
data: data as unknown as { result: t.ToolEndEvent },
|
|
61
|
+
});
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
[GraphEvents.ON_MESSAGE_DELTA]: {
|
|
65
|
+
handle: (
|
|
66
|
+
event: GraphEvents.ON_MESSAGE_DELTA,
|
|
67
|
+
data: t.StreamEventData
|
|
68
|
+
): void => {
|
|
69
|
+
// console.log('====== ON_MESSAGE_DELTA ======');
|
|
70
|
+
console.dir(data, { depth: null });
|
|
71
|
+
aggregateContent({ event, data: data as t.MessageDeltaEvent });
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
[GraphEvents.TOOL_START]: {
|
|
75
|
+
handle: (
|
|
76
|
+
_event: string,
|
|
77
|
+
data: t.StreamEventData,
|
|
78
|
+
metadata?: Record<string, unknown>
|
|
79
|
+
): void => {
|
|
80
|
+
const toolData = data as any;
|
|
81
|
+
console.log(`\nš§ Tool started:`);
|
|
82
|
+
console.dir({ toolData, metadata }, { depth: null });
|
|
83
|
+
|
|
84
|
+
if (toolData?.output?.name?.includes('transfer_to_')) {
|
|
85
|
+
handoffOccurred = true;
|
|
86
|
+
const specialist = toolData.name.replace('transfer_to_', '');
|
|
87
|
+
console.log(`\nš Handoff initiated to: ${specialist}`);
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
// Create the graph with research agent and report writer
|
|
94
|
+
function createGraphWithToolsAndHandoff(): t.RunConfig {
|
|
95
|
+
const agents: t.AgentInputs[] = [
|
|
96
|
+
{
|
|
97
|
+
agentId: 'research_coordinator',
|
|
98
|
+
provider: Providers.OPENAI,
|
|
99
|
+
clientOptions: {
|
|
100
|
+
modelName: 'gpt-4.1-mini',
|
|
101
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
102
|
+
},
|
|
103
|
+
tools: [],
|
|
104
|
+
instructions: `You are a Research Coordinator with access to a report writer specialist.
|
|
105
|
+
|
|
106
|
+
Your workflow MUST follow these steps IN ORDER:
|
|
107
|
+
1. FIRST: Write an initial response acknowledging the request
|
|
108
|
+
- Explain what you understand about the topic
|
|
109
|
+
- Provide any general knowledge you have
|
|
110
|
+
2. FINALLY: Transfer to the report writer
|
|
111
|
+
- Provide the report writer with a summary of the information
|
|
112
|
+
|
|
113
|
+
CRITICAL: You MUST write your initial response before transferring to the report writer.`,
|
|
114
|
+
maxContextTokens: 8000,
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
agentId: 'report_writer',
|
|
118
|
+
provider: Providers.OPENAI,
|
|
119
|
+
clientOptions: {
|
|
120
|
+
modelName: 'gpt-5-mini',
|
|
121
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
122
|
+
},
|
|
123
|
+
instructions: `You are a Report Writer specialist. Your role is to:
|
|
124
|
+
1. Receive research findings from the Research Coordinator
|
|
125
|
+
2. Create a well-structured, comprehensive report
|
|
126
|
+
3. Include all key findings from the research
|
|
127
|
+
4. Format the report with clear sections and bullet points
|
|
128
|
+
5. Add a brief executive summary at the beginning
|
|
129
|
+
|
|
130
|
+
Focus on clarity, completeness, and professional presentation.`,
|
|
131
|
+
maxContextTokens: 8000,
|
|
132
|
+
},
|
|
133
|
+
];
|
|
134
|
+
|
|
135
|
+
// Create edge from research coordinator to report writer
|
|
136
|
+
const edges: t.GraphEdge[] = [
|
|
137
|
+
{
|
|
138
|
+
from: 'research_coordinator',
|
|
139
|
+
to: 'report_writer',
|
|
140
|
+
description: 'Transfer to report writer after completing research',
|
|
141
|
+
edgeType: 'handoff',
|
|
142
|
+
},
|
|
143
|
+
];
|
|
144
|
+
|
|
145
|
+
return {
|
|
146
|
+
runId: `tools-before-handoff-${Date.now()}`,
|
|
147
|
+
graphConfig: {
|
|
148
|
+
type: 'multi-agent',
|
|
149
|
+
agents,
|
|
150
|
+
edges,
|
|
151
|
+
},
|
|
152
|
+
customHandlers,
|
|
153
|
+
returnContent: true,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
try {
|
|
158
|
+
// Single test query that requires handoff to report writer
|
|
159
|
+
const query = `Tell me about quantum computing developments,
|
|
160
|
+
including major breakthroughs and commercial applications.
|
|
161
|
+
I need a comprehensive report.`;
|
|
162
|
+
|
|
163
|
+
console.log('='.repeat(60));
|
|
164
|
+
console.log(`USER QUERY: "${query}"`);
|
|
165
|
+
console.log('='.repeat(60));
|
|
166
|
+
|
|
167
|
+
// Create the graph
|
|
168
|
+
const runConfig = createGraphWithToolsAndHandoff();
|
|
169
|
+
const run = await Run.create(runConfig);
|
|
170
|
+
|
|
171
|
+
console.log('\nExpected behavior:');
|
|
172
|
+
console.log('1. Research Coordinator writes initial response');
|
|
173
|
+
console.log('2. Research Coordinator hands off to Report Writer');
|
|
174
|
+
console.log('3. Report Writer creates final report\n');
|
|
175
|
+
|
|
176
|
+
// Process with streaming
|
|
177
|
+
conversationHistory.push(new HumanMessage(query));
|
|
178
|
+
const inputs = {
|
|
179
|
+
messages: conversationHistory,
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
const config = {
|
|
183
|
+
configurable: {
|
|
184
|
+
thread_id: 'tools-handoff-test-1',
|
|
185
|
+
},
|
|
186
|
+
streamMode: 'values',
|
|
187
|
+
version: 'v2' as const,
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
const finalContentParts = await run.processStream(inputs, config);
|
|
191
|
+
const finalMessages = run.getRunMessages();
|
|
192
|
+
|
|
193
|
+
if (finalMessages) {
|
|
194
|
+
conversationHistory.push(...finalMessages);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Show results summary
|
|
198
|
+
console.log(`\n${'ā'.repeat(60)}`);
|
|
199
|
+
console.log('EDGE CASE TEST RESULTS:');
|
|
200
|
+
console.log('ā'.repeat(60));
|
|
201
|
+
console.log(`Tool calls before handoff: ${toolCallCount}`);
|
|
202
|
+
console.log(`Expected tool calls: 0 (no web search available)`);
|
|
203
|
+
console.log(`Handoff occurred: ${handoffOccurred ? 'Yes ā
' : 'No ā'}`);
|
|
204
|
+
console.log(`Test status: ${handoffOccurred ? 'PASSED ā
' : 'FAILED ā'}`);
|
|
205
|
+
console.log('ā'.repeat(60));
|
|
206
|
+
|
|
207
|
+
// Display conversation history
|
|
208
|
+
console.log('\nConversation History:');
|
|
209
|
+
console.log('ā'.repeat(60));
|
|
210
|
+
conversationHistory.forEach((msg, idx) => {
|
|
211
|
+
const role = msg.constructor.name.replace('Message', '');
|
|
212
|
+
console.log(`\n[${idx}] ${role}:`);
|
|
213
|
+
if (typeof msg.content === 'string') {
|
|
214
|
+
console.log(
|
|
215
|
+
msg.content.substring(0, 200) +
|
|
216
|
+
(msg.content.length > 200 ? '...' : '')
|
|
217
|
+
);
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
} catch (error) {
|
|
221
|
+
console.error('Error in tools-before-handoff test:', error);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// Run the test
|
|
226
|
+
testToolsBeforeHandoff();
|