/** * ComparisonRunner — Run the same goal across two adapter configurations side-by-side * * Executes identical tasks through two different adapter setups and produces * a structured comparison of results, timing, cost, and quality. * * Usage: * const runner = new ComparisonRunner(); * const result = await runner.compare({ * goal: { action: 'review', params: { code: '...' } }, * configA: { name: 'GPT-4', adapter: openaiAdapter }, * configB: { name: 'Claude', adapter: anthropicAdapter }, * }); * runner.printReport(result); * * @module ComparisonRunner * @version 1.0.0 */ /** A handler that executes a goal payload and returns a result */ export type ComparisonHandler = (payload: Record) => Promise; /** Output from a single execution */ export interface ComparisonOutput { /** Whether execution succeeded */ success: boolean; /** Result data */ data?: unknown; /** Error message if failed */ error?: string; /** Token usage (if available) */ tokens?: { input?: number; output?: number; }; /** Estimated cost in USD (if available) */ costUsd?: number; /** Any additional metadata */ metadata?: Record; } /** Configuration for one side of the comparison */ export interface ComparisonConfig { /** Human-readable name (e.g. 'GPT-4o', 'Claude Sonnet') */ name: string; /** Handler to execute the goal */ handler: ComparisonHandler; } /** Input to a comparison run */ export interface ComparisonInput { /** The goal/task payload to execute */ goal: Record; /** First configuration */ configA: ComparisonConfig; /** Second configuration */ configB: ComparisonConfig; /** Number of runs per config (default: 1) */ runs?: number; /** Optional quality scorer (0-100) */ scorer?: (output: ComparisonOutput) => number; } /** Result from a single run */ export interface RunResult { output: ComparisonOutput; durationMs: number; runIndex: number; } /** Side result (all runs for one config) */ export interface SideResult { name: string; runs: RunResult[]; avgDurationMs: number; avgScore: number | null; avgCostUsd: number | null; successRate: number; } /** Full comparison result */ export interface ComparisonResult { goal: Record; a: SideResult; b: SideResult; winner: 'A' | 'B' | 'TIE'; winReason: string; comparedAt: number; } /** * ComparisonRunner — Side-by-side adapter comparison. */ export declare class ComparisonRunner { /** * Run the same goal through two configurations and compare results. */ compare(input: ComparisonInput): Promise; /** * Print a human-readable comparison report. */ printReport(result: ComparisonResult): void; private runSide; private aggregateSide; private determineWinner; } //# sourceMappingURL=comparison-runner.d.ts.map