query-engine.ts
1 /** 2 * QueryEngine Integration Test 3 * 4 * Tests semantic and keyword search for RAG applications. 5 * 6 * Run: npx ts-node query-engine.ts 7 */ 8 9 import { 10 QueryEngine, 11 createQueryEngine, 12 createSimpleQueryEngine 13 } from '../../../src/praisonai-ts/dist'; 14 15 async function main() { 16 console.log('=== QueryEngine Integration Test ===\n'); 17 18 // Test 1: Simple in-memory engine 19 console.log('1. Testing simple in-memory QueryEngine:'); 20 const docs = [ 21 { id: 'doc1', content: 'PraisonAI is a high-performance AI agent framework designed for production use.' }, 22 { id: 'doc2', content: 'TypeScript provides static typing and better tooling for JavaScript projects.' }, 23 { id: 'doc3', content: 'Agents can use tools, memory, and knowledge to complete complex tasks.' }, 24 { id: 'doc4', content: 'RAG (Retrieval-Augmented Generation) improves AI responses with relevant context.' }, 25 { id: 'doc5', content: 'Workflows enable sequential and parallel execution of agent tasks.' } 26 ]; 27 28 const engine = createSimpleQueryEngine(docs); 29 30 const results1 = await engine.query('agent framework', { topK: 2 }); 31 console.log(' Query: "agent framework"'); 32 console.log(` Found: ${results1.length} results`); 33 results1.forEach((r, i) => { 34 console.log(` [${i + 1}] ${r.content.slice(0, 50)}... (score: ${r.score.toFixed(2)})`); 35 }); 36 console.log(' Success: ✅'); 37 38 // Test 2: Different queries 39 console.log('\n2. Testing various queries:'); 40 const queries = ['TypeScript', 'RAG', 'workflow', 'tools memory']; 41 42 for (const q of queries) { 43 const results = await engine.query(q, { topK: 1 }); 44 console.log(` "${q}" → ${results.length > 0 ? results[0].content.slice(0, 40) + '...' : 'No results'}`); 45 } 46 console.log(' Success: ✅'); 47 48 // Test 3: Query for context string 49 console.log('\n3. Testing queryForContext:'); 50 const context = await engine.queryForContext('agent tasks', { topK: 2 }); 51 console.log(' Context string (preview):'); 52 console.log(' ' + context.split('\n')[0]); 53 console.log(' Success: ✅'); 54 55 // Test 4: Cache behavior 56 console.log('\n4. Testing caching:'); 57 const start = Date.now(); 58 await engine.query('agent framework', { topK: 2 }); 59 const cachedTime = Date.now() - start; 60 console.log(` Cached query time: ${cachedTime}ms (should be fast)`); 61 62 engine.clearCache(); 63 const start2 = Date.now(); 64 await engine.query('agent framework', { topK: 2 }); 65 const uncachedTime = Date.now() - start2; 66 console.log(` Uncached query time: ${uncachedTime}ms`); 67 console.log(' Success: ✅'); 68 69 // Test 5: QueryEngine configuration 70 console.log('\n5. Testing custom QueryEngine configuration:'); 71 const customEngine = new QueryEngine({ 72 keywordSearch: async (query, options) => { 73 return docs 74 .filter(d => d.content.toLowerCase().includes(query.toLowerCase())) 75 .map(d => ({ id: d.id, content: d.content, score: 0.8 })) 76 .slice(0, options?.topK ?? 5); 77 }, 78 defaultOptions: { mode: 'keyword', topK: 3 } 79 }); 80 81 const customResults = await customEngine.query('TypeScript'); 82 console.log(` Custom engine results: ${customResults.length}`); 83 console.log(' Success: ✅'); 84 85 // Test 6: Empty results handling 86 console.log('\n6. Testing empty results:'); 87 const emptyResults = await engine.query('nonexistent_query_12345'); 88 console.log(` Results for nonsense query: ${emptyResults.length}`); 89 90 const emptyContext = await engine.queryForContext('nonexistent_query_12345'); 91 console.log(` Context: "${emptyContext}"`); 92 console.log(' Success: ✅'); 93 94 console.log('\n=== QueryEngine Tests Complete ==='); 95 } 96 97 main().catch(console.error);