import type { AxAIService, AxLoggerFunction } from '../ai/types.js'; import type { AxGEPAAdapter } from './optimizers/gepaAdapter.js'; import type { AxOptimizerLoggerData } from './optimizerTypes.js'; import type { AxFieldValue, AxResultPickerFunction } from './types.js'; export type AxExample = Record; export type AxTypedExample = IN & { [key: string]: AxFieldValue; }; export type AxMetricFn = ( arg0: Readonly<{ prediction: T; example: AxExample }> ) => number | Promise; export type AxMetricFnArgs = Parameters[0]; export type AxMultiMetricFn = ( arg0: Readonly<{ prediction: T; example: AxExample }> ) => Record | Promise>; export interface AxOptimizationProgress { round: number; totalRounds: number; currentScore: number; bestScore: number; tokensUsed: number; timeElapsed: number; successfulExamples: number; totalExamples: number; currentConfiguration?: Record; bestConfiguration?: Record; convergenceInfo?: { improvement: number; stagnationRounds: number; isConverging: boolean; }; } export interface AxCostTracker { trackTokens(count: number, model: string): void; getCurrentCost(): number; getTokenUsage(): Record; getTotalTokens(): number; isLimitReached(): boolean; reset(): void; } export interface AxCostTrackerOptions { costPerModel?: Record; maxCost?: number; maxTokens?: number; } export interface AxOptimizationCheckpoint { version: string; timestamp: number; optimizerType: string; optimizerConfig: Record; currentRound: number; totalRounds: number; bestScore: number; bestConfiguration?: Record; scoreHistory: number[]; configurationHistory: Record[]; stats: AxOptimizationStats; optimizerState: Record; examples: readonly AxExample[]; } export type AxCheckpointSaveFn = ( checkpoint: Readonly ) => Promise; export type AxCheckpointLoadFn = ( checkpointId: string ) => Promise; export interface AxOptimizationStats { totalCalls: number; successfulDemos: number; estimatedTokenUsage: number; earlyStopped: boolean; earlyStopping?: { bestScoreRound: number; patienceExhausted: boolean; reason: string; }; bestScore: number; bestConfiguration?: Record; resourceUsage: { totalTokens: number; totalTime: number; avgLatencyPerEval: number; peakMemoryUsage?: number; costByModel: Record; }; convergenceInfo: { converged: boolean; finalImprovement: number; stagnationRounds: number; convergenceThreshold: number; }; evaluationBreakdown?: { trainingScore: number; validationScore: number; crossValidationScores?: number[]; standardDeviation?: number; }; } export type AxOptimizerArgs = { studentAI: AxAIService; teacherAI?: AxAIService; optimizerEndpoint?: string; optimizerTimeout?: number; optimizerRetries?: number; numCandidates?: number; initTemperature?: number; maxBootstrappedDemos?: number; maxLabeledDemos?: number; numTrials?: number; minibatch?: boolean; minibatchSize?: number; minibatchFullEvalSteps?: number; programAwareProposer?: boolean; dataAwareProposer?: boolean; viewDataBatchSize?: number; tipAwareProposer?: boolean; fewshotAwareProposer?: boolean; earlyStoppingTrials?: number; minImprovementThreshold?: number; bayesianOptimization?: boolean; acquisitionFunction?: | 'expected_improvement' | 'upper_confidence_bound' | 'probability_improvement'; explorationWeight?: number; sampleCount?: number; // Optional: custom picker used when sampleCount > 1 // If omitted, MiPRO uses a default majority-vote picker resultPicker?: AxResultPickerFunction; // Optional: include topP in the Python optimizer search space (0.7–1.0) optimizeTopP?: boolean; minSuccessRate?: number; targetScore?: number; onProgress?: (progress: Readonly) => void; onEarlyStop?: (reason: string, stats: Readonly) => void; costTracker?: AxCostTracker; checkpointSave?: AxCheckpointSaveFn; checkpointLoad?: AxCheckpointLoadFn; checkpointInterval?: number; resumeFromCheckpoint?: string; logger?: AxLoggerFunction; verbose?: boolean; seed?: number; debugOptimizer?: boolean; optimizerLogger?: (data: AxOptimizerLoggerData) => void; }; export interface AxCompileOptions { maxIterations?: number; earlyStoppingPatience?: number; verbose?: boolean; maxDemos?: number; auto?: 'light' | 'medium' | 'heavy'; overrideTargetScore?: number; overrideCostTracker?: AxCostTracker; overrideTeacherAI?: AxAIService; overrideOnProgress?: (progress: Readonly) => void; overrideOnEarlyStop?: ( reason: string, stats: Readonly ) => void; overrideCheckpointSave?: AxCheckpointSaveFn; overrideCheckpointLoad?: AxCheckpointLoadFn; overrideCheckpointInterval?: number; saveCheckpointOnComplete?: boolean; // GEPA core options (adapter-based) gepaAdapter?: AxGEPAAdapter; validationExamples?: readonly AxTypedExample[]; feedbackExamples?: readonly AxTypedExample[]; feedbackFn?: ( args: Readonly<{ prediction: unknown; example: AxExample }> ) => string | string[] | undefined; skipPerfectScore?: boolean; perfectScore?: number; maxMetricCalls?: number; }