OpenWriterControle/evals/framework/test-evaluators.js
darrenhinde 478c8e3e85 feat: implement SDK-based evaluation framework with real agent testing
- Replace planned framework with working SDK implementation using @opencode-ai/sdk
- Add 6 YAML test cases across developer/business/edge-case categories (100% passing)
- Implement 4 evaluators for openagent.md rule compliance (approval-gate, context-loading, delegation, tool-usage)
- Add real-time event streaming and session recording
- Configure opencode/grok-code-fast as default model (zero API costs)
- Add comprehensive documentation (SDK_EVAL_README.md, test-design-guide.md, TEST_SCENARIOS.md)
- Support v2 schema with behavior-based expectations instead of message counts
- Enable model-agnostic test design that works across Claude, GPT-4, and Grok
- Add subagent invocation syntax documentation to openagent.md
2025-11-22 14:30:11 +00:00

109 lines
2.9 KiB
JavaScript

/**
* Test evaluators with real OpenCode session data
*/
const {
createConfig,
SessionReader,
TimelineBuilder,
EvaluatorRunner,
ApprovalGateEvaluator,
ContextLoadingEvaluator,
DelegationEvaluator,
ToolUsageEvaluator
} = require('./dist');
async function main() {
console.log('='.repeat(80));
console.log('EVALUATOR TEST');
console.log('='.repeat(80));
console.log('');
// Create config
const config = createConfig({
projectPath: '/Users/darrenhinde/Documents/GitHub/opencode-agents'
});
console.log(`Project path: ${config.projectPath}`);
console.log(`Session storage: ${config.sessionStoragePath}`);
console.log('');
// Create session reader and timeline builder
const sessionReader = new SessionReader(config.projectPath, config.sessionStoragePath);
const timelineBuilder = new TimelineBuilder(sessionReader);
// List available sessions
console.log('Finding sessions...');
const sessions = sessionReader.listSessions();
console.log(`Found ${sessions.length} sessions`);
console.log('');
if (sessions.length === 0) {
console.log('No sessions found. Exiting.');
return;
}
// Pick the most recent session
const latestSession = sessions[0];
console.log(`Testing with session: ${latestSession.id}`);
console.log(`Title: ${latestSession.title}`);
const createdDate = new Date(latestSession.created);
console.log(`Created: ${isNaN(createdDate.getTime()) ? 'Unknown' : createdDate.toISOString()}`);
console.log('');
// Create evaluators
const evaluators = [
new ApprovalGateEvaluator(),
new ContextLoadingEvaluator(),
new DelegationEvaluator(),
new ToolUsageEvaluator()
];
console.log(`Registered ${evaluators.length} evaluators:`);
evaluators.forEach((e, idx) => {
console.log(` ${idx + 1}. ${e.name} - ${e.description}`);
});
console.log('');
// Create runner
const runner = new EvaluatorRunner({
sessionReader,
timelineBuilder,
evaluators
});
// Run evaluators
console.log('-'.repeat(80));
console.log('Running evaluators...');
console.log('-'.repeat(80));
console.log('');
const result = await runner.runAll(latestSession.id);
// Generate and print report
console.log('');
console.log(runner.generateReport(result));
// Test batch evaluation with first 3 sessions
if (sessions.length > 1) {
console.log('');
console.log('');
console.log('='.repeat(80));
console.log('BATCH EVALUATION TEST (first 3 sessions)');
console.log('='.repeat(80));
console.log('');
const sessionIds = sessions.slice(0, Math.min(3, sessions.length)).map(s => s.id);
const batchResults = await runner.runBatch(sessionIds);
console.log('');
console.log(runner.generateBatchSummary(batchResults));
}
console.log('');
console.log('✓ Evaluator test complete!');
}
main().catch(error => {
console.error('Error running evaluator test:', error);
process.exit(1);
});