Severian's picture
Upload 81 files
995af0f verified
raw
history blame
3.29 kB
from http import HTTPStatus
from typing import Union
import httpx
from pydantic import BaseModel
from dify_client_python.dify_client import models
class DifyAPIError(Exception):
def __init__(self, status: int, code: str, message: str):
super().__init__(f"status_code={status}, code={code}, {message}")
self.status = status
self.code = code
self.message = message
class DifyInvalidParam(DifyAPIError):
pass
class DifyNotChatApp(DifyAPIError):
pass
class DifyResourceNotFound(DifyAPIError):
pass
class DifyAppUnavailable(DifyAPIError):
pass
class DifyProviderNotInitialize(DifyAPIError):
pass
class DifyProviderQuotaExceeded(DifyAPIError):
pass
class DifyModelCurrentlyNotSupport(DifyAPIError):
pass
class DifyCompletionRequestError(DifyAPIError):
pass
class DifyInternalServerError(DifyAPIError):
pass
class DifyNoFileUploaded(DifyAPIError):
pass
class DifyTooManyFiles(DifyAPIError):
pass
class DifyUnsupportedPreview(DifyAPIError):
pass
class DifyUnsupportedEstimate(DifyAPIError):
pass
class DifyFileTooLarge(DifyAPIError):
pass
class DifyUnsupportedFileType(DifyAPIError):
pass
class DifyS3ConnectionFailed(DifyAPIError):
pass
class DifyS3PermissionDenied(DifyAPIError):
pass
class DifyS3FileTooLarge(DifyAPIError):
pass
SPEC_CODE_ERRORS = {
# completion & chat & workflow
"invalid_param": DifyInvalidParam,
"not_chat_app": DifyNotChatApp,
"app_unavailable": DifyAppUnavailable,
"provider_not_initialize": DifyProviderNotInitialize,
"provider_quota_exceeded": DifyProviderQuotaExceeded,
"model_currently_not_support": DifyModelCurrentlyNotSupport,
"completion_request_error": DifyCompletionRequestError,
# files upload
"no_file_uploaded": DifyNoFileUploaded,
"too_many_files": DifyTooManyFiles,
"unsupported_preview": DifyUnsupportedPreview,
"unsupported_estimate": DifyUnsupportedEstimate,
"file_too_large": DifyFileTooLarge,
"unsupported_file_type": DifyUnsupportedFileType,
"s3_connection_failed": DifyS3ConnectionFailed,
"s3_permission_denied": DifyS3PermissionDenied,
"s3_file_too_large": DifyS3FileTooLarge,
}
def raise_for_status(response: Union[httpx.Response, BaseModel]):
if isinstance(response, httpx.Response):
if response.is_success:
return
json = response.json()
if "status" not in json:
json["status"] = response.status_code
details = models.ErrorResponse(**json)
elif isinstance(response, BaseModel):
if not hasattr(response, 'event') or response.event != models.StreamEvent.ERROR.value:
return
details = models.ErrorStreamResponse(**response.dict())
else:
raise ValueError(f"Invalid dify response type: {type(response)}")
if details.status == HTTPStatus.NOT_FOUND:
raise DifyResourceNotFound(details.status, details.code, details.message)
elif details.status == HTTPStatus.INTERNAL_SERVER_ERROR:
raise DifyInternalServerError(details.status, details.code, details.message)
else:
raise SPEC_CODE_ERRORS.get(details.code, DifyAPIError)(
details.status, details.code, details.message
)