repeat-pattern.ts
1 /** 2 * Repeat Pattern Integration Test 3 * 4 * Tests the Repeat workflow pattern for evaluator-optimizer loops. 5 * 6 * Run: npx ts-node repeat-pattern.ts 7 */ 8 9 import { Repeat, repeatPattern, Agent } from '../../../src/praisonai-ts/dist'; 10 11 async function main() { 12 console.log('=== Repeat Pattern Integration Test ===\n'); 13 14 // Test 1: Basic repeat until condition 15 console.log('1. Testing Repeat with condition:'); 16 let counter = 0; 17 const incrementer = () => { 18 counter++; 19 return `Iteration ${counter}`; 20 }; 21 22 const repeat1 = new Repeat(incrementer, { 23 until: (ctx) => ctx.iteration >= 3, 24 maxIterations: 10 25 }); 26 27 const result1 = await repeat1.run('start'); 28 console.log(' Results:', result1.iterations); 29 console.log(' Final:', result1.result); 30 console.log(' Condition met:', result1.conditionMet ? '✅' : '❌'); 31 console.log(' Max reached:', result1.maxReached ? '⚠️' : 'No'); 32 33 // Test 2: Repeat with content condition 34 console.log('\n2. Testing Repeat with content-based condition:'); 35 let quality = 0; 36 const improver = (input: string, prev: string | null) => { 37 quality += 25; 38 return `Quality: ${quality}% - ${prev || input}`; 39 }; 40 41 const repeat2 = new Repeat(improver, { 42 until: (ctx) => ctx.lastResult?.includes('100%') ?? false, 43 maxIterations: 5 44 }); 45 46 quality = 0; // Reset 47 const result2 = await repeat2.run('Initial draft'); 48 console.log(' Iterations:', result2.count); 49 console.log(' Final:', result2.result); 50 console.log(' Condition met:', result2.conditionMet ? '✅' : '❌'); 51 52 // Test 3: Repeat reaching max iterations 53 console.log('\n3. Testing Repeat hitting max iterations:'); 54 const neverDone = () => 'still working...'; 55 56 const repeat3 = new Repeat(neverDone, { 57 until: () => false, // Never satisfied 58 maxIterations: 3 59 }); 60 61 const result3 = await repeat3.run('start'); 62 console.log(' Iterations:', result3.count); 63 console.log(' Max reached:', result3.maxReached ? '✅ (expected)' : '❌'); 64 65 // Test 4: Repeat with Agent (requires OPENAI_API_KEY) 66 if (process.env.OPENAI_API_KEY) { 67 console.log('\n4. Testing Repeat with Agent (live API):'); 68 try { 69 const agent = new Agent({ 70 name: 'Optimizer', 71 instructions: 'Improve the given text. Add more detail and clarity. Say "DONE" when satisfied.', 72 llm: 'openai/gpt-4o-mini' 73 }); 74 75 const repeat4 = new Repeat(agent, { 76 until: (ctx) => ctx.lastResult?.includes('DONE') ?? false, 77 maxIterations: 3 78 }); 79 80 const result4 = await repeat4.run('Make this better: Hello world'); 81 console.log(' Iterations:', result4.count); 82 console.log(' Final (truncated):', result4.result.slice(0, 100) + '...'); 83 console.log(' Condition met:', result4.conditionMet ? '✅' : 'Max reached'); 84 } catch (error: any) { 85 console.log(' ⚠️ Agent test failed:', error.message); 86 } 87 } else { 88 console.log('\n4. Agent Repeat Test: Skipped (OPENAI_API_KEY not set)'); 89 } 90 91 // Test 5: Convenience function 92 console.log('\n5. Testing repeatPattern() convenience function:'); 93 let seq = 0; 94 const sequencer = () => `seq-${++seq}`; 95 96 const repeat5 = repeatPattern(sequencer, { 97 until: (ctx) => ctx.iteration >= 2, 98 maxIterations: 5 99 }); 100 101 seq = 0; // Reset 102 const result5 = await repeat5.run(''); 103 console.log(' Results:', result5.iterations); 104 console.log(' Success:', result5.conditionMet ? '✅' : '❌'); 105 106 // Test 6: Verify exports 107 console.log('\n6. Verifying exports:'); 108 console.log(' Repeat class:', typeof Repeat); 109 console.log(' repeatPattern function:', typeof repeatPattern); 110 111 console.log('\n=== Repeat Pattern Tests Complete ==='); 112 } 113 114 main().catch(console.error);