huggingface-hub 0.36.0rc0__py3-none-any.whl → 1.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of huggingface-hub might be problematic. Click here for more details.

Files changed (132) hide show
  1. huggingface_hub/__init__.py +33 -45
  2. huggingface_hub/_commit_api.py +39 -43
  3. huggingface_hub/_commit_scheduler.py +11 -8
  4. huggingface_hub/_inference_endpoints.py +8 -8
  5. huggingface_hub/_jobs_api.py +20 -20
  6. huggingface_hub/_login.py +17 -43
  7. huggingface_hub/_oauth.py +8 -8
  8. huggingface_hub/_snapshot_download.py +135 -50
  9. huggingface_hub/_space_api.py +4 -4
  10. huggingface_hub/_tensorboard_logger.py +5 -5
  11. huggingface_hub/_upload_large_folder.py +18 -32
  12. huggingface_hub/_webhooks_payload.py +3 -3
  13. huggingface_hub/_webhooks_server.py +2 -2
  14. huggingface_hub/cli/__init__.py +0 -14
  15. huggingface_hub/cli/_cli_utils.py +143 -39
  16. huggingface_hub/cli/auth.py +105 -171
  17. huggingface_hub/cli/cache.py +594 -361
  18. huggingface_hub/cli/download.py +120 -112
  19. huggingface_hub/cli/hf.py +38 -41
  20. huggingface_hub/cli/jobs.py +689 -1017
  21. huggingface_hub/cli/lfs.py +120 -143
  22. huggingface_hub/cli/repo.py +282 -216
  23. huggingface_hub/cli/repo_files.py +50 -84
  24. huggingface_hub/cli/system.py +6 -25
  25. huggingface_hub/cli/upload.py +198 -220
  26. huggingface_hub/cli/upload_large_folder.py +91 -106
  27. huggingface_hub/community.py +5 -5
  28. huggingface_hub/constants.py +17 -52
  29. huggingface_hub/dataclasses.py +135 -21
  30. huggingface_hub/errors.py +47 -30
  31. huggingface_hub/fastai_utils.py +8 -9
  32. huggingface_hub/file_download.py +351 -303
  33. huggingface_hub/hf_api.py +398 -570
  34. huggingface_hub/hf_file_system.py +101 -66
  35. huggingface_hub/hub_mixin.py +32 -54
  36. huggingface_hub/inference/_client.py +177 -162
  37. huggingface_hub/inference/_common.py +38 -54
  38. huggingface_hub/inference/_generated/_async_client.py +218 -258
  39. huggingface_hub/inference/_generated/types/automatic_speech_recognition.py +3 -3
  40. huggingface_hub/inference/_generated/types/base.py +10 -7
  41. huggingface_hub/inference/_generated/types/chat_completion.py +16 -16
  42. huggingface_hub/inference/_generated/types/depth_estimation.py +2 -2
  43. huggingface_hub/inference/_generated/types/document_question_answering.py +2 -2
  44. huggingface_hub/inference/_generated/types/feature_extraction.py +2 -2
  45. huggingface_hub/inference/_generated/types/fill_mask.py +2 -2
  46. huggingface_hub/inference/_generated/types/sentence_similarity.py +3 -3
  47. huggingface_hub/inference/_generated/types/summarization.py +2 -2
  48. huggingface_hub/inference/_generated/types/table_question_answering.py +4 -4
  49. huggingface_hub/inference/_generated/types/text2text_generation.py +2 -2
  50. huggingface_hub/inference/_generated/types/text_generation.py +10 -10
  51. huggingface_hub/inference/_generated/types/text_to_video.py +2 -2
  52. huggingface_hub/inference/_generated/types/token_classification.py +2 -2
  53. huggingface_hub/inference/_generated/types/translation.py +2 -2
  54. huggingface_hub/inference/_generated/types/zero_shot_classification.py +2 -2
  55. huggingface_hub/inference/_generated/types/zero_shot_image_classification.py +2 -2
  56. huggingface_hub/inference/_generated/types/zero_shot_object_detection.py +1 -3
  57. huggingface_hub/inference/_mcp/agent.py +3 -3
  58. huggingface_hub/inference/_mcp/constants.py +1 -2
  59. huggingface_hub/inference/_mcp/mcp_client.py +33 -22
  60. huggingface_hub/inference/_mcp/types.py +10 -10
  61. huggingface_hub/inference/_mcp/utils.py +4 -4
  62. huggingface_hub/inference/_providers/__init__.py +12 -4
  63. huggingface_hub/inference/_providers/_common.py +62 -24
  64. huggingface_hub/inference/_providers/black_forest_labs.py +6 -6
  65. huggingface_hub/inference/_providers/cohere.py +3 -3
  66. huggingface_hub/inference/_providers/fal_ai.py +25 -25
  67. huggingface_hub/inference/_providers/featherless_ai.py +4 -4
  68. huggingface_hub/inference/_providers/fireworks_ai.py +3 -3
  69. huggingface_hub/inference/_providers/hf_inference.py +13 -13
  70. huggingface_hub/inference/_providers/hyperbolic.py +4 -4
  71. huggingface_hub/inference/_providers/nebius.py +10 -10
  72. huggingface_hub/inference/_providers/novita.py +5 -5
  73. huggingface_hub/inference/_providers/nscale.py +4 -4
  74. huggingface_hub/inference/_providers/replicate.py +15 -15
  75. huggingface_hub/inference/_providers/sambanova.py +6 -6
  76. huggingface_hub/inference/_providers/together.py +7 -7
  77. huggingface_hub/lfs.py +21 -94
  78. huggingface_hub/repocard.py +15 -16
  79. huggingface_hub/repocard_data.py +57 -57
  80. huggingface_hub/serialization/__init__.py +0 -1
  81. huggingface_hub/serialization/_base.py +9 -9
  82. huggingface_hub/serialization/_dduf.py +7 -7
  83. huggingface_hub/serialization/_torch.py +28 -28
  84. huggingface_hub/utils/__init__.py +11 -6
  85. huggingface_hub/utils/_auth.py +5 -5
  86. huggingface_hub/utils/_cache_manager.py +49 -74
  87. huggingface_hub/utils/_deprecation.py +1 -1
  88. huggingface_hub/utils/_dotenv.py +3 -3
  89. huggingface_hub/utils/_fixes.py +0 -10
  90. huggingface_hub/utils/_git_credential.py +3 -3
  91. huggingface_hub/utils/_headers.py +7 -29
  92. huggingface_hub/utils/_http.py +371 -208
  93. huggingface_hub/utils/_pagination.py +4 -4
  94. huggingface_hub/utils/_parsing.py +98 -0
  95. huggingface_hub/utils/_paths.py +5 -5
  96. huggingface_hub/utils/_runtime.py +59 -23
  97. huggingface_hub/utils/_safetensors.py +21 -21
  98. huggingface_hub/utils/_subprocess.py +9 -9
  99. huggingface_hub/utils/_telemetry.py +3 -3
  100. huggingface_hub/{commands/_cli_utils.py → utils/_terminal.py} +4 -9
  101. huggingface_hub/utils/_typing.py +3 -3
  102. huggingface_hub/utils/_validators.py +53 -72
  103. huggingface_hub/utils/_xet.py +16 -16
  104. huggingface_hub/utils/_xet_progress_reporting.py +1 -1
  105. huggingface_hub/utils/insecure_hashlib.py +3 -9
  106. huggingface_hub/utils/tqdm.py +3 -3
  107. {huggingface_hub-0.36.0rc0.dist-info → huggingface_hub-1.0.0.dist-info}/METADATA +16 -35
  108. huggingface_hub-1.0.0.dist-info/RECORD +152 -0
  109. {huggingface_hub-0.36.0rc0.dist-info → huggingface_hub-1.0.0.dist-info}/entry_points.txt +0 -1
  110. huggingface_hub/commands/__init__.py +0 -27
  111. huggingface_hub/commands/delete_cache.py +0 -476
  112. huggingface_hub/commands/download.py +0 -204
  113. huggingface_hub/commands/env.py +0 -39
  114. huggingface_hub/commands/huggingface_cli.py +0 -65
  115. huggingface_hub/commands/lfs.py +0 -200
  116. huggingface_hub/commands/repo.py +0 -151
  117. huggingface_hub/commands/repo_files.py +0 -132
  118. huggingface_hub/commands/scan_cache.py +0 -183
  119. huggingface_hub/commands/tag.py +0 -161
  120. huggingface_hub/commands/upload.py +0 -318
  121. huggingface_hub/commands/upload_large_folder.py +0 -131
  122. huggingface_hub/commands/user.py +0 -208
  123. huggingface_hub/commands/version.py +0 -40
  124. huggingface_hub/inference_api.py +0 -217
  125. huggingface_hub/keras_mixin.py +0 -497
  126. huggingface_hub/repository.py +0 -1471
  127. huggingface_hub/serialization/_tensorflow.py +0 -92
  128. huggingface_hub/utils/_hf_folder.py +0 -68
  129. huggingface_hub-0.36.0rc0.dist-info/RECORD +0 -170
  130. {huggingface_hub-0.36.0rc0.dist-info → huggingface_hub-1.0.0.dist-info}/LICENSE +0 -0
  131. {huggingface_hub-0.36.0rc0.dist-info → huggingface_hub-1.0.0.dist-info}/WHEEL +0 -0
  132. {huggingface_hub-0.36.0rc0.dist-info → huggingface_hub-1.0.0.dist-info}/top_level.txt +0 -0
