| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477 |
- """Contains all custom errors."""
- from pathlib import Path
- from httpx import HTTPError, Response
- # CACHE ERRORS
- class CacheNotFound(Exception):
- """Exception thrown when the Huggingface cache is not found."""
- cache_dir: str | Path
- def __init__(self, msg: str, cache_dir: str | Path, *args, **kwargs):
- super().__init__(msg, *args, **kwargs)
- self.cache_dir = cache_dir
- class CorruptedCacheException(Exception):
- """Exception for any unexpected structure in the Huggingface cache-system."""
- # HEADERS ERRORS
- class LocalTokenNotFoundError(EnvironmentError):
- """Raised if local token is required but not found."""
- # HTTP ERRORS
- class OfflineModeIsEnabled(ConnectionError):
- """Raised when a request is made but `HF_HUB_OFFLINE=1` is set as environment variable."""
- class HfHubHTTPError(HTTPError, OSError):
- """
- HTTPError to inherit from for any custom HTTP Error raised in HF Hub.
- Any HTTPError is converted at least into a `HfHubHTTPError`. If some information is
- sent back by the server, it will be added to the error message.
- Added details:
- - Request ID sourced from headers in order of precedence: "X-Request-Id", "X-Amzn-Trace-Id", "X-Amz-Cf-Id".
- - Server error message from the header "X-Error-Message".
- - Server error message if we can found one in the response body.
- Example:
- ```py
- import httpx
- from huggingface_hub.utils import get_session, hf_raise_for_status, HfHubHTTPError
- response = get_session().post(...)
- try:
- hf_raise_for_status(response)
- except HfHubHTTPError as e:
- print(str(e)) # formatted message
- e.request_id, e.server_message # details returned by server
- # Complete the error message with additional information once it's raised
- e.append_to_message("\n`create_commit` expects the repository to exist.")
- raise
- ```
- """
- def __init__(
- self,
- message: str,
- *,
- response: Response,
- server_message: str | None = None,
- ):
- self.request_id = (
- response.headers.get("x-request-id")
- or response.headers.get("X-Amzn-Trace-Id")
- or response.headers.get("x-amz-cf-id")
- )
- self.server_message = server_message
- self.response = response
- self.request = response.request
- super().__init__(message)
- def append_to_message(self, additional_message: str) -> None:
- """Append additional information to the `HfHubHTTPError` initial message."""
- self.args = (self.args[0] + additional_message,) + self.args[1:]
- @classmethod
- def _reconstruct_hf_hub_http_error(
- cls, message: str, response: Response, server_message: str | None
- ) -> "HfHubHTTPError":
- return cls(message, response=response, server_message=server_message)
- def __reduce_ex__(self, protocol):
- """Fix pickling of Exception subclass with kwargs. We need to override __reduce_ex__ of the parent class"""
- return (self.__class__._reconstruct_hf_hub_http_error, (str(self), self.response, self.server_message))
- # INFERENCE CLIENT ERRORS
- class InferenceTimeoutError(HTTPError, TimeoutError):
- """Error raised when a model is unavailable or the request times out."""
- # INFERENCE ENDPOINT ERRORS
- class InferenceEndpointError(Exception):
- """Generic exception when dealing with Inference Endpoints."""
- class InferenceEndpointTimeoutError(InferenceEndpointError, TimeoutError):
- """Exception for timeouts while waiting for Inference Endpoint."""
- # SAFETENSORS ERRORS
- class SafetensorsParsingError(Exception):
- """Raised when failing to parse a safetensors file metadata.
- This can be the case if the file is not a safetensors file or does not respect the specification.
- """
- class NotASafetensorsRepoError(Exception):
- """Raised when a repo is not a Safetensors repo i.e. doesn't have either a `model.safetensors` or a
- `model.safetensors.index.json` file.
- """
- # TEXT GENERATION ERRORS
- class TextGenerationError(HTTPError):
- """Generic error raised if text-generation went wrong."""
- # Text Generation Inference Errors
- class ValidationError(TextGenerationError):
- """Server-side validation error."""
- class GenerationError(TextGenerationError):
- pass
- class OverloadedError(TextGenerationError):
- pass
- class IncompleteGenerationError(TextGenerationError):
- pass
- class UnknownError(TextGenerationError):
- pass
- # VALIDATION ERRORS
- class HFValidationError(ValueError):
- """Generic exception thrown by `huggingface_hub` validators.
- Inherits from [`ValueError`](https://docs.python.org/3/library/exceptions.html#ValueError).
- """
- # FILE METADATA ERRORS
- class DryRunError(OSError):
- """Error triggered when a dry run is requested but cannot be performed (e.g. invalid repo)."""
- class FileMetadataError(OSError):
- """Error triggered when the metadata of a file on the Hub cannot be retrieved (missing ETag or commit_hash).
- Inherits from `OSError` for backward compatibility.
- """
- # BUCKET ERRORS
- class BucketNotFoundError(HfHubHTTPError):
- """
- Raised when trying to access a bucket that does not exist.
- Attributes:
- bucket_id (`str` or `None`):
- The bucket id (namespace/name) that was not found, if it could be determined from the request URL.
- Example:
- ```py
- >>> from huggingface_hub import bucket_info
- >>> bucket_info("<non_existent_bucket>")
- (...)
- huggingface_hub.errors.BucketNotFoundError: 404 Client Error. (Request ID: XXX)
- Bucket Not Found for url: https://huggingface.co/api/buckets/namespace/name.
- Please make sure you specified the correct bucket id (namespace/name).
- If the bucket is private, make sure you are authenticated and your token has the required permissions.
- ```
- """
- bucket_id: str | None = None
- # REPOSITORY ERRORS
- class RepositoryNotFoundError(HfHubHTTPError):
- """
- Raised when trying to access a hf.co URL with an invalid repository name, or
- with a private repo name the user does not have access to.
- Attributes:
- repo_id (`str` or `None`):
- The repo id that was not found, if it could be determined from the request URL.
- repo_type (`str` or `None`):
- The repo type ("model", "dataset", or "space"), if it could be determined from the request URL.
- Example:
- ```py
- >>> from huggingface_hub import model_info
- >>> model_info("<non_existent_repository>")
- (...)
- huggingface_hub.errors.RepositoryNotFoundError: 401 Client Error. (Request ID: PvMw_VjBMjVdMz53WKIzP)
- Repository Not Found for url: https://huggingface.co/api/models/%3Cnon_existent_repository%3E.
- Please make sure you specified the correct `repo_id` and `repo_type`.
- If the repo is private, make sure you are authenticated and your token has the required permissions.
- Invalid username or password.
- ```
- """
- repo_id: str | None = None
- repo_type: str | None = None
- class GatedRepoError(RepositoryNotFoundError):
- """
- Raised when trying to access a gated repository for which the user is not on the
- authorized list.
- Note: derives from `RepositoryNotFoundError` to ensure backward compatibility.
- Example:
- ```py
- >>> from huggingface_hub import model_info
- >>> model_info("<gated_repository>")
- (...)
- huggingface_hub.errors.GatedRepoError: 403 Client Error. (Request ID: ViT1Bf7O_026LGSQuVqfa)
- Cannot access gated repo for url https://huggingface.co/api/models/ardent-figment/gated-model.
- Access to model ardent-figment/gated-model is restricted and you are not in the authorized list.
- Visit https://huggingface.co/ardent-figment/gated-model to ask for access.
- ```
- """
- class DisabledRepoError(HfHubHTTPError):
- """
- Raised when trying to access a repository that has been disabled by its author.
- Example:
- ```py
- >>> from huggingface_hub import dataset_info
- >>> dataset_info("laion/laion-art")
- (...)
- huggingface_hub.errors.DisabledRepoError: 403 Client Error. (Request ID: Root=1-659fc3fa-3031673e0f92c71a2260dbe2;bc6f4dfb-b30a-4862-af0a-5cfe827610d8)
- Cannot access repository for url https://huggingface.co/api/datasets/laion/laion-art.
- Access to this resource is disabled.
- ```
- """
- # REVISION ERROR
- class RevisionNotFoundError(HfHubHTTPError):
- """
- Raised when trying to access a hf.co URL with a valid repository but an invalid
- revision.
- Attributes:
- repo_id (`str` or `None`):
- The repo id, if it could be determined from the request URL.
- repo_type (`str` or `None`):
- The repo type ("model", "dataset", or "space"), if it could be determined from the request URL.
- Example:
- ```py
- >>> from huggingface_hub import hf_hub_download
- >>> hf_hub_download('bert-base-cased', 'config.json', revision='<non-existent-revision>')
- (...)
- huggingface_hub.errors.RevisionNotFoundError: 404 Client Error. (Request ID: Mwhe_c3Kt650GcdKEFomX)
- Revision Not Found for url: https://huggingface.co/bert-base-cased/resolve/%3Cnon-existent-revision%3E/config.json.
- ```
- """
- repo_id: str | None = None
- repo_type: str | None = None
- # ENTRY ERRORS
- class EntryNotFoundError(Exception):
- """
- Raised when entry not found, either locally or remotely.
- Example:
- ```py
- >>> from huggingface_hub import hf_hub_download
- >>> hf_hub_download('bert-base-cased', '<non-existent-file>')
- (...)
- huggingface_hub.errors.RemoteEntryNotFoundError (...)
- >>> hf_hub_download('bert-base-cased', '<non-existent-file>', local_files_only=True)
- (...)
- huggingface_hub.utils.errors.LocalEntryNotFoundError (...)
- ```
- """
- class RemoteEntryNotFoundError(HfHubHTTPError, EntryNotFoundError):
- """
- Raised when trying to access a hf.co URL with a valid repository and revision
- but an invalid filename.
- Attributes:
- repo_id (`str` or `None`):
- The repo id, if it could be determined from the request URL.
- repo_type (`str` or `None`):
- The repo type ("model", "dataset", or "space"), if it could be determined from the request URL.
- Example:
- ```py
- >>> from huggingface_hub import hf_hub_download
- >>> hf_hub_download('bert-base-cased', '<non-existent-file>')
- (...)
- huggingface_hub.errors.EntryNotFoundError: 404 Client Error. (Request ID: 53pNl6M0MxsnG5Sw8JA6x)
- Entry Not Found for url: https://huggingface.co/bert-base-cased/resolve/main/%3Cnon-existent-file%3E.
- ```
- """
- repo_id: str | None = None
- repo_type: str | None = None
- class LocalEntryNotFoundError(FileNotFoundError, EntryNotFoundError):
- """
- Raised when trying to access a file or snapshot that is not on the disk when network is
- disabled or unavailable (connection issue). The entry may exist on the Hub.
- Example:
- ```py
- >>> from huggingface_hub import hf_hub_download
- >>> hf_hub_download('bert-base-cased', '<non-cached-file>', local_files_only=True)
- (...)
- huggingface_hub.errors.LocalEntryNotFoundError: Cannot find the requested files in the disk cache and outgoing traffic has been disabled. To enable hf.co look-ups and downloads online, set 'local_files_only' to False.
- ```
- """
- def __init__(self, message: str):
- super().__init__(message)
- # REQUEST ERROR
- class BadRequestError(HfHubHTTPError, ValueError):
- """
- Raised by `hf_raise_for_status` when the server returns a HTTP 400 error.
- Example:
- ```py
- >>> resp = httpx.post("hf.co/api/check", ...)
- >>> hf_raise_for_status(resp, endpoint_name="check")
- huggingface_hub.errors.BadRequestError: Bad request for check endpoint: {details} (Request ID: XXX)
- ```
- """
- # DDUF file format ERROR
- class DDUFError(Exception):
- """Base exception for errors related to the DDUF format."""
- class DDUFCorruptedFileError(DDUFError):
- """Exception thrown when the DDUF file is corrupted."""
- class DDUFExportError(DDUFError):
- """Base exception for errors during DDUF export."""
- class DDUFInvalidEntryNameError(DDUFExportError):
- """Exception thrown when the entry name is invalid."""
- # STRICT DATACLASSES ERRORS
- class StrictDataclassError(Exception):
- """Base exception for strict dataclasses."""
- class StrictDataclassDefinitionError(StrictDataclassError):
- """Exception thrown when a strict dataclass is defined incorrectly."""
- class StrictDataclassFieldValidationError(StrictDataclassError):
- """Exception thrown when a strict dataclass fails validation for a given field."""
- def __init__(self, field: str, cause: Exception):
- error_message = f"Validation error for field '{field}':"
- error_message += f"\n {cause.__class__.__name__}: {cause}"
- super().__init__(error_message)
- class StrictDataclassClassValidationError(StrictDataclassError):
- """Exception thrown when a strict dataclass fails validation on a class validator."""
- def __init__(self, validator: str, cause: Exception):
- error_message = f"Class validation error for validator '{validator}':"
- error_message += f"\n {cause.__class__.__name__}: {cause}"
- super().__init__(error_message)
- # XET ERRORS
- class XetError(Exception):
- """Base exception for errors related to Xet Storage."""
- class XetAuthorizationError(XetError):
- """Exception thrown when the user does not have the right authorization to use Xet Storage."""
- class XetRefreshTokenError(XetError):
- """Exception thrown when the refresh token is invalid."""
- class XetDownloadError(Exception):
- """Exception thrown when the download from Xet Storage fails."""
- # CLI ERRORS
- class CLIError(Exception):
- """CLI error with clean message (no traceback by default)."""
- class ConfirmationError(CLIError):
- """Raised when a confirmation prompt is declined (non-interactive mode)."""
- class CLIExtensionInstallError(CLIError):
- """Error during CLI extension installation."""
|