import { type RunScore, type RunScoreWeights } from './run-score';
import type { SteeringBundle } from './steering';
export type SteeringOptimizerBackend = 'pairwise' | 'ax-gepa';
export interface SteeringOptimizationRow {
    variantId: string;
    scenarioId: string;
    bundle: SteeringBundle;
    score: RunScore;
    metadata?: Record<string, unknown>;
}
export interface SteeringOptimizationSelector {
    backend: SteeringOptimizerBackend;
    signature?: string;
    labels?: string[];
    rationale?: string;
}
export interface SteeringOptimizationResult {
    backend: SteeringOptimizerBackend;
    recommendedVariantId: string;
    rationale: string;
    rankings: Array<{
        variantId: string;
        mean: number;
        runs: number;
    }>;
    selector?: SteeringOptimizationSelector;
    /** Runnable handle on the trained classifier. Present only when the
     *  ax-gepa backend completed training; calls the optimized selector
     *  program via ax's `forward`. */
    selectVariant?: (row: {
        task: string;
        split: string;
        seedPreview: string;
    }) => Promise<{
        variantId: string;
        rationale: string;
    }>;
    skipped?: boolean;
}
export interface SteeringOptimizerConfig {
    weights?: Partial<RunScoreWeights>;
}
export interface AxSteeringOptimizerConfig extends SteeringOptimizerConfig {
    provider: 'openai' | 'anthropic';
    apiKey: string;
    model: string;
    teacherModel?: string;
    minScenarioWinners?: number;
}
export declare class PairwiseSteeringOptimizer {
    optimize(rows: SteeringOptimizationRow[], config?: SteeringOptimizerConfig): SteeringOptimizationResult;
}
export declare class AxGepaSteeringOptimizer {
    private readonly config;
    constructor(config: AxSteeringOptimizerConfig);
    optimize(rows: SteeringOptimizationRow[]): Promise<SteeringOptimizationResult>;
}
//# sourceMappingURL=steering-optimizer.d.ts.map