import logging import os from inspect import currentframe logger = logging.getLogger(__name__) logging.basicConfig( level=logging.INFO, format="%(asctime)s [%(levelname)s] %(name)s: %(message)s", ) def _resolve_error_origin( file_name: str | None, method_name: str | None, ) -> tuple[str, str]: """Resolve the source location where the exception was raised.""" if file_name and method_name: return file_name, method_name frame = currentframe() helper_caller = frame.f_back if frame else None caller_frame = helper_caller.f_back if helper_caller else None resolved_file = file_name or "unknown_file" resolved_method = method_name or "unknown_method" if caller_frame is not None: code = caller_frame.f_code resolved_file = file_name or os.path.basename(code.co_filename) resolved_method = method_name or code.co_name return resolved_file, resolved_method def _build_message(message: str, file_name: str, method_name: str) -> str: """Create a standardized exception message with origin details.""" return f"{message} [source: {file_name}:{method_name}]" class ModelPipelineError(RuntimeError): """Exception raised for errors in the model generation pipeline.""" def __init__( self, message: str, file_name: str | None = None, method_name: str | None = None, ): self.file_name, self.method_name = _resolve_error_origin( file_name, method_name, ) full_message = _build_message( message, self.file_name, self.method_name, ) super().__init__(full_message) logger.error("ModelPipelineError: %s", full_message) class TextGenerationError(RuntimeError): """Exception raised for errors in text generation.""" def __init__( self, message: str, file_name: str | None = None, method_name: str | None = None, ): self.file_name, self.method_name = _resolve_error_origin( file_name, method_name, ) full_message = _build_message( message, self.file_name, self.method_name, ) super().__init__(full_message) logger.error("TextGenerationError: %s", full_message) class UnifiedGenerationError(RuntimeError): """Exception raised for errors in unified generation.""" def __init__( self, message: str, file_name: str | None = None, method_name: str | None = None, ): self.file_name, self.method_name = _resolve_error_origin( file_name, method_name, ) full_message = _build_message( message, self.file_name, self.method_name, ) super().__init__(full_message) logger.error("UnifiedGenerationError: %s", full_message) class ImageGenerationError(Exception): """Raised when live image generation fails.""" def __init__( self, message: str, file_name: str | None = None, method_name: str | None = None, ): self.file_name, self.method_name = _resolve_error_origin( file_name, method_name, ) full_message = _build_message( message, self.file_name, self.method_name, ) super().__init__(full_message) logger.error("ImageGenerationError: %s", full_message)