/ examples / js / workflows / repeat-pattern.ts
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);