/ examples / js / knowledge / query-engine.ts
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);