Suhasdev's picture
Deploy Universal Prompt Optimizer to HF Spaces (clean)
cacd4d0
"""
Result models for GEPA Optimizer
"""
from dataclasses import dataclass, field
from datetime import datetime
from typing import Dict, Any, Optional, List
import uuid
@dataclass
class OptimizationResult:
"""Complete optimization result with all metadata"""
# Identifiers
session_id: str = field(default_factory=lambda: str(uuid.uuid4()))
# Core results
original_prompt: str = ""
optimized_prompt: str = ""
# Performance metrics
improvement_data: Dict[str, Any] = field(default_factory=dict)
baseline_metrics: Dict[str, float] = field(default_factory=dict)
final_metrics: Dict[str, float] = field(default_factory=dict)
# Process metadata
optimization_time: float = 0.0
dataset_size: int = 0
total_iterations: int = 0
# Status and error handling
status: str = "pending" # pending, running, completed, failed
error_message: Optional[str] = None
# Timestamps
created_at: datetime = field(default_factory=datetime.now)
completed_at: Optional[datetime] = None
# Reflection history
reflection_history: List[Dict[str, Any]] = field(default_factory=list)
# Cost and resource usage
estimated_cost: Optional[float] = None
api_calls_made: int = 0
def mark_completed(self):
"""Mark optimization as completed"""
self.status = "completed"
self.completed_at = datetime.now()
def mark_failed(self, error: str):
"""Mark optimization as failed"""
self.status = "failed"
self.error_message = error
self.completed_at = datetime.now()
class OptimizedResult:
"""
User-facing result class that provides clean interface
"""
def __init__(self,
original_prompt: str = "",
optimized_prompt: str = "",
improvement_data: Dict[str, Any] = None,
optimization_time: float = 0.0,
dataset_size: int = 0,
total_iterations: int = 0,
status: str = "pending",
error_message: Optional[str] = None,
detailed_result: Optional[OptimizationResult] = None,
session_id: Optional[str] = None):
"""
Initialize OptimizedResult with individual parameters
Args:
original_prompt: Original seed prompt
optimized_prompt: Optimized prompt
improvement_data: Performance improvement data
optimization_time: Time taken for optimization
dataset_size: Size of dataset used
total_iterations: Number of optimization iterations
status: Optimization status
error_message: Error message if failed
detailed_result: Optional detailed OptimizationResult
session_id: Optional session ID
"""
if improvement_data is None:
improvement_data = {}
# Create internal OptimizationResult
self._result = OptimizationResult(
session_id=session_id or str(uuid.uuid4()),
original_prompt=original_prompt,
optimized_prompt=optimized_prompt,
improvement_data=improvement_data,
optimization_time=optimization_time,
dataset_size=dataset_size,
total_iterations=total_iterations,
status=status,
error_message=error_message
)
# If detailed_result is provided, use it instead
if detailed_result is not None:
self._result = detailed_result
@property
def prompt(self) -> str:
"""The optimized prompt ready for production use"""
return self._result.optimized_prompt
@property
def original_prompt(self) -> str:
"""The original seed prompt for reference"""
return self._result.original_prompt
@property
def session_id(self) -> str:
"""Unique session identifier"""
return self._result.session_id
@property
def improvement_data(self) -> Dict[str, Any]:
"""Performance improvement data"""
return self._result.improvement_data
@property
def status(self) -> str:
"""Optimization status"""
return self._result.status
@property
def error_message(self) -> Optional[str]:
"""Error message if optimization failed"""
return self._result.error_message
@property
def is_successful(self) -> bool:
"""Whether optimization completed successfully"""
return (
self._result.status == "completed" and
self._result.error_message is None
)
@property
def optimization_time(self) -> float:
"""Time taken for optimization in seconds"""
return self._result.optimization_time
@property
def dataset_size(self) -> int:
"""Size of dataset used for optimization"""
return self._result.dataset_size
@property
def total_iterations(self) -> int:
"""Total optimization iterations performed"""
return self._result.total_iterations
@property
def estimated_cost(self) -> Optional[float]:
"""Estimated cost in USD"""
return self._result.estimated_cost
def get_improvement_summary(self) -> Dict[str, Any]:
"""Get summary of improvements made"""
summary = {
'has_improvement': bool(self._result.improvement_data),
'optimization_time': self.optimization_time,
'iterations': self.total_iterations,
'dataset_size': self.dataset_size
}
# Add improvement percentage if available
if 'improvement_percent' in self._result.improvement_data:
summary['improvement_percent'] = self._result.improvement_data['improvement_percent']
return summary
def get_reflection_summary(self) -> Dict[str, Any]:
"""Get summary of reflection process"""
if not self._result.reflection_history:
return {'total_reflections': 0}
return {
'total_reflections': len(self._result.reflection_history),
'reflection_points': [
r.get('summary', 'No summary')
for r in self._result.reflection_history[:3] # First 3
]
}
def get_detailed_result(self) -> OptimizationResult:
"""Get the full detailed result for advanced users"""
return self._result
def __str__(self) -> str:
"""String representation"""
status_emoji = "✅" if self.is_successful else "❌" if self.status == "failed" else "⏳"
return f"OptimizedResult({status_emoji} {self.status}, time={self.optimization_time:.2f}s)"
def __repr__(self) -> str:
return self.__str__()