@illuma-ai/agents 1.5.1 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -62
- package/dist/cjs/agents/AgentContext.cjs +160 -259
- package/dist/cjs/agents/AgentContext.cjs.map +1 -1
- package/dist/cjs/common/enum.cjs +12 -12
- package/dist/cjs/common/enum.cjs.map +1 -1
- package/dist/cjs/graphs/Graph.cjs +30 -13
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/graphs/MultiAgentGraph.cjs +1 -1
- package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
- package/dist/cjs/graphs/phases/memoryFlushPhase.cjs +1 -1
- package/dist/cjs/graphs/phases/memoryFlushPhase.cjs.map +1 -1
- package/dist/cjs/hooks/HookRegistry.cjs +1 -1
- package/dist/cjs/hooks/HookRegistry.cjs.map +1 -1
- package/dist/cjs/hooks/matchers.cjs +2 -2
- package/dist/cjs/hooks/matchers.cjs.map +1 -1
- package/dist/cjs/hooks/types.cjs +1 -1
- package/dist/cjs/hooks/types.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +1 -5
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/index.cjs +33 -61
- package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
- package/dist/cjs/llm/openai/index.cjs +1 -1
- package/dist/cjs/llm/openai/index.cjs.map +1 -1
- package/dist/cjs/llm/openai/utils/index.cjs +10 -27
- package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
- package/dist/cjs/main.cjs +3 -84
- package/dist/cjs/main.cjs.map +1 -1
- package/dist/cjs/memory/citations.cjs +4 -4
- package/dist/cjs/memory/citations.cjs.map +1 -1
- package/dist/cjs/memory/constants.cjs +17 -17
- package/dist/cjs/memory/constants.cjs.map +1 -1
- package/dist/cjs/memory/mmr.cjs +1 -1
- package/dist/cjs/memory/mmr.cjs.map +1 -1
- package/dist/cjs/memory/paths.cjs +1 -1
- package/dist/cjs/memory/paths.cjs.map +1 -1
- package/dist/cjs/memory/recallTracking.cjs +3 -3
- package/dist/cjs/memory/recallTracking.cjs.map +1 -1
- package/dist/cjs/memory/temporalDecay.cjs +2 -2
- package/dist/cjs/memory/temporalDecay.cjs.map +1 -1
- package/dist/cjs/messages/cache.cjs +0 -89
- package/dist/cjs/messages/cache.cjs.map +1 -1
- package/dist/cjs/messages/format.cjs +13 -71
- package/dist/cjs/messages/format.cjs.map +1 -1
- package/dist/cjs/tools/BashExecutor.cjs +11 -21
- package/dist/cjs/tools/BashExecutor.cjs.map +1 -1
- package/dist/cjs/tools/CodeExecutor.cjs +13 -41
- package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs +11 -16
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
- package/dist/cjs/tools/ToolNode.cjs +78 -13
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/memory/memoryAppendTool.cjs +1 -1
- package/dist/cjs/tools/memory/memoryAppendTool.cjs.map +1 -1
- package/dist/cjs/tools/memory/memoryGetTool.cjs +2 -2
- package/dist/cjs/tools/memory/memoryGetTool.cjs.map +1 -1
- package/dist/cjs/tools/memory/memorySearchTool.cjs +3 -3
- package/dist/cjs/tools/memory/memorySearchTool.cjs.map +1 -1
- package/dist/cjs/tools/memory/shared.cjs +1 -1
- package/dist/cjs/tools/memory/shared.cjs.map +1 -1
- package/dist/cjs/tools/search/search.cjs +3 -11
- package/dist/cjs/tools/search/search.cjs.map +1 -1
- package/dist/cjs/tools/search/tool.cjs +4 -28
- package/dist/cjs/tools/search/tool.cjs.map +1 -1
- package/dist/cjs/tools/search/utils.cjs +3 -10
- package/dist/cjs/tools/search/utils.cjs.map +1 -1
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs +48 -0
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
- package/dist/cjs/types/graph.cjs.map +1 -1
- package/dist/esm/agents/AgentContext.mjs +160 -259
- package/dist/esm/agents/AgentContext.mjs.map +1 -1
- package/dist/esm/common/enum.mjs +12 -12
- package/dist/esm/common/enum.mjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +30 -13
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/graphs/MultiAgentGraph.mjs +1 -1
- package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
- package/dist/esm/graphs/phases/memoryFlushPhase.mjs +1 -1
- package/dist/esm/graphs/phases/memoryFlushPhase.mjs.map +1 -1
- package/dist/esm/hooks/HookRegistry.mjs +1 -1
- package/dist/esm/hooks/HookRegistry.mjs.map +1 -1
- package/dist/esm/hooks/matchers.mjs +2 -2
- package/dist/esm/hooks/matchers.mjs.map +1 -1
- package/dist/esm/hooks/types.mjs +1 -1
- package/dist/esm/hooks/types.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs +1 -5
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/bedrock/index.mjs +34 -61
- package/dist/esm/llm/bedrock/index.mjs.map +1 -1
- package/dist/esm/llm/openai/index.mjs +1 -1
- package/dist/esm/llm/openai/index.mjs.map +1 -1
- package/dist/esm/llm/openai/utils/index.mjs +10 -27
- package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
- package/dist/esm/main.mjs +1 -5
- package/dist/esm/main.mjs.map +1 -1
- package/dist/esm/memory/citations.mjs +4 -4
- package/dist/esm/memory/citations.mjs.map +1 -1
- package/dist/esm/memory/constants.mjs +17 -17
- package/dist/esm/memory/constants.mjs.map +1 -1
- package/dist/esm/memory/mmr.mjs +1 -1
- package/dist/esm/memory/mmr.mjs.map +1 -1
- package/dist/esm/memory/paths.mjs +1 -1
- package/dist/esm/memory/paths.mjs.map +1 -1
- package/dist/esm/memory/recallTracking.mjs +3 -3
- package/dist/esm/memory/recallTracking.mjs.map +1 -1
- package/dist/esm/memory/temporalDecay.mjs +2 -2
- package/dist/esm/memory/temporalDecay.mjs.map +1 -1
- package/dist/esm/messages/cache.mjs +0 -89
- package/dist/esm/messages/cache.mjs.map +1 -1
- package/dist/esm/messages/format.mjs +13 -71
- package/dist/esm/messages/format.mjs.map +1 -1
- package/dist/esm/tools/BashExecutor.mjs +12 -22
- package/dist/esm/tools/BashExecutor.mjs.map +1 -1
- package/dist/esm/tools/CodeExecutor.mjs +14 -41
- package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
- package/dist/esm/tools/ProgrammaticToolCalling.mjs +12 -17
- package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
- package/dist/esm/tools/ToolNode.mjs +78 -13
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/memory/memoryAppendTool.mjs +1 -1
- package/dist/esm/tools/memory/memoryAppendTool.mjs.map +1 -1
- package/dist/esm/tools/memory/memoryGetTool.mjs +2 -2
- package/dist/esm/tools/memory/memoryGetTool.mjs.map +1 -1
- package/dist/esm/tools/memory/memorySearchTool.mjs +3 -3
- package/dist/esm/tools/memory/memorySearchTool.mjs.map +1 -1
- package/dist/esm/tools/memory/shared.mjs +1 -1
- package/dist/esm/tools/memory/shared.mjs.map +1 -1
- package/dist/esm/tools/search/search.mjs +3 -11
- package/dist/esm/tools/search/search.mjs.map +1 -1
- package/dist/esm/tools/search/tool.mjs +4 -28
- package/dist/esm/tools/search/tool.mjs.map +1 -1
- package/dist/esm/tools/search/utils.mjs +3 -10
- package/dist/esm/tools/search/utils.mjs.map +1 -1
- package/dist/esm/tools/subagent/SubagentExecutor.mjs +48 -0
- package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
- package/dist/esm/types/graph.mjs.map +1 -1
- package/dist/types/agents/AgentContext.d.ts +25 -95
- package/dist/types/common/enum.d.ts +12 -12
- package/dist/types/graphs/Graph.d.ts +2 -2
- package/dist/types/graphs/phases/memoryFlushPhase.d.ts +2 -2
- package/dist/types/hooks/HookRegistry.d.ts +1 -1
- package/dist/types/hooks/matchers.d.ts +2 -2
- package/dist/types/hooks/types.d.ts +1 -1
- package/dist/types/index.d.ts +0 -1
- package/dist/types/llm/bedrock/index.d.ts +1 -54
- package/dist/types/llm/openai/index.d.ts +1 -1
- package/dist/types/memory/citations.d.ts +4 -4
- package/dist/types/memory/constants.d.ts +17 -17
- package/dist/types/memory/mmr.d.ts +3 -3
- package/dist/types/memory/paths.d.ts +1 -1
- package/dist/types/memory/temporalDecay.d.ts +2 -2
- package/dist/types/memory/types.d.ts +3 -3
- package/dist/types/messages/format.d.ts +2 -5
- package/dist/types/tools/CodeExecutor.d.ts +0 -6
- package/dist/types/tools/ToolNode.d.ts +3 -3
- package/dist/types/tools/memory/shared.d.ts +1 -1
- package/dist/types/tools/search/test.d.ts +1 -0
- package/dist/types/tools/search/types.d.ts +5 -99
- package/dist/types/tools/search/utils.d.ts +2 -2
- package/dist/types/tools/subagent/SubagentExecutor.d.ts +29 -0
- package/dist/types/types/graph.d.ts +30 -34
- package/dist/types/types/index.d.ts +0 -1
- package/dist/types/types/messages.d.ts +1 -1
- package/dist/types/types/run.d.ts +1 -3
- package/dist/types/types/tools.d.ts +5 -14
- package/package.json +1 -61
- package/src/agents/AgentContext.test.ts +176 -0
- package/src/agents/AgentContext.ts +179 -305
- package/src/agents/__tests__/AgentContext.test.ts +0 -632
- package/src/common/__tests__/enum.test.ts +1 -1
- package/src/common/enum.ts +12 -12
- package/src/graphs/Graph.ts +32 -13
- package/src/graphs/MultiAgentGraph.ts +1 -1
- package/src/graphs/gapFeatures.test.ts +1 -1
- package/src/graphs/phases/__tests__/memoryFlushPhase.test.ts +1 -1
- package/src/graphs/phases/memoryFlushPhase.ts +2 -2
- package/src/hooks/HookRegistry.ts +1 -1
- package/src/hooks/index.ts +1 -1
- package/src/hooks/matchers.ts +2 -2
- package/src/hooks/types.ts +1 -1
- package/src/index.ts +0 -6
- package/src/llm/anthropic/utils/message_inputs.ts +1 -10
- package/src/llm/bedrock/__tests__/bedrock-caching.test.ts +18 -166
- package/src/llm/bedrock/index.ts +41 -116
- package/src/llm/openai/index.ts +2 -2
- package/src/llm/openai/utils/index.ts +14 -31
- package/src/memory/citations.ts +4 -4
- package/src/memory/constants.ts +17 -17
- package/src/memory/mmr.ts +3 -3
- package/src/memory/paths.ts +1 -1
- package/src/memory/recallTracking.ts +3 -3
- package/src/memory/temporalDecay.ts +2 -2
- package/src/memory/types.ts +3 -3
- package/src/messages/cache.test.ts +24 -62
- package/src/messages/cache.ts +0 -112
- package/src/messages/ensureThinkingBlock.test.ts +1 -1
- package/src/messages/format.ts +13 -92
- package/src/messages/formatAgentMessages.test.ts +1 -1
- package/src/scripts/subagent-configurable-inheritance.ts +263 -0
- package/src/scripts/subagent-event-driven-debug.ts +2 -2
- package/src/specs/anthropic.simple.test.ts +0 -61
- package/src/specs/prune.orphans.test.ts +1 -1
- package/src/tools/BashExecutor.ts +13 -37
- package/src/tools/CodeExecutor.ts +14 -59
- package/src/tools/ProgrammaticToolCalling.ts +14 -29
- package/src/tools/ToolNode.ts +75 -14
- package/src/tools/__tests__/CodeExecutor.test.ts +3 -3
- package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +0 -60
- package/src/tools/__tests__/SubagentExecutor.test.ts +157 -0
- package/src/tools/memory/memoryAppendTool.ts +1 -1
- package/src/tools/memory/memoryGetTool.ts +2 -2
- package/src/tools/memory/memorySearchTool.ts +3 -3
- package/src/tools/memory/shared.ts +1 -1
- package/src/tools/search/output.md +2775 -0
- package/src/tools/search/search.ts +2 -12
- 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 +2 -36
- package/src/tools/search/types.ts +8 -133
- package/src/tools/search/utils.ts +5 -13
- package/src/tools/subagent/SubagentExecutor.ts +78 -0
- package/src/types/graph.ts +27 -34
- package/src/types/index.ts +0 -1
- package/src/types/messages.ts +1 -1
- package/src/types/run.ts +1 -3
- package/src/types/tools.ts +5 -14
- package/dist/cjs/langchain/google-common.cjs +0 -3
- package/dist/cjs/langchain/google-common.cjs.map +0 -1
- package/dist/cjs/langchain/index.cjs +0 -86
- package/dist/cjs/langchain/index.cjs.map +0 -1
- package/dist/cjs/langchain/language_models/chat_models.cjs +0 -3
- package/dist/cjs/langchain/language_models/chat_models.cjs.map +0 -1
- package/dist/cjs/langchain/messages/tool.cjs +0 -3
- package/dist/cjs/langchain/messages/tool.cjs.map +0 -1
- package/dist/cjs/langchain/messages.cjs +0 -51
- package/dist/cjs/langchain/messages.cjs.map +0 -1
- package/dist/cjs/langchain/openai.cjs +0 -3
- package/dist/cjs/langchain/openai.cjs.map +0 -1
- package/dist/cjs/langchain/prompts.cjs +0 -11
- package/dist/cjs/langchain/prompts.cjs.map +0 -1
- package/dist/cjs/langchain/runnables.cjs +0 -19
- package/dist/cjs/langchain/runnables.cjs.map +0 -1
- package/dist/cjs/langchain/tools.cjs +0 -23
- package/dist/cjs/langchain/tools.cjs.map +0 -1
- package/dist/cjs/langchain/utils/env.cjs +0 -11
- package/dist/cjs/langchain/utils/env.cjs.map +0 -1
- package/dist/cjs/llm/bedrock/cacheSupport.cjs +0 -55
- package/dist/cjs/llm/bedrock/cacheSupport.cjs.map +0 -1
- package/dist/cjs/tools/search/tavily-scraper.cjs +0 -189
- package/dist/cjs/tools/search/tavily-scraper.cjs.map +0 -1
- package/dist/cjs/tools/search/tavily-search.cjs +0 -372
- package/dist/cjs/tools/search/tavily-search.cjs.map +0 -1
- package/dist/cjs/types/agent-cache.cjs +0 -54
- package/dist/cjs/types/agent-cache.cjs.map +0 -1
- package/dist/esm/langchain/google-common.mjs +0 -2
- package/dist/esm/langchain/google-common.mjs.map +0 -1
- package/dist/esm/langchain/index.mjs +0 -5
- package/dist/esm/langchain/index.mjs.map +0 -1
- package/dist/esm/langchain/language_models/chat_models.mjs +0 -2
- package/dist/esm/langchain/language_models/chat_models.mjs.map +0 -1
- package/dist/esm/langchain/messages/tool.mjs +0 -2
- package/dist/esm/langchain/messages/tool.mjs.map +0 -1
- package/dist/esm/langchain/messages.mjs +0 -2
- package/dist/esm/langchain/messages.mjs.map +0 -1
- package/dist/esm/langchain/openai.mjs +0 -2
- package/dist/esm/langchain/openai.mjs.map +0 -1
- package/dist/esm/langchain/prompts.mjs +0 -2
- package/dist/esm/langchain/prompts.mjs.map +0 -1
- package/dist/esm/langchain/runnables.mjs +0 -2
- package/dist/esm/langchain/runnables.mjs.map +0 -1
- package/dist/esm/langchain/tools.mjs +0 -2
- package/dist/esm/langchain/tools.mjs.map +0 -1
- package/dist/esm/langchain/utils/env.mjs +0 -2
- package/dist/esm/langchain/utils/env.mjs.map +0 -1
- package/dist/esm/llm/bedrock/cacheSupport.mjs +0 -52
- package/dist/esm/llm/bedrock/cacheSupport.mjs.map +0 -1
- package/dist/esm/tools/search/tavily-scraper.mjs +0 -186
- package/dist/esm/tools/search/tavily-scraper.mjs.map +0 -1
- package/dist/esm/tools/search/tavily-search.mjs +0 -370
- package/dist/esm/tools/search/tavily-search.mjs.map +0 -1
- package/dist/esm/types/agent-cache.mjs +0 -52
- package/dist/esm/types/agent-cache.mjs.map +0 -1
- package/dist/types/langchain/google-common.d.ts +0 -1
- package/dist/types/langchain/index.d.ts +0 -8
- package/dist/types/langchain/language_models/chat_models.d.ts +0 -1
- package/dist/types/langchain/messages/tool.d.ts +0 -1
- package/dist/types/langchain/messages.d.ts +0 -2
- package/dist/types/langchain/openai.d.ts +0 -1
- package/dist/types/langchain/prompts.d.ts +0 -1
- package/dist/types/langchain/runnables.d.ts +0 -2
- package/dist/types/langchain/tools.d.ts +0 -2
- package/dist/types/langchain/utils/env.d.ts +0 -1
- package/dist/types/llm/bedrock/cacheSupport.d.ts +0 -35
- package/dist/types/tools/search/tavily-scraper.d.ts +0 -19
- package/dist/types/tools/search/tavily-search.d.ts +0 -4
- package/dist/types/tools/subagent/types.d.ts +0 -84
- package/dist/types/types/agent-cache.d.ts +0 -71
- package/src/agents/__tests__/AgentContext.cacheTtl.live.test.ts +0 -259
- package/src/agents/__tests__/AgentContext.crossAgentTier1.live.test.ts +0 -266
- package/src/agents/__tests__/AgentContext.crossUserCache.live.test.ts +0 -342
- package/src/langchain/google-common.ts +0 -1
- package/src/langchain/index.ts +0 -8
- package/src/langchain/language_models/chat_models.ts +0 -1
- package/src/langchain/messages/tool.ts +0 -5
- package/src/langchain/messages.ts +0 -21
- package/src/langchain/openai.ts +0 -1
- package/src/langchain/prompts.ts +0 -1
- package/src/langchain/runnables.ts +0 -7
- package/src/langchain/tools.ts +0 -8
- package/src/langchain/utils/env.ts +0 -1
- package/src/llm/anthropic/utils/server-tool-inputs.test.ts +0 -436
- package/src/llm/bedrock/cacheSupport.test.ts +0 -99
- package/src/llm/bedrock/cacheSupport.ts +0 -53
- package/src/tools/search/tavily-scraper.ts +0 -235
- package/src/tools/search/tavily-search.ts +0 -424
- package/src/tools/search/tavily.test.ts +0 -965
- package/src/tools/subagent/types.test.ts +0 -70
- package/src/tools/subagent/types.ts +0 -115
- package/src/types/agent-cache.ts +0 -74
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/* eslint-disable no-console */
|
|
2
|
+
// processWikipedia.ts
|
|
3
|
+
import * as fs from 'fs';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import { processContent } from './content';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Process a Wikipedia article (HTML and Markdown) and create a referenced version
|
|
9
|
+
*/
|
|
10
|
+
async function processWikipediaArticle(): Promise<void> {
|
|
11
|
+
try {
|
|
12
|
+
console.log('Starting Wikipedia article processing...');
|
|
13
|
+
|
|
14
|
+
// Define file paths - adapt these to your specific file locations
|
|
15
|
+
const htmlPath = path.resolve('./test.html');
|
|
16
|
+
const markdownPath = path.resolve('./test.md');
|
|
17
|
+
const outputPath = path.resolve('./output.md');
|
|
18
|
+
|
|
19
|
+
// Check if input files exist
|
|
20
|
+
if (!fs.existsSync(htmlPath)) {
|
|
21
|
+
throw new Error(`Wikipedia HTML file not found at ${htmlPath}`);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
if (!fs.existsSync(markdownPath)) {
|
|
25
|
+
throw new Error(`Wikipedia Markdown file not found at ${markdownPath}`);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
console.log('Reading Wikipedia article files...');
|
|
29
|
+
const html = fs.readFileSync(htmlPath, 'utf-8');
|
|
30
|
+
const markdown = fs.readFileSync(markdownPath, 'utf-8');
|
|
31
|
+
|
|
32
|
+
// Extract article title for logging
|
|
33
|
+
const titleMatch = /<h1[^>]*>([^<]+)<\/h1>/i.exec(html);
|
|
34
|
+
const articleTitle = titleMatch
|
|
35
|
+
? titleMatch[1].trim()
|
|
36
|
+
: 'Wikipedia article';
|
|
37
|
+
|
|
38
|
+
console.log(`Processing "${articleTitle}"...`);
|
|
39
|
+
|
|
40
|
+
// Measure processing time
|
|
41
|
+
const startTime = process.hrtime();
|
|
42
|
+
|
|
43
|
+
// Process content
|
|
44
|
+
const result = processContent(html, markdown);
|
|
45
|
+
|
|
46
|
+
// Calculate processing time
|
|
47
|
+
const elapsed = process.hrtime(startTime);
|
|
48
|
+
const timeInMs = elapsed[0] * 1000 + elapsed[1] / 1000000;
|
|
49
|
+
|
|
50
|
+
// Generate reference appendix
|
|
51
|
+
const appendix = generateReferenceAppendix(result);
|
|
52
|
+
|
|
53
|
+
// Create complete output with the processed content and appendix
|
|
54
|
+
const completeOutput = result.markdown + appendix;
|
|
55
|
+
|
|
56
|
+
// Write to output file
|
|
57
|
+
fs.writeFileSync(outputPath, completeOutput);
|
|
58
|
+
|
|
59
|
+
// Print processing statistics
|
|
60
|
+
console.log('\nWikipedia article processing complete! ✓');
|
|
61
|
+
console.log('-'.repeat(60));
|
|
62
|
+
console.log(`Article: ${articleTitle}`);
|
|
63
|
+
console.log(`Processing time: ${timeInMs.toFixed(2)}ms`);
|
|
64
|
+
console.log('Media references replaced:');
|
|
65
|
+
console.log(` - Links: ${result.links.length}`);
|
|
66
|
+
console.log(` - Images: ${result.images.length}`);
|
|
67
|
+
console.log(` - Videos: ${result.videos.length}`);
|
|
68
|
+
console.log(
|
|
69
|
+
` - Total: ${result.links.length + result.images.length + result.videos.length}`
|
|
70
|
+
);
|
|
71
|
+
console.log(`Output saved to: ${outputPath}`);
|
|
72
|
+
console.log('-'.repeat(60));
|
|
73
|
+
|
|
74
|
+
// Print sample of the transformation
|
|
75
|
+
const sampleLines = result.markdown.split('\n').slice(0, 10).join('\n');
|
|
76
|
+
console.log('\nSample of transformed content:');
|
|
77
|
+
console.log('-'.repeat(30));
|
|
78
|
+
console.log(sampleLines);
|
|
79
|
+
console.log('-'.repeat(30));
|
|
80
|
+
console.log('... (continued in output file)');
|
|
81
|
+
} catch (error) {
|
|
82
|
+
console.error('Error processing Wikipedia article:', error);
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Generate a comprehensive reference appendix with all media links
|
|
89
|
+
*/
|
|
90
|
+
function generateReferenceAppendix(result: {
|
|
91
|
+
links: Array<{ originalUrl: string; title?: string; text?: string }>;
|
|
92
|
+
images: Array<{ originalUrl: string; title?: string }>;
|
|
93
|
+
videos: Array<{ originalUrl: string; title?: string }>;
|
|
94
|
+
}): string {
|
|
95
|
+
let appendix = '\n\n' + '---'.repeat(10) + '\n\n';
|
|
96
|
+
appendix += '# References\n\n';
|
|
97
|
+
|
|
98
|
+
if (result.links.length > 0) {
|
|
99
|
+
appendix += '## Links\n\n';
|
|
100
|
+
result.links.forEach((link, index) => {
|
|
101
|
+
// Clean and format text for display
|
|
102
|
+
let displayText = '';
|
|
103
|
+
if (link.text != null && link.text.trim()) {
|
|
104
|
+
// Limit length for very long link text
|
|
105
|
+
let cleanText = link.text.trim();
|
|
106
|
+
if (cleanText.length > 50) {
|
|
107
|
+
cleanText = cleanText.substring(0, 47) + '...';
|
|
108
|
+
}
|
|
109
|
+
displayText = ` - "${cleanText}"`;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
appendix += `**link#${index + 1}**: ${link.originalUrl}${displayText}\n\n`;
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if (result.images.length > 0) {
|
|
117
|
+
appendix += '## Images\n\n';
|
|
118
|
+
result.images.forEach((image, index) => {
|
|
119
|
+
const displayTitle =
|
|
120
|
+
image.title != null && image.title.trim()
|
|
121
|
+
? ` - ${image.title.trim()}`
|
|
122
|
+
: '';
|
|
123
|
+
appendix += `**image#${index + 1}**: ${image.originalUrl}${displayTitle}\n\n`;
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if (result.videos.length > 0) {
|
|
128
|
+
appendix += '## Videos\n\n';
|
|
129
|
+
result.videos.forEach((video, index) => {
|
|
130
|
+
const displayTitle =
|
|
131
|
+
video.title != null && video.title.trim()
|
|
132
|
+
? ` - ${video.title.trim()}`
|
|
133
|
+
: '';
|
|
134
|
+
appendix += `**video#${index + 1}**: ${video.originalUrl}${displayTitle}\n\n`;
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Add a category breakdown to show what types of links were found
|
|
139
|
+
const totalRefs =
|
|
140
|
+
result.links.length + result.images.length + result.videos.length;
|
|
141
|
+
|
|
142
|
+
appendix += '## Summary\n\n';
|
|
143
|
+
appendix += `Total references: **${totalRefs}**\n\n`;
|
|
144
|
+
appendix += `- Links: ${result.links.length}\n`;
|
|
145
|
+
appendix += `- Images: ${result.images.length}\n`;
|
|
146
|
+
appendix += `- Videos: ${result.videos.length}\n`;
|
|
147
|
+
|
|
148
|
+
return appendix;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Using async IIFE to allow for better error handling
|
|
152
|
+
(async (): Promise<void> => {
|
|
153
|
+
try {
|
|
154
|
+
await processWikipediaArticle();
|
|
155
|
+
} catch (error) {
|
|
156
|
+
console.error('Unhandled error:', error);
|
|
157
|
+
process.exit(1);
|
|
158
|
+
}
|
|
159
|
+
})();
|
package/src/tools/search/tool.ts
CHANGED
|
@@ -12,7 +12,6 @@ import {
|
|
|
12
12
|
} from './schema';
|
|
13
13
|
import { createSearchAPI, createSourceProcessor } from './search';
|
|
14
14
|
import { createSerperScraper } from './serper-scraper';
|
|
15
|
-
import { createTavilyScraper } from './tavily-scraper';
|
|
16
15
|
import { createFirecrawlScraper } from './firecrawl';
|
|
17
16
|
import { expandHighlights } from './highlights';
|
|
18
17
|
import { formatResultsForLLM } from './format';
|
|
@@ -310,16 +309,12 @@ async function executeParallelSearches({
|
|
|
310
309
|
function createSearchProcessor({
|
|
311
310
|
searchAPI,
|
|
312
311
|
safeSearch,
|
|
313
|
-
supportsVideos,
|
|
314
312
|
sourceProcessor,
|
|
315
313
|
scraper,
|
|
316
314
|
onGetHighlights,
|
|
317
315
|
logger,
|
|
318
316
|
}: {
|
|
319
317
|
safeSearch: t.SearchToolConfig['safeSearch'];
|
|
320
|
-
/* Tavily search API does not return videos. Other providers (Serper)
|
|
321
|
-
* do — this flag short-circuits the videos request when unsupported. */
|
|
322
|
-
supportsVideos: boolean;
|
|
323
318
|
searchAPI: ReturnType<typeof createSearchAPI>;
|
|
324
319
|
sourceProcessor: ReturnType<typeof createSourceProcessor>;
|
|
325
320
|
scraper: t.BaseScraper;
|
|
@@ -371,7 +366,7 @@ function createSearchProcessor({
|
|
|
371
366
|
country,
|
|
372
367
|
safeSearch,
|
|
373
368
|
images,
|
|
374
|
-
videos
|
|
369
|
+
videos,
|
|
375
370
|
news,
|
|
376
371
|
logger,
|
|
377
372
|
});
|
|
@@ -554,10 +549,6 @@ export const createSearchTool = (
|
|
|
554
549
|
serperApiKey,
|
|
555
550
|
searxngInstanceUrl,
|
|
556
551
|
searxngApiKey,
|
|
557
|
-
tavilyApiKey,
|
|
558
|
-
tavilySearchUrl,
|
|
559
|
-
tavilyExtractUrl,
|
|
560
|
-
tavilySearchOptions,
|
|
561
552
|
domainBlocklist,
|
|
562
553
|
countryBlocklist,
|
|
563
554
|
rerankerType = 'cohere',
|
|
@@ -571,7 +562,6 @@ export const createSearchTool = (
|
|
|
571
562
|
firecrawlVersion,
|
|
572
563
|
firecrawlOptions,
|
|
573
564
|
serperScraperOptions,
|
|
574
|
-
tavilyScraperOptions,
|
|
575
565
|
scraperTimeout,
|
|
576
566
|
jinaApiKey,
|
|
577
567
|
jinaApiUrl,
|
|
@@ -581,15 +571,6 @@ export const createSearchTool = (
|
|
|
581
571
|
} = config;
|
|
582
572
|
|
|
583
573
|
const logger = config.logger || createDefaultLogger();
|
|
584
|
-
/* Tavily search API exposes a `safe_search` boolean derived from the
|
|
585
|
-
* tool's existing safeSearch level (0 = off, ≥1 = on). Bridge the two. */
|
|
586
|
-
const effectiveTavilySearchOptions =
|
|
587
|
-
searchProvider === 'tavily' && config.safeSearch != null
|
|
588
|
-
? {
|
|
589
|
-
...tavilySearchOptions,
|
|
590
|
-
safeSearch: config.safeSearch !== 0,
|
|
591
|
-
}
|
|
592
|
-
: tavilySearchOptions;
|
|
593
574
|
|
|
594
575
|
const schemaProperties: Record<string, unknown> = {
|
|
595
576
|
query: querySchema,
|
|
@@ -599,7 +580,7 @@ export const createSearchTool = (
|
|
|
599
580
|
news: newsSchema,
|
|
600
581
|
};
|
|
601
582
|
|
|
602
|
-
if (searchProvider === 'serper'
|
|
583
|
+
if (searchProvider === 'serper') {
|
|
603
584
|
schemaProperties.country = countrySchema;
|
|
604
585
|
}
|
|
605
586
|
|
|
@@ -614,9 +595,6 @@ export const createSearchTool = (
|
|
|
614
595
|
serperApiKey,
|
|
615
596
|
searxngInstanceUrl,
|
|
616
597
|
searxngApiKey,
|
|
617
|
-
tavilyApiKey,
|
|
618
|
-
tavilySearchUrl,
|
|
619
|
-
tavilySearchOptions: effectiveTavilySearchOptions,
|
|
620
598
|
domainBlocklist,
|
|
621
599
|
countryBlocklist,
|
|
622
600
|
});
|
|
@@ -631,17 +609,6 @@ export const createSearchTool = (
|
|
|
631
609
|
timeout: scraperTimeout ?? serperScraperOptions?.timeout,
|
|
632
610
|
logger,
|
|
633
611
|
});
|
|
634
|
-
} else if (scraperProvider === 'tavily') {
|
|
635
|
-
scraperInstance = createTavilyScraper({
|
|
636
|
-
...tavilyScraperOptions,
|
|
637
|
-
apiKey:
|
|
638
|
-
tavilyScraperOptions?.apiKey ??
|
|
639
|
-
tavilyApiKey ??
|
|
640
|
-
process.env.TAVILY_API_KEY,
|
|
641
|
-
apiUrl: tavilyScraperOptions?.apiUrl ?? tavilyExtractUrl,
|
|
642
|
-
timeout: scraperTimeout ?? tavilyScraperOptions?.timeout,
|
|
643
|
-
logger,
|
|
644
|
-
});
|
|
645
612
|
} else {
|
|
646
613
|
scraperInstance = createFirecrawlScraper({
|
|
647
614
|
...firecrawlOptions,
|
|
@@ -680,7 +647,6 @@ export const createSearchTool = (
|
|
|
680
647
|
const search = createSearchProcessor({
|
|
681
648
|
searchAPI,
|
|
682
649
|
safeSearch,
|
|
683
|
-
supportsVideos: searchProvider !== 'tavily',
|
|
684
650
|
sourceProcessor,
|
|
685
651
|
scraper: scraperInstance,
|
|
686
652
|
onGetHighlights,
|
|
@@ -3,8 +3,8 @@ import type { RunnableConfig } from '@langchain/core/runnables';
|
|
|
3
3
|
import type { BaseReranker } from './rerankers';
|
|
4
4
|
import { DATE_RANGE } from './schema';
|
|
5
5
|
|
|
6
|
-
export type SearchProvider = 'serper' | 'searxng'
|
|
7
|
-
export type ScraperProvider = 'firecrawl' | 'serper'
|
|
6
|
+
export type SearchProvider = 'serper' | 'searxng';
|
|
7
|
+
export type ScraperProvider = 'firecrawl' | 'serper';
|
|
8
8
|
export type RerankerType = 'infinity' | 'jina' | 'cohere' | 'none';
|
|
9
9
|
|
|
10
10
|
export interface Highlight {
|
|
@@ -62,59 +62,11 @@ export interface Source {
|
|
|
62
62
|
date?: string;
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
export type TavilyTimeRange = 'day' | 'week' | 'month' | 'year';
|
|
66
|
-
export type TavilyTimeRangeInput =
|
|
67
|
-
| TavilyTimeRange
|
|
68
|
-
| 'h'
|
|
69
|
-
| 'd'
|
|
70
|
-
| 'w'
|
|
71
|
-
| 'm'
|
|
72
|
-
| 'y';
|
|
73
|
-
|
|
74
|
-
export interface TavilySearchOptions {
|
|
75
|
-
searchDepth?: 'basic' | 'advanced' | 'fast' | 'ultra-fast';
|
|
76
|
-
maxResults?: number;
|
|
77
|
-
includeImages?: boolean;
|
|
78
|
-
includeAnswer?: boolean | 'basic' | 'advanced';
|
|
79
|
-
includeRawContent?: boolean | 'markdown' | 'text';
|
|
80
|
-
includeDomains?: string[];
|
|
81
|
-
excludeDomains?: string[];
|
|
82
|
-
topic?: 'general' | 'news' | 'finance';
|
|
83
|
-
timeRange?: TavilyTimeRangeInput;
|
|
84
|
-
includeImageDescriptions?: boolean;
|
|
85
|
-
includeFavicon?: boolean;
|
|
86
|
-
chunksPerSource?: number;
|
|
87
|
-
safeSearch?: boolean;
|
|
88
|
-
timeout?: number;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
export interface TavilySearchPayload {
|
|
92
|
-
query: string;
|
|
93
|
-
search_depth: NonNullable<TavilySearchOptions['searchDepth']>;
|
|
94
|
-
topic: NonNullable<TavilySearchOptions['topic']>;
|
|
95
|
-
max_results: number;
|
|
96
|
-
safe_search?: boolean;
|
|
97
|
-
time_range?: TavilyTimeRange;
|
|
98
|
-
country?: string;
|
|
99
|
-
include_images?: boolean;
|
|
100
|
-
include_answer?: NonNullable<TavilySearchOptions['includeAnswer']>;
|
|
101
|
-
include_raw_content?: NonNullable<TavilySearchOptions['includeRawContent']>;
|
|
102
|
-
include_domains?: string[];
|
|
103
|
-
exclude_domains?: string[];
|
|
104
|
-
include_image_descriptions?: boolean;
|
|
105
|
-
include_favicon?: boolean;
|
|
106
|
-
chunks_per_source?: number;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
65
|
export interface SearchConfig {
|
|
110
66
|
searchProvider?: SearchProvider;
|
|
111
67
|
serperApiKey?: string;
|
|
112
68
|
searxngInstanceUrl?: string;
|
|
113
69
|
searxngApiKey?: string;
|
|
114
|
-
tavilyApiKey?: string;
|
|
115
|
-
tavilySearchUrl?: string;
|
|
116
|
-
tavilyExtractUrl?: string;
|
|
117
|
-
tavilySearchOptions?: TavilySearchOptions;
|
|
118
70
|
/** Domains to exclude from search results (e.g., 'reddit.com', 'twitter.com').
|
|
119
71
|
* Appended as -site: operators to the search query. */
|
|
120
72
|
domainBlocklist?: string[];
|
|
@@ -160,17 +112,6 @@ export interface SerperScraperConfig {
|
|
|
160
112
|
includeMarkdown?: boolean;
|
|
161
113
|
}
|
|
162
114
|
|
|
163
|
-
export interface TavilyScraperConfig {
|
|
164
|
-
apiKey?: string;
|
|
165
|
-
apiUrl?: string;
|
|
166
|
-
timeout?: number;
|
|
167
|
-
logger?: Logger;
|
|
168
|
-
extractDepth?: 'basic' | 'advanced';
|
|
169
|
-
includeImages?: boolean;
|
|
170
|
-
includeFavicon?: boolean;
|
|
171
|
-
format?: 'markdown' | 'text';
|
|
172
|
-
}
|
|
173
|
-
|
|
174
115
|
export interface ScraperContentResult {
|
|
175
116
|
content: string;
|
|
176
117
|
}
|
|
@@ -219,7 +160,6 @@ export interface SearchToolConfig
|
|
|
219
160
|
extends SearchConfig,
|
|
220
161
|
ProcessSourcesConfig,
|
|
221
162
|
FirecrawlConfig {
|
|
222
|
-
tavilyScraperOptions?: TavilyScraperConfig;
|
|
223
163
|
logger?: Logger;
|
|
224
164
|
safeSearch?: SafeSearchLevel;
|
|
225
165
|
jinaApiKey?: string;
|
|
@@ -247,27 +187,20 @@ export type UsedReferences = {
|
|
|
247
187
|
reference: MediaReference;
|
|
248
188
|
}[];
|
|
249
189
|
|
|
250
|
-
export type AnyScraperResponse =
|
|
251
|
-
| FirecrawlScrapeResponse
|
|
252
|
-
| SerperScrapeResponse
|
|
253
|
-
| TavilyScrapeResponse;
|
|
254
|
-
|
|
255
190
|
/** Base Scraper Interface */
|
|
256
191
|
export interface BaseScraper {
|
|
257
192
|
scrapeUrl(
|
|
258
193
|
url: string,
|
|
259
194
|
options?: unknown
|
|
260
|
-
): Promise<[string,
|
|
261
|
-
scrapeUrls?(
|
|
262
|
-
urls: string[],
|
|
263
|
-
options?: unknown
|
|
264
|
-
): Promise<Array<[string, AnyScraperResponse]>>;
|
|
195
|
+
): Promise<[string, FirecrawlScrapeResponse | SerperScrapeResponse]>;
|
|
265
196
|
extractContent(
|
|
266
|
-
response:
|
|
197
|
+
response: FirecrawlScrapeResponse | SerperScrapeResponse
|
|
267
198
|
): [string, undefined | References];
|
|
268
199
|
extractMetadata(
|
|
269
|
-
response:
|
|
270
|
-
):
|
|
200
|
+
response: FirecrawlScrapeResponse | SerperScrapeResponse
|
|
201
|
+
):
|
|
202
|
+
| ScrapeMetadata
|
|
203
|
+
| Record<string, string | number | boolean | null | undefined>;
|
|
271
204
|
}
|
|
272
205
|
|
|
273
206
|
/** Firecrawl */
|
|
@@ -281,25 +214,6 @@ export type SerperScrapeOptions = Omit<
|
|
|
281
214
|
'apiKey' | 'apiUrl' | 'logger'
|
|
282
215
|
>;
|
|
283
216
|
|
|
284
|
-
export type TavilyScrapeOptions = Omit<
|
|
285
|
-
TavilyScraperConfig,
|
|
286
|
-
'apiKey' | 'apiUrl' | 'logger'
|
|
287
|
-
>;
|
|
288
|
-
|
|
289
|
-
export interface TavilyExtractPayload {
|
|
290
|
-
urls: string[];
|
|
291
|
-
extract_depth: NonNullable<TavilyScraperConfig['extractDepth']>;
|
|
292
|
-
include_images: boolean;
|
|
293
|
-
include_favicon?: boolean;
|
|
294
|
-
format?: NonNullable<TavilyScraperConfig['format']>;
|
|
295
|
-
timeout?: number;
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
export type GenericScrapeMetadata = Record<
|
|
299
|
-
string,
|
|
300
|
-
string | number | boolean | null | undefined
|
|
301
|
-
>;
|
|
302
|
-
|
|
303
217
|
export interface ScrapeMetadata {
|
|
304
218
|
// Core source information
|
|
305
219
|
sourceURL?: string;
|
|
@@ -386,45 +300,6 @@ export interface SerperScrapeResponse {
|
|
|
386
300
|
error?: string;
|
|
387
301
|
}
|
|
388
302
|
|
|
389
|
-
export interface TavilyScrapeResponse {
|
|
390
|
-
success: boolean;
|
|
391
|
-
data?: {
|
|
392
|
-
rawContent?: string;
|
|
393
|
-
images?: string[];
|
|
394
|
-
favicon?: string;
|
|
395
|
-
};
|
|
396
|
-
error?: string;
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
export interface TavilySearchResult {
|
|
400
|
-
title?: string;
|
|
401
|
-
url?: string;
|
|
402
|
-
content?: string;
|
|
403
|
-
score?: number;
|
|
404
|
-
published_date?: string;
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
export type TavilyImageResult =
|
|
408
|
-
| string
|
|
409
|
-
| {
|
|
410
|
-
url?: string;
|
|
411
|
-
description?: string;
|
|
412
|
-
};
|
|
413
|
-
|
|
414
|
-
export interface TavilySearchResponse {
|
|
415
|
-
answer?: string;
|
|
416
|
-
images?: TavilyImageResult[];
|
|
417
|
-
results?: TavilySearchResult[];
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
export interface TavilyExtractResult {
|
|
421
|
-
url: string;
|
|
422
|
-
raw_content?: string;
|
|
423
|
-
images?: string[];
|
|
424
|
-
favicon?: string;
|
|
425
|
-
error?: string;
|
|
426
|
-
}
|
|
427
|
-
|
|
428
303
|
export interface FirecrawlScraperConfig {
|
|
429
304
|
apiKey?: string;
|
|
430
305
|
apiUrl?: string;
|
|
@@ -29,18 +29,11 @@ export const fileExtRegex =
|
|
|
29
29
|
|
|
30
30
|
export const getDomainName = (
|
|
31
31
|
link: string,
|
|
32
|
-
metadata?: t.ScrapeMetadata
|
|
32
|
+
metadata?: t.ScrapeMetadata,
|
|
33
33
|
logger?: t.Logger
|
|
34
34
|
): string | undefined => {
|
|
35
35
|
try {
|
|
36
|
-
const
|
|
37
|
-
const metadataUrl = metadata?.url;
|
|
38
|
-
const url =
|
|
39
|
-
typeof sourceUrl === 'string'
|
|
40
|
-
? sourceUrl
|
|
41
|
-
: typeof metadataUrl === 'string'
|
|
42
|
-
? metadataUrl
|
|
43
|
-
: link || '';
|
|
36
|
+
const url = metadata?.sourceURL ?? metadata?.url ?? (link || '');
|
|
44
37
|
const domain = new URL(url).hostname.replace(/^www\./, '');
|
|
45
38
|
if (domain) {
|
|
46
39
|
return domain;
|
|
@@ -59,7 +52,7 @@ export const getDomainName = (
|
|
|
59
52
|
|
|
60
53
|
export function getAttribution(
|
|
61
54
|
link: string,
|
|
62
|
-
metadata?: t.ScrapeMetadata
|
|
55
|
+
metadata?: t.ScrapeMetadata,
|
|
63
56
|
logger?: t.Logger
|
|
64
57
|
): string | undefined {
|
|
65
58
|
if (!metadata) return getDomainName(link, metadata, logger);
|
|
@@ -67,17 +60,16 @@ export function getAttribution(
|
|
|
67
60
|
const twitterSite = metadata['twitter:site'];
|
|
68
61
|
const twitterSiteFormatted =
|
|
69
62
|
typeof twitterSite === 'string' ? twitterSite.replace(/^@/, '') : undefined;
|
|
70
|
-
const title = metadata.title;
|
|
71
63
|
|
|
72
64
|
const possibleAttributions = [
|
|
73
65
|
metadata.ogSiteName,
|
|
74
66
|
metadata['og:site_name'],
|
|
75
|
-
|
|
67
|
+
metadata.title?.split('|').pop()?.trim(),
|
|
76
68
|
twitterSiteFormatted,
|
|
77
69
|
];
|
|
78
70
|
|
|
79
71
|
const attribution = possibleAttributions.find(
|
|
80
|
-
(attr)
|
|
72
|
+
(attr) => attr != null && typeof attr === 'string' && attr.trim() !== ''
|
|
81
73
|
);
|
|
82
74
|
if (attribution != null) {
|
|
83
75
|
return attribution;
|
|
@@ -40,6 +40,35 @@ export type SubagentExecuteParams = {
|
|
|
40
40
|
* without relying on event ordering heuristics.
|
|
41
41
|
*/
|
|
42
42
|
parentToolCallId?: string;
|
|
43
|
+
/**
|
|
44
|
+
* Snapshot of the parent invocation's `config.configurable` at the
|
|
45
|
+
* spawn-tool call site. Inherited verbatim into the child workflow's
|
|
46
|
+
* `configurable` so host-set fields (`requestBody`, `user`,
|
|
47
|
+
* `userMCPAuthMap`, etc.) propagate — fixing MCP body-placeholder
|
|
48
|
+
* substitution and per-user lookups for subagent tool calls.
|
|
49
|
+
*
|
|
50
|
+
* Inheritance details (verified empirically against LangGraph):
|
|
51
|
+
* - host-set keys propagate as-is into the child's tool dispatches;
|
|
52
|
+
* - `thread_id` propagates (with `childRunId` as a fallback when
|
|
53
|
+
* parent did not supply one) — matches the "subagent is part of
|
|
54
|
+
* the same conversation" mental model and aligns with the
|
|
55
|
+
* `sessionId: this.parentRunId` convention this executor already
|
|
56
|
+
* uses for `SubagentStart` / `SubagentStop` hooks;
|
|
57
|
+
* - `parent_run_id` propagates when the host put it on parent's
|
|
58
|
+
* configurable;
|
|
59
|
+
* - `run_id` is *overwritten by the LangGraph runtime* at child
|
|
60
|
+
* invoke time regardless of what we forward — child's tool
|
|
61
|
+
* dispatches see the child graph's runtime runId in
|
|
62
|
+
* `configurable.run_id`, not the parent's. Hosts that need
|
|
63
|
+
* parent-scoped run identity for downstream consumers should
|
|
64
|
+
* plumb it via a host-defined key (e.g. `requestBody.messageId`),
|
|
65
|
+
* not `run_id`.
|
|
66
|
+
*
|
|
67
|
+
* A future revision will likely make this inheritance configurable
|
|
68
|
+
* per spawn type — background / async subagents may want isolation
|
|
69
|
+
* rather than sharing parent's host context.
|
|
70
|
+
*/
|
|
71
|
+
parentConfigurable?: Record<string, unknown>;
|
|
43
72
|
};
|
|
44
73
|
|
|
45
74
|
export type SubagentExecuteResult = {
|
|
@@ -246,6 +275,52 @@ export class SubagentExecutor {
|
|
|
246
275
|
* nested trace pollution).
|
|
247
276
|
*/
|
|
248
277
|
const callbacks: Callbacks = forwarder ? [forwarder] : [];
|
|
278
|
+
/**
|
|
279
|
+
* Inherit the parent's `configurable` verbatim — host-set fields
|
|
280
|
+
* (`requestBody`, `user`, `userMCPAuthMap`, etc.) AND the run-
|
|
281
|
+
* identity fields (`run_id`, `parent_run_id`, `thread_id`) all
|
|
282
|
+
* propagate.
|
|
283
|
+
*
|
|
284
|
+
* Run-identity propagation is intentional and matches the
|
|
285
|
+
* convention this executor itself already uses for `SubagentStart`
|
|
286
|
+
* / `SubagentStop` hooks (`sessionId: this.parentRunId`): the
|
|
287
|
+
* subagent runs under the parent's session scope, not its own.
|
|
288
|
+
* Forwarding `run_id` / `parent_run_id` / `thread_id` makes
|
|
289
|
+
* `ToolNode`'s hook lookups (`hasHookFor(eventName, runId)`),
|
|
290
|
+
* `ToolOutputReferenceRegistry` keying, and trace lineage all
|
|
291
|
+
* resolve to the parent's session for tools dispatched from the
|
|
292
|
+
* subagent — so `PreToolUse` / `PostToolUse` hooks the host
|
|
293
|
+
* registered against the parent's run fire for subagent tool
|
|
294
|
+
* calls too. "Same run" matches the user-perceptual mental model.
|
|
295
|
+
*
|
|
296
|
+
* `thread_id` falls back to `childRunId` only when the parent
|
|
297
|
+
* didn't supply one (legacy behavior preserved for hosts that
|
|
298
|
+
* never set thread_id).
|
|
299
|
+
*
|
|
300
|
+
* NOTE: a future revision will likely make this configurable per
|
|
301
|
+
* spawn type — e.g. a background / async subagent that runs after
|
|
302
|
+
* the parent's run completes wants isolation, not inheritance.
|
|
303
|
+
* For now the inheritance path matches LibreChat's primary use
|
|
304
|
+
* case (synchronous subagents within a single user turn).
|
|
305
|
+
*/
|
|
306
|
+
const inheritedConfigurable: Record<string, unknown> =
|
|
307
|
+
params.parentConfigurable ?? {};
|
|
308
|
+
/**
|
|
309
|
+
* Surface the parent's `subagent` tool_call.id to the child's run
|
|
310
|
+
* metadata so host-side artifact handlers (e.g. ranger's
|
|
311
|
+
* `resolveUiToolCallId`) can re-key child-emitted attachments to
|
|
312
|
+
* the parent's bubble. Without this, files produced by tools
|
|
313
|
+
* inside a subagent (execute_code .docx, image_gen, etc.) get
|
|
314
|
+
* attached to the child's inner tool_call_id — which the parent
|
|
315
|
+
* message has no record of — and orphan in the chat UI.
|
|
316
|
+
*/
|
|
317
|
+
const inheritedMetadata: Record<string, unknown> = {
|
|
318
|
+
...((inheritedConfigurable as { metadata?: Record<string, unknown> })
|
|
319
|
+
.metadata ?? {}),
|
|
320
|
+
parentToolCallId,
|
|
321
|
+
subagentAgentId: childAgentId,
|
|
322
|
+
subagentType,
|
|
323
|
+
};
|
|
249
324
|
result = await workflow.invoke(
|
|
250
325
|
{ messages: [new HumanMessage(description)] },
|
|
251
326
|
{
|
|
@@ -255,7 +330,10 @@ export class SubagentExecutor {
|
|
|
255
330
|
runName: `subagent:${subagentType}`,
|
|
256
331
|
configurable: {
|
|
257
332
|
thread_id: childRunId,
|
|
333
|
+
...inheritedConfigurable,
|
|
334
|
+
parentToolCallId,
|
|
258
335
|
},
|
|
336
|
+
metadata: inheritedMetadata,
|
|
259
337
|
}
|
|
260
338
|
);
|
|
261
339
|
} catch (error) {
|