/ examples / js / knowledge / chonkie-adapter.ts
chonkie-adapter.ts
  1  /**
  2   * ChonkieAdapter Integration Test
  3   * 
  4   * Tests the ChonkieJS adapter for text chunking.
  5   * Works without ChonkieJS installed (uses native fallback).
  6   * 
  7   * Run: npx ts-node chonkie-adapter.ts
  8   */
  9  
 10  import {
 11    ChonkieAdapter,
 12    createChonkieAdapter,
 13    hasChonkie,
 14    Chunking
 15  } from '../../../src/praisonai-ts/dist';
 16  
 17  async function main() {
 18    console.log('=== ChonkieAdapter Integration Test ===\n');
 19  
 20    // Test 1: Check ChonkieJS availability
 21    console.log('1. Checking ChonkieJS availability:');
 22    const chonkieAvailable = await hasChonkie();
 23    console.log(`   ChonkieJS installed: ${chonkieAvailable ? '✅' : '❌ (using native fallback)'}`);
 24  
 25    // Test 2: Create adapter with default config
 26    console.log('\n2. Testing ChonkieAdapter creation:');
 27    const adapter = new ChonkieAdapter({
 28      strategy: 'token',
 29      chunkSize: 100,
 30      overlap: 20
 31    });
 32    console.log('   Adapter created: ✅');
 33    console.log('   Info:', adapter.getInfo());
 34  
 35    // Test 3: Chunk text
 36    console.log('\n3. Testing text chunking:');
 37    const sampleText = `
 38      PraisonAI is a high-performance, agentic AI framework designed with minimal client-side API.
 39      It features extreme performance sensitivity, lazy loading everywhere, and optional dependencies only.
 40      The framework supports clean separation between Core SDK, Wrapper/integrations, and Tools/plugins.
 41      All features must have a relevant CLI integration and representation.
 42    `.trim();
 43  
 44    const chunks = await adapter.chunk(sampleText);
 45    console.log(`   Input length: ${sampleText.length} characters`);
 46    console.log(`   Chunks created: ${chunks.length}`);
 47    chunks.forEach((chunk, i) => {
 48      console.log(`   [${i}]: "${chunk.content.slice(0, 50)}..." (${chunk.content.length} chars)`);
 49    });
 50    console.log('   Success: ✅');
 51  
 52    // Test 4: Different strategies
 53    console.log('\n4. Testing different chunking strategies:');
 54    const strategies = ['size', 'sentence', 'paragraph', 'semantic'] as const;
 55  
 56    for (const strategy of strategies) {
 57      const strategyAdapter = createChonkieAdapter({ strategy, chunkSize: 80 });
 58      const strategyChunks = await strategyAdapter.chunk(sampleText);
 59      console.log(`   ${strategy}: ${strategyChunks.length} chunks`);
 60    }
 61    console.log('   Success: ✅');
 62  
 63    // Test 5: Native Chunking class
 64    console.log('\n5. Testing native Chunking class:');
 65    const nativeChunker = new Chunking({ chunkSize: 100, overlap: 10, strategy: 'sentence' });
 66    const nativeChunks = nativeChunker.chunk(sampleText);
 67    console.log(`   Native chunks: ${nativeChunks.length}`);
 68    console.log('   Success: ✅');
 69  
 70    // Test 6: Factory function
 71    console.log('\n6. Testing createChunking() factory:');
 72    const factoryChunker = createChunking({ chunkSize: 200 });
 73    const factoryChunks = factoryChunker.chunk(sampleText);
 74    console.log(`   Factory chunks: ${factoryChunks.length}`);
 75    console.log('   Success: ✅');
 76  
 77    // Test 7: Merge small chunks
 78    console.log('\n7. Testing mergeSmallChunks:');
 79    const tinyChunker = new Chunking({ chunkSize: 20, overlap: 5 });
 80    const tinyChunks = tinyChunker.chunk(sampleText);
 81    const mergedChunks = tinyChunker.mergeSmallChunks(tinyChunks, 50);
 82    console.log(`   Before merge: ${tinyChunks.length} chunks`);
 83    console.log(`   After merge: ${mergedChunks.length} chunks`);
 84    console.log('   Success: ✅');
 85  
 86    // Test 8: Code chunking (if ChonkieJS available)
 87    if (chonkieAvailable) {
 88      console.log('\n8. Testing code chunking (ChonkieJS):');
 89      const codeAdapter = createChonkieAdapter({ strategy: 'code', language: 'typescript' });
 90      const codeText = `
 91  function hello() {
 92    console.log('Hello');
 93  }
 94  
 95  class MyClass {
 96    constructor() {
 97      this.value = 42;
 98    }
 99    
100    getValue() {
101      return this.value;
102    }
103  }
104      `.trim();
105  
106      const codeChunks = await codeAdapter.chunk(codeText);
107      console.log(`   Code chunks: ${codeChunks.length}`);
108      console.log('   Success: ✅');
109    } else {
110      console.log('\n8. Code chunking: Skipped (ChonkieJS not installed)');
111    }
112  
113    // Test 9: Verify adapter info
114    console.log('\n9. Verifying adapter state:');
115    const info = adapter.getInfo();
116    console.log(`   Strategy: ${info.strategy}`);
117    console.log(`   Using ChonkieJS: ${info.usingChonkie}`);
118    console.log(`   Chunk size: ${info.config.chunkSize}`);
119    console.log('   Success: ✅');
120  
121    console.log('\n=== ChonkieAdapter Tests Complete ===');
122  }
123  
124  main().catch(console.error);