51 lines
1.8 KiB
Python
51 lines
1.8 KiB
Python
"""Typed, serializable failures used across the single-stage workflow."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass, field
|
|
from enum import StrEnum
|
|
from typing import Any
|
|
|
|
|
|
class ErrorCode(StrEnum):
|
|
CANCELLED = "CANCELLED"
|
|
RUNTIME_CONTRACT_INVALID = "RUNTIME_CONTRACT_INVALID"
|
|
MODEL_STRUCTURED_OUTPUT_UNSUPPORTED = "MODEL_STRUCTURED_OUTPUT_UNSUPPORTED"
|
|
AUTHOR_TRANSPORT_UNAVAILABLE = "AUTHOR_TRANSPORT_UNAVAILABLE"
|
|
RENDER_SERVICE_UNAVAILABLE = "RENDER_SERVICE_UNAVAILABLE"
|
|
STORAGE_FAILURE = "STORAGE_FAILURE"
|
|
RUNTIME_EXECUTION_FAILURE = "RUNTIME_EXECUTION_FAILURE"
|
|
BEST_EFFORT_COMPLETED = "BEST_EFFORT_COMPLETED"
|
|
FAILED_INTERNAL = "FAILED_INTERNAL"
|
|
WAITING_FOR_USER = "WAITING_FOR_USER"
|
|
AUTHOR_FORBIDDEN_FIELD = "AUTHOR_FORBIDDEN_FIELD"
|
|
AUTHOR_SCHEMA_INVALID = "AUTHOR_SCHEMA_INVALID"
|
|
AUTHOR_REFERENCE_INVALID = "AUTHOR_REFERENCE_INVALID"
|
|
AUTHOR_CYCLE = "AUTHOR_CYCLE"
|
|
OPERATION_UNSUPPORTED = "OPERATION_UNSUPPORTED"
|
|
SELECTOR_NOT_FOUND = "SELECTOR_NOT_FOUND"
|
|
SELECTOR_AMBIGUOUS = "SELECTOR_AMBIGUOUS"
|
|
SELECTOR_DEPENDENCY_UNAVAILABLE = "SELECTOR_DEPENDENCY_UNAVAILABLE"
|
|
SELECTOR_KIND_MISMATCH = "SELECTOR_KIND_MISMATCH"
|
|
ENGINE_EXECUTION_FAILED = "ENGINE_EXECUTION_FAILED"
|
|
|
|
|
|
@dataclass(frozen=True, slots=True)
|
|
class WorkflowError:
|
|
"""An expected domain rejection, never a free-form exception channel."""
|
|
|
|
code: ErrorCode
|
|
message: str
|
|
field_errors: tuple[dict[str, Any], ...] = ()
|
|
retryable: bool = False
|
|
details: dict[str, Any] = field(default_factory=dict)
|
|
|
|
def payload(self) -> dict[str, Any]:
|
|
return {
|
|
"code": self.code.value,
|
|
"message": self.message,
|
|
"field_errors": list(self.field_errors),
|
|
"retryable": self.retryable,
|
|
"details": self.details,
|
|
}
|