mirror of
https://github.com/MervinPraison/PraisonAI.git
synced 2026-11-12 18:47:44 -10:00
115 lines
3.9 KiB
TypeScript
115 lines
3.9 KiB
TypeScript
/**
|
|
* Repeat Pattern Integration Test
|
|
*
|
|
* Tests the Repeat workflow pattern for evaluator-optimizer loops.
|
|
*
|
|
* Run: npx ts-node repeat-pattern.ts
|
|
*/
|
|
|
|
import { Repeat, repeatPattern, Agent } from '../../../src/praisonai-ts/dist';
|
|
|
|
async function main() {
|
|
console.log('=== Repeat Pattern Integration Test ===\n');
|
|
|
|
// Test 1: Basic repeat until condition
|
|
console.log('1. Testing Repeat with condition:');
|
|
let counter = 0;
|
|
const incrementer = () => {
|
|
counter++;
|
|
return `Iteration ${counter}`;
|
|
};
|
|
|
|
const repeat1 = new Repeat(incrementer, {
|
|
until: (ctx) => ctx.iteration >= 3,
|
|
maxIterations: 10
|
|
});
|
|
|
|
const result1 = await repeat1.run('start');
|
|
console.log(' Results:', result1.iterations);
|
|
console.log(' Final:', result1.result);
|
|
console.log(' Condition met:', result1.conditionMet ? '✅' : '❌');
|
|
console.log(' Max reached:', result1.maxReached ? '⚠️' : 'No');
|
|
|
|
// Test 2: Repeat with content condition
|
|
console.log('\n2. Testing Repeat with content-based condition:');
|
|
let quality = 0;
|
|
const improver = (input: string, prev: string | null) => {
|
|
quality += 25;
|
|
return `Quality: ${quality}% - ${prev || input}`;
|
|
};
|
|
|
|
const repeat2 = new Repeat(improver, {
|
|
until: (ctx) => ctx.lastResult?.includes('100%') ?? false,
|
|
maxIterations: 5
|
|
});
|
|
|
|
quality = 0; // Reset
|
|
const result2 = await repeat2.run('Initial draft');
|
|
console.log(' Iterations:', result2.count);
|
|
console.log(' Final:', result2.result);
|
|
console.log(' Condition met:', result2.conditionMet ? '✅' : '❌');
|
|
|
|
// Test 3: Repeat reaching max iterations
|
|
console.log('\n3. Testing Repeat hitting max iterations:');
|
|
const neverDone = () => 'still working...';
|
|
|
|
const repeat3 = new Repeat(neverDone, {
|
|
until: () => false, // Never satisfied
|
|
maxIterations: 3
|
|
});
|
|
|
|
const result3 = await repeat3.run('start');
|
|
console.log(' Iterations:', result3.count);
|
|
console.log(' Max reached:', result3.maxReached ? '✅ (expected)' : '❌');
|
|
|
|
// Test 4: Repeat with Agent (requires OPENAI_API_KEY)
|
|
if (process.env.OPENAI_API_KEY) {
|
|
console.log('\n4. Testing Repeat with Agent (live API):');
|
|
try {
|
|
const agent = new Agent({
|
|
name: 'Optimizer',
|
|
instructions: 'Improve the given text. Add more detail and clarity. Say "DONE" when satisfied.',
|
|
llm: 'openai/gpt-4o-mini'
|
|
});
|
|
|
|
const repeat4 = new Repeat(agent, {
|
|
until: (ctx) => ctx.lastResult?.includes('DONE') ?? false,
|
|
maxIterations: 3
|
|
});
|
|
|
|
const result4 = await repeat4.run('Make this better: Hello world');
|
|
console.log(' Iterations:', result4.count);
|
|
console.log(' Final (truncated):', result4.result.slice(0, 100) + '...');
|
|
console.log(' Condition met:', result4.conditionMet ? '✅' : 'Max reached');
|
|
} catch (error: any) {
|
|
console.log(' ⚠️ Agent test failed:', error.message);
|
|
}
|
|
} else {
|
|
console.log('\n4. Agent Repeat Test: Skipped (OPENAI_API_KEY not set)');
|
|
}
|
|
|
|
// Test 5: Convenience function
|
|
console.log('\n5. Testing repeatPattern() convenience function:');
|
|
let seq = 0;
|
|
const sequencer = () => `seq-${++seq}`;
|
|
|
|
const repeat5 = repeatPattern(sequencer, {
|
|
until: (ctx) => ctx.iteration >= 2,
|
|
maxIterations: 5
|
|
});
|
|
|
|
seq = 0; // Reset
|
|
const result5 = await repeat5.run('');
|
|
console.log(' Results:', result5.iterations);
|
|
console.log(' Success:', result5.conditionMet ? '✅' : '❌');
|
|
|
|
// Test 6: Verify exports
|
|
console.log('\n6. Verifying exports:');
|
|
console.log(' Repeat class:', typeof Repeat);
|
|
console.log(' repeatPattern function:', typeof repeatPattern);
|
|
|
|
console.log('\n=== Repeat Pattern Tests Complete ===');
|
|
}
|
|
|
|
main().catch(console.error);
|