from __future__ import annotations from typing import Any class ApiProblemError(Exception): def __init__( self, *, status_code: int, detail: str | dict[str, Any], code: str | None = None, params: dict[str, Any] | None = None, ) -> None: resolved_detail = detail resolved_code = code resolved_params = params if isinstance(detail, dict): payload = detail resolved_code = resolved_code or str( payload.get("code") or "INTERNAL_ERROR" ) resolved_detail = str(payload.get("detail") or "Request failed") raw_params = payload.get("params") if resolved_params is None and isinstance(raw_params, dict): resolved_params = raw_params if not isinstance(resolved_detail, str): resolved_detail = str(resolved_detail) if not resolved_code or not isinstance(resolved_code, str): resolved_code = "INTERNAL_ERROR" super().__init__(resolved_detail) self.status_code = status_code self.code = resolved_code self.detail = resolved_detail self.params = resolved_params def problem_payload( *, code: str, detail: str, params: dict[str, Any] | None = None, ) -> dict[str, Any]: payload: dict[str, Any] = {"code": code, "detail": detail} if params: payload["params"] = params return payload