Spaces:
Running
on
Zero
Running
on
Zero
| """ | |
| Error Report Model | |
| Provides structured error reporting with type categorization for consistent | |
| error handling across web and CLI interfaces. | |
| """ | |
| from typing import Set, TypedDict | |
| class ErrorReport(TypedDict): | |
| """ | |
| Structured error report for all failure scenarios. | |
| Fields: | |
| status: Always "failed" for errors | |
| error: Human-readable error message for end users | |
| error_type: Category of error (audio_io, processing, validation, ssl, model_loading) | |
| """ | |
| status: str | |
| error: str | |
| error_type: str | |
| # Valid error type categories | |
| VALID_ERROR_TYPES: Set[str] = { | |
| "audio_io", # File read/write failures, format issues | |
| "processing", # Algorithm failures, computation errors | |
| "validation", # Invalid parameters, constraint violations | |
| "ssl", # Certificate verification failures, network issues | |
| "model_loading", # HuggingFace Hub errors, missing model files | |
| } | |
| def validate_error_report(report: dict) -> ErrorReport: | |
| """ | |
| Validate error report structure and content. | |
| Args: | |
| report: Dictionary to validate | |
| Returns: | |
| Type-narrowed ErrorReport | |
| Raises: | |
| ValueError: If report is invalid | |
| """ | |
| # Check required keys | |
| required_keys = {"status", "error", "error_type"} | |
| missing = required_keys - report.keys() | |
| if missing: | |
| raise ValueError(f"Missing required keys: {missing}") | |
| # Validate status | |
| if report["status"] != "failed": | |
| raise ValueError(f"Error report status must be 'failed', got '{report['status']}'") | |
| # Validate error message | |
| if not report["error"] or not isinstance(report["error"], str): | |
| raise ValueError("Error message must be non-empty string") | |
| # Validate error_type | |
| if report["error_type"] not in VALID_ERROR_TYPES: | |
| raise ValueError( | |
| f"Invalid error_type: '{report['error_type']}'. Must be one of {VALID_ERROR_TYPES}" | |
| ) | |
| return report # Type-narrowed to ErrorReport | |
| def format_error_report(exception: Exception, error_type: str, context: str = "") -> ErrorReport: | |
| """ | |
| Create an ErrorReport from an exception. | |
| Args: | |
| exception: The exception that occurred | |
| error_type: Category of error (must be in VALID_ERROR_TYPES) | |
| context: Optional context to prepend to error message | |
| Returns: | |
| Validated ErrorReport dictionary | |
| Raises: | |
| ValueError: If error_type is invalid | |
| """ | |
| if error_type not in VALID_ERROR_TYPES: | |
| raise ValueError(f"Invalid error_type: '{error_type}'. Must be one of {VALID_ERROR_TYPES}") | |
| # Build error message | |
| error_msg = str(exception) | |
| if context: | |
| error_msg = f"{context}: {error_msg}" | |
| error_report: ErrorReport = {"status": "failed", "error": error_msg, "error_type": error_type} | |
| return error_report | |