@@ -14,9 +14,9 @@
14
14
  # limitations under the License.
15
15
  """Contains utilities to handle pagination on Huggingface Hub."""
16
16
 
17
- from typing import Dict, Iterable, Optional
17
+ from typing import Iterable, Optional
18
18
 
19
- import requests
19
+ import httpx
20
20
 
21
21
  from . import get_session, hf_raise_for_status, http_backoff, logging
22
22
 
@@ -24,7 +24,7 @@ from . import get_session, hf_raise_for_status, http_backoff, logging
24
24
  logger = logging.get_logger(__name__)
25
25
 
26
26
 
27
- def paginate(path: str, params: Dict, headers: Dict) -> Iterable:
27
+ def paginate(path: str, params: dict, headers: dict) -> Iterable:
28
28
  """Fetch a list of models/datasets/spaces and paginate through results.
29
29
 
30
30
  This is using the same "Link" header format as GitHub.
@@ -48,5 +48,5 @@ def paginate(path: str, params: Dict, headers: Dict) -> Iterable:
48
48
  next_page = _get_next_page(r)
49
49
 
50
50
 
51
- def _get_next_page(response: requests.Response) -> Optional[str]:
51
+ def _get_next_page(response: httpx.Response) -> Optional[str]:
52
52
  return response.links.get("next", {}).get("url")
@@ -0,0 +1,98 @@
1
+ # coding=utf-8
2
+ # Copyright 2025-present, the HuggingFace Inc. team.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ """Parsing helpers shared across modules."""
16
+
17
+ import re
18
+ import time
19
+ from typing import Dict
20
+
21
+
22
+ RE_NUMBER_WITH_UNIT = re.compile(r"(\d+)([a-z]+)", re.IGNORECASE)
23
+
24
+ BYTE_UNITS: Dict[str, int] = {
25
+ "k": 1_000,
26
+ "m": 1_000_000,
27
+ "g": 1_000_000_000,
28
+ "t": 1_000_000_000_000,
29
+ "p": 1_000_000_000_000_000,
30
+ }
31
+
32
+ TIME_UNITS: Dict[str, int] = {
33
+ "s": 1,
34
+ "m": 60,
35
+ "h": 60 * 60,
36
+ "d": 24 * 60 * 60,
37
+ "w": 7 * 24 * 60 * 60,
38
+ "mo": 30 * 24 * 60 * 60,
39
+ "y": 365 * 24 * 60 * 60,
40
+ }
41
+
42
+
43
+ def parse_size(value: str) -> int:
44
+ """Parse a size expressed as a string with digits and unit (like `"10MB"`) to an integer (in bytes)."""
45
+ return _parse_with_unit(value, BYTE_UNITS)
46
+
47
+
48
+ def parse_duration(value: str) -> int:
49
+ """Parse a duration expressed as a string with digits and unit (like `"10s"`) to an integer (in seconds)."""
50
+ return _parse_with_unit(value, TIME_UNITS)
51
+
52
+
53
+ def _parse_with_unit(value: str, units: Dict[str, int]) -> int:
54
+ """Parse a numeric value with optional unit."""
55
+ stripped = value.strip()
56
+ if not stripped:
57
+ raise ValueError("Value cannot be empty.")
58
+ try:
59
+ return int(value)
60
+ except ValueError:
61
+ pass
62
+
63
+ match = RE_NUMBER_WITH_UNIT.fullmatch(stripped)
64
+ if not match:
65
+ raise ValueError(f"Invalid value '{value}'. Must match pattern '\\d+[a-z]+' or be a plain number.")
66
+
67
+ number = int(match.group(1))
68
+ unit = match.group(2).lower()
69
+
70
+ if unit not in units:
71
+ raise ValueError(f"Unknown unit '{unit}'. Must be one of {list(units.keys())}.")
72
+
73
+ return number * units[unit]
74
+
75
+
76
+ def format_timesince(ts: float) -> str:
77
+ """Format timestamp in seconds into a human-readable string, relative to now.
78
+
79
+ Vaguely inspired by Django's `timesince` formatter.
80
+ """
81
+ _TIMESINCE_CHUNKS = (
82
+ # Label, divider, max value
83
+ ("second", 1, 60),
84
+ ("minute", 60, 60),
85
+ ("hour", 60 * 60, 24),
86
+ ("day", 60 * 60 * 24, 6),
87
+ ("week", 60 * 60 * 24 * 7, 6),
88
+ ("month", 60 * 60 * 24 * 30, 11),
89
+ ("year", 60 * 60 * 24 * 365, None),
90
+ )
91
+ delta = time.time() - ts
92
+ if delta < 20:
93
+ return "a few seconds ago"
94
+ for label, divider, max_value in _TIMESINCE_CHUNKS: # noqa: B007
95
+ value = round(delta / divider)
96
+ if max_value is not None and value <= max_value:
97
+ break
98
+ return f"{value} {label}{'s' if value > 1 else ''} ago"
@@ -16,7 +16,7 @@
16
16
 
17
17
  from fnmatch import fnmatch
18
18
  from pathlib import Path
19
- from typing import Callable, Generator, Iterable, List, Optional, TypeVar, Union
19
+ from typing import Callable, Generator, Iterable, Optional, TypeVar, Union
20
20
 
21
21
 
22
22
  T = TypeVar("T")
@@ -39,8 +39,8 @@ FORBIDDEN_FOLDERS = [".git", ".cache"]
39
39
  def filter_repo_objects(
40
40
  items: Iterable[T],
41
41
  *,
42
- allow_patterns: Optional[Union[List[str], str]] = None,
43
- ignore_patterns: Optional[Union[List[str], str]] = None,
42
+ allow_patterns: Optional[Union[list[str], str]] = None,
43
+ ignore_patterns: Optional[Union[list[str], str]] = None,
44
44
  key: Optional[Callable[[T], str]] = None,
45
45
  ) -> Generator[T, None, None]:
46
46
  """Filter repo objects based on an allowlist and a denylist.
