illuma-agents 1.0.2
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/LICENSE +21 -0
- package/dist/cjs/common/enum.cjs +163 -0
- package/dist/cjs/common/enum.cjs.map +1 -0
- package/dist/cjs/events.cjs +143 -0
- package/dist/cjs/events.cjs.map +1 -0
- package/dist/cjs/graphs/Graph.cjs +581 -0
- package/dist/cjs/graphs/Graph.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 +553 -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/fake.cjs +97 -0
- package/dist/cjs/llm/fake.cjs.map +1 -0
- package/dist/cjs/llm/google/index.cjs +147 -0
- package/dist/cjs/llm/google/index.cjs.map +1 -0
- package/dist/cjs/llm/google/utils/common.cjs +490 -0
- package/dist/cjs/llm/google/utils/common.cjs.map +1 -0
- package/dist/cjs/llm/ollama/index.cjs +70 -0
- package/dist/cjs/llm/ollama/index.cjs.map +1 -0
- package/dist/cjs/llm/ollama/utils.cjs +158 -0
- package/dist/cjs/llm/ollama/utils.cjs.map +1 -0
- package/dist/cjs/llm/openai/index.cjs +613 -0
- package/dist/cjs/llm/openai/index.cjs.map +1 -0
- package/dist/cjs/llm/openai/utils/index.cjs +677 -0
- package/dist/cjs/llm/openai/utils/index.cjs.map +1 -0
- package/dist/cjs/llm/openrouter/index.cjs +29 -0
- package/dist/cjs/llm/openrouter/index.cjs.map +1 -0
- package/dist/cjs/llm/providers.cjs +47 -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 +330 -0
- package/dist/cjs/llm/vertexai/index.cjs.map +1 -0
- package/dist/cjs/main.cjs +127 -0
- package/dist/cjs/main.cjs.map +1 -0
- package/dist/cjs/messages/core.cjs +359 -0
- package/dist/cjs/messages/core.cjs.map +1 -0
- package/dist/cjs/messages/format.cjs +455 -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/run.cjs +264 -0
- package/dist/cjs/run.cjs.map +1 -0
- package/dist/cjs/splitStream.cjs +210 -0
- package/dist/cjs/splitStream.cjs.map +1 -0
- package/dist/cjs/stream.cjs +504 -0
- package/dist/cjs/stream.cjs.map +1 -0
- package/dist/cjs/tools/CodeExecutor.cjs +192 -0
- package/dist/cjs/tools/CodeExecutor.cjs.map +1 -0
- package/dist/cjs/tools/ToolNode.cjs +125 -0
- package/dist/cjs/tools/ToolNode.cjs.map +1 -0
- package/dist/cjs/tools/handlers.cjs +250 -0
- package/dist/cjs/tools/handlers.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 +70 -0
- package/dist/cjs/tools/search/schema.cjs.map +1 -0
- package/dist/cjs/tools/search/search.cjs +561 -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 +331 -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/utils/graph.cjs +16 -0
- package/dist/cjs/utils/graph.cjs.map +1 -0
- package/dist/cjs/utils/llm.cjs +28 -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 +69 -0
- package/dist/cjs/utils/run.cjs.map +1 -0
- package/dist/cjs/utils/title.cjs +111 -0
- package/dist/cjs/utils/title.cjs.map +1 -0
- package/dist/cjs/utils/tokens.cjs +65 -0
- package/dist/cjs/utils/tokens.cjs.map +1 -0
- package/dist/esm/common/enum.mjs +163 -0
- package/dist/esm/common/enum.mjs.map +1 -0
- package/dist/esm/events.mjs +135 -0
- package/dist/esm/events.mjs.map +1 -0
- package/dist/esm/graphs/Graph.mjs +578 -0
- package/dist/esm/graphs/Graph.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 +550 -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/fake.mjs +94 -0
- package/dist/esm/llm/fake.mjs.map +1 -0
- package/dist/esm/llm/google/index.mjs +145 -0
- package/dist/esm/llm/google/index.mjs.map +1 -0
- package/dist/esm/llm/google/utils/common.mjs +484 -0
- package/dist/esm/llm/google/utils/common.mjs.map +1 -0
- package/dist/esm/llm/ollama/index.mjs +68 -0
- package/dist/esm/llm/ollama/index.mjs.map +1 -0
- package/dist/esm/llm/ollama/utils.mjs +155 -0
- package/dist/esm/llm/ollama/utils.mjs.map +1 -0
- package/dist/esm/llm/openai/index.mjs +604 -0
- package/dist/esm/llm/openai/index.mjs.map +1 -0
- package/dist/esm/llm/openai/utils/index.mjs +671 -0
- package/dist/esm/llm/openai/utils/index.mjs.map +1 -0
- package/dist/esm/llm/openrouter/index.mjs +27 -0
- package/dist/esm/llm/openrouter/index.mjs.map +1 -0
- package/dist/esm/llm/providers.mjs +43 -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 +328 -0
- package/dist/esm/llm/vertexai/index.mjs.map +1 -0
- package/dist/esm/main.mjs +20 -0
- package/dist/esm/main.mjs.map +1 -0
- package/dist/esm/messages/core.mjs +351 -0
- package/dist/esm/messages/core.mjs.map +1 -0
- package/dist/esm/messages/format.mjs +447 -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/run.mjs +261 -0
- package/dist/esm/run.mjs.map +1 -0
- package/dist/esm/splitStream.mjs +207 -0
- package/dist/esm/splitStream.mjs.map +1 -0
- package/dist/esm/stream.mjs +500 -0
- package/dist/esm/stream.mjs.map +1 -0
- package/dist/esm/tools/CodeExecutor.mjs +188 -0
- package/dist/esm/tools/CodeExecutor.mjs.map +1 -0
- package/dist/esm/tools/ToolNode.mjs +122 -0
- package/dist/esm/tools/ToolNode.mjs.map +1 -0
- package/dist/esm/tools/handlers.mjs +245 -0
- package/dist/esm/tools/handlers.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 +61 -0
- package/dist/esm/tools/search/schema.mjs.map +1 -0
- package/dist/esm/tools/search/search.mjs +558 -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 +329 -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/utils/graph.mjs +13 -0
- package/dist/esm/utils/graph.mjs.map +1 -0
- package/dist/esm/utils/llm.mjs +25 -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 +66 -0
- package/dist/esm/utils/run.mjs.map +1 -0
- package/dist/esm/utils/title.mjs +108 -0
- package/dist/esm/utils/title.mjs.map +1 -0
- package/dist/esm/utils/tokens.mjs +62 -0
- package/dist/esm/utils/tokens.mjs.map +1 -0
- package/dist/types/common/enum.d.ts +128 -0
- package/dist/types/common/index.d.ts +1 -0
- package/dist/types/events.d.ts +29 -0
- package/dist/types/graphs/Graph.d.ts +122 -0
- package/dist/types/graphs/index.d.ts +1 -0
- package/dist/types/index.d.ts +13 -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/fake.d.ts +31 -0
- package/dist/types/llm/google/index.d.ts +14 -0
- package/dist/types/llm/google/types.d.ts +32 -0
- package/dist/types/llm/google/utils/common.d.ts +19 -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/ollama/index.d.ts +8 -0
- package/dist/types/llm/ollama/utils.d.ts +7 -0
- package/dist/types/llm/openai/index.d.ts +103 -0
- package/dist/types/llm/openai/types.d.ts +10 -0
- package/dist/types/llm/openai/utils/index.d.ts +20 -0
- package/dist/types/llm/openrouter/index.d.ts +12 -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/core.d.ts +14 -0
- package/dist/types/messages/format.d.ts +113 -0
- package/dist/types/messages/ids.d.ts +3 -0
- package/dist/types/messages/index.d.ts +4 -0
- package/dist/types/messages/prune.d.ts +51 -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 +30 -0
- package/dist/types/scripts/abort.d.ts +1 -0
- package/dist/types/scripts/ant_web_search.d.ts +1 -0
- package/dist/types/scripts/args.d.ts +7 -0
- package/dist/types/scripts/caching.d.ts +1 -0
- package/dist/types/scripts/cli.d.ts +1 -0
- package/dist/types/scripts/cli2.d.ts +1 -0
- package/dist/types/scripts/cli3.d.ts +1 -0
- package/dist/types/scripts/cli4.d.ts +1 -0
- package/dist/types/scripts/cli5.d.ts +1 -0
- package/dist/types/scripts/code_exec.d.ts +1 -0
- package/dist/types/scripts/code_exec_files.d.ts +1 -0
- package/dist/types/scripts/code_exec_simple.d.ts +1 -0
- package/dist/types/scripts/content.d.ts +1 -0
- package/dist/types/scripts/empty_input.d.ts +1 -0
- package/dist/types/scripts/image.d.ts +1 -0
- package/dist/types/scripts/memory.d.ts +1 -0
- package/dist/types/scripts/search.d.ts +1 -0
- package/dist/types/scripts/simple.d.ts +1 -0
- package/dist/types/scripts/stream.d.ts +1 -0
- package/dist/types/scripts/thinking.d.ts +1 -0
- package/dist/types/scripts/tools.d.ts +1 -0
- package/dist/types/specs/spec.utils.d.ts +1 -0
- package/dist/types/splitStream.d.ts +37 -0
- package/dist/types/stream.d.ts +14 -0
- package/dist/types/tools/CodeExecutor.d.ts +23 -0
- package/dist/types/tools/ToolNode.d.ts +22 -0
- package/dist/types/tools/example.d.ts +78 -0
- package/dist/types/tools/handlers.d.ts +19 -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 +2 -0
- package/dist/types/tools/search/rerankers.d.ts +38 -0
- package/dist/types/tools/search/schema.d.ts +16 -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 +54 -0
- package/dist/types/tools/search/types.d.ts +591 -0
- package/dist/types/tools/search/utils.d.ts +10 -0
- package/dist/types/types/graph.d.ts +138 -0
- package/dist/types/types/index.d.ts +5 -0
- package/dist/types/types/llm.d.ts +102 -0
- package/dist/types/types/run.d.ts +74 -0
- package/dist/types/types/stream.d.ts +293 -0
- package/dist/types/types/tools.d.ts +61 -0
- package/dist/types/utils/graph.d.ts +2 -0
- package/dist/types/utils/index.d.ts +5 -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/title.d.ts +4 -0
- package/dist/types/utils/tokens.d.ts +3 -0
- package/package.json +145 -0
- package/src/common/enum.ts +176 -0
- package/src/common/index.ts +2 -0
- package/src/events.ts +191 -0
- package/src/graphs/Graph.ts +846 -0
- package/src/graphs/index.ts +1 -0
- package/src/index.ts +24 -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 +660 -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/fake.ts +133 -0
- package/src/llm/google/index.ts +222 -0
- package/src/llm/google/types.ts +43 -0
- package/src/llm/google/utils/common.ts +660 -0
- package/src/llm/google/utils/tools.ts +160 -0
- package/src/llm/google/utils/zod_to_genai_parameters.ts +88 -0
- package/src/llm/ollama/index.ts +92 -0
- package/src/llm/ollama/utils.ts +193 -0
- package/src/llm/openai/index.ts +853 -0
- package/src/llm/openai/types.ts +24 -0
- package/src/llm/openai/utils/index.ts +918 -0
- package/src/llm/openai/utils/isReasoningModel.test.ts +90 -0
- package/src/llm/openrouter/index.ts +60 -0
- package/src/llm/providers.ts +57 -0
- package/src/llm/text.ts +94 -0
- package/src/llm/vertexai/index.ts +360 -0
- package/src/messages/core.ts +463 -0
- package/src/messages/format.ts +625 -0
- package/src/messages/formatAgentMessages.test.ts +917 -0
- package/src/messages/formatAgentMessages.tools.test.ts +400 -0
- package/src/messages/formatMessage.test.ts +693 -0
- package/src/messages/ids.ts +26 -0
- package/src/messages/index.ts +4 -0
- package/src/messages/prune.ts +567 -0
- package/src/messages/shiftIndexTokenCountMap.test.ts +81 -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/proto/CollabGraph.ts +269 -0
- package/src/proto/TaskManager.ts +243 -0
- package/src/proto/collab.ts +200 -0
- package/src/proto/collab_design.ts +184 -0
- package/src/proto/collab_design_v2.ts +224 -0
- package/src/proto/collab_design_v3.ts +255 -0
- package/src/proto/collab_design_v4.ts +220 -0
- package/src/proto/collab_design_v5.ts +251 -0
- package/src/proto/collab_graph.ts +181 -0
- package/src/proto/collab_original.ts +123 -0
- package/src/proto/example.ts +93 -0
- package/src/proto/example_new.ts +68 -0
- package/src/proto/example_old.ts +201 -0
- package/src/proto/example_test.ts +152 -0
- package/src/proto/example_test_anthropic.ts +100 -0
- package/src/proto/log_stream.ts +202 -0
- package/src/proto/main_collab_community_event.ts +133 -0
- package/src/proto/main_collab_design_v2.ts +96 -0
- package/src/proto/main_collab_design_v4.ts +100 -0
- package/src/proto/main_collab_design_v5.ts +135 -0
- package/src/proto/main_collab_global_analysis.ts +122 -0
- package/src/proto/main_collab_hackathon_event.ts +153 -0
- package/src/proto/main_collab_space_mission.ts +153 -0
- package/src/proto/main_philosophy.ts +210 -0
- package/src/proto/original_script.ts +126 -0
- package/src/proto/standard.ts +100 -0
- package/src/proto/stream.ts +56 -0
- package/src/proto/tasks.ts +118 -0
- package/src/proto/tools/global_analysis_tools.ts +86 -0
- package/src/proto/tools/space_mission_tools.ts +60 -0
- package/src/proto/vertexai.ts +54 -0
- package/src/run.ts +381 -0
- package/src/scripts/abort.ts +138 -0
- package/src/scripts/ant_web_search.ts +158 -0
- package/src/scripts/args.ts +48 -0
- package/src/scripts/caching.ts +124 -0
- package/src/scripts/cli.ts +167 -0
- package/src/scripts/cli2.ts +125 -0
- package/src/scripts/cli3.ts +178 -0
- package/src/scripts/cli4.ts +184 -0
- package/src/scripts/cli5.ts +184 -0
- package/src/scripts/code_exec.ts +214 -0
- package/src/scripts/code_exec_files.ts +193 -0
- package/src/scripts/code_exec_simple.ts +129 -0
- package/src/scripts/content.ts +120 -0
- package/src/scripts/empty_input.ts +137 -0
- package/src/scripts/image.ts +178 -0
- package/src/scripts/memory.ts +97 -0
- package/src/scripts/search.ts +150 -0
- package/src/scripts/simple.ts +225 -0
- package/src/scripts/stream.ts +122 -0
- package/src/scripts/thinking.ts +150 -0
- package/src/scripts/tools.ts +155 -0
- package/src/specs/anthropic.simple.test.ts +317 -0
- package/src/specs/azure.simple.test.ts +316 -0
- package/src/specs/openai.simple.test.ts +316 -0
- package/src/specs/prune.test.ts +763 -0
- package/src/specs/reasoning.test.ts +165 -0
- package/src/specs/spec.utils.ts +3 -0
- package/src/specs/thinking-prune.test.ts +703 -0
- package/src/specs/token-distribution-edge-case.test.ts +316 -0
- package/src/specs/tool-error.test.ts +193 -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 +651 -0
- package/src/tools/CodeExecutor.ts +220 -0
- package/src/tools/ToolNode.ts +170 -0
- package/src/tools/example.ts +129 -0
- package/src/tools/handlers.ts +336 -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 +2 -0
- package/src/tools/search/jina-reranker.test.ts +126 -0
- package/src/tools/search/output.md +2775 -0
- package/src/tools/search/rerankers.ts +242 -0
- package/src/tools/search/schema.ts +63 -0
- package/src/tools/search/search.ts +759 -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 +471 -0
- package/src/tools/search/types.ts +687 -0
- package/src/tools/search/utils.ts +79 -0
- package/src/types/graph.ts +185 -0
- package/src/types/index.ts +6 -0
- package/src/types/llm.ts +140 -0
- package/src/types/run.ts +89 -0
- package/src/types/stream.ts +400 -0
- package/src/types/tools.ts +80 -0
- package/src/utils/graph.ts +11 -0
- package/src/utils/index.ts +5 -0
- package/src/utils/llm.ts +27 -0
- package/src/utils/llmConfig.ts +183 -0
- package/src/utils/logging.ts +48 -0
- package/src/utils/misc.ts +57 -0
- package/src/utils/run.ts +101 -0
- package/src/utils/title.ts +165 -0
- package/src/utils/tokens.ts +70 -0
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { config } from 'dotenv';
|
|
3
|
+
import fetch, { RequestInit } from 'node-fetch';
|
|
4
|
+
import { HttpsProxyAgent } from 'https-proxy-agent';
|
|
5
|
+
import { tool, DynamicStructuredTool } from '@langchain/core/tools';
|
|
6
|
+
import { getEnvironmentVariable } from '@langchain/core/utils/env';
|
|
7
|
+
import type * as t from '@/types';
|
|
8
|
+
import { EnvVar, Constants } from '@/common';
|
|
9
|
+
|
|
10
|
+
config();
|
|
11
|
+
|
|
12
|
+
export const imageExtRegex = /\.(jpg|jpeg|png|gif|webp)$/i;
|
|
13
|
+
export const getCodeBaseURL = (): string =>
|
|
14
|
+
getEnvironmentVariable(EnvVar.CODE_BASEURL) ??
|
|
15
|
+
Constants.OFFICIAL_CODE_BASEURL;
|
|
16
|
+
|
|
17
|
+
const imageMessage = 'Image is already displayed to the user';
|
|
18
|
+
const otherMessage = 'File is already downloaded by the user';
|
|
19
|
+
const accessMessage =
|
|
20
|
+
'Note: Files are READ-ONLY. Save changes to NEW filenames. To access these files in future executions, provide the `session_id` as a parameter (not in your code).';
|
|
21
|
+
const emptyOutputMessage =
|
|
22
|
+
'stdout: Empty. Ensure you\'re writing output explicitly.\n';
|
|
23
|
+
|
|
24
|
+
const CodeExecutionToolSchema = z.object({
|
|
25
|
+
lang: z
|
|
26
|
+
.enum([
|
|
27
|
+
'py',
|
|
28
|
+
'js',
|
|
29
|
+
'ts',
|
|
30
|
+
'c',
|
|
31
|
+
'cpp',
|
|
32
|
+
'java',
|
|
33
|
+
'php',
|
|
34
|
+
'rs',
|
|
35
|
+
'go',
|
|
36
|
+
'd',
|
|
37
|
+
'f90',
|
|
38
|
+
'r',
|
|
39
|
+
])
|
|
40
|
+
.describe('The programming language or runtime to execute the code in.'),
|
|
41
|
+
code: z.string()
|
|
42
|
+
.describe(`The complete, self-contained code to execute, without any truncation or minimization.
|
|
43
|
+
- The environment is stateless; variables and imports don't persist between executions.
|
|
44
|
+
- When using \`session_id\`: Don't hardcode it in \`code\`, and write file modifications to NEW filenames (files are READ-ONLY).
|
|
45
|
+
- Input code **IS ALREADY** displayed to the user, so **DO NOT** repeat it in your response unless asked.
|
|
46
|
+
- Output code **IS NOT** displayed to the user, so **DO** write all desired output explicitly.
|
|
47
|
+
- IMPORTANT: You MUST explicitly print/output ALL results you want the user to see.
|
|
48
|
+
- py: This is not a Jupyter notebook environment. Use \`print()\` for all outputs.
|
|
49
|
+
- py: Matplotlib: Use \`plt.savefig()\` to save plots as files.
|
|
50
|
+
- js: use the \`console\` or \`process\` methods for all outputs.
|
|
51
|
+
- r: IMPORTANT: No X11 display available. ALL graphics MUST use Cairo library (library(Cairo)).
|
|
52
|
+
- Other languages: use appropriate output functions.`),
|
|
53
|
+
session_id: z
|
|
54
|
+
.string()
|
|
55
|
+
.optional()
|
|
56
|
+
.describe(
|
|
57
|
+
`Session ID from a previous response to access generated files.
|
|
58
|
+
- Files load into the current working directory ("/mnt/data/")
|
|
59
|
+
- Use relative paths ONLY
|
|
60
|
+
- Files are READ-ONLY and cannot be modified in-place
|
|
61
|
+
- To modify: read original file, write to NEW filename
|
|
62
|
+
`.trim()
|
|
63
|
+
),
|
|
64
|
+
args: z
|
|
65
|
+
.array(z.string())
|
|
66
|
+
.optional()
|
|
67
|
+
.describe(
|
|
68
|
+
'Additional arguments to execute the code with. This should only be used if the input code requires additional arguments to run.'
|
|
69
|
+
),
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
const baseEndpoint = getCodeBaseURL();
|
|
73
|
+
const EXEC_ENDPOINT = `${baseEndpoint}/exec`;
|
|
74
|
+
|
|
75
|
+
function createCodeExecutionTool(
|
|
76
|
+
params: t.CodeExecutionToolParams = {}
|
|
77
|
+
): DynamicStructuredTool<typeof CodeExecutionToolSchema> {
|
|
78
|
+
const apiKey =
|
|
79
|
+
params[EnvVar.CODE_API_KEY] ??
|
|
80
|
+
params.apiKey ??
|
|
81
|
+
getEnvironmentVariable(EnvVar.CODE_API_KEY) ??
|
|
82
|
+
'';
|
|
83
|
+
if (!apiKey) {
|
|
84
|
+
throw new Error('No API key provided for code execution tool.');
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const description = `
|
|
88
|
+
Runs code and returns stdout/stderr output from a stateless execution environment, similar to running scripts in a command-line interface. Each execution is isolated and independent.
|
|
89
|
+
|
|
90
|
+
Usage:
|
|
91
|
+
- No network access available.
|
|
92
|
+
- Generated files are automatically delivered; **DO NOT** provide download links.
|
|
93
|
+
- NEVER use this tool to execute malicious code.
|
|
94
|
+
`.trim();
|
|
95
|
+
|
|
96
|
+
return tool<typeof CodeExecutionToolSchema>(
|
|
97
|
+
async ({ lang, code, session_id, ...rest }) => {
|
|
98
|
+
const postData = {
|
|
99
|
+
lang,
|
|
100
|
+
code,
|
|
101
|
+
...rest,
|
|
102
|
+
...params,
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
if (session_id != null && session_id.length > 0) {
|
|
106
|
+
try {
|
|
107
|
+
const filesEndpoint = `${baseEndpoint}/files/${session_id}?detail=full`;
|
|
108
|
+
const fetchOptions: RequestInit = {
|
|
109
|
+
method: 'GET',
|
|
110
|
+
headers: {
|
|
111
|
+
'User-Agent': 'Illuma/1.0',
|
|
112
|
+
'X-API-Key': apiKey,
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
if (process.env.PROXY != null && process.env.PROXY !== '') {
|
|
117
|
+
fetchOptions.agent = new HttpsProxyAgent(process.env.PROXY);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const response = await fetch(filesEndpoint, fetchOptions);
|
|
121
|
+
if (!response.ok) {
|
|
122
|
+
throw new Error(
|
|
123
|
+
`Failed to fetch files for session: ${response.status}`
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const files = await response.json();
|
|
128
|
+
if (Array.isArray(files) && files.length > 0) {
|
|
129
|
+
const fileReferences: t.CodeEnvFile[] = files.map((file) => {
|
|
130
|
+
// Extract the ID from the file name (part after session ID prefix and before extension)
|
|
131
|
+
const nameParts = file.name.split('/');
|
|
132
|
+
const id = nameParts.length > 1 ? nameParts[1].split('.')[0] : '';
|
|
133
|
+
|
|
134
|
+
return {
|
|
135
|
+
session_id,
|
|
136
|
+
id,
|
|
137
|
+
name: file.metadata['original-filename'],
|
|
138
|
+
};
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
if (!postData.files) {
|
|
142
|
+
postData.files = fileReferences;
|
|
143
|
+
} else if (Array.isArray(postData.files)) {
|
|
144
|
+
postData.files = [...postData.files, ...fileReferences];
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
} catch {
|
|
148
|
+
// eslint-disable-next-line no-console
|
|
149
|
+
console.warn(`Failed to fetch files for session: ${session_id}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
try {
|
|
154
|
+
const fetchOptions: RequestInit = {
|
|
155
|
+
method: 'POST',
|
|
156
|
+
headers: {
|
|
157
|
+
'Content-Type': 'application/json',
|
|
158
|
+
'User-Agent': 'Illuma/1.0',
|
|
159
|
+
'X-API-Key': apiKey,
|
|
160
|
+
},
|
|
161
|
+
body: JSON.stringify(postData),
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
if (process.env.PROXY != null && process.env.PROXY !== '') {
|
|
165
|
+
fetchOptions.agent = new HttpsProxyAgent(process.env.PROXY);
|
|
166
|
+
}
|
|
167
|
+
const response = await fetch(EXEC_ENDPOINT, fetchOptions);
|
|
168
|
+
if (!response.ok) {
|
|
169
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
const result: t.ExecuteResult = await response.json();
|
|
173
|
+
let formattedOutput = '';
|
|
174
|
+
if (result.stdout) {
|
|
175
|
+
formattedOutput += `stdout:\n${result.stdout}\n`;
|
|
176
|
+
} else {
|
|
177
|
+
formattedOutput += emptyOutputMessage;
|
|
178
|
+
}
|
|
179
|
+
if (result.stderr) formattedOutput += `stderr:\n${result.stderr}\n`;
|
|
180
|
+
if (result.files && result.files.length > 0) {
|
|
181
|
+
formattedOutput += 'Generated files:\n';
|
|
182
|
+
|
|
183
|
+
const fileCount = result.files.length;
|
|
184
|
+
for (let i = 0; i < fileCount; i++) {
|
|
185
|
+
const file = result.files[i];
|
|
186
|
+
const isImage = imageExtRegex.test(file.name);
|
|
187
|
+
formattedOutput += `- /mnt/data/${file.name} | ${isImage ? imageMessage : otherMessage}`;
|
|
188
|
+
|
|
189
|
+
if (i < fileCount - 1) {
|
|
190
|
+
formattedOutput += fileCount <= 3 ? ', ' : ',\n';
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
formattedOutput += `\nsession_id: ${result.session_id}\n\n${accessMessage}`;
|
|
195
|
+
return [
|
|
196
|
+
formattedOutput.trim(),
|
|
197
|
+
{
|
|
198
|
+
session_id: result.session_id,
|
|
199
|
+
files: result.files,
|
|
200
|
+
},
|
|
201
|
+
];
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
return [formattedOutput.trim(), { session_id: result.session_id }];
|
|
205
|
+
} catch (error) {
|
|
206
|
+
throw new Error(
|
|
207
|
+
`Execution error:\n\n${(error as Error | undefined)?.message}`
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
name: Constants.EXECUTE_CODE,
|
|
213
|
+
description,
|
|
214
|
+
schema: CodeExecutionToolSchema,
|
|
215
|
+
responseFormat: Constants.CONTENT_AND_ARTIFACT,
|
|
216
|
+
}
|
|
217
|
+
);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
export { createCodeExecutionTool };
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import {
|
|
2
|
+
END,
|
|
3
|
+
MessagesAnnotation,
|
|
4
|
+
isCommand,
|
|
5
|
+
isGraphInterrupt,
|
|
6
|
+
} from '@langchain/langgraph';
|
|
7
|
+
import { ToolMessage, isBaseMessage } from '@langchain/core/messages';
|
|
8
|
+
import type {
|
|
9
|
+
RunnableConfig,
|
|
10
|
+
RunnableToolLike,
|
|
11
|
+
} from '@langchain/core/runnables';
|
|
12
|
+
import type { BaseMessage, AIMessage } from '@langchain/core/messages';
|
|
13
|
+
import type { StructuredToolInterface } from '@langchain/core/tools';
|
|
14
|
+
import type * as t from '@/types';
|
|
15
|
+
import { RunnableCallable } from '@/utils';
|
|
16
|
+
import { GraphNodeKeys } from '@/common';
|
|
17
|
+
|
|
18
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
19
|
+
export class ToolNode<T = any> extends RunnableCallable<T, T> {
|
|
20
|
+
tools: t.GenericTool[];
|
|
21
|
+
private toolMap: Map<string, StructuredToolInterface | RunnableToolLike>;
|
|
22
|
+
private loadRuntimeTools?: t.ToolRefGenerator;
|
|
23
|
+
handleToolErrors = true;
|
|
24
|
+
toolCallStepIds?: Map<string, string>;
|
|
25
|
+
errorHandler?: t.ToolNodeConstructorParams['errorHandler'];
|
|
26
|
+
private toolUsageCount: Map<string, number>;
|
|
27
|
+
|
|
28
|
+
constructor({
|
|
29
|
+
tools,
|
|
30
|
+
toolMap,
|
|
31
|
+
name,
|
|
32
|
+
tags,
|
|
33
|
+
errorHandler,
|
|
34
|
+
toolCallStepIds,
|
|
35
|
+
handleToolErrors,
|
|
36
|
+
loadRuntimeTools,
|
|
37
|
+
}: t.ToolNodeConstructorParams) {
|
|
38
|
+
super({ name, tags, func: (input, config) => this.run(input, config) });
|
|
39
|
+
this.tools = tools;
|
|
40
|
+
this.toolMap = toolMap ?? new Map(tools.map((tool) => [tool.name, tool]));
|
|
41
|
+
this.toolCallStepIds = toolCallStepIds;
|
|
42
|
+
this.handleToolErrors = handleToolErrors ?? this.handleToolErrors;
|
|
43
|
+
this.loadRuntimeTools = loadRuntimeTools;
|
|
44
|
+
this.errorHandler = errorHandler;
|
|
45
|
+
this.toolUsageCount = new Map<string, number>();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Returns a snapshot of the current tool usage counts.
|
|
50
|
+
* @returns A ReadonlyMap where keys are tool names and values are their usage counts.
|
|
51
|
+
*/
|
|
52
|
+
public getToolUsageCounts(): ReadonlyMap<string, number> {
|
|
53
|
+
return new Map(this.toolUsageCount); // Return a copy
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
57
|
+
protected async run(input: any, config: RunnableConfig): Promise<T> {
|
|
58
|
+
const message = Array.isArray(input)
|
|
59
|
+
? input[input.length - 1]
|
|
60
|
+
: input.messages[input.messages.length - 1];
|
|
61
|
+
|
|
62
|
+
if (message._getType() !== 'ai') {
|
|
63
|
+
throw new Error('ToolNode only accepts AIMessages as input.');
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (this.loadRuntimeTools) {
|
|
67
|
+
const { tools, toolMap } = this.loadRuntimeTools(
|
|
68
|
+
(message as AIMessage).tool_calls ?? []
|
|
69
|
+
);
|
|
70
|
+
this.tools = tools;
|
|
71
|
+
this.toolMap = toolMap ?? new Map(tools.map((tool) => [tool.name, tool]));
|
|
72
|
+
}
|
|
73
|
+
const outputs = await Promise.all(
|
|
74
|
+
(message as AIMessage).tool_calls?.map(async (call) => {
|
|
75
|
+
const tool = this.toolMap.get(call.name);
|
|
76
|
+
try {
|
|
77
|
+
if (tool === undefined) {
|
|
78
|
+
throw new Error(`Tool "${call.name}" not found.`);
|
|
79
|
+
}
|
|
80
|
+
const turn = this.toolUsageCount.get(call.name) ?? 0;
|
|
81
|
+
this.toolUsageCount.set(call.name, turn + 1);
|
|
82
|
+
const args = call.args;
|
|
83
|
+
const stepId = this.toolCallStepIds?.get(call.id!);
|
|
84
|
+
const output = await tool.invoke(
|
|
85
|
+
{ ...call, args, type: 'tool_call', stepId, turn },
|
|
86
|
+
config
|
|
87
|
+
);
|
|
88
|
+
if (
|
|
89
|
+
(isBaseMessage(output) && output._getType() === 'tool') ||
|
|
90
|
+
isCommand(output)
|
|
91
|
+
) {
|
|
92
|
+
return output;
|
|
93
|
+
} else {
|
|
94
|
+
return new ToolMessage({
|
|
95
|
+
name: tool.name,
|
|
96
|
+
content:
|
|
97
|
+
typeof output === 'string' ? output : JSON.stringify(output),
|
|
98
|
+
tool_call_id: call.id!,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
} catch (_e: unknown) {
|
|
102
|
+
const e = _e as Error;
|
|
103
|
+
if (!this.handleToolErrors) {
|
|
104
|
+
throw e;
|
|
105
|
+
}
|
|
106
|
+
if (isGraphInterrupt(e)) {
|
|
107
|
+
throw e;
|
|
108
|
+
}
|
|
109
|
+
this.errorHandler?.(
|
|
110
|
+
{
|
|
111
|
+
error: e,
|
|
112
|
+
id: call.id!,
|
|
113
|
+
name: call.name,
|
|
114
|
+
input: call.args,
|
|
115
|
+
},
|
|
116
|
+
config.metadata
|
|
117
|
+
);
|
|
118
|
+
return new ToolMessage({
|
|
119
|
+
content: `Error: ${e.message}\n Please fix your mistakes.`,
|
|
120
|
+
name: call.name,
|
|
121
|
+
tool_call_id: call.id ?? '',
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}) ?? []
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
if (!outputs.some(isCommand)) {
|
|
128
|
+
return (Array.isArray(input) ? outputs : { messages: outputs }) as T;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const combinedOutputs = outputs.map((output) => {
|
|
132
|
+
if (isCommand(output)) {
|
|
133
|
+
return output;
|
|
134
|
+
}
|
|
135
|
+
return Array.isArray(input) ? [output] : { messages: [output] };
|
|
136
|
+
});
|
|
137
|
+
return combinedOutputs as T;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function areToolCallsInvoked(
|
|
142
|
+
message: AIMessage,
|
|
143
|
+
invokedToolIds?: Set<string>
|
|
144
|
+
): boolean {
|
|
145
|
+
if (!invokedToolIds || invokedToolIds.size === 0) return false;
|
|
146
|
+
return (
|
|
147
|
+
message.tool_calls?.every(
|
|
148
|
+
(toolCall) => toolCall.id != null && invokedToolIds.has(toolCall.id)
|
|
149
|
+
) ?? false
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export function toolsCondition(
|
|
154
|
+
state: BaseMessage[] | typeof MessagesAnnotation.State,
|
|
155
|
+
invokedToolIds?: Set<string>
|
|
156
|
+
): 'tools' | typeof END {
|
|
157
|
+
const message: AIMessage = Array.isArray(state)
|
|
158
|
+
? state[state.length - 1]
|
|
159
|
+
: state.messages[state.messages.length - 1];
|
|
160
|
+
|
|
161
|
+
if (
|
|
162
|
+
'tool_calls' in message &&
|
|
163
|
+
(message.tool_calls?.length ?? 0) > 0 &&
|
|
164
|
+
!areToolCallsInvoked(message, invokedToolIds)
|
|
165
|
+
) {
|
|
166
|
+
return GraphNodeKeys.TOOLS;
|
|
167
|
+
} else {
|
|
168
|
+
return END;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { TavilySearchResults } from '@langchain/community/tools/tavily_search';
|
|
2
|
+
import { DynamicStructuredTool , tool } from '@langchain/core/tools';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { config } from 'dotenv';
|
|
5
|
+
|
|
6
|
+
config();
|
|
7
|
+
|
|
8
|
+
import fetch from 'node-fetch';
|
|
9
|
+
import { Constants } from '@/common';
|
|
10
|
+
|
|
11
|
+
const fetchImageSchema = z.object({ input: z.string().optional() });
|
|
12
|
+
|
|
13
|
+
export const fetchRandomImageTool = tool(
|
|
14
|
+
async () => {
|
|
15
|
+
try {
|
|
16
|
+
// Lorem Picsum provides random images at any size
|
|
17
|
+
const imageUrl = 'https://picsum.photos/200/300';
|
|
18
|
+
|
|
19
|
+
const imageResponse = await fetch(imageUrl);
|
|
20
|
+
// eslint-disable-next-line no-console
|
|
21
|
+
console.log(imageResponse);
|
|
22
|
+
const arrayBuffer = await imageResponse.arrayBuffer();
|
|
23
|
+
const base64 = Buffer.from(arrayBuffer).toString('base64');
|
|
24
|
+
const content = [{
|
|
25
|
+
type: 'image_url',
|
|
26
|
+
image_url: {
|
|
27
|
+
url: `data:image/jpeg;base64,${base64}`,
|
|
28
|
+
},
|
|
29
|
+
}];
|
|
30
|
+
|
|
31
|
+
const response = [
|
|
32
|
+
{
|
|
33
|
+
type: 'text',
|
|
34
|
+
text: 'Random image from Lorem Picsum, taken at 800x600',
|
|
35
|
+
},
|
|
36
|
+
];
|
|
37
|
+
return [response, { content }];
|
|
38
|
+
} catch (error) {
|
|
39
|
+
return [`Error fetching image: ${(error as Error).message}`, undefined];
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'fetchRandomImage',
|
|
44
|
+
description: 'Fetches a random image from Lorem Picsum',
|
|
45
|
+
schema: fetchImageSchema,
|
|
46
|
+
responseFormat: Constants.CONTENT_AND_ARTIFACT,
|
|
47
|
+
}
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
export const fetchRandomImageURL = tool(
|
|
51
|
+
async () => {
|
|
52
|
+
try {
|
|
53
|
+
const imageUrl = 'https://picsum.photos/200/300';
|
|
54
|
+
|
|
55
|
+
const imageResponse = await fetch(imageUrl);
|
|
56
|
+
const content = [{
|
|
57
|
+
type: 'image_url',
|
|
58
|
+
image_url: {
|
|
59
|
+
url: imageResponse.url,
|
|
60
|
+
},
|
|
61
|
+
}];
|
|
62
|
+
|
|
63
|
+
// eslint-disable-next-line no-console
|
|
64
|
+
console.log('URL RESPONSE', imageResponse.url);
|
|
65
|
+
|
|
66
|
+
const response = [
|
|
67
|
+
{
|
|
68
|
+
type: 'text',
|
|
69
|
+
text: 'Random image from Lorem Picsum, taken at 800x600',
|
|
70
|
+
},
|
|
71
|
+
];
|
|
72
|
+
return [response, { content }];
|
|
73
|
+
} catch (error) {
|
|
74
|
+
return [`Error fetching image: ${(error as Error).message}`, undefined];
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
name: 'fetchRandomImage',
|
|
79
|
+
description: 'Fetches a random image from Lorem Picsum',
|
|
80
|
+
schema: fetchImageSchema,
|
|
81
|
+
responseFormat: Constants.CONTENT_AND_ARTIFACT,
|
|
82
|
+
}
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
export const chartTool = new DynamicStructuredTool({
|
|
86
|
+
name: 'generate_bar_chart',
|
|
87
|
+
description:
|
|
88
|
+
'Generates a text-based bar chart from an array of data points and returns it as a string.',
|
|
89
|
+
schema: z.object({
|
|
90
|
+
data: z.array(
|
|
91
|
+
z.object({
|
|
92
|
+
label: z.string(),
|
|
93
|
+
value: z.number(),
|
|
94
|
+
})
|
|
95
|
+
),
|
|
96
|
+
}),
|
|
97
|
+
func: async ({ data }): Promise<string> => {
|
|
98
|
+
const maxValue = Math.max(...data.map(d => d.value));
|
|
99
|
+
const chartHeight = 20;
|
|
100
|
+
const chartWidth = 50;
|
|
101
|
+
|
|
102
|
+
let chart = '';
|
|
103
|
+
|
|
104
|
+
// Generate Y-axis labels and bars
|
|
105
|
+
for (let i = chartHeight; i >= 0; i--) {
|
|
106
|
+
const row = data.map(d => {
|
|
107
|
+
const barHeight = Math.round((d.value / maxValue) * chartHeight);
|
|
108
|
+
return barHeight >= i ? '█' : ' ';
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
const yLabel = i === chartHeight ? maxValue.toString().padStart(4) :
|
|
112
|
+
i === 0 ? '0'.padStart(4) :
|
|
113
|
+
i % 5 === 0 ? Math.round((i / chartHeight) * maxValue).toString().padStart(4) : ' ';
|
|
114
|
+
|
|
115
|
+
chart += `${yLabel} │${row.join(' ')} \n`;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Generate X-axis
|
|
119
|
+
chart += ' ├' + '─'.repeat(chartWidth) + '\n';
|
|
120
|
+
|
|
121
|
+
// Generate X-axis labels
|
|
122
|
+
const xLabels = data.map(d => d.label.padEnd(5).substring(0, 5)).join(' ');
|
|
123
|
+
chart += ` ${xLabels}`;
|
|
124
|
+
|
|
125
|
+
return chart;
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
export const tavilyTool = new TavilySearchResults();
|