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,37 @@
|
|
|
1
|
+
import { getAttribution } from './utils.mjs';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Coerces Anthropic web search results to the SearchResultData format
|
|
5
|
+
* @param results - Array of Anthropic web search results
|
|
6
|
+
* @param turn - The turn number to associate with these results
|
|
7
|
+
* @returns SearchResultData with minimal ProcessedOrganic items
|
|
8
|
+
*/
|
|
9
|
+
function coerceAnthropicSearchResults({ results, turn = 0, }) {
|
|
10
|
+
const organic = results
|
|
11
|
+
.filter((result) => result.type === 'web_search_result')
|
|
12
|
+
.map((result, index) => ({
|
|
13
|
+
link: result.url,
|
|
14
|
+
position: index + 1,
|
|
15
|
+
title: result.title,
|
|
16
|
+
date: result.page_age ?? undefined,
|
|
17
|
+
attribution: getAttribution(result.url),
|
|
18
|
+
}));
|
|
19
|
+
return {
|
|
20
|
+
turn,
|
|
21
|
+
organic,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Helper function to check if an object is an Anthropic web search result
|
|
26
|
+
*/
|
|
27
|
+
function isAnthropicWebSearchResult(obj) {
|
|
28
|
+
return (typeof obj === 'object' &&
|
|
29
|
+
obj !== null &&
|
|
30
|
+
'type' in obj &&
|
|
31
|
+
obj.type === 'web_search_result' &&
|
|
32
|
+
'url' in obj &&
|
|
33
|
+
typeof obj.url === 'string');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export { coerceAnthropicSearchResults, isAnthropicWebSearchResult };
|
|
37
|
+
//# sourceMappingURL=anthropic.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.mjs","sources":["../../../../src/tools/search/anthropic.ts"],"sourcesContent":["import type {\r\n AnthropicTextBlockParam,\r\n AnthropicWebSearchResultBlockParam,\r\n} from '@/llm/anthropic/types';\r\nimport type { SearchResultData, ProcessedOrganic } from './types';\r\nimport { getAttribution } from './utils';\r\n\r\n/**\r\n * Coerces Anthropic web search results to the SearchResultData format\r\n * @param results - Array of Anthropic web search results\r\n * @param turn - The turn number to associate with these results\r\n * @returns SearchResultData with minimal ProcessedOrganic items\r\n */\r\nexport function coerceAnthropicSearchResults({\r\n results,\r\n turn = 0,\r\n}: {\r\n results: (AnthropicTextBlockParam | AnthropicWebSearchResultBlockParam)[];\r\n turn?: number;\r\n}): SearchResultData {\r\n const organic: ProcessedOrganic[] = results\r\n .filter((result) => result.type === 'web_search_result')\r\n .map((result, index) => ({\r\n link: result.url,\r\n position: index + 1,\r\n title: result.title,\r\n date: result.page_age ?? undefined,\r\n attribution: getAttribution(result.url),\r\n }));\r\n\r\n return {\r\n turn,\r\n organic,\r\n };\r\n}\r\n\r\n/**\r\n * Helper function to check if an object is an Anthropic web search result\r\n */\r\nexport function isAnthropicWebSearchResult(\r\n obj: unknown\r\n): obj is AnthropicWebSearchResultBlockParam {\r\n return (\r\n typeof obj === 'object' &&\r\n obj !== null &&\r\n 'type' in obj &&\r\n obj.type === 'web_search_result' &&\r\n 'url' in obj &&\r\n typeof (obj as Record<string, unknown>).url === 'string'\r\n );\r\n}\r\n"],"names":[],"mappings":";;AAOA;;;;;AAKG;AACG,SAAU,4BAA4B,CAAC,EAC3C,OAAO,EACP,IAAI,GAAG,CAAC,GAIT,EAAA;IACC,MAAM,OAAO,GAAuB;SACjC,MAAM,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,KAAK,mBAAmB;SACtD,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,MAAM;QACvB,IAAI,EAAE,MAAM,CAAC,GAAG;QAChB,QAAQ,EAAE,KAAK,GAAG,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC,KAAK;AACnB,QAAA,IAAI,EAAE,MAAM,CAAC,QAAQ,IAAI,SAAS;AAClC,QAAA,WAAW,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC;AACxC,KAAA,CAAC,CAAC;IAEL,OAAO;QACL,IAAI;QACJ,OAAO;KACR;AACH;AAEA;;AAEG;AACG,SAAU,0BAA0B,CACxC,GAAY,EAAA;AAEZ,IAAA,QACE,OAAO,GAAG,KAAK,QAAQ;AACvB,QAAA,GAAG,KAAK,IAAI;AACZ,QAAA,MAAM,IAAI,GAAG;QACb,GAAG,CAAC,IAAI,KAAK,mBAAmB;AAChC,QAAA,KAAK,IAAI,GAAG;AACZ,QAAA,OAAQ,GAA+B,CAAC,GAAG,KAAK,QAAQ;AAE5D;;;;"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import * as cheerio from 'cheerio';
|
|
2
|
+
|
|
3
|
+
function processContent(html, markdown) {
|
|
4
|
+
const linkMap = new Map();
|
|
5
|
+
const imageMap = new Map();
|
|
6
|
+
const videoMap = new Map();
|
|
7
|
+
const iframeMap = new Map();
|
|
8
|
+
const $ = cheerio.load(html, {
|
|
9
|
+
xmlMode: false,
|
|
10
|
+
});
|
|
11
|
+
// Extract all media references
|
|
12
|
+
$('a[href]').each((_, el) => {
|
|
13
|
+
const href = $(el).attr('href');
|
|
14
|
+
if (href != null && href) {
|
|
15
|
+
linkMap.set(href, {
|
|
16
|
+
originalUrl: href,
|
|
17
|
+
title: $(el).attr('title'),
|
|
18
|
+
text: $(el).text().trim(),
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
$('img[src]').each((_, el) => {
|
|
23
|
+
const src = $(el).attr('src');
|
|
24
|
+
if (src != null && src) {
|
|
25
|
+
imageMap.set(src, {
|
|
26
|
+
originalUrl: src,
|
|
27
|
+
title: $(el).attr('alt') ?? $(el).attr('title'),
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
// Handle videos (dedicated video elements and video platforms in iframes)
|
|
32
|
+
$('video[src], iframe[src*="youtube"], iframe[src*="vimeo"]').each((_, el) => {
|
|
33
|
+
const src = $(el).attr('src');
|
|
34
|
+
if (src != null && src) {
|
|
35
|
+
videoMap.set(src, {
|
|
36
|
+
originalUrl: src,
|
|
37
|
+
title: $(el).attr('title'),
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
// Handle all other generic iframes that aren't already captured as videos
|
|
42
|
+
$('iframe').each((_, el) => {
|
|
43
|
+
const src = $(el).attr('src');
|
|
44
|
+
if (src != null &&
|
|
45
|
+
src &&
|
|
46
|
+
!src.includes('youtube') &&
|
|
47
|
+
!src.includes('vimeo')) {
|
|
48
|
+
iframeMap.set(src, {
|
|
49
|
+
originalUrl: src,
|
|
50
|
+
title: $(el).attr('title'),
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
// Create lookup maps with indices
|
|
55
|
+
const linkIndexMap = new Map();
|
|
56
|
+
const imageIndexMap = new Map();
|
|
57
|
+
const videoIndexMap = new Map();
|
|
58
|
+
const iframeIndexMap = new Map();
|
|
59
|
+
Array.from(linkMap.keys()).forEach((url, i) => linkIndexMap.set(url, i + 1));
|
|
60
|
+
Array.from(imageMap.keys()).forEach((url, i) => imageIndexMap.set(url, i + 1));
|
|
61
|
+
Array.from(videoMap.keys()).forEach((url, i) => videoIndexMap.set(url, i + 1));
|
|
62
|
+
Array.from(iframeMap.keys()).forEach((url, i) => iframeIndexMap.set(url, i + 1));
|
|
63
|
+
// Process the markdown
|
|
64
|
+
let result = markdown;
|
|
65
|
+
// Replace each URL one by one, starting with the longest URLs first to avoid partial matches
|
|
66
|
+
const allUrls = [
|
|
67
|
+
...Array.from(imageMap.keys()).map((url) => ({
|
|
68
|
+
url,
|
|
69
|
+
type: 'image',
|
|
70
|
+
idx: imageIndexMap.get(url),
|
|
71
|
+
})),
|
|
72
|
+
...Array.from(videoMap.keys()).map((url) => ({
|
|
73
|
+
url,
|
|
74
|
+
type: 'video',
|
|
75
|
+
idx: videoIndexMap.get(url),
|
|
76
|
+
})),
|
|
77
|
+
...Array.from(iframeMap.keys()).map((url) => ({
|
|
78
|
+
url,
|
|
79
|
+
type: 'iframe',
|
|
80
|
+
idx: iframeIndexMap.get(url),
|
|
81
|
+
})),
|
|
82
|
+
...Array.from(linkMap.keys()).map((url) => ({
|
|
83
|
+
url,
|
|
84
|
+
type: 'link',
|
|
85
|
+
idx: linkIndexMap.get(url),
|
|
86
|
+
})),
|
|
87
|
+
].sort((a, b) => b.url.length - a.url.length);
|
|
88
|
+
// Create a function to escape special characters in URLs for regex
|
|
89
|
+
function escapeRegex(string) {
|
|
90
|
+
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
91
|
+
}
|
|
92
|
+
// Replace each URL in the markdown
|
|
93
|
+
for (const { url, type, idx } of allUrls) {
|
|
94
|
+
// Create a regex that captures URLs in markdown links
|
|
95
|
+
const regex = new RegExp(`\\(${escapeRegex(url)}(?:\\s+"[^"]*")?\\)`, 'g');
|
|
96
|
+
result = result.replace(regex, (match) => {
|
|
97
|
+
// Keep any title attribute that might exist
|
|
98
|
+
const titleMatch = match.match(/\s+"([^"]*)"/);
|
|
99
|
+
const titlePart = titleMatch ? ` "${titleMatch[1]}"` : '';
|
|
100
|
+
return `(${type}#${idx}${titlePart})`;
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
iframeMap.clear();
|
|
104
|
+
const links = Array.from(linkMap.values());
|
|
105
|
+
linkMap.clear();
|
|
106
|
+
const images = Array.from(imageMap.values());
|
|
107
|
+
imageMap.clear();
|
|
108
|
+
const videos = Array.from(videoMap.values());
|
|
109
|
+
videoMap.clear();
|
|
110
|
+
return {
|
|
111
|
+
markdown: result,
|
|
112
|
+
links,
|
|
113
|
+
images,
|
|
114
|
+
videos,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export { processContent };
|
|
119
|
+
//# sourceMappingURL=content.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content.mjs","sources":["../../../../src/tools/search/content.ts"],"sourcesContent":["import * as cheerio from 'cheerio';\r\nimport type { References, MediaReference } from './types';\r\n\r\nexport function processContent(\r\n html: string,\r\n markdown: string\r\n): {\r\n markdown: string;\r\n} & References {\r\n const linkMap = new Map<string, MediaReference>();\r\n const imageMap = new Map<string, MediaReference>();\r\n const videoMap = new Map<string, MediaReference>();\r\n const iframeMap = new Map<string, MediaReference>();\r\n\r\n const $ = cheerio.load(html, {\r\n xmlMode: false,\r\n });\r\n\r\n // Extract all media references\r\n $('a[href]').each((_, el) => {\r\n const href = $(el).attr('href');\r\n if (href != null && href) {\r\n linkMap.set(href, {\r\n originalUrl: href,\r\n title: $(el).attr('title'),\r\n text: $(el).text().trim(),\r\n });\r\n }\r\n });\r\n\r\n $('img[src]').each((_, el) => {\r\n const src = $(el).attr('src');\r\n if (src != null && src) {\r\n imageMap.set(src, {\r\n originalUrl: src,\r\n title: $(el).attr('alt') ?? $(el).attr('title'),\r\n });\r\n }\r\n });\r\n\r\n // Handle videos (dedicated video elements and video platforms in iframes)\r\n $('video[src], iframe[src*=\"youtube\"], iframe[src*=\"vimeo\"]').each(\r\n (_, el) => {\r\n const src = $(el).attr('src');\r\n if (src != null && src) {\r\n videoMap.set(src, {\r\n originalUrl: src,\r\n title: $(el).attr('title'),\r\n });\r\n }\r\n }\r\n );\r\n\r\n // Handle all other generic iframes that aren't already captured as videos\r\n $('iframe').each((_, el) => {\r\n const src = $(el).attr('src');\r\n if (\r\n src != null &&\r\n src &&\r\n !src.includes('youtube') &&\r\n !src.includes('vimeo')\r\n ) {\r\n iframeMap.set(src, {\r\n originalUrl: src,\r\n title: $(el).attr('title'),\r\n });\r\n }\r\n });\r\n\r\n // Create lookup maps with indices\r\n const linkIndexMap = new Map<string, number>();\r\n const imageIndexMap = new Map<string, number>();\r\n const videoIndexMap = new Map<string, number>();\r\n const iframeIndexMap = new Map<string, number>();\r\n\r\n Array.from(linkMap.keys()).forEach((url, i) => linkIndexMap.set(url, i + 1));\r\n Array.from(imageMap.keys()).forEach((url, i) =>\r\n imageIndexMap.set(url, i + 1)\r\n );\r\n Array.from(videoMap.keys()).forEach((url, i) =>\r\n videoIndexMap.set(url, i + 1)\r\n );\r\n Array.from(iframeMap.keys()).forEach((url, i) =>\r\n iframeIndexMap.set(url, i + 1)\r\n );\r\n\r\n // Process the markdown\r\n let result = markdown;\r\n\r\n // Replace each URL one by one, starting with the longest URLs first to avoid partial matches\r\n const allUrls = [\r\n ...Array.from(imageMap.keys()).map((url) => ({\r\n url,\r\n type: 'image',\r\n idx: imageIndexMap.get(url),\r\n })),\r\n ...Array.from(videoMap.keys()).map((url) => ({\r\n url,\r\n type: 'video',\r\n idx: videoIndexMap.get(url),\r\n })),\r\n ...Array.from(iframeMap.keys()).map((url) => ({\r\n url,\r\n type: 'iframe',\r\n idx: iframeIndexMap.get(url),\r\n })),\r\n ...Array.from(linkMap.keys()).map((url) => ({\r\n url,\r\n type: 'link',\r\n idx: linkIndexMap.get(url),\r\n })),\r\n ].sort((a, b) => b.url.length - a.url.length);\r\n\r\n // Create a function to escape special characters in URLs for regex\r\n function escapeRegex(string: string): string {\r\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n }\r\n\r\n // Replace each URL in the markdown\r\n for (const { url, type, idx } of allUrls) {\r\n // Create a regex that captures URLs in markdown links\r\n const regex = new RegExp(`\\\\(${escapeRegex(url)}(?:\\\\s+\"[^\"]*\")?\\\\)`, 'g');\r\n\r\n result = result.replace(regex, (match) => {\r\n // Keep any title attribute that might exist\r\n const titleMatch = match.match(/\\s+\"([^\"]*)\"/);\r\n const titlePart = titleMatch ? ` \"${titleMatch[1]}\"` : '';\r\n\r\n return `(${type}#${idx}${titlePart})`;\r\n });\r\n }\r\n\r\n iframeMap.clear();\r\n const links = Array.from(linkMap.values());\r\n linkMap.clear();\r\n const images = Array.from(imageMap.values());\r\n imageMap.clear();\r\n const videos = Array.from(videoMap.values());\r\n videoMap.clear();\r\n\r\n return {\r\n markdown: result,\r\n links,\r\n images,\r\n videos,\r\n };\r\n}\r\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import { processContent } from './content.mjs';
|
|
3
|
+
import { createDefaultLogger } from './utils.mjs';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Firecrawl scraper implementation
|
|
7
|
+
* Uses the Firecrawl API to scrape web pages
|
|
8
|
+
*/
|
|
9
|
+
class FirecrawlScraper {
|
|
10
|
+
apiKey;
|
|
11
|
+
apiUrl;
|
|
12
|
+
version;
|
|
13
|
+
defaultFormats;
|
|
14
|
+
timeout;
|
|
15
|
+
logger;
|
|
16
|
+
includeTags;
|
|
17
|
+
excludeTags;
|
|
18
|
+
waitFor;
|
|
19
|
+
maxAge;
|
|
20
|
+
mobile;
|
|
21
|
+
skipTlsVerification;
|
|
22
|
+
blockAds;
|
|
23
|
+
removeBase64Images;
|
|
24
|
+
parsePDF;
|
|
25
|
+
storeInCache;
|
|
26
|
+
zeroDataRetention;
|
|
27
|
+
headers;
|
|
28
|
+
location;
|
|
29
|
+
onlyMainContent;
|
|
30
|
+
changeTrackingOptions;
|
|
31
|
+
constructor(config = {}) {
|
|
32
|
+
this.apiKey = config.apiKey ?? process.env.FIRECRAWL_API_KEY ?? '';
|
|
33
|
+
this.version = config.version ?? 'v2';
|
|
34
|
+
const baseUrl = config.apiUrl ??
|
|
35
|
+
process.env.FIRECRAWL_BASE_URL ??
|
|
36
|
+
'https://api.firecrawl.dev';
|
|
37
|
+
this.apiUrl = `${baseUrl.replace(/\/+$/, '')}/${this.version}/scrape`;
|
|
38
|
+
this.defaultFormats = config.formats ?? ['markdown', 'rawHtml'];
|
|
39
|
+
this.timeout = config.timeout ?? 7500;
|
|
40
|
+
this.logger = config.logger || createDefaultLogger();
|
|
41
|
+
this.includeTags = config.includeTags;
|
|
42
|
+
this.excludeTags = config.excludeTags;
|
|
43
|
+
this.waitFor = config.waitFor;
|
|
44
|
+
this.maxAge = config.maxAge;
|
|
45
|
+
this.mobile = config.mobile;
|
|
46
|
+
this.skipTlsVerification = config.skipTlsVerification;
|
|
47
|
+
this.blockAds = config.blockAds;
|
|
48
|
+
this.removeBase64Images = config.removeBase64Images;
|
|
49
|
+
this.parsePDF = config.parsePDF;
|
|
50
|
+
this.storeInCache = config.storeInCache;
|
|
51
|
+
this.zeroDataRetention = config.zeroDataRetention;
|
|
52
|
+
this.headers = config.headers;
|
|
53
|
+
this.location = config.location;
|
|
54
|
+
this.onlyMainContent = config.onlyMainContent;
|
|
55
|
+
this.changeTrackingOptions = config.changeTrackingOptions;
|
|
56
|
+
if (!this.apiKey) {
|
|
57
|
+
this.logger.warn('FIRECRAWL_API_KEY is not set. Scraping will not work.');
|
|
58
|
+
}
|
|
59
|
+
this.logger.debug(`Firecrawl scraper initialized with API URL: ${this.apiUrl}`);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Scrape a single URL
|
|
63
|
+
* @param url URL to scrape
|
|
64
|
+
* @param options Scrape options
|
|
65
|
+
* @returns Scrape response
|
|
66
|
+
*/
|
|
67
|
+
async scrapeUrl(url, options = {}) {
|
|
68
|
+
if (!this.apiKey) {
|
|
69
|
+
return [
|
|
70
|
+
url,
|
|
71
|
+
{
|
|
72
|
+
success: false,
|
|
73
|
+
error: 'FIRECRAWL_API_KEY is not set',
|
|
74
|
+
},
|
|
75
|
+
];
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
const payload = omitUndefined({
|
|
79
|
+
url,
|
|
80
|
+
formats: options.formats ?? this.defaultFormats,
|
|
81
|
+
includeTags: options.includeTags ?? this.includeTags,
|
|
82
|
+
excludeTags: options.excludeTags ?? this.excludeTags,
|
|
83
|
+
headers: options.headers ?? this.headers,
|
|
84
|
+
waitFor: options.waitFor ?? this.waitFor,
|
|
85
|
+
timeout: options.timeout ?? this.timeout,
|
|
86
|
+
onlyMainContent: options.onlyMainContent ?? this.onlyMainContent,
|
|
87
|
+
maxAge: options.maxAge ?? this.maxAge,
|
|
88
|
+
mobile: options.mobile ?? this.mobile,
|
|
89
|
+
skipTlsVerification: options.skipTlsVerification ?? this.skipTlsVerification,
|
|
90
|
+
parsePDF: options.parsePDF ?? this.parsePDF,
|
|
91
|
+
location: options.location ?? this.location,
|
|
92
|
+
removeBase64Images: options.removeBase64Images ?? this.removeBase64Images,
|
|
93
|
+
blockAds: options.blockAds ?? this.blockAds,
|
|
94
|
+
storeInCache: options.storeInCache ?? this.storeInCache,
|
|
95
|
+
zeroDataRetention: options.zeroDataRetention ?? this.zeroDataRetention,
|
|
96
|
+
changeTrackingOptions: options.changeTrackingOptions ?? this.changeTrackingOptions,
|
|
97
|
+
});
|
|
98
|
+
const response = await axios.post(this.apiUrl, payload, {
|
|
99
|
+
headers: {
|
|
100
|
+
'Content-Type': 'application/json',
|
|
101
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
102
|
+
},
|
|
103
|
+
timeout: this.timeout,
|
|
104
|
+
});
|
|
105
|
+
return [url, response.data];
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
109
|
+
return [
|
|
110
|
+
url,
|
|
111
|
+
{
|
|
112
|
+
success: false,
|
|
113
|
+
error: `Firecrawl API request failed: ${errorMessage}`,
|
|
114
|
+
},
|
|
115
|
+
];
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Extract content from scrape response
|
|
120
|
+
* @param response Scrape response
|
|
121
|
+
* @returns Extracted content or empty string if not available
|
|
122
|
+
*/
|
|
123
|
+
extractContent(response) {
|
|
124
|
+
if (!response.success || !response.data) {
|
|
125
|
+
return ['', undefined];
|
|
126
|
+
}
|
|
127
|
+
if (response.data.markdown != null && response.data.html != null) {
|
|
128
|
+
try {
|
|
129
|
+
const { markdown, ...rest } = processContent(response.data.html, response.data.markdown);
|
|
130
|
+
return [markdown, rest];
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
this.logger.error('Error processing content:', error);
|
|
134
|
+
return [response.data.markdown, undefined];
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
else if (response.data.markdown != null) {
|
|
138
|
+
return [response.data.markdown, undefined];
|
|
139
|
+
}
|
|
140
|
+
// Fall back to HTML content
|
|
141
|
+
if (response.data.html != null) {
|
|
142
|
+
return [response.data.html, undefined];
|
|
143
|
+
}
|
|
144
|
+
// Fall back to raw HTML content
|
|
145
|
+
if (response.data.rawHtml != null) {
|
|
146
|
+
return [response.data.rawHtml, undefined];
|
|
147
|
+
}
|
|
148
|
+
return ['', undefined];
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Extract metadata from scrape response
|
|
152
|
+
* @param response Scrape response
|
|
153
|
+
* @returns Metadata object
|
|
154
|
+
*/
|
|
155
|
+
extractMetadata(response) {
|
|
156
|
+
if (!response.success || !response.data || !response.data.metadata) {
|
|
157
|
+
return {};
|
|
158
|
+
}
|
|
159
|
+
return response.data.metadata;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Create a Firecrawl scraper instance
|
|
164
|
+
* @param config Scraper configuration
|
|
165
|
+
* @returns Firecrawl scraper instance
|
|
166
|
+
*/
|
|
167
|
+
const createFirecrawlScraper = (config = {}) => {
|
|
168
|
+
return new FirecrawlScraper(config);
|
|
169
|
+
};
|
|
170
|
+
// Helper function to clean up payload for firecrawl
|
|
171
|
+
function omitUndefined(obj) {
|
|
172
|
+
return Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined));
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export { FirecrawlScraper, createFirecrawlScraper };
|
|
176
|
+
//# sourceMappingURL=firecrawl.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firecrawl.mjs","sources":["../../../../src/tools/search/firecrawl.ts"],"sourcesContent":["import axios from 'axios';\r\nimport { processContent } from './content';\r\nimport type * as t from './types';\r\nimport { createDefaultLogger } from './utils';\r\n\r\n/**\r\n * Firecrawl scraper implementation\r\n * Uses the Firecrawl API to scrape web pages\r\n */\r\nexport class FirecrawlScraper implements t.BaseScraper {\r\n private apiKey: string;\r\n private apiUrl: string;\r\n private version: string;\r\n private defaultFormats: string[];\r\n private timeout: number;\r\n private logger: t.Logger;\r\n private includeTags?: string[];\r\n private excludeTags?: string[];\r\n private waitFor?: number;\r\n private maxAge?: number;\r\n private mobile?: boolean;\r\n private skipTlsVerification?: boolean;\r\n private blockAds?: boolean;\r\n private removeBase64Images?: boolean;\r\n private parsePDF?: boolean;\r\n private storeInCache?: boolean;\r\n private zeroDataRetention?: boolean;\r\n private headers?: Record<string, string>;\r\n private location?: { country?: string; languages?: string[] };\r\n private onlyMainContent?: boolean;\r\n private changeTrackingOptions?: object;\r\n\r\n constructor(config: t.FirecrawlScraperConfig = {}) {\r\n this.apiKey = config.apiKey ?? process.env.FIRECRAWL_API_KEY ?? '';\r\n\r\n this.version = config.version ?? 'v2';\r\n\r\n const baseUrl =\r\n config.apiUrl ??\r\n process.env.FIRECRAWL_BASE_URL ??\r\n 'https://api.firecrawl.dev';\r\n this.apiUrl = `${baseUrl.replace(/\\/+$/, '')}/${this.version}/scrape`;\r\n\r\n this.defaultFormats = config.formats ?? ['markdown', 'rawHtml'];\r\n this.timeout = config.timeout ?? 7500;\r\n\r\n this.logger = config.logger || createDefaultLogger();\r\n\r\n this.includeTags = config.includeTags;\r\n this.excludeTags = config.excludeTags;\r\n this.waitFor = config.waitFor;\r\n this.maxAge = config.maxAge;\r\n this.mobile = config.mobile;\r\n this.skipTlsVerification = config.skipTlsVerification;\r\n this.blockAds = config.blockAds;\r\n this.removeBase64Images = config.removeBase64Images;\r\n this.parsePDF = config.parsePDF;\r\n this.storeInCache = config.storeInCache;\r\n this.zeroDataRetention = config.zeroDataRetention;\r\n this.headers = config.headers;\r\n this.location = config.location;\r\n this.onlyMainContent = config.onlyMainContent;\r\n this.changeTrackingOptions = config.changeTrackingOptions;\r\n\r\n if (!this.apiKey) {\r\n this.logger.warn('FIRECRAWL_API_KEY is not set. Scraping will not work.');\r\n }\r\n\r\n this.logger.debug(\r\n `Firecrawl scraper initialized with API URL: ${this.apiUrl}`\r\n );\r\n }\r\n\r\n /**\r\n * Scrape a single URL\r\n * @param url URL to scrape\r\n * @param options Scrape options\r\n * @returns Scrape response\r\n */\r\n async scrapeUrl(\r\n url: string,\r\n options: t.FirecrawlScrapeOptions = {}\r\n ): Promise<[string, t.FirecrawlScrapeResponse]> {\r\n if (!this.apiKey) {\r\n return [\r\n url,\r\n {\r\n success: false,\r\n error: 'FIRECRAWL_API_KEY is not set',\r\n },\r\n ];\r\n }\r\n\r\n try {\r\n const payload = omitUndefined({\r\n url,\r\n formats: options.formats ?? this.defaultFormats,\r\n includeTags: options.includeTags ?? this.includeTags,\r\n excludeTags: options.excludeTags ?? this.excludeTags,\r\n headers: options.headers ?? this.headers,\r\n waitFor: options.waitFor ?? this.waitFor,\r\n timeout: options.timeout ?? this.timeout,\r\n onlyMainContent: options.onlyMainContent ?? this.onlyMainContent,\r\n maxAge: options.maxAge ?? this.maxAge,\r\n mobile: options.mobile ?? this.mobile,\r\n skipTlsVerification:\r\n options.skipTlsVerification ?? this.skipTlsVerification,\r\n parsePDF: options.parsePDF ?? this.parsePDF,\r\n location: options.location ?? this.location,\r\n removeBase64Images:\r\n options.removeBase64Images ?? this.removeBase64Images,\r\n blockAds: options.blockAds ?? this.blockAds,\r\n storeInCache: options.storeInCache ?? this.storeInCache,\r\n zeroDataRetention: options.zeroDataRetention ?? this.zeroDataRetention,\r\n changeTrackingOptions:\r\n options.changeTrackingOptions ?? this.changeTrackingOptions,\r\n });\r\n const response = await axios.post(this.apiUrl, payload, {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${this.apiKey}`,\r\n },\r\n timeout: this.timeout,\r\n });\r\n\r\n return [url, response.data];\r\n } catch (error) {\r\n const errorMessage =\r\n error instanceof Error ? error.message : String(error);\r\n return [\r\n url,\r\n {\r\n success: false,\r\n error: `Firecrawl API request failed: ${errorMessage}`,\r\n },\r\n ];\r\n }\r\n }\r\n\r\n /**\r\n * Extract content from scrape response\r\n * @param response Scrape response\r\n * @returns Extracted content or empty string if not available\r\n */\r\n extractContent(\r\n response: t.FirecrawlScrapeResponse\r\n ): [string, undefined | t.References] {\r\n if (!response.success || !response.data) {\r\n return ['', undefined];\r\n }\r\n\r\n if (response.data.markdown != null && response.data.html != null) {\r\n try {\r\n const { markdown, ...rest } = processContent(\r\n response.data.html,\r\n response.data.markdown\r\n );\r\n return [markdown, rest];\r\n } catch (error) {\r\n this.logger.error('Error processing content:', error);\r\n return [response.data.markdown, undefined];\r\n }\r\n } else if (response.data.markdown != null) {\r\n return [response.data.markdown, undefined];\r\n }\r\n\r\n // Fall back to HTML content\r\n if (response.data.html != null) {\r\n return [response.data.html, undefined];\r\n }\r\n\r\n // Fall back to raw HTML content\r\n if (response.data.rawHtml != null) {\r\n return [response.data.rawHtml, undefined];\r\n }\r\n\r\n return ['', undefined];\r\n }\r\n\r\n /**\r\n * Extract metadata from scrape response\r\n * @param response Scrape response\r\n * @returns Metadata object\r\n */\r\n extractMetadata(response: t.FirecrawlScrapeResponse): t.ScrapeMetadata {\r\n if (!response.success || !response.data || !response.data.metadata) {\r\n return {};\r\n }\r\n\r\n return response.data.metadata;\r\n }\r\n}\r\n\r\n/**\r\n * Create a Firecrawl scraper instance\r\n * @param config Scraper configuration\r\n * @returns Firecrawl scraper instance\r\n */\r\nexport const createFirecrawlScraper = (\r\n config: t.FirecrawlScraperConfig = {}\r\n): FirecrawlScraper => {\r\n return new FirecrawlScraper(config);\r\n};\r\n\r\n// Helper function to clean up payload for firecrawl\r\nfunction omitUndefined<T extends object>(obj: T): Partial<T> {\r\n return Object.fromEntries(\r\n Object.entries(obj).filter(([, v]) => v !== undefined)\r\n ) as Partial<T>;\r\n}\r\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { fileExtRegex, getDomainName } from './utils.mjs';
|
|
2
|
+
|
|
3
|
+
function addHighlightSection() {
|
|
4
|
+
return ['\n## Highlights', ''];
|
|
5
|
+
}
|
|
6
|
+
// Helper function to format a source (organic or top story)
|
|
7
|
+
function formatSource(source, index, turn, sourceType, references) {
|
|
8
|
+
/** Array of all lines to include in the output */
|
|
9
|
+
const outputLines = [];
|
|
10
|
+
// Add the title
|
|
11
|
+
outputLines.push(`# ${sourceType.charAt(0).toUpperCase() + sourceType.slice(1)} ${index}: ${source.title != null && source.title ? `"${source.title}"` : '(no title)'}`);
|
|
12
|
+
outputLines.push(`\nAnchor: \\ue202turn${turn}${sourceType}${index}`);
|
|
13
|
+
outputLines.push(`URL: ${source.link}`);
|
|
14
|
+
// Add optional fields
|
|
15
|
+
if ('snippet' in source && source.snippet != null) {
|
|
16
|
+
outputLines.push(`Summary: ${source.snippet}`);
|
|
17
|
+
}
|
|
18
|
+
if (source.date != null) {
|
|
19
|
+
outputLines.push(`Date: ${source.date}`);
|
|
20
|
+
}
|
|
21
|
+
if (source.attribution != null) {
|
|
22
|
+
outputLines.push(`Source: ${source.attribution}`);
|
|
23
|
+
}
|
|
24
|
+
// Add highlight section or empty line
|
|
25
|
+
if ((source.highlights?.length ?? 0) > 0) {
|
|
26
|
+
outputLines.push(...addHighlightSection());
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
outputLines.push('');
|
|
30
|
+
}
|
|
31
|
+
// Process highlights if they exist
|
|
32
|
+
(source.highlights ?? [])
|
|
33
|
+
.filter((h) => h.text.trim().length > 0)
|
|
34
|
+
.forEach((h, hIndex) => {
|
|
35
|
+
outputLines.push(`### Highlight ${hIndex + 1} [Relevance: ${h.score.toFixed(2)}]`);
|
|
36
|
+
outputLines.push('');
|
|
37
|
+
outputLines.push('```text');
|
|
38
|
+
outputLines.push(h.text.trim());
|
|
39
|
+
outputLines.push('```');
|
|
40
|
+
outputLines.push('');
|
|
41
|
+
if (h.references != null && h.references.length) {
|
|
42
|
+
let hasHeader = false;
|
|
43
|
+
const refLines = [];
|
|
44
|
+
for (let j = 0; j < h.references.length; j++) {
|
|
45
|
+
const ref = h.references[j];
|
|
46
|
+
if (ref.reference.originalUrl.includes('mailto:')) {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (ref.type !== 'link') {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (fileExtRegex.test(ref.reference.originalUrl)) {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
references.push({
|
|
56
|
+
type: ref.type,
|
|
57
|
+
link: ref.reference.originalUrl,
|
|
58
|
+
attribution: getDomainName(ref.reference.originalUrl),
|
|
59
|
+
title: (((ref.reference.title ?? '') || ref.reference.text) ??
|
|
60
|
+
'').split('\n')[0],
|
|
61
|
+
});
|
|
62
|
+
if (!hasHeader) {
|
|
63
|
+
refLines.push('Core References:');
|
|
64
|
+
hasHeader = true;
|
|
65
|
+
}
|
|
66
|
+
refLines.push(`- ${ref.type}#${ref.originalIndex + 1}: ${ref.reference.originalUrl}`);
|
|
67
|
+
refLines.push(`\t- Anchor: \\ue202turn${turn}ref${references.length - 1}`);
|
|
68
|
+
}
|
|
69
|
+
if (hasHeader) {
|
|
70
|
+
outputLines.push(...refLines);
|
|
71
|
+
outputLines.push('');
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (hIndex < (source.highlights?.length ?? 0) - 1) {
|
|
75
|
+
outputLines.push('---');
|
|
76
|
+
outputLines.push('');
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
outputLines.push('');
|
|
80
|
+
return outputLines.join('\n');
|
|
81
|
+
}
|
|
82
|
+
function formatResultsForLLM(turn, results) {
|
|
83
|
+
/** Array to collect all output lines */
|
|
84
|
+
const outputLines = [];
|
|
85
|
+
const addSection = (title) => {
|
|
86
|
+
outputLines.push('');
|
|
87
|
+
outputLines.push(`=== ${title} ===`);
|
|
88
|
+
outputLines.push('');
|
|
89
|
+
};
|
|
90
|
+
const references = [];
|
|
91
|
+
// Organic (web) results
|
|
92
|
+
if (results.organic?.length != null && results.organic.length > 0) {
|
|
93
|
+
addSection(`Web Results, Turn ${turn}`);
|
|
94
|
+
for (let i = 0; i < results.organic.length; i++) {
|
|
95
|
+
const r = results.organic[i];
|
|
96
|
+
outputLines.push(formatSource(r, i, turn, 'search', references));
|
|
97
|
+
delete results.organic[i].highlights;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Top stories (news)
|
|
101
|
+
const topStories = results.topStories ?? [];
|
|
102
|
+
if (topStories.length) {
|
|
103
|
+
addSection('News Results');
|
|
104
|
+
for (let i = 0; i < topStories.length; i++) {
|
|
105
|
+
const r = topStories[i];
|
|
106
|
+
outputLines.push(formatSource(r, i, turn, 'news', references));
|
|
107
|
+
if (results.topStories?.[i]?.highlights) {
|
|
108
|
+
delete results.topStories[i].highlights;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// // Images
|
|
113
|
+
// const images = results.images ?? [];
|
|
114
|
+
// if (images.length) {
|
|
115
|
+
// addSection('Image Results');
|
|
116
|
+
// const imageLines = images.map((img, i) => [
|
|
117
|
+
// `Anchor: \ue202turn0image${i}`,
|
|
118
|
+
// `Title: ${img.title ?? '(no title)'}`,
|
|
119
|
+
// `Image URL: ${img.imageUrl}`,
|
|
120
|
+
// ''
|
|
121
|
+
// ].join('\n'));
|
|
122
|
+
// outputLines.push(imageLines.join('\n'));
|
|
123
|
+
// }
|
|
124
|
+
// Knowledge Graph
|
|
125
|
+
if (results.knowledgeGraph != null) {
|
|
126
|
+
addSection('Knowledge Graph');
|
|
127
|
+
const kgLines = [
|
|
128
|
+
`**Title:** ${results.knowledgeGraph.title ?? '(no title)'}`,
|
|
129
|
+
results.knowledgeGraph.type != null
|
|
130
|
+
? `**Type:** ${results.knowledgeGraph.type}`
|
|
131
|
+
: '',
|
|
132
|
+
results.knowledgeGraph.description != null
|
|
133
|
+
? `**Description:** ${results.knowledgeGraph.description}`
|
|
134
|
+
: '',
|
|
135
|
+
results.knowledgeGraph.descriptionSource != null
|
|
136
|
+
? `**Description Source:** ${results.knowledgeGraph.descriptionSource}`
|
|
137
|
+
: '',
|
|
138
|
+
results.knowledgeGraph.descriptionLink != null
|
|
139
|
+
? `**Description Link:** ${results.knowledgeGraph.descriptionLink}`
|
|
140
|
+
: '',
|
|
141
|
+
results.knowledgeGraph.imageUrl != null
|
|
142
|
+
? `**Image URL:** ${results.knowledgeGraph.imageUrl}`
|
|
143
|
+
: '',
|
|
144
|
+
results.knowledgeGraph.website != null
|
|
145
|
+
? `**Website:** ${results.knowledgeGraph.website}`
|
|
146
|
+
: '',
|
|
147
|
+
results.knowledgeGraph.attributes != null
|
|
148
|
+
? `**Attributes:**\n\`\`\`json\n${JSON.stringify(results.knowledgeGraph.attributes, null, 2)}\n\`\`\``
|
|
149
|
+
: '',
|
|
150
|
+
'',
|
|
151
|
+
].filter(Boolean);
|
|
152
|
+
outputLines.push(kgLines.join('\n\n'));
|
|
153
|
+
}
|
|
154
|
+
// Answer Box
|
|
155
|
+
if (results.answerBox != null) {
|
|
156
|
+
addSection('Answer Box');
|
|
157
|
+
const abLines = [
|
|
158
|
+
results.answerBox.title != null
|
|
159
|
+
? `**Title:** ${results.answerBox.title}`
|
|
160
|
+
: '',
|
|
161
|
+
results.answerBox.snippet != null
|
|
162
|
+
? `**Snippet:** ${results.answerBox.snippet}`
|
|
163
|
+
: '',
|
|
164
|
+
results.answerBox.snippetHighlighted != null
|
|
165
|
+
? `**Snippet Highlighted:** ${results.answerBox.snippetHighlighted
|
|
166
|
+
.map((s) => `\`${s}\``)
|
|
167
|
+
.join(' ')}`
|
|
168
|
+
: '',
|
|
169
|
+
results.answerBox.link != null
|
|
170
|
+
? `**Link:** ${results.answerBox.link}`
|
|
171
|
+
: '',
|
|
172
|
+
'',
|
|
173
|
+
].filter(Boolean);
|
|
174
|
+
outputLines.push(abLines.join('\n\n'));
|
|
175
|
+
}
|
|
176
|
+
// People also ask
|
|
177
|
+
const peopleAlsoAsk = results.peopleAlsoAsk ?? [];
|
|
178
|
+
if (peopleAlsoAsk.length) {
|
|
179
|
+
addSection('People Also Ask');
|
|
180
|
+
const paaLines = [];
|
|
181
|
+
peopleAlsoAsk.forEach((p, i) => {
|
|
182
|
+
const questionLines = [
|
|
183
|
+
`### Question ${i + 1}:`,
|
|
184
|
+
`"${p.question}"`,
|
|
185
|
+
`${p.snippet != null && p.snippet ? `Snippet: ${p.snippet}` : ''}`,
|
|
186
|
+
`${p.title != null && p.title ? `Title: ${p.title}` : ''}`,
|
|
187
|
+
`${p.link != null && p.link ? `Link: ${p.link}` : ''}`,
|
|
188
|
+
'',
|
|
189
|
+
].filter(Boolean);
|
|
190
|
+
paaLines.push(questionLines.join('\n\n'));
|
|
191
|
+
});
|
|
192
|
+
outputLines.push(paaLines.join(''));
|
|
193
|
+
}
|
|
194
|
+
return {
|
|
195
|
+
output: outputLines.join('\n').trim(),
|
|
196
|
+
references,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export { formatResultsForLLM };
|
|
201
|
+
//# sourceMappingURL=format.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.mjs","sources":["../../../../src/tools/search/format.ts"],"sourcesContent":["import type * as t from './types';\r\nimport { getDomainName, fileExtRegex } from './utils';\r\n\r\nfunction addHighlightSection(): string[] {\r\n return ['\\n## Highlights', ''];\r\n}\r\n\r\n// Helper function to format a source (organic or top story)\r\nfunction formatSource(\r\n source: t.ValidSource,\r\n index: number,\r\n turn: number,\r\n sourceType: 'search' | 'news',\r\n references: t.ResultReference[]\r\n): string {\r\n /** Array of all lines to include in the output */\r\n const outputLines: string[] = [];\r\n\r\n // Add the title\r\n outputLines.push(\r\n `# ${sourceType.charAt(0).toUpperCase() + sourceType.slice(1)} ${index}: ${source.title != null && source.title ? `\"${source.title}\"` : '(no title)'}`\r\n );\r\n outputLines.push(`\\nAnchor: \\\\ue202turn${turn}${sourceType}${index}`);\r\n outputLines.push(`URL: ${source.link}`);\r\n\r\n // Add optional fields\r\n if ('snippet' in source && source.snippet != null) {\r\n outputLines.push(`Summary: ${source.snippet}`);\r\n }\r\n\r\n if (source.date != null) {\r\n outputLines.push(`Date: ${source.date}`);\r\n }\r\n\r\n if (source.attribution != null) {\r\n outputLines.push(`Source: ${source.attribution}`);\r\n }\r\n\r\n // Add highlight section or empty line\r\n if ((source.highlights?.length ?? 0) > 0) {\r\n outputLines.push(...addHighlightSection());\r\n } else {\r\n outputLines.push('');\r\n }\r\n\r\n // Process highlights if they exist\r\n (source.highlights ?? [])\r\n .filter((h) => h.text.trim().length > 0)\r\n .forEach((h, hIndex) => {\r\n outputLines.push(\r\n `### Highlight ${hIndex + 1} [Relevance: ${h.score.toFixed(2)}]`\r\n );\r\n outputLines.push('');\r\n outputLines.push('```text');\r\n outputLines.push(h.text.trim());\r\n outputLines.push('```');\r\n outputLines.push('');\r\n\r\n if (h.references != null && h.references.length) {\r\n let hasHeader = false;\r\n const refLines: string[] = [];\r\n\r\n for (let j = 0; j < h.references.length; j++) {\r\n const ref = h.references[j];\r\n if (ref.reference.originalUrl.includes('mailto:')) {\r\n continue;\r\n }\r\n if (ref.type !== 'link') {\r\n continue;\r\n }\r\n if (fileExtRegex.test(ref.reference.originalUrl)) {\r\n continue;\r\n }\r\n references.push({\r\n type: ref.type,\r\n link: ref.reference.originalUrl,\r\n attribution: getDomainName(ref.reference.originalUrl),\r\n title: (\r\n ((ref.reference.title ?? '') || ref.reference.text) ??\r\n ''\r\n ).split('\\n')[0],\r\n });\r\n\r\n if (!hasHeader) {\r\n refLines.push('Core References:');\r\n hasHeader = true;\r\n }\r\n\r\n refLines.push(\r\n `- ${ref.type}#${ref.originalIndex + 1}: ${ref.reference.originalUrl}`\r\n );\r\n refLines.push(\r\n `\\t- Anchor: \\\\ue202turn${turn}ref${references.length - 1}`\r\n );\r\n }\r\n\r\n if (hasHeader) {\r\n outputLines.push(...refLines);\r\n outputLines.push('');\r\n }\r\n }\r\n\r\n if (hIndex < (source.highlights?.length ?? 0) - 1) {\r\n outputLines.push('---');\r\n outputLines.push('');\r\n }\r\n });\r\n\r\n outputLines.push('');\r\n return outputLines.join('\\n');\r\n}\r\n\r\nexport function formatResultsForLLM(\r\n turn: number,\r\n results: t.SearchResultData\r\n): { output: string; references: t.ResultReference[] } {\r\n /** Array to collect all output lines */\r\n const outputLines: string[] = [];\r\n\r\n const addSection = (title: string): void => {\r\n outputLines.push('');\r\n outputLines.push(`=== ${title} ===`);\r\n outputLines.push('');\r\n };\r\n\r\n const references: t.ResultReference[] = [];\r\n\r\n // Organic (web) results\r\n if (results.organic?.length != null && results.organic.length > 0) {\r\n addSection(`Web Results, Turn ${turn}`);\r\n for (let i = 0; i < results.organic.length; i++) {\r\n const r = results.organic[i];\r\n outputLines.push(formatSource(r, i, turn, 'search', references));\r\n delete results.organic[i].highlights;\r\n }\r\n }\r\n\r\n // Top stories (news)\r\n const topStories = results.topStories ?? [];\r\n if (topStories.length) {\r\n addSection('News Results');\r\n for (let i = 0; i < topStories.length; i++) {\r\n const r = topStories[i];\r\n outputLines.push(formatSource(r, i, turn, 'news', references));\r\n if (results.topStories?.[i]?.highlights) {\r\n delete results.topStories[i].highlights;\r\n }\r\n }\r\n }\r\n\r\n // // Images\r\n // const images = results.images ?? [];\r\n // if (images.length) {\r\n // addSection('Image Results');\r\n // const imageLines = images.map((img, i) => [\r\n // `Anchor: \\ue202turn0image${i}`,\r\n // `Title: ${img.title ?? '(no title)'}`,\r\n // `Image URL: ${img.imageUrl}`,\r\n // ''\r\n // ].join('\\n'));\r\n // outputLines.push(imageLines.join('\\n'));\r\n // }\r\n\r\n // Knowledge Graph\r\n if (results.knowledgeGraph != null) {\r\n addSection('Knowledge Graph');\r\n const kgLines = [\r\n `**Title:** ${results.knowledgeGraph.title ?? '(no title)'}`,\r\n results.knowledgeGraph.type != null\r\n ? `**Type:** ${results.knowledgeGraph.type}`\r\n : '',\r\n results.knowledgeGraph.description != null\r\n ? `**Description:** ${results.knowledgeGraph.description}`\r\n : '',\r\n results.knowledgeGraph.descriptionSource != null\r\n ? `**Description Source:** ${results.knowledgeGraph.descriptionSource}`\r\n : '',\r\n results.knowledgeGraph.descriptionLink != null\r\n ? `**Description Link:** ${results.knowledgeGraph.descriptionLink}`\r\n : '',\r\n results.knowledgeGraph.imageUrl != null\r\n ? `**Image URL:** ${results.knowledgeGraph.imageUrl}`\r\n : '',\r\n results.knowledgeGraph.website != null\r\n ? `**Website:** ${results.knowledgeGraph.website}`\r\n : '',\r\n results.knowledgeGraph.attributes != null\r\n ? `**Attributes:**\\n\\`\\`\\`json\\n${JSON.stringify(\r\n results.knowledgeGraph.attributes,\r\n null,\r\n 2\r\n )}\\n\\`\\`\\``\r\n : '',\r\n '',\r\n ].filter(Boolean);\r\n\r\n outputLines.push(kgLines.join('\\n\\n'));\r\n }\r\n\r\n // Answer Box\r\n if (results.answerBox != null) {\r\n addSection('Answer Box');\r\n const abLines = [\r\n results.answerBox.title != null\r\n ? `**Title:** ${results.answerBox.title}`\r\n : '',\r\n results.answerBox.snippet != null\r\n ? `**Snippet:** ${results.answerBox.snippet}`\r\n : '',\r\n results.answerBox.snippetHighlighted != null\r\n ? `**Snippet Highlighted:** ${results.answerBox.snippetHighlighted\r\n .map((s) => `\\`${s}\\``)\r\n .join(' ')}`\r\n : '',\r\n results.answerBox.link != null\r\n ? `**Link:** ${results.answerBox.link}`\r\n : '',\r\n '',\r\n ].filter(Boolean);\r\n\r\n outputLines.push(abLines.join('\\n\\n'));\r\n }\r\n\r\n // People also ask\r\n const peopleAlsoAsk = results.peopleAlsoAsk ?? [];\r\n if (peopleAlsoAsk.length) {\r\n addSection('People Also Ask');\r\n\r\n const paaLines: string[] = [];\r\n peopleAlsoAsk.forEach((p, i) => {\r\n const questionLines = [\r\n `### Question ${i + 1}:`,\r\n `\"${p.question}\"`,\r\n `${p.snippet != null && p.snippet ? `Snippet: ${p.snippet}` : ''}`,\r\n `${p.title != null && p.title ? `Title: ${p.title}` : ''}`,\r\n `${p.link != null && p.link ? `Link: ${p.link}` : ''}`,\r\n '',\r\n ].filter(Boolean);\r\n\r\n paaLines.push(questionLines.join('\\n\\n'));\r\n });\r\n\r\n outputLines.push(paaLines.join(''));\r\n }\r\n\r\n return {\r\n output: outputLines.join('\\n').trim(),\r\n references,\r\n };\r\n}\r\n"],"names":[],"mappings":"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"}
|