@@ -55,10 +55,10 @@ def filter_repo_objects(
55
55
  Args:
56
56
  items (`Iterable`):
57
57
  List of items to filter.
58
- allow_patterns (`str` or `List[str]`, *optional*):
58
+ allow_patterns (`str` or `list[str]`, *optional*):
59
59
  Patterns constituting the allowlist. If provided, item paths must match at
60
60
  least one pattern from the allowlist.
61
- ignore_patterns (`str` or `List[str]`, *optional*):
61
+ ignore_patterns (`str` or `list[str]`, *optional*):
62
62
  Patterns constituting the denylist. If provided, item paths must not match
63
63
  any patterns from the denylist.
64
64
  key (`Callable[[T], str]`, *optional*):
@@ -19,7 +19,8 @@ import os
19
19
  import platform
20
20
  import sys
21
21
  import warnings
22
- from typing import Any, Dict
22
+ from pathlib import Path
23
+ from typing import Any, Literal
23
24
 
24
25
  from .. import __version__, constants
25
26
 
@@ -35,9 +36,9 @@ _CANDIDATES = {
35
36
  "fastcore": {"fastcore"},
36
37
  "gradio": {"gradio"},
37
38
  "graphviz": {"graphviz"},
38
- "hf_transfer": {"hf_transfer"},
39
39
  "hf_xet": {"hf_xet"},
40
40
  "jinja": {"Jinja2"},
41
+ "httpx": {"httpx"},
41
42
  "keras": {"keras"},
42
43
  "numpy": {"numpy"},
43
44
  "pillow": {"Pillow"},
@@ -143,13 +144,13 @@ def get_graphviz_version() -> str:
143
144
  return _get_version("graphviz")
144
145
 
145
146
 
146
- # hf_transfer
147
- def is_hf_transfer_available() -> bool:
148
- return is_package_available("hf_transfer")
147
+ # httpx
148
+ def is_httpx_available() -> bool:
149
+ return is_package_available("httpx")
149
150
 
150
151
 
151
- def get_hf_transfer_version() -> str:
152
- return _get_version("hf_transfer")
152
+ def get_httpx_version() -> str:
153
+ return _get_version("httpx")
153
154
 
154
155
 
155
156
  # xet
@@ -312,7 +313,50 @@ def is_colab_enterprise() -> bool:
312
313
  return os.environ.get("VERTEX_PRODUCT") == "COLAB_ENTERPRISE"
313
314
 
314
315
 
315
- def dump_environment_info() -> Dict[str, Any]:
316
+ # Check how huggingface_hub has been installed
317
+
318
+
319
+ def installation_method() -> Literal["brew", "hf_installer", "unknown"]:
320
+ """Return the installation method of the current environment.
321
+
322
+ - "hf_installer" if installed via the official installer script
323
+ - "brew" if installed via Homebrew
324
+ - "unknown" otherwise
325
+ """
326
+ if _is_brew_installation():
327
+ return "brew"
328
+ elif _is_hf_installer_installation():
329
+ return "hf_installer"
330
+ else:
331
+ return "unknown"
332
+
333
+
334
+ def _is_brew_installation() -> bool:
335
+ """Check if running from a Homebrew installation.
336
+
337
+ Note: AI-generated by Claude.
338
+ """
339
+ exe_path = Path(sys.executable).resolve()
340
+ exe_str = str(exe_path)
341
+
342
+ # Check common Homebrew paths
343
+ # /opt/homebrew (Apple Silicon), /usr/local (Intel)
344
+ return "/Cellar/" in exe_str or "/opt/homebrew/" in exe_str or exe_str.startswith("/usr/local/Cellar/")
345
+
346
+
347
+ def _is_hf_installer_installation() -> bool:
348
+ """Return `True` if the current environment was set up via the official hf installer script.
349
+
350
+ i.e. using one of
351
+ curl -LsSf https://hf.co/cli/install.sh | sh
352
+ powershell -ExecutionPolicy ByPass -c "irm https://hf.co/cli/install.ps1 | iex"
353
+ """
354
+ venv = sys.prefix # points to venv root if active
355
+ marker = Path(venv) / ".hf_installer_marker"
356
+ return marker.exists()
357
+
358
+
359
+ def dump_environment_info() -> dict[str, Any]:
316
360
  """Dump information about the machine to help debugging issues.
317
361
 
318
362
  Similar helper exist in:
@@ -326,7 +370,7 @@ def dump_environment_info() -> Dict[str, Any]:
326
370
  token = get_token()
327
371
 
328
372
  # Generic machine info
329
- info: Dict[str, Any] = {
373
+ info: dict[str, Any] = {
330
374
  "huggingface_hub version": get_hf_hub_version(),
331
375
  "Platform": platform.platform(),
332
376
  "Python version": get_python_version(),
@@ -356,22 +400,14 @@ def dump_environment_info() -> Dict[str, Any]:
356
400
  except Exception:
357
401
  pass
358
402
 
403
+ # How huggingface_hub has been installed?
404
+ info["Installation method"] = installation_method()
405
+
359
406
  # Installed dependencies
360
- info["FastAI"] = get_fastai_version()
361
- info["Tensorflow"] = get_tf_version()
362
- info["Torch"] = get_torch_version()
363
- info["Jinja2"] = get_jinja_version()
364
- info["Graphviz"] = get_graphviz_version()
365
- info["keras"] = get_keras_version()
366
- info["Pydot"] = get_pydot_version()
367
- info["Pillow"] = get_pillow_version()
368
- info["hf_transfer"] = get_hf_transfer_version()
407
+ info["httpx"] = get_httpx_version()
408
+ info["hf_xet"] = get_xet_version()
369
409
  info["gradio"] = get_gradio_version()
370
410
  info["tensorboard"] = get_tensorboard_version()
371
- info["numpy"] = get_numpy_version()
372
- info["pydantic"] = get_pydantic_version()
373
- info["aiohttp"] = get_aiohttp_version()
374
- info["hf_xet"] = get_xet_version()
375
411
 
376
412
  # Environment variables
377
413
  info["ENDPOINT"] = constants.ENDPOINT
@@ -386,9 +422,9 @@ def dump_environment_info() -> Dict[str, Any]:
386
422
  info["HF_HUB_DISABLE_EXPERIMENTAL_WARNING"] = constants.HF_HUB_DISABLE_EXPERIMENTAL_WARNING
387
423
  info["HF_HUB_DISABLE_IMPLICIT_TOKEN"] = constants.HF_HUB_DISABLE_IMPLICIT_TOKEN
388
424
  info["HF_HUB_DISABLE_XET"] = constants.HF_HUB_DISABLE_XET
389
- info["HF_HUB_ENABLE_HF_TRANSFER"] = constants.HF_HUB_ENABLE_HF_TRANSFER
390
425
  info["HF_HUB_ETAG_TIMEOUT"] = constants.HF_HUB_ETAG_TIMEOUT
391
426
  info["HF_HUB_DOWNLOAD_TIMEOUT"] = constants.HF_HUB_DOWNLOAD_TIMEOUT
427
+ info["HF_XET_HIGH_PERFORMANCE"] = constants.HF_XET_HIGH_PERFORMANCE
392
428
 
393
429
  print("\nCopy-and-paste the text below in your GitHub issue.\n")
394
430
  print("\n".join([f"- {prop}: {val}" for prop, val in info.items()]) + "\n")
@@ -2,7 +2,7 @@ import functools
2
2
  import operator
3
3
  from collections import defaultdict
4
4
  from dataclasses import dataclass, field
5
- from typing import Dict, List, Literal, Optional, Tuple
5
+ from typing import Literal, Optional
6
6
 
7
7
 
8
8
  FILENAME_T = str
@@ -19,17 +19,17 @@ class TensorInfo:
19
19
  Attributes:
20
20
  dtype (`str`):
21
21
  The data type of the tensor ("F64", "F32", "F16", "BF16", "I64", "I32", "I16", "I8", "U8", "BOOL").
22
- shape (`List[int]`):
22
+ shape (`list[int]`):
23
23
  The shape of the tensor.
24
- data_offsets (`Tuple[int, int]`):
24
+ data_offsets (`tuple[int, int]`):
25
25
  The offsets of the data in the file as a tuple `[BEGIN, END]`.
26
26
  parameter_count (`int`):
27
27
  The number of parameters in the tensor.
28
28
  """
29
29
 
30
30
  dtype: DTYPE_T
31
- shape: List[int]
32
- data_offsets: Tuple[int, int]
31
+ shape: list[int]
32
+ data_offsets: tuple[int, int]
33
33
  parameter_count: int = field(init=False)
34
34
 
35
35
  def __post_init__(self) -> None:
@@ -49,22 +49,22 @@ class SafetensorsFileMetadata:
49
49
  For more details regarding the safetensors format, check out https://huggingface.co/docs/safetensors/index#format.
50
50
 
51
51
  Attributes:
52
- metadata (`Dict`):
52
+ metadata (`dict`):
53
53
  The metadata contained in the file.
54
- tensors (`Dict[str, TensorInfo]`):
54
+ tensors (`dict[str, TensorInfo]`):
55
55
  A map of all tensors. Keys are tensor names and values are information about the corresponding tensor, as a
56
56
  [`TensorInfo`] object.
57
- parameter_count (`Dict[str, int]`):
57
+ parameter_count (`dict[str, int]`):
58
58
  A map of the number of parameters per data type. Keys are data types and values are the number of parameters
59
59
  of that data type.
60
60
  """
61
61
 
62
- metadata: Dict[str, str]
63
- tensors: Dict[TENSOR_NAME_T, TensorInfo]
64
- parameter_count: Dict[DTYPE_T, int] = field(init=False)
62
+ metadata: dict[str, str]
63
+ tensors: dict[TENSOR_NAME_T, TensorInfo]
64
+ parameter_count: dict[DTYPE_T, int] = field(init=False)
65
65
 
66
66
  def __post_init__(self) -> None:
67
- parameter_count: Dict[DTYPE_T, int] = defaultdict(int)
67
+ parameter_count: dict[DTYPE_T, int] = defaultdict(int)
68
68
  for tensor in self.tensors.values():
69
69
  parameter_count[tensor.dtype] += tensor.parameter_count
70
70
  self.parameter_count = dict(parameter_count)
@@ -82,29 +82,29 @@ class SafetensorsRepoMetadata:
82
82
  For more details regarding the safetensors format, check out https://huggingface.co/docs/safetensors/index#format.
83
83
 
84
84
  Attributes:
85
- metadata (`Dict`, *optional*):
85
+ metadata (`dict`, *optional*):
86
86
  The metadata contained in the 'model.safetensors.index.json' file, if it exists. Only populated for sharded
87
87
  models.
88
88
  sharded (`bool`):
89
89
  Whether the repo contains a sharded model or not.
90
- weight_map (`Dict[str, str]`):
90
+ weight_map (`dict[str, str]`):
91
91
  A map of all weights. Keys are tensor names and values are filenames of the files containing the tensors.
92
- files_metadata (`Dict[str, SafetensorsFileMetadata]`):
92
+ files_metadata (`dict[str, SafetensorsFileMetadata]`):
93
93
  A map of all files metadata. Keys are filenames and values are the metadata of the corresponding file, as
94
94
  a [`SafetensorsFileMetadata`] object.
95
- parameter_count (`Dict[str, int]`):
95
+ parameter_count (`dict[str, int]`):
96
96
  A map of the number of parameters per data type. Keys are data types and values are the number of parameters
97
97
  of that data type.
98
98
  """
99
99
 
100
- metadata: Optional[Dict]
100
+ metadata: Optional[dict]
101
101
  sharded: bool
102
- weight_map: Dict[TENSOR_NAME_T, FILENAME_T] # tensor name -> filename
103
- files_metadata: Dict[FILENAME_T, SafetensorsFileMetadata] # filename -> metadata
104
- parameter_count: Dict[DTYPE_T, int] = field(init=False)
102
+ weight_map: dict[TENSOR_NAME_T, FILENAME_T] # tensor name -> filename
103
+ files_metadata: dict[FILENAME_T, SafetensorsFileMetadata] # filename -> metadata
104
+ parameter_count: dict[DTYPE_T, int] = field(init=False)
105
105
 
106
106
  def __post_init__(self) -> None:
107
- parameter_count: Dict[DTYPE_T, int] = defaultdict(int)
107
+ parameter_count: dict[DTYPE_T, int] = defaultdict(int)
108
108
  for file_metadata in self.files_metadata.values():
109
109
  for dtype, nb_parameters_ in file_metadata.parameter_count.items():
110
110
  parameter_count[dtype] += nb_parameters_
@@ -20,7 +20,7 @@ import sys
20
20
  from contextlib import contextmanager
21
21
  from io import StringIO
22
22
  from pathlib import Path
23
- from typing import IO, Generator, List, Optional, Tuple, Union
23
+ from typing import IO, Generator, Optional, Union
24
24
 
25
25
  from .logging import get_logger
26
26
 
@@ -51,7 +51,7 @@ def capture_output() -> Generator[StringIO, None, None]:
51
51
 
52
52
 
53
53
  def run_subprocess(
54
- command: Union[str, List[str]],
54
+ command: Union[str, list[str]],
55
55
  folder: Optional[Union[str, Path]] = None,
56
56
  check=True,
57
57
  **kwargs,
@@ -62,7 +62,7 @@ def run_subprocess(
62
62
  be captured.
63
63
 
64
64
  Args:
65
- command (`str` or `List[str]`):
65
+ command (`str` or `list[str]`):
66
66
  The command to execute as a string or list of strings.
67
67
  folder (`str`, *optional*):
68
68
  The folder in which to run the command. Defaults to current working
@@ -70,7 +70,7 @@ def run_subprocess(
70
70
  check (`bool`, *optional*, defaults to `True`):
71
71
  Setting `check` to `True` will raise a `subprocess.CalledProcessError`
72
72
  when the subprocess has a non-zero exit code.
73
- kwargs (`Dict[str]`):
73
+ kwargs (`dict[str]`):
74
74
  Keyword arguments to be passed to the `subprocess.run` underlying command.
75
75
 
76
76
  Returns:
@@ -96,23 +96,23 @@ def run_subprocess(
96
96
 
97
97
  @contextmanager
98
98
  def run_interactive_subprocess(
99
- command: Union[str, List[str]],
99
+ command: Union[str, list[str]],
100
100
  folder: Optional[Union[str, Path]] = None,
101
101
  **kwargs,
102
- ) -> Generator[Tuple[IO[str], IO[str]], None, None]:
102
+ ) -> Generator[tuple[IO[str], IO[str]], None, None]:
103
103
  """Run a subprocess in an interactive mode in a context manager.
104
104
 
105
105
  Args:
106
- command (`str` or `List[str]`):
106
+ command (`str` or `list[str]`):
107
107
  The command to execute as a string or list of strings.
108
108
  folder (`str`, *optional*):
109
109
  The folder in which to run the command. Defaults to current working
110
110
  directory (from `os.getcwd()`).
111
- kwargs (`Dict[str]`):
111
+ kwargs (`dict[str]`):
112
112
  Keyword arguments to be passed to the `subprocess.run` underlying command.
113
113
 
114
114
  Returns:
115
- `Tuple[IO[str], IO[str]]`: A tuple with `stdin` and `stdout` to interact
115
+ `tuple[IO[str], IO[str]]`: A tuple with `stdin` and `stdout` to interact
116
116
  with the process (input and output are utf-8 encoded).
117
117
 
118
118
  Example:
@@ -1,6 +1,6 @@
1
1
  from queue import Queue
2
2
  from threading import Lock, Thread
3
- from typing import Dict, Optional, Union
3
+ from typing import Optional, Union
4
4
  from urllib.parse import quote
5
5
 
6
6
  from .. import constants, logging
@@ -22,7 +22,7 @@ def send_telemetry(
22
22
  *,
23
23
  library_name: Optional[str] = None,
24
24
  library_version: Optional[str] = None,
25
- user_agent: Union[Dict, str, None] = None,
25
+ user_agent: Union[dict, str, None] = None,
26
26
  ) -> None:
27
27
  """
28
28
  Sends telemetry that helps tracking usage of different HF libraries.
@@ -98,7 +98,7 @@ def _send_telemetry_in_thread(
98
98
  *,
99
99
  library_name: Optional[str] = None,
100
100
  library_version: Optional[str] = None,
101
- user_agent: Union[Dict, str, None] = None,
101
+ user_agent: Union[dict, str, None] = None,
102
102
  ) -> None:
103
103
  """Contains the actual data sending data to the Hub.
104
104
 
@@ -1,4 +1,4 @@
1
- # Copyright 2022 The HuggingFace Team. All rights reserved.
1
+ # Copyright 2025 The HuggingFace Team. All rights reserved.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -11,10 +11,10 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
- """Contains a utility for good-looking prints."""
14
+ """Contains utilities to print stuff to the terminal (styling, helpers)."""
15
15
 
16
16
  import os
17
- from typing import List, Union
17
+ from typing import Union
18
18
 
19
19
 
20
20
  class ANSI:
@@ -52,7 +52,7 @@ class ANSI:
52
52
  return f"{code}{s}{cls._reset}"
53
53
 
54
54
 
55
- def tabulate(rows: List[List[Union[str, int]]], headers: List[str]) -> str:
55
+ def tabulate(rows: list[list[Union[str, int]]], headers: list[str]) -> str:
56
56
  """
57
57
  Inspired by:
58
58
 
@@ -67,8 +67,3 @@ def tabulate(rows: List[List[Union[str, int]]], headers: List[str]) -> str:
67
67
  for row in rows:
68
68
  lines.append(row_format.format(*row))
69
69
  return "\n".join(lines)
70
-
71
-
72
- def show_deprecation_warning(old_command: str, new_command: str):
73
- """Show a yellow warning about deprecated CLI command."""
74
- print(ANSI.yellow(f"⚠️ Warning: '{old_command}' is deprecated. Use '{new_command}' instead."))
@@ -15,10 +15,10 @@
15
15
  """Handle typing imports based on system compatibility."""
16
16
 
17
17
  import sys
18
- from typing import Any, Callable, List, Literal, Optional, Set, Type, TypeVar, Union, get_args, get_origin
18
+ from typing import Any, Callable, Literal, Optional, Type, TypeVar, Union, get_args, get_origin
19
19
 
20
20
 
21
- UNION_TYPES: List[Any] = [Union]
21
+ UNION_TYPES: list[Any] = [Union]
22
22
  if sys.version_info >= (3, 10):
23
23
  from types import UnionType
24
24
 
@@ -33,7 +33,7 @@ CallableT = TypeVar("CallableT", bound=Callable)
33
33
  _JSON_SERIALIZABLE_TYPES = (int, float, str, bool, type(None))
34
34
 
35
35
 
36
- def is_jsonable(obj: Any, _visited: Optional[Set[int]] = None) -> bool:
36
+ def is_jsonable(obj: Any, _visited: Optional[set[int]] = None) -> bool:
37
37
  """Check if an object is JSON serializable.
38
38
 
39
39
  This is a weak check, as it does not check for the actual JSON serialization, but only for the types of the object.