Files
python-sdk/pkg/hanzoai/_exceptions.py
T
zooqueenandHanzo Dev b144973bfc fix(lint): resolve all ruff + black errors across all packages
Fix 35 ruff errors (E722, F841, B904, B905, B007, E741, S202, S310,
S306, S110, TID251, UP042, F401) and run black on 526 files.

Co-authored-by: Hanzo Dev <[email protected]>
2026-02-21 23:32:32 -08:00

139 lines
3.3 KiB
Python

# Hanzo AI SDK
from __future__ import annotations
from typing_extensions import Literal
import httpx
__all__ = [
"BadRequestError",
"AuthenticationError",
"PermissionDeniedError",
"NotFoundError",
"ConflictError",
"UnprocessableEntityError",
"RateLimitError",
"InternalServerError",
]
class HanzoError(Exception):
pass
class APIError(HanzoError):
message: str
request: httpx.Request
body: object | None
"""The API response body.
If the API responded with a valid JSON structure then this property will be the
decoded result.
If it isn't a valid JSON structure then this will be the raw response.
If there was no response associated with this error then it will be `None`.
"""
def __init__(
self, message: str, request: httpx.Request, *, body: object | None
) -> None: # noqa: ARG002
super().__init__(message)
self.request = request
self.message = message
self.body = body
class APIResponseValidationError(APIError):
response: httpx.Response
status_code: int
def __init__(
self,
response: httpx.Response,
body: object | None,
*,
message: str | None = None,
) -> None:
super().__init__(
message or "Data returned by API invalid for expected schema.",
response.request,
body=body,
)
self.response = response
self.status_code = response.status_code
class APIStatusError(APIError):
"""Raised when an API response has a status code of 4xx or 5xx."""
response: httpx.Response
status_code: int
def __init__(
self, message: str, *, response: httpx.Response, body: object | None
) -> None:
super().__init__(message, response.request, body=body)
self.response = response
self.status_code = response.status_code
class APIConnectionError(APIError):
def __init__(
self, *, message: str = "Connection error.", request: httpx.Request
) -> None:
super().__init__(message, request, body=None)
class APITimeoutError(APIConnectionError):
def __init__(self, request: httpx.Request) -> None:
super().__init__(message="Request timed out.", request=request)
class BadRequestError(APIStatusError):
status_code: Literal[400] = (
400 # pyright: ignore[reportIncompatibleVariableOverride]
)
class AuthenticationError(APIStatusError):
status_code: Literal[401] = (
401 # pyright: ignore[reportIncompatibleVariableOverride]
)
class PermissionDeniedError(APIStatusError):
status_code: Literal[403] = (
403 # pyright: ignore[reportIncompatibleVariableOverride]
)
class NotFoundError(APIStatusError):
status_code: Literal[404] = (
404 # pyright: ignore[reportIncompatibleVariableOverride]
)
class ConflictError(APIStatusError):
status_code: Literal[409] = (
409 # pyright: ignore[reportIncompatibleVariableOverride]
)
class UnprocessableEntityError(APIStatusError):
status_code: Literal[422] = (
422 # pyright: ignore[reportIncompatibleVariableOverride]
)
class RateLimitError(APIStatusError):
status_code: Literal[429] = (
429 # pyright: ignore[reportIncompatibleVariableOverride]
)
class InternalServerError(APIStatusError):
pass