MH0386 commited on
Commit
2404bb8
·
verified ·
1 Parent(s): 1458ba2

Upload folder using huggingface_hub

Browse files
Files changed (5) hide show
  1. pyproject.toml +6 -6
  2. src/vocalizr/__init__.py +14 -5
  3. src/vocalizr/gui.py +12 -25
  4. src/vocalizr/model.py +20 -10
  5. uv.lock +53 -59
pyproject.toml CHANGED
@@ -21,24 +21,24 @@ build-backend = "uv_build"
21
  [dependency-groups]
22
  dev = [
23
  "mypy>=1.15.0",
24
- "pyrefly>=0.14.0",
25
  "black>=25.1.0",
26
  "watchfiles>=1.0.5",
27
- "ruff>=0.11.9",
28
  "typos>=1.32.0",
29
  "pylint>=3.3.7",
30
  "pyright>=1.1.400",
31
- "huggingface-hub[cli,hf-transfer]>=0.31.1",
 
32
  ]
33
 
34
  [tool.typos.default.extend-words]
35
  Chatacter = "Chatacter"
36
 
37
- [tool.mypy]
38
- ignore_missing_imports = true
39
-
40
  [tool.pylint]
41
  disable = ["E1101", "C0114"]
42
 
 
 
 
43
  [tool.uv.sources]
44
  en-core-web-sm = { url = "https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.8.0/en_core_web_sm-3.8.0-py3-none-any.whl" }
 
21
  [dependency-groups]
22
  dev = [
23
  "mypy>=1.15.0",
 
24
  "black>=25.1.0",
25
  "watchfiles>=1.0.5",
26
+ "ruff>=0.11.10",
27
  "typos>=1.32.0",
28
  "pylint>=3.3.7",
29
  "pyright>=1.1.400",
30
+ "huggingface-hub[cli,hf-transfer]>=0.31.2",
31
+ "ty>=0.0.1a3",
32
  ]
33
 
34
  [tool.typos.default.extend-words]
35
  Chatacter = "Chatacter"
36
 
 
 
 
37
  [tool.pylint]
38
  disable = ["E1101", "C0114"]
39
 
40
+ [tool.ruff]
41
+ show-fixes = true
42
+
43
  [tool.uv.sources]
44
  en-core-web-sm = { url = "https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.8.0/en_core_web_sm-3.8.0-py3-none-any.whl" }
src/vocalizr/__init__.py CHANGED
@@ -1,16 +1,24 @@
1
  from datetime import datetime
2
  from os import getenv
3
  from pathlib import Path
4
-
5
  from dotenv import load_dotenv
6
  from kokoro import KPipeline
7
  from loguru import logger
8
  from torch import cuda
 
 
 
 
 
 
 
 
 
 
9
 
10
  load_dotenv()
11
 
12
- DEBUG: bool = getenv(key="DEBUG", default="False").lower() == "true"
13
- CHAR_LIMIT: int = int(getenv(key="CHAR_LIMIT", default="-1"))
14
  SERVER_NAME: str = getenv(key="GRADIO_SERVER_NAME", default="localhost")
15
  SERVER_PORT: int = int(getenv(key="GRADIO_SERVER_PORT", default="8080"))
16
  PIPELINE: KPipeline = KPipeline(lang_code="a", repo_id="hexgrad/Kokoro-82M")
@@ -32,11 +40,12 @@ logger.add(
32
  colorize=True,
33
  )
34
  logger.info(f"CUDA Available: {CUDA_AVAILABLE}")
35
- logger.info(f"Char limit: {CHAR_LIMIT}")
36
  logger.info(f"Base directory: {BASE_DIR}")
37
  logger.info(f"Results directory: {RESULTS_DIR}")
38
- logger.info(f"Current date: {CURRENT_DATE}")
39
  logger.info(f"Audio file path: {AUDIO_FILE_PATH}")
 
40
 
41
  CHOICES: dict[str, str] = {
42
  "🇺🇸 🚺 Heart ❤️": "af_heart",
 
1
  from datetime import datetime
2
  from os import getenv
3
  from pathlib import Path
 
4
  from dotenv import load_dotenv
5
  from kokoro import KPipeline
6
  from loguru import logger
7
  from torch import cuda
8
+ from warnings import filterwarnings
9
+
10
+ filterwarnings(
11
+ action="ignore",
12
+ message="dropout option adds dropout after all but last recurrent layer",
13
+ )
14
+ filterwarnings(
15
+ action="ignore",
16
+ message="`torch.nn.utils.weight_norm` is deprecated",
17
+ )
18
 
19
  load_dotenv()
20
 
21
+ DEBUG: bool = getenv(key="DEBUG", default="True").lower() == "true"
 
22
  SERVER_NAME: str = getenv(key="GRADIO_SERVER_NAME", default="localhost")
23
  SERVER_PORT: int = int(getenv(key="GRADIO_SERVER_PORT", default="8080"))
24
  PIPELINE: KPipeline = KPipeline(lang_code="a", repo_id="hexgrad/Kokoro-82M")
 
40
  colorize=True,
41
  )
42
  logger.info(f"CUDA Available: {CUDA_AVAILABLE}")
43
+ logger.info(f"Current date: {CURRENT_DATE}")
44
  logger.info(f"Base directory: {BASE_DIR}")
45
  logger.info(f"Results directory: {RESULTS_DIR}")
46
+ logger.info(f"Log directory: {LOG_DIR}")
47
  logger.info(f"Audio file path: {AUDIO_FILE_PATH}")
48
+ logger.info(f"Log file path: {LOG_FILE_PATH}")
49
 
50
  CHOICES: dict[str, str] = {
51
  "🇺🇸 🚺 Heart ❤️": "af_heart",
src/vocalizr/gui.py CHANGED
@@ -8,9 +8,9 @@ from gradio import (
8
  Row,
9
  Slider,
10
  Textbox,
 
11
  )
12
-
13
- from vocalizr import CHOICES, CUDA_AVAILABLE
14
  from vocalizr.model import generate_audio_for_text
15
 
16
 
@@ -22,10 +22,7 @@ def app_block() -> Blocks:
22
  with Blocks() as app:
23
  with Row():
24
  with Column():
25
- text: Textbox = Textbox(
26
- label="Input Text",
27
- info="Enter your text here",
28
- )
29
  with Row():
30
  voice: Dropdown = Dropdown(
31
  choices=list(CHOICES.items()),
@@ -36,14 +33,13 @@ def app_block() -> Blocks:
36
  Dropdown(
37
  choices=[("GPU 🚀", True), ("CPU 🐌", False)],
38
  value=CUDA_AVAILABLE,
39
- label="Hardware",
40
- info="GPU is usually faster, but has a usage quota",
41
  interactive=CUDA_AVAILABLE,
42
  )
43
- save_file = Checkbox(
44
- label="Save Audio",
45
- info="Save audio to local storage",
46
- )
47
  speed: Slider = Slider(
48
  minimum=0.5,
49
  maximum=2,
@@ -59,21 +55,12 @@ def app_block() -> Blocks:
59
  autoplay=True,
60
  )
61
  with Row():
62
- stream_btn: Button = Button(
63
- value="Generate",
64
- variant="primary",
65
- )
66
- stop_btn: Button = Button(
67
- value="Stop",
68
- variant="stop",
69
- )
70
  stream_event = stream_btn.click(
71
  fn=generate_audio_for_text,
72
- inputs=[text, voice, speed, save_file],
73
  outputs=[out_audio],
74
  )
75
- stop_btn.click(
76
- fn=None,
77
- cancels=stream_event,
78
- )
79
  return app
 
8
  Row,
9
  Slider,
10
  Textbox,
11
+ Number,
12
  )
13
+ from vocalizr import CHOICES, CUDA_AVAILABLE, DEBUG
 
14
  from vocalizr.model import generate_audio_for_text
15
 
16
 
 
22
  with Blocks() as app:
23
  with Row():
24
  with Column():
25
+ text: Textbox = Textbox(label="Input Text", info="Enter your text here")
 
 
 
26
  with Row():
27
  voice: Dropdown = Dropdown(
28
  choices=list(CHOICES.items()),
 
33
  Dropdown(
34
  choices=[("GPU 🚀", True), ("CPU 🐌", False)],
35
  value=CUDA_AVAILABLE,
36
+ label="Current Hardware",
 
37
  interactive=CUDA_AVAILABLE,
38
  )
39
+ char_limit: Number = Number(label="Character Limit", value=-1)
40
+ with Row():
41
+ save_file: Checkbox = Checkbox(label="Save Audio File")
42
+ debug: Checkbox = Checkbox(value=DEBUG, label="Debug")
43
  speed: Slider = Slider(
44
  minimum=0.5,
45
  maximum=2,
 
55
  autoplay=True,
56
  )
57
  with Row():
58
+ stream_btn: Button = Button(value="Generate", variant="primary")
59
+ stop_btn: Button = Button(value="Stop", variant="stop")
 
 
 
 
 
 
60
  stream_event = stream_btn.click(
61
  fn=generate_audio_for_text,
62
+ inputs=[text, voice, speed, save_file, debug, char_limit],
63
  outputs=[out_audio],
64
  )
65
+ stop_btn.click(fn=None, cancels=stream_event)
 
 
 
66
  return app
src/vocalizr/model.py CHANGED
@@ -7,7 +7,7 @@ from numpy import float32
7
  from numpy.typing import NDArray
8
  from soundfile import write
9
 
10
- from vocalizr import AUDIO_FILE_PATH, CHAR_LIMIT, PIPELINE
11
 
12
 
13
  @logger.catch
@@ -31,10 +31,14 @@ def save_file_wav(audio: NDArray[float32]) -> None:
31
  raise RuntimeError(f"Failed to save audio to {AUDIO_FILE_PATH}: {e}") from e
32
 
33
 
34
- # noinspection PyTypeChecker
35
  @logger.catch
36
  def generate_audio_for_text(
37
- text: str, voice: str = "af_heart", speed: float = 1, save_file: bool = False
 
 
 
 
 
38
  ) -> Generator[tuple[Literal[24000], NDArray[float32]], Any, None]:
39
  """
40
  Generates audio from the provided text using the specified voice and speed.
@@ -57,26 +61,32 @@ def generate_audio_for_text(
57
  to False.
58
  :type save_file: bool
59
 
 
 
 
 
 
 
60
  :return: A generator that yields tuples, where the first element is the
61
  fixed sampling rate of 24,000 Hz, and the second element is a NumPy
62
  array representing the generated audio data.
63
  :rtype: Generator[tuple[Literal[24000], NDArray[float32]], Any, None]
64
  """
65
- try:
66
- text = text if CHAR_LIMIT == -1 else text.strip()[:CHAR_LIMIT]
67
- except Exception as e:
68
- logger.exception(str(object=e))
69
- raise Error(message=str(object=e)) from e
70
  generator: Generator[KPipeline.Result, None, None] = PIPELINE(
71
  text=text, voice=voice, speed=speed
72
  )
73
- logger.info(f"Generating audio for '{text}'")
74
  for _, _, audio in generator:
75
  if audio is None or isinstance(audio, str):
76
  logger.exception(f"Unexpected type (audio): {type(audio)}")
77
  raise Error(message=f"Unexpected type (audio): {type(audio)}")
 
78
  audio_np: NDArray[float32] = audio.numpy()
79
  if save_file:
 
80
  save_file_wav(audio=audio_np)
81
- logger.info(f"Yielding audio for '{text}'")
82
  yield 24000, audio_np
 
7
  from numpy.typing import NDArray
8
  from soundfile import write
9
 
10
+ from vocalizr import AUDIO_FILE_PATH, PIPELINE
11
 
12
 
13
  @logger.catch
 
31
  raise RuntimeError(f"Failed to save audio to {AUDIO_FILE_PATH}: {e}") from e
32
 
33
 
 
34
  @logger.catch
35
  def generate_audio_for_text(
36
+ text: str,
37
+ voice: str = "af_heart",
38
+ speed: float = 1.0,
39
+ save_file: bool = False,
40
+ debug: bool = False,
41
+ char_limit: int = -1,
42
  ) -> Generator[tuple[Literal[24000], NDArray[float32]], Any, None]:
43
  """
44
  Generates audio from the provided text using the specified voice and speed.
 
61
  to False.
62
  :type save_file: bool
63
 
64
+ :param debug: Whether to enable debug mode. Defaults to False.
65
+ :type debug: bool
66
+
67
+ :param char_limit: The maximum number of characters to include in the input
68
+ :type char_limit: int
69
+
70
  :return: A generator that yields tuples, where the first element is the
71
  fixed sampling rate of 24,000 Hz, and the second element is a NumPy
72
  array representing the generated audio data.
73
  :rtype: Generator[tuple[Literal[24000], NDArray[float32]], Any, None]
74
  """
75
+ if not text:
76
+ logger.exception("No text provided")
77
+ elif len(text) < 4:
78
+ logger.exception(f"Text too short: {text} with length {len(text)}")
79
+ text = text if char_limit == -1 else text.strip()[:char_limit]
80
  generator: Generator[KPipeline.Result, None, None] = PIPELINE(
81
  text=text, voice=voice, speed=speed
82
  )
 
83
  for _, _, audio in generator:
84
  if audio is None or isinstance(audio, str):
85
  logger.exception(f"Unexpected type (audio): {type(audio)}")
86
  raise Error(message=f"Unexpected type (audio): {type(audio)}")
87
+ logger.info(f"Generating audio for '{text}'")
88
  audio_np: NDArray[float32] = audio.numpy()
89
  if save_file:
90
+ logger.info(f"Saving audio file at {AUDIO_FILE_PATH}")
91
  save_file_wav(audio=audio_np)
 
92
  yield 24000, audio_np
uv.lock CHANGED
@@ -567,21 +567,6 @@ wheels = [
567
  { url = "https://files.pythonhosted.org/packages/a1/14/f1e15b851d1c2af5b0b1a82bf8eb10bda2da62d98180220ba6fd8879bb5b/hf_transfer-0.1.9-cp38-abi3-win_amd64.whl", hash = "sha256:16f208fc678911c37e11aa7b586bc66a37d02e636208f18b6bc53d29b5df40ad", size = 1160240, upload-time = "2025-01-07T10:05:14.324Z" },
568
  ]
569
 
570
- [[package]]
571
- name = "hf-xet"
572
- version = "1.1.0"
573
- source = { registry = "https://pypi.org/simple" }
574
- sdist = { url = "https://files.pythonhosted.org/packages/aa/2c/70009910fcbd204bde75842b60c1e47fe72edb0e978954cb8001735885c7/hf_xet-1.1.0.tar.gz", hash = "sha256:a7c2a4c2b6eee9ce0a1a367a82b60d95ba634420ef1c250addad7aa4af419cf4", size = 263996, upload-time = "2025-04-29T21:15:51.247Z" }
575
- wheels = [
576
- { url = "https://files.pythonhosted.org/packages/dc/fd/0db331297e331f0f02005fd7ea666439bf15efd74f0dd62af02a43236a1b/hf_xet-1.1.0-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:0322c42551e275fcb7949c083a54a81b2898e50787c9aa74284fcb8d2c58c12c", size = 5069444, upload-time = "2025-04-29T21:15:42.631Z" },
577
- { url = "https://files.pythonhosted.org/packages/b9/7d/4d7ae44219d3744ad55669cb90ef3d4ed9f5f8a4729fa635a6499491cb78/hf_xet-1.1.0-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:667153a0304ac2debf2af95a8ff7687186f885b493f4cd16344869af270cd110", size = 4881465, upload-time = "2025-04-29T21:15:40.799Z" },
578
- { url = "https://files.pythonhosted.org/packages/83/9a/d40d2a57b132d609d8a4ccc29e59ed69749021610616749cabcda2532158/hf_xet-1.1.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:995eeffb119636ea617b96c7d7bf3c3f5ea8727fa57974574e25d700b8532d48", size = 53584225, upload-time = "2025-04-29T21:15:37.754Z" },
579
- { url = "https://files.pythonhosted.org/packages/2e/01/d94553f91d85746e0862f24d239da88d10f5ce252b028565744e982432f4/hf_xet-1.1.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3aee847da362393331f515c4010d0aaa1c2669acfcca1f4b28946d6949cc0086", size = 52043680, upload-time = "2025-04-29T21:15:34.15Z" },
580
- { url = "https://files.pythonhosted.org/packages/29/89/1f31853bf378f0ceb3363c07fd8a12af9b904b1f8c21e65eb5c19397bc98/hf_xet-1.1.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:68c5813a6074aa36e12ef5983230e3b03148cce61e0fcdd294096493795565b4", size = 53072672, upload-time = "2025-04-29T21:15:44.743Z" },
581
- { url = "https://files.pythonhosted.org/packages/b5/9f/5ecb92b18a4b2135a72a95dc08bcbeda9176f46642c745ee052420d2aea8/hf_xet-1.1.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4ee9222bf9274b1c198b88a929de0b5a49349c4962d89c5b3b2f0f7f47d9761c", size = 53521053, upload-time = "2025-04-29T21:15:48.252Z" },
582
- { url = "https://files.pythonhosted.org/packages/53/d6/cb32842cbf1cf5a154b41fa918a2fd86003af9bca227a2397cd7f312a8a6/hf_xet-1.1.0-cp37-abi3-win_amd64.whl", hash = "sha256:73153eab9abf3d6973b21e94a67ccba5d595c3e12feb8c0bf50be02964e7f126", size = 4204376, upload-time = "2025-04-29T21:15:52.69Z" },
583
- ]
584
-
585
  [[package]]
586
  name = "httpcore"
587
  version = "1.0.9"
@@ -621,21 +606,20 @@ wheels = [
621
 
622
  [[package]]
623
  name = "huggingface-hub"
624
- version = "0.31.1"
625
  source = { registry = "https://pypi.org/simple" }
626
  dependencies = [
627
  { name = "filelock" },
628
  { name = "fsspec" },
629
- { name = "hf-xet", marker = "platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'" },
630
  { name = "packaging" },
631
  { name = "pyyaml" },
632
  { name = "requests" },
633
  { name = "tqdm" },
634
  { name = "typing-extensions" },
635
  ]
636
- sdist = { url = "https://files.pythonhosted.org/packages/25/eb/9268c1205d19388659d5dc664f012177b752c0eef194a9159acc7227780f/huggingface_hub-0.31.1.tar.gz", hash = "sha256:492bb5f545337aa9e2f59b75ef4c5f535a371e8958a6ce90af056387e67f1180", size = 403036, upload-time = "2025-05-07T15:25:19.695Z" }
637
  wheels = [
638
- { url = "https://files.pythonhosted.org/packages/3a/bf/6002da17ec1c7a47bedeb216812929665927c70b6e7500b3c7bf36f01bdd/huggingface_hub-0.31.1-py3-none-any.whl", hash = "sha256:43f73124819b48b42d140cbc0d7a2e6bd15b2853b1b9d728d4d55ad1750cac5b", size = 484265, upload-time = "2025-05-07T15:25:17.921Z" },
639
  ]
640
 
641
  [package.optional-dependencies]
@@ -1525,21 +1509,6 @@ wheels = [
1525
  { url = "https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf", size = 111120, upload-time = "2025-03-25T05:01:24.908Z" },
1526
  ]
1527
 
1528
- [[package]]
1529
- name = "pyrefly"
1530
- version = "0.14.1"
1531
- source = { registry = "https://pypi.org/simple" }
1532
- sdist = { url = "https://files.pythonhosted.org/packages/7d/21/d8108a979ab07bb9fb946a2ed67dd15d192e6f47440fb1c23c3740b941f9/pyrefly-0.14.1.tar.gz", hash = "sha256:439762c0d9cd2a23c464924cf65adac89a0981e2e39fb88c0ea6becc2ec05bd8", size = 944001, upload-time = "2025-05-10T03:41:48.876Z" }
1533
- wheels = [
1534
- { url = "https://files.pythonhosted.org/packages/cd/7d/3a2c15e87d109141e775070c77dc036f2f80ddbd85a4ae743e96016e22a9/pyrefly-0.14.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9a2e10908edcabe66c81dbfb74c0ddee6f182ccfe9fd78d3d151e251a99673a9", size = 6244556, upload-time = "2025-05-10T03:41:34.206Z" },
1535
- { url = "https://files.pythonhosted.org/packages/cc/b6/f993b07bb1d4d5f5ad4ad6e3616213d653a5c4f6de5d86f1966f765b2eef/pyrefly-0.14.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d963709f54421b4f9bd8aa2d6556a7367a78c5da373b97d44033903d493b9385", size = 5901305, upload-time = "2025-05-10T03:41:36.5Z" },
1536
- { url = "https://files.pythonhosted.org/packages/0b/34/65973f8c73f9aef185f9cf0aeb85f5b73f7ab3be16829a5578b582834393/pyrefly-0.14.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dff47b1bc01f702947f0aa01d89e4eea5467533a5e2cce28246191277d14dcf6", size = 6900446, upload-time = "2025-05-10T03:41:39.377Z" },
1537
- { url = "https://files.pythonhosted.org/packages/07/eb/c4e6fbc442144f9c43871d39fe7dc88bc98e594fc3548a5cd82575c07116/pyrefly-0.14.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:050828ff96a5814c98a8217ae32515910767698f504698b65b25614a2589faff", size = 6506620, upload-time = "2025-05-10T03:41:41.496Z" },
1538
- { url = "https://files.pythonhosted.org/packages/ba/21/435b3ea02481d9cf42a6407113ec5eab47b49c44d0dc20c5319064f9f37d/pyrefly-0.14.1-py3-none-win32.whl", hash = "sha256:694cb156f540f133bab6975f7cee17d8f15d707e5e4f8ac040d2c6f1ab6f3500", size = 5737107, upload-time = "2025-05-10T03:41:43.153Z" },
1539
- { url = "https://files.pythonhosted.org/packages/78/f2/a281b401f1b6399cc47d594d146966305e9f6eb2ce80bc75a2d97a13e8ce/pyrefly-0.14.1-py3-none-win_amd64.whl", hash = "sha256:68e2240ca1a6d7237e0a6a9448757302302cc85896a7b5b12d362606ea371c82", size = 6168272, upload-time = "2025-05-10T03:41:45.275Z" },
1540
- { url = "https://files.pythonhosted.org/packages/ff/78/89184a166eef39674304785bd65f8f43e252fc469daaea3204739c43835d/pyrefly-0.14.1-py3-none-win_arm64.whl", hash = "sha256:a366f0adac8779c475a1fea06ca9787be58d2b5641554b4fd78d6c6a3aaa9e35", size = 5875018, upload-time = "2025-05-10T03:41:47.163Z" },
1541
- ]
1542
-
1543
  [[package]]
1544
  name = "pyright"
1545
  version = "1.1.400"
@@ -1768,27 +1737,27 @@ wheels = [
1768
 
1769
  [[package]]
1770
  name = "ruff"
1771
- version = "0.11.9"
1772
- source = { registry = "https://pypi.org/simple" }
1773
- sdist = { url = "https://files.pythonhosted.org/packages/f5/e7/e55dda1c92cdcf34b677ebef17486669800de01e887b7831a1b8fdf5cb08/ruff-0.11.9.tar.gz", hash = "sha256:ebd58d4f67a00afb3a30bf7d383e52d0e036e6195143c6db7019604a05335517", size = 4132134, upload-time = "2025-05-09T16:19:41.511Z" }
1774
- wheels = [
1775
- { url = "https://files.pythonhosted.org/packages/fb/71/75dfb7194fe6502708e547941d41162574d1f579c4676a8eb645bf1a6842/ruff-0.11.9-py3-none-linux_armv6l.whl", hash = "sha256:a31a1d143a5e6f499d1fb480f8e1e780b4dfdd580f86e05e87b835d22c5c6f8c", size = 10335453, upload-time = "2025-05-09T16:18:58.2Z" },
1776
- { url = "https://files.pythonhosted.org/packages/74/fc/ad80c869b1732f53c4232bbf341f33c5075b2c0fb3e488983eb55964076a/ruff-0.11.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:66bc18ca783b97186a1f3100e91e492615767ae0a3be584e1266aa9051990722", size = 11072566, upload-time = "2025-05-09T16:19:01.432Z" },
1777
- { url = "https://files.pythonhosted.org/packages/87/0d/0ccececef8a0671dae155cbf7a1f90ea2dd1dba61405da60228bbe731d35/ruff-0.11.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:bd576cd06962825de8aece49f28707662ada6a1ff2db848d1348e12c580acbf1", size = 10435020, upload-time = "2025-05-09T16:19:03.897Z" },
1778
- { url = "https://files.pythonhosted.org/packages/52/01/e249e1da6ad722278094e183cbf22379a9bbe5f21a3e46cef24ccab76e22/ruff-0.11.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b1d18b4be8182cc6fddf859ce432cc9631556e9f371ada52f3eaefc10d878de", size = 10593935, upload-time = "2025-05-09T16:19:06.455Z" },
1779
- { url = "https://files.pythonhosted.org/packages/ed/9a/40cf91f61e3003fe7bd43f1761882740e954506c5a0f9097b1cff861f04c/ruff-0.11.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0f3f46f759ac623e94824b1e5a687a0df5cd7f5b00718ff9c24f0a894a683be7", size = 10172971, upload-time = "2025-05-09T16:19:10.261Z" },
1780
- { url = "https://files.pythonhosted.org/packages/61/12/d395203de1e8717d7a2071b5a340422726d4736f44daf2290aad1085075f/ruff-0.11.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f34847eea11932d97b521450cf3e1d17863cfa5a94f21a056b93fb86f3f3dba2", size = 11748631, upload-time = "2025-05-09T16:19:12.307Z" },
1781
- { url = "https://files.pythonhosted.org/packages/66/d6/ef4d5eba77677eab511644c37c55a3bb8dcac1cdeb331123fe342c9a16c9/ruff-0.11.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f33b15e00435773df97cddcd263578aa83af996b913721d86f47f4e0ee0ff271", size = 12409236, upload-time = "2025-05-09T16:19:15.006Z" },
1782
- { url = "https://files.pythonhosted.org/packages/c5/8f/5a2c5fc6124dd925a5faf90e1089ee9036462118b619068e5b65f8ea03df/ruff-0.11.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7b27613a683b086f2aca8996f63cb3dd7bc49e6eccf590563221f7b43ded3f65", size = 11881436, upload-time = "2025-05-09T16:19:17.063Z" },
1783
- { url = "https://files.pythonhosted.org/packages/39/d1/9683f469ae0b99b95ef99a56cfe8c8373c14eba26bd5c622150959ce9f64/ruff-0.11.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e0d88756e63e8302e630cee3ce2ffb77859797cc84a830a24473939e6da3ca6", size = 13982759, upload-time = "2025-05-09T16:19:19.693Z" },
1784
- { url = "https://files.pythonhosted.org/packages/4e/0b/c53a664f06e0faab596397867c6320c3816df479e888fe3af63bc3f89699/ruff-0.11.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:537c82c9829d7811e3aa680205f94c81a2958a122ac391c0eb60336ace741a70", size = 11541985, upload-time = "2025-05-09T16:19:21.831Z" },
1785
- { url = "https://files.pythonhosted.org/packages/23/a0/156c4d7e685f6526a636a60986ee4a3c09c8c4e2a49b9a08c9913f46c139/ruff-0.11.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:440ac6a7029f3dee7d46ab7de6f54b19e34c2b090bb4f2480d0a2d635228f381", size = 10465775, upload-time = "2025-05-09T16:19:24.401Z" },
1786
- { url = "https://files.pythonhosted.org/packages/43/d5/88b9a6534d9d4952c355e38eabc343df812f168a2c811dbce7d681aeb404/ruff-0.11.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:71c539bac63d0788a30227ed4d43b81353c89437d355fdc52e0cda4ce5651787", size = 10170957, upload-time = "2025-05-09T16:19:27.08Z" },
1787
- { url = "https://files.pythonhosted.org/packages/f0/b8/2bd533bdaf469dc84b45815ab806784d561fab104d993a54e1852596d581/ruff-0.11.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c67117bc82457e4501473c5f5217d49d9222a360794bfb63968e09e70f340abd", size = 11143307, upload-time = "2025-05-09T16:19:29.462Z" },
1788
- { url = "https://files.pythonhosted.org/packages/2f/d9/43cfba291788459b9bfd4e09a0479aa94d05ab5021d381a502d61a807ec1/ruff-0.11.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e4b78454f97aa454586e8a5557facb40d683e74246c97372af3c2d76901d697b", size = 11603026, upload-time = "2025-05-09T16:19:31.569Z" },
1789
- { url = "https://files.pythonhosted.org/packages/22/e6/7ed70048e89b01d728ccc950557a17ecf8df4127b08a56944b9d0bae61bc/ruff-0.11.9-py3-none-win32.whl", hash = "sha256:7fe1bc950e7d7b42caaee2a8a3bc27410547cc032c9558ee2e0f6d3b209e845a", size = 10548627, upload-time = "2025-05-09T16:19:33.657Z" },
1790
- { url = "https://files.pythonhosted.org/packages/90/36/1da5d566271682ed10f436f732e5f75f926c17255c9c75cefb77d4bf8f10/ruff-0.11.9-py3-none-win_amd64.whl", hash = "sha256:52edaa4a6d70f8180343a5b7f030c7edd36ad180c9f4d224959c2d689962d964", size = 11634340, upload-time = "2025-05-09T16:19:35.815Z" },
1791
- { url = "https://files.pythonhosted.org/packages/40/f7/70aad26e5877c8f7ee5b161c4c9fa0100e63fc4c944dc6d97b9c7e871417/ruff-0.11.9-py3-none-win_arm64.whl", hash = "sha256:bcf42689c22f2e240f496d0c183ef2c6f7b35e809f12c1db58f75d9aa8d630ca", size = 10741080, upload-time = "2025-05-09T16:19:39.605Z" },
1792
  ]
1793
 
1794
  [[package]]
@@ -2203,6 +2172,31 @@ wheels = [
2203
  { url = "https://files.pythonhosted.org/packages/0a/93/f28a696fa750b9b608baa236f8225dd3290e5aff27433b06143adc025961/triton-3.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce4700fc14032af1e049005ae94ba908e71cd6c2df682239aed08e49bc71b742", size = 156580729, upload-time = "2025-04-09T20:27:55.424Z" },
2204
  ]
2205
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2206
  [[package]]
2207
  name = "typer"
2208
  version = "0.15.3"
@@ -2313,9 +2307,9 @@ dev = [
2313
  { name = "huggingface-hub", extra = ["cli", "hf-transfer"] },
2314
  { name = "mypy" },
2315
  { name = "pylint" },
2316
- { name = "pyrefly" },
2317
  { name = "pyright" },
2318
  { name = "ruff" },
 
2319
  { name = "typos" },
2320
  { name = "watchfiles" },
2321
  ]
@@ -2331,12 +2325,12 @@ requires-dist = [
2331
  [package.metadata.requires-dev]
2332
  dev = [
2333
  { name = "black", specifier = ">=25.1.0" },
2334
- { name = "huggingface-hub", extras = ["cli", "hf-transfer"], specifier = ">=0.31.1" },
2335
  { name = "mypy", specifier = ">=1.15.0" },
2336
  { name = "pylint", specifier = ">=3.3.7" },
2337
- { name = "pyrefly", specifier = ">=0.14.0" },
2338
  { name = "pyright", specifier = ">=1.1.400" },
2339
- { name = "ruff", specifier = ">=0.11.9" },
 
2340
  { name = "typos", specifier = ">=1.32.0" },
2341
  { name = "watchfiles", specifier = ">=1.0.5" },
2342
  ]
 
567
  { url = "https://files.pythonhosted.org/packages/a1/14/f1e15b851d1c2af5b0b1a82bf8eb10bda2da62d98180220ba6fd8879bb5b/hf_transfer-0.1.9-cp38-abi3-win_amd64.whl", hash = "sha256:16f208fc678911c37e11aa7b586bc66a37d02e636208f18b6bc53d29b5df40ad", size = 1160240, upload-time = "2025-01-07T10:05:14.324Z" },
568
  ]
569
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
570
  [[package]]
571
  name = "httpcore"
572
  version = "1.0.9"
 
606
 
607
  [[package]]
608
  name = "huggingface-hub"
609
+ version = "0.31.2"
610
  source = { registry = "https://pypi.org/simple" }
611
  dependencies = [
612
  { name = "filelock" },
613
  { name = "fsspec" },
 
614
  { name = "packaging" },
615
  { name = "pyyaml" },
616
  { name = "requests" },
617
  { name = "tqdm" },
618
  { name = "typing-extensions" },
619
  ]
620
+ sdist = { url = "https://files.pythonhosted.org/packages/3b/7b/09ab792c463975fcd0a81f459b5e900057dabbbc274ff253bb28d58ebfce/huggingface_hub-0.31.2.tar.gz", hash = "sha256:7053561376ed7f6ffdaecf09cc54d70dc784ac6315fa4bb9b93e19662b029675", size = 403025, upload-time = "2025-05-13T09:45:43.617Z" }
621
  wheels = [
622
+ { url = "https://files.pythonhosted.org/packages/83/81/a8fd9c226f7e3bc8918f1e456131717cb38e93f18ccc109bf3c8471e464f/huggingface_hub-0.31.2-py3-none-any.whl", hash = "sha256:8138cd52aa2326b4429bb00a4a1ba8538346b7b8a808cdce30acb6f1f1bdaeec", size = 484230, upload-time = "2025-05-13T09:45:41.977Z" },
623
  ]
624
 
625
  [package.optional-dependencies]
 
1509
  { url = "https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf", size = 111120, upload-time = "2025-03-25T05:01:24.908Z" },
1510
  ]
1511
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1512
  [[package]]
1513
  name = "pyright"
1514
  version = "1.1.400"
 
1737
 
1738
  [[package]]
1739
  name = "ruff"
1740
+ version = "0.11.10"
1741
+ source = { registry = "https://pypi.org/simple" }
1742
+ sdist = { url = "https://files.pythonhosted.org/packages/e8/4c/4a3c5a97faaae6b428b336dcca81d03ad04779f8072c267ad2bd860126bf/ruff-0.11.10.tar.gz", hash = "sha256:d522fb204b4959909ecac47da02830daec102eeb100fb50ea9554818d47a5fa6", size = 4165632, upload-time = "2025-05-15T14:08:56.76Z" }
1743
+ wheels = [
1744
+ { url = "https://files.pythonhosted.org/packages/2f/9f/596c628f8824a2ce4cd12b0f0b4c0629a62dfffc5d0f742c19a1d71be108/ruff-0.11.10-py3-none-linux_armv6l.whl", hash = "sha256:859a7bfa7bc8888abbea31ef8a2b411714e6a80f0d173c2a82f9041ed6b50f58", size = 10316243, upload-time = "2025-05-15T14:08:12.884Z" },
1745
+ { url = "https://files.pythonhosted.org/packages/3c/38/c1e0b77ab58b426f8c332c1d1d3432d9fc9a9ea622806e208220cb133c9e/ruff-0.11.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:968220a57e09ea5e4fd48ed1c646419961a0570727c7e069842edd018ee8afed", size = 11083636, upload-time = "2025-05-15T14:08:16.551Z" },
1746
+ { url = "https://files.pythonhosted.org/packages/23/41/b75e15961d6047d7fe1b13886e56e8413be8467a4e1be0a07f3b303cd65a/ruff-0.11.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:1067245bad978e7aa7b22f67113ecc6eb241dca0d9b696144256c3a879663bca", size = 10441624, upload-time = "2025-05-15T14:08:19.032Z" },
1747
+ { url = "https://files.pythonhosted.org/packages/b6/2c/e396b6703f131406db1811ea3d746f29d91b41bbd43ad572fea30da1435d/ruff-0.11.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4854fd09c7aed5b1590e996a81aeff0c9ff51378b084eb5a0b9cd9518e6cff2", size = 10624358, upload-time = "2025-05-15T14:08:21.542Z" },
1748
+ { url = "https://files.pythonhosted.org/packages/bd/8c/ee6cca8bdaf0f9a3704796022851a33cd37d1340bceaf4f6e991eb164e2e/ruff-0.11.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8b4564e9f99168c0f9195a0fd5fa5928004b33b377137f978055e40008a082c5", size = 10176850, upload-time = "2025-05-15T14:08:23.682Z" },
1749
+ { url = "https://files.pythonhosted.org/packages/e9/ce/4e27e131a434321b3b7c66512c3ee7505b446eb1c8a80777c023f7e876e6/ruff-0.11.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b6a9cc5b62c03cc1fea0044ed8576379dbaf751d5503d718c973d5418483641", size = 11759787, upload-time = "2025-05-15T14:08:25.733Z" },
1750
+ { url = "https://files.pythonhosted.org/packages/58/de/1e2e77fc72adc7cf5b5123fd04a59ed329651d3eab9825674a9e640b100b/ruff-0.11.10-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:607ecbb6f03e44c9e0a93aedacb17b4eb4f3563d00e8b474298a201622677947", size = 12430479, upload-time = "2025-05-15T14:08:28.013Z" },
1751
+ { url = "https://files.pythonhosted.org/packages/07/ed/af0f2340f33b70d50121628ef175523cc4c37619e98d98748c85764c8d88/ruff-0.11.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7b3a522fa389402cd2137df9ddefe848f727250535c70dafa840badffb56b7a4", size = 11919760, upload-time = "2025-05-15T14:08:30.956Z" },
1752
+ { url = "https://files.pythonhosted.org/packages/24/09/d7b3d3226d535cb89234390f418d10e00a157b6c4a06dfbe723e9322cb7d/ruff-0.11.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f071b0deed7e9245d5820dac235cbdd4ef99d7b12ff04c330a241ad3534319f", size = 14041747, upload-time = "2025-05-15T14:08:33.297Z" },
1753
+ { url = "https://files.pythonhosted.org/packages/62/b3/a63b4e91850e3f47f78795e6630ee9266cb6963de8f0191600289c2bb8f4/ruff-0.11.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a60e3a0a617eafba1f2e4186d827759d65348fa53708ca547e384db28406a0b", size = 11550657, upload-time = "2025-05-15T14:08:35.639Z" },
1754
+ { url = "https://files.pythonhosted.org/packages/46/63/a4f95c241d79402ccdbdb1d823d156c89fbb36ebfc4289dce092e6c0aa8f/ruff-0.11.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:da8ec977eaa4b7bf75470fb575bea2cb41a0e07c7ea9d5a0a97d13dbca697bf2", size = 10489671, upload-time = "2025-05-15T14:08:38.437Z" },
1755
+ { url = "https://files.pythonhosted.org/packages/6a/9b/c2238bfebf1e473495659c523d50b1685258b6345d5ab0b418ca3f010cd7/ruff-0.11.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:ddf8967e08227d1bd95cc0851ef80d2ad9c7c0c5aab1eba31db49cf0a7b99523", size = 10160135, upload-time = "2025-05-15T14:08:41.247Z" },
1756
+ { url = "https://files.pythonhosted.org/packages/ba/ef/ba7251dd15206688dbfba7d413c0312e94df3b31b08f5d695580b755a899/ruff-0.11.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5a94acf798a82db188f6f36575d80609072b032105d114b0f98661e1679c9125", size = 11170179, upload-time = "2025-05-15T14:08:43.762Z" },
1757
+ { url = "https://files.pythonhosted.org/packages/73/9f/5c336717293203ba275dbfa2ea16e49b29a9fd9a0ea8b6febfc17e133577/ruff-0.11.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:3afead355f1d16d95630df28d4ba17fb2cb9c8dfac8d21ced14984121f639bad", size = 11626021, upload-time = "2025-05-15T14:08:46.451Z" },
1758
+ { url = "https://files.pythonhosted.org/packages/d9/2b/162fa86d2639076667c9aa59196c020dc6d7023ac8f342416c2f5ec4bda0/ruff-0.11.10-py3-none-win32.whl", hash = "sha256:dc061a98d32a97211af7e7f3fa1d4ca2fcf919fb96c28f39551f35fc55bdbc19", size = 10494958, upload-time = "2025-05-15T14:08:49.601Z" },
1759
+ { url = "https://files.pythonhosted.org/packages/24/f3/66643d8f32f50a4b0d09a4832b7d919145ee2b944d43e604fbd7c144d175/ruff-0.11.10-py3-none-win_amd64.whl", hash = "sha256:5cc725fbb4d25b0f185cb42df07ab6b76c4489b4bfb740a175f3a59c70e8a224", size = 11650285, upload-time = "2025-05-15T14:08:52.392Z" },
1760
+ { url = "https://files.pythonhosted.org/packages/95/3a/2e8704d19f376c799748ff9cb041225c1d59f3e7711bc5596c8cfdc24925/ruff-0.11.10-py3-none-win_arm64.whl", hash = "sha256:ef69637b35fb8b210743926778d0e45e1bffa850a7c61e428c6b971549b5f5d1", size = 10765278, upload-time = "2025-05-15T14:08:54.56Z" },
1761
  ]
1762
 
1763
  [[package]]
 
2172
  { url = "https://files.pythonhosted.org/packages/0a/93/f28a696fa750b9b608baa236f8225dd3290e5aff27433b06143adc025961/triton-3.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce4700fc14032af1e049005ae94ba908e71cd6c2df682239aed08e49bc71b742", size = 156580729, upload-time = "2025-04-09T20:27:55.424Z" },
2173
  ]
2174
 
2175
+ [[package]]
2176
+ name = "ty"
2177
+ version = "0.0.1a3"
2178
+ source = { registry = "https://pypi.org/simple" }
2179
+ sdist = { url = "https://files.pythonhosted.org/packages/7c/2c/7e942c911da8bc597ae8ed5148931670c1074d64e03bf62e0ee0f62de5b9/ty-0.0.1a3.tar.gz", hash = "sha256:56e73d152888576932c67c61b295a5428636e3ef15e8a19a83977822b3a8a762", size = 2875322, upload-time = "2025-05-15T12:48:53.544Z" }
2180
+ wheels = [
2181
+ { url = "https://files.pythonhosted.org/packages/21/a8/79b0575b8a0385bdb08097c59268388d811638b83a8fe09eb6a034e33626/ty-0.0.1a3-py3-none-linux_armv6l.whl", hash = "sha256:f04dd8d6a1db1e8cf40270619a555ea306f7b6bfc265e0919a7b89ee1a467232", size = 6208030, upload-time = "2025-05-15T12:48:17.885Z" },
2182
+ { url = "https://files.pythonhosted.org/packages/7e/59/fe66fcef7efdc32d5689b681c005d289b0150259fa2907215d53c624f938/ty-0.0.1a3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:bb04a11d2b772ddd680f09fffd60c3ee827e5b020a20dd8ce07f2c64ed0d554a", size = 6283431, upload-time = "2025-05-15T12:48:20.29Z" },
2183
+ { url = "https://files.pythonhosted.org/packages/45/32/2d7f4d9a514538dbb6152f28964804a688a98c0de9ade0d6f035fd991932/ty-0.0.1a3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:aef675b51212ee2f5c731fd4b26191f13ef7d51509aafd959685d5716781c875", size = 5955170, upload-time = "2025-05-15T12:48:22.001Z" },
2184
+ { url = "https://files.pythonhosted.org/packages/45/34/0021bc71c17b0acd8d5757ec2fe1649c9ee10044c0e1144b87401b6270d7/ty-0.0.1a3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f7f63794a660cf7d87562bedf124152a9a284b637d80488c13a1cb5ed6aaf85", size = 6085244, upload-time = "2025-05-15T12:48:23.789Z" },
2185
+ { url = "https://files.pythonhosted.org/packages/5e/54/f12dae2d5d1aea37d03ffaa5029d3f9a79aeb4324e62a01909035072a635/ty-0.0.1a3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f16a4fae298f6886a5dad8e81919bb848b0bb0839f39715a0e0723665092efe", size = 6065139, upload-time = "2025-05-15T12:48:26.4Z" },
2186
+ { url = "https://files.pythonhosted.org/packages/8f/e4/acfb902f77f17f4009e06f0ab2be1591c1ac4483fe9fd2915d76327bef21/ty-0.0.1a3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b6c38f7252b38d6c3b5517f33b8a5736bdf1313d96d72d2bf2cf7ed96d3e3ee", size = 6764344, upload-time = "2025-05-15T12:48:28.449Z" },
2187
+ { url = "https://files.pythonhosted.org/packages/52/e4/76a8bfd8c2c3565e24c173b61bafa4e0b7033ffb1434654c6324f89bef53/ty-0.0.1a3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:225dcfb52cd757aab1585caa94602e5f87edbab6bd260bbea5c8a821b389baa1", size = 7176756, upload-time = "2025-05-15T12:48:30.361Z" },
2188
+ { url = "https://files.pythonhosted.org/packages/69/0c/628bedeab27911c5a194e42986cac58f9b25c36e666bf8729bb25e601895/ty-0.0.1a3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cb0c3d664840d1fefecc63b1cf5a62a2039b039ddca9a868eac51ce3cc1b3ab5", size = 6827963, upload-time = "2025-05-15T12:48:32.31Z" },
2189
+ { url = "https://files.pythonhosted.org/packages/64/59/e9c8444d47778da1b4c3d5580d583a7b1ecaf912fa035193c261e202cb9a/ty-0.0.1a3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23e9b730ba9c8772801ea16fe5da6007cd7f5cae504b9eb746782600b910c389", size = 7587027, upload-time = "2025-05-15T12:48:34.196Z" },
2190
+ { url = "https://files.pythonhosted.org/packages/54/9b/461eaca531ec17d18028a5a263cf94329796d4e798e4b81631e5d82d02df/ty-0.0.1a3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc7b7617b4ae3471546543e3b5922bfffcfb138c34b19f41d0c102bf6c3f064f", size = 6556360, upload-time = "2025-05-15T12:48:36.415Z" },
2191
+ { url = "https://files.pythonhosted.org/packages/97/41/0ad3145620568103ed0661bb6037d75392dd1b7822254bbaa62dc910fb7b/ty-0.0.1a3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:f45db3b40b265fd4e4f67d26e038dcdd1a10a9246e09c1b0f310150fc01e101a", size = 6001580, upload-time = "2025-05-15T12:48:38.905Z" },
2192
+ { url = "https://files.pythonhosted.org/packages/bc/55/f5b1d630bbbc1e2b5c034cc2c17b6420001c928ed7e97c8f2e1debcc1195/ty-0.0.1a3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:aa754e4ff7685910769812d92c1e31b664142c7067b79487e58889aca67fc3ae", size = 6092120, upload-time = "2025-05-15T12:48:40.688Z" },
2193
+ { url = "https://files.pythonhosted.org/packages/71/a9/71577384db3fb7f4722b10d64a59abee724b8462af038b0ab493cb9aa855/ty-0.0.1a3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:015657bdb165ad01f5baf822ef430c8dec98c5a70f8d86e32cf20ff679bdd57a", size = 6473271, upload-time = "2025-05-15T12:48:43.365Z" },
2194
+ { url = "https://files.pythonhosted.org/packages/d6/4a/aec305127624520af7ba1ac58bf871d36c575b3eb66308ad98f2b2f8cb28/ty-0.0.1a3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:28a09ae6c97c38f540af87df5a37e71b91e153dceb7128ff40bfd6742c9a01c5", size = 6627140, upload-time = "2025-05-15T12:48:45.813Z" },
2195
+ { url = "https://files.pythonhosted.org/packages/2c/30/81fa4d1a4e68b01ae7cb8297920a9e1d939a94049eb059eaaf03d38e231a/ty-0.0.1a3-py3-none-win32.whl", hash = "sha256:c04c852d8382712a8235b05984b22176f9397d58e596d69abf4073729b3404c6", size = 5891012, upload-time = "2025-05-15T12:48:47.552Z" },
2196
+ { url = "https://files.pythonhosted.org/packages/20/75/dbf77fd884f581acd88c3dac526faeb1396252ad5284870e7edef184a411/ty-0.0.1a3-py3-none-win_amd64.whl", hash = "sha256:90c068448d5a66b8aa0a533380fe8f10d6d6522bc2a20b41ba713029c775f9da", size = 6370696, upload-time = "2025-05-15T12:48:49.353Z" },
2197
+ { url = "https://files.pythonhosted.org/packages/cc/79/d143f7a65f8321849934559a2c968b7877b4fae64b19d082890454d5cd93/ty-0.0.1a3-py3-none-win_arm64.whl", hash = "sha256:8abf6f1c391fe4f506bf36f9e66b3f95844a4c74c01c037a80e71f440073c1e5", size = 6031781, upload-time = "2025-05-15T12:48:51.525Z" },
2198
+ ]
2199
+
2200
  [[package]]
2201
  name = "typer"
2202
  version = "0.15.3"
 
2307
  { name = "huggingface-hub", extra = ["cli", "hf-transfer"] },
2308
  { name = "mypy" },
2309
  { name = "pylint" },
 
2310
  { name = "pyright" },
2311
  { name = "ruff" },
2312
+ { name = "ty" },
2313
  { name = "typos" },
2314
  { name = "watchfiles" },
2315
  ]
 
2325
  [package.metadata.requires-dev]
2326
  dev = [
2327
  { name = "black", specifier = ">=25.1.0" },
2328
+ { name = "huggingface-hub", extras = ["cli", "hf-transfer"], specifier = ">=0.31.2" },
2329
  { name = "mypy", specifier = ">=1.15.0" },
2330
  { name = "pylint", specifier = ">=3.3.7" },
 
2331
  { name = "pyright", specifier = ">=1.1.400" },
2332
+ { name = "ruff", specifier = ">=0.11.10" },
2333
+ { name = "ty", specifier = ">=0.0.1a3" },
2334
  { name = "typos", specifier = ">=1.32.0" },
2335
  { name = "watchfiles", specifier = ">=1.0.5" },
2336
  ]