77 lines
2.7 KiB
Python
77 lines
2.7 KiB
Python
from fastapi import HTTPException
|
|
from openai import APIError as OpenAIAPIError
|
|
from google.genai.errors import APIError as GoogleAPIError
|
|
import traceback
|
|
|
|
from enums.llm_provider import LLMProvider
|
|
from llmai.shared.errors import BaseError as LLMAIBaseError
|
|
from utils.image_generation_error import openai_error_detail
|
|
from utils.llm_provider import get_llm_provider
|
|
from utils.provider_error_messages import safe_llm_provider_error_detail
|
|
|
|
|
|
CHATGPT_AUTH_REQUIRED_HEADER = {"X-Presenton-Auth-Action": "codex-reauth"}
|
|
CHATGPT_AUTH_REQUIRED_PREFIX = "CHATGPT_AUTH_REQUIRED:"
|
|
|
|
|
|
def _is_codex_provider() -> bool:
|
|
try:
|
|
return get_llm_provider() == LLMProvider.CODEX
|
|
except Exception:
|
|
return False
|
|
|
|
|
|
def _chatgpt_auth_required_exception(message: object) -> HTTPException:
|
|
detail = str(message or "Your ChatGPT session expired. Please sign in again from Settings.")
|
|
if CHATGPT_AUTH_REQUIRED_PREFIX not in detail:
|
|
detail = f"{CHATGPT_AUTH_REQUIRED_PREFIX} {detail}"
|
|
return HTTPException(
|
|
status_code=401,
|
|
detail=detail,
|
|
headers=CHATGPT_AUTH_REQUIRED_HEADER,
|
|
)
|
|
|
|
|
|
def handle_llm_client_exceptions(e: Exception) -> HTTPException:
|
|
traceback.print_exc()
|
|
if isinstance(e, HTTPException):
|
|
if _is_codex_provider() and e.status_code in {401, 403}:
|
|
return _chatgpt_auth_required_exception(e.detail)
|
|
return e
|
|
if isinstance(e, LLMAIBaseError):
|
|
if _is_codex_provider() and e.status_code in {401, 403}:
|
|
return _chatgpt_auth_required_exception(e.message)
|
|
return HTTPException(
|
|
status_code=e.status_code,
|
|
detail=safe_llm_provider_error_detail(
|
|
status_code=e.status_code,
|
|
message=e.message,
|
|
),
|
|
)
|
|
if isinstance(e, OpenAIAPIError):
|
|
status_code = getattr(e, "status_code", None) or 500
|
|
detail = openai_error_detail(e, operation="API request")
|
|
if _is_codex_provider() and status_code in {401, 403}:
|
|
return _chatgpt_auth_required_exception(detail)
|
|
return HTTPException(
|
|
status_code=status_code,
|
|
detail=detail,
|
|
)
|
|
if isinstance(e, GoogleAPIError):
|
|
status_code = (
|
|
getattr(e, "code", None)
|
|
or getattr(e, "status_code", None)
|
|
or 500
|
|
)
|
|
return HTTPException(
|
|
status_code=500,
|
|
detail=safe_llm_provider_error_detail(
|
|
status_code=status_code,
|
|
message=f"Google API error: {getattr(e, 'message', None) or str(e)}",
|
|
),
|
|
)
|
|
return HTTPException(
|
|
status_code=500,
|
|
detail=safe_llm_provider_error_detail(message=f"LLM API error: {e}"),
|
|
)
|