aidial_adapter_openai/exception_handlers.py (54 lines of code) (raw):
from aidial_sdk.exceptions import HTTPException as DialException
from aidial_sdk.exceptions import InternalServerError
from fastapi.requests import Request as FastAPIRequest
from fastapi.responses import Response as FastAPIResponse
from openai import APIConnectionError, APIError, APIStatusError, APITimeoutError
from aidial_adapter_openai.utils.adapter_exception import (
AdapterException,
ResponseWrapper,
parse_adapter_exception,
)
def to_adapter_exception(exc: Exception) -> AdapterException:
if isinstance(exc, (DialException, ResponseWrapper)):
return exc
if isinstance(exc, APIStatusError):
# Non-streaming errors reported by `openai` library via this exception
r = exc.response
httpx_headers = r.headers
# httpx library (used by openai) automatically sets
# "Accept-Encoding:gzip,deflate" header in requests to the upstream.
# Therefore, we may receive from the upstream gzip-encoded
# response along with "Content-Encoding:gzip" header.
# We either need to encode the response, or
# remove the "Content-Encoding" header.
if "Content-Encoding" in httpx_headers:
del httpx_headers["Content-Encoding"]
return parse_adapter_exception(
status_code=r.status_code,
headers=dict(httpx_headers.items()),
content=r.text,
)
if isinstance(exc, APITimeoutError):
return DialException(
status_code=504,
type="timeout",
message="Request timed out",
display_message="Request timed out. Please try again later.",
)
if isinstance(exc, APIConnectionError):
return DialException(
status_code=502,
type="connection",
message="Error communicating with OpenAI",
display_message="OpenAI server is not responsive. Please try again later.",
)
if isinstance(exc, APIError):
# Streaming errors reported by `openai` library via this exception
status_code: int = 500
if exc.code:
try:
status_code = int(exc.code)
except Exception:
pass
return parse_adapter_exception(
status_code=status_code,
headers={},
content={"error": exc.body or {}},
)
return InternalServerError(str(exc))
def adapter_exception_handler(
request: FastAPIRequest, exc: Exception
) -> FastAPIResponse:
return to_adapter_exception(exc).to_fastapi_response()