hysts HF Staff commited on
Commit
55b540a
·
1 Parent(s): b8aa7b5
Files changed (4) hide show
  1. app.py +27 -8
  2. pyproject.toml +1 -1
  3. requirements.txt +29 -4
  4. uv.lock +79 -9
app.py CHANGED
@@ -30,7 +30,17 @@ pose_model = VitPoseForPoseEstimation.from_pretrained(pose_model_name, device_ma
30
 
31
  @spaces.GPU(duration=5)
32
  @torch.inference_mode()
33
- def process_image(image: PIL.Image.Image) -> tuple[PIL.Image.Image, list[dict]]:
 
 
 
 
 
 
 
 
 
 
34
  inputs = person_image_processor(images=image, return_tensors="pt").to(device)
35
  outputs = person_model(**inputs)
36
  results = person_image_processor.post_process_object_detection(
@@ -102,10 +112,19 @@ def process_image(image: PIL.Image.Image) -> tuple[PIL.Image.Image, list[dict]]:
102
 
103
 
104
  @spaces.GPU(duration=90)
105
- def process_video(
106
  video_path: str,
107
  progress: gr.Progress = gr.Progress(track_tqdm=True), # noqa: ARG001, B008
108
  ) -> str:
 
 
 
 
 
 
 
 
 
109
  cap = cv2.VideoCapture(video_path)
110
 
111
  height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
@@ -121,7 +140,7 @@ def process_video(
121
  if not ok:
122
  break
123
  rgb_frame = frame[:, :, ::-1]
124
- annotated_frame, _ = process_image(PIL.Image.fromarray(rgb_frame))
125
  writer.write(np.asarray(annotated_frame)[:, :, ::-1])
126
  writer.release()
127
  cap.release()
@@ -144,11 +163,11 @@ with gr.Blocks(css_paths="style.css") as demo:
144
  examples=sorted(pathlib.Path("images").glob("*.jpg")),
145
  inputs=input_image,
146
  outputs=[output_image, output_json],
147
- fn=process_image,
148
  )
149
 
150
  run_button_image.click(
151
- fn=process_image,
152
  inputs=input_image,
153
  outputs=[output_image, output_json],
154
  )
@@ -167,15 +186,15 @@ with gr.Blocks(css_paths="style.css") as demo:
167
  examples=sorted(pathlib.Path("videos").glob("*.mp4")),
168
  inputs=input_video,
169
  outputs=output_video,
170
- fn=process_video,
171
  cache_examples=False,
172
  )
173
  run_button_video.click(
174
- fn=process_video,
175
  inputs=input_video,
176
  outputs=output_video,
177
  )
178
 
179
 
180
  if __name__ == "__main__":
181
- demo.launch()
 
30
 
31
  @spaces.GPU(duration=5)
32
  @torch.inference_mode()
33
+ def detect_pose_image(image: PIL.Image.Image) -> tuple[PIL.Image.Image, list[dict]]:
34
+ """Detects persons and estimates their poses in a single image.
35
+
36
+ Args:
37
+ image (PIL.Image.Image): Input image in which to detect persons and estimate poses.
38
+
39
+ Returns:
40
+ tuple[PIL.Image.Image, list[dict]]:
41
+ - Annotated image with bounding boxes and pose keypoints drawn.
42
+ - List of dictionaries containing human-readable pose estimation results for each detected person.
43
+ """
44
  inputs = person_image_processor(images=image, return_tensors="pt").to(device)
45
  outputs = person_model(**inputs)
46
  results = person_image_processor.post_process_object_detection(
 
112
 
113
 
114
  @spaces.GPU(duration=90)
115
+ def detect_pose_video(
116
  video_path: str,
117
  progress: gr.Progress = gr.Progress(track_tqdm=True), # noqa: ARG001, B008
118
  ) -> str:
119
+ """Detects persons and estimates their poses for each frame in a video, saving the annotated video.
120
+
121
+ Args:
122
+ video_path (str): Path to the input video file.
123
+ progress (gr.Progress, optional): Gradio progress tracker. Defaults to gr.Progress(track_tqdm=True).
124
+
125
+ Returns:
126
+ str: Path to the output video file with annotated bounding boxes and pose keypoints.
127
+ """
128
  cap = cv2.VideoCapture(video_path)
129
 
130
  height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
 
140
  if not ok:
141
  break
142
  rgb_frame = frame[:, :, ::-1]
143
+ annotated_frame, _ = detect_pose_image(PIL.Image.fromarray(rgb_frame))
144
  writer.write(np.asarray(annotated_frame)[:, :, ::-1])
145
  writer.release()
146
  cap.release()
 
163
  examples=sorted(pathlib.Path("images").glob("*.jpg")),
164
  inputs=input_image,
165
  outputs=[output_image, output_json],
166
+ fn=detect_pose_image,
167
  )
168
 
169
  run_button_image.click(
170
+ fn=detect_pose_image,
171
  inputs=input_image,
172
  outputs=[output_image, output_json],
173
  )
 
186
  examples=sorted(pathlib.Path("videos").glob("*.mp4")),
187
  inputs=input_video,
188
  outputs=output_video,
189
+ fn=detect_pose_video,
190
  cache_examples=False,
191
  )
192
  run_button_video.click(
193
+ fn=detect_pose_video,
194
  inputs=input_video,
195
  outputs=output_video,
196
  )
197
 
198
 
199
  if __name__ == "__main__":
200
+ demo.launch(mcp_server=True)
pyproject.toml CHANGED
@@ -6,7 +6,7 @@ readme = "README.md"
6
  requires-python = ">=3.10"
7
  dependencies = [
8
  "accelerate>=1.8.1",
9
- "gradio>=5.35.0",
10
  "hf-transfer>=0.1.9",
11
  "setuptools>=80.9.0",
12
  "spaces>=0.37.1",
 
6
  requires-python = ">=3.10"
7
  dependencies = [
8
  "accelerate>=1.8.1",
9
+ "gradio[mcp]>=5.35.0",
10
  "hf-transfer>=0.1.9",
11
  "setuptools>=80.9.0",
12
  "spaces>=0.37.1",
requirements.txt CHANGED
@@ -10,6 +10,8 @@ anyio==4.8.0
10
  # via
11
  # gradio
12
  # httpx
 
 
13
  # starlette
14
  certifi==2024.12.14
15
  # via
@@ -71,8 +73,11 @@ httpx==0.28.1
71
  # via
72
  # gradio
73
  # gradio-client
 
74
  # safehttpx
75
  # spaces
 
 
76
  huggingface-hub==0.33.2
77
  # via
78
  # accelerate
@@ -99,6 +104,8 @@ markupsafe==2.1.5
99
  # jinja2
100
  matplotlib==3.10.0
101
  # via supervision
 
 
102
  mdurl==0.1.2
103
  # via markdown-it-py
104
  mpmath==1.3.0
@@ -172,13 +179,17 @@ psutil==5.9.8
172
  # via
173
  # accelerate
174
  # spaces
175
- pydantic==2.10.6
176
  # via
177
  # fastapi
178
  # gradio
 
 
179
  # spaces
180
- pydantic-core==2.27.2
181
  # via pydantic
 
 
182
  pydub==0.25.1
183
  # via gradio
184
  pygments==2.19.1
@@ -189,8 +200,12 @@ python-dateutil==2.9.0.post0
189
  # via
190
  # matplotlib
191
  # pandas
 
 
192
  python-multipart==0.0.20
193
- # via gradio
 
 
194
  pytz==2024.2
195
  # via pandas
196
  pyyaml==6.0.2
@@ -232,10 +247,13 @@ sniffio==1.3.1
232
  # via anyio
233
  spaces==0.37.1
234
  # via vitpose-transformers (pyproject.toml)
 
 
235
  starlette==0.45.3
236
  # via
237
  # fastapi
238
  # gradio
 
239
  supervision==0.25.1
240
  # via vitpose-transformers (pyproject.toml)
241
  sympy==1.13.1
@@ -272,12 +290,19 @@ typing-extensions==4.12.2
272
  # spaces
273
  # torch
274
  # typer
 
275
  # uvicorn
 
 
 
 
276
  tzdata==2025.1
277
  # via pandas
278
  urllib3==2.3.0
279
  # via requests
280
  uvicorn==0.34.0
281
- # via gradio
 
 
282
  websockets==14.2
283
  # via gradio-client
 
10
  # via
11
  # gradio
12
  # httpx
13
+ # mcp
14
+ # sse-starlette
15
  # starlette
16
  certifi==2024.12.14
17
  # via
 
73
  # via
74
  # gradio
75
  # gradio-client
76
+ # mcp
77
  # safehttpx
78
  # spaces
79
+ httpx-sse==0.4.1
80
+ # via mcp
81
  huggingface-hub==0.33.2
82
  # via
83
  # accelerate
 
104
  # jinja2
105
  matplotlib==3.10.0
106
  # via supervision
107
+ mcp==1.9.3
108
+ # via gradio
109
  mdurl==0.1.2
110
  # via markdown-it-py
111
  mpmath==1.3.0
 
179
  # via
180
  # accelerate
181
  # spaces
182
+ pydantic==2.11.7
183
  # via
184
  # fastapi
185
  # gradio
186
+ # mcp
187
+ # pydantic-settings
188
  # spaces
189
+ pydantic-core==2.33.2
190
  # via pydantic
191
+ pydantic-settings==2.10.1
192
+ # via mcp
193
  pydub==0.25.1
194
  # via gradio
195
  pygments==2.19.1
 
200
  # via
201
  # matplotlib
202
  # pandas
203
+ python-dotenv==1.1.1
204
+ # via pydantic-settings
205
  python-multipart==0.0.20
206
+ # via
207
+ # gradio
208
+ # mcp
209
  pytz==2024.2
210
  # via pandas
211
  pyyaml==6.0.2
 
247
  # via anyio
248
  spaces==0.37.1
249
  # via vitpose-transformers (pyproject.toml)
250
+ sse-starlette==2.3.6
251
+ # via mcp
252
  starlette==0.45.3
253
  # via
254
  # fastapi
255
  # gradio
256
+ # mcp
257
  supervision==0.25.1
258
  # via vitpose-transformers (pyproject.toml)
259
  sympy==1.13.1
 
290
  # spaces
291
  # torch
292
  # typer
293
+ # typing-inspection
294
  # uvicorn
295
+ typing-inspection==0.4.1
296
+ # via
297
+ # pydantic
298
+ # pydantic-settings
299
  tzdata==2025.1
300
  # via pandas
301
  urllib3==2.3.0
302
  # via requests
303
  uvicorn==0.34.0
304
+ # via
305
+ # gradio
306
+ # mcp
307
  websockets==14.2
308
  # via gradio-client
uv.lock CHANGED
@@ -420,6 +420,12 @@ wheels = [
420
  { url = "https://files.pythonhosted.org/packages/69/9b/7c0e41bbcaae194b28f599191b5329e21ee91fd789607d6e6fb05ac58c1a/gradio-5.35.0-py3-none-any.whl", hash = "sha256:781a80df25355861e44fd2819fac4ed43cf08ea77911570fb0682f6ae16b9c7c", size = 54328513, upload-time = "2025-06-27T22:49:40.449Z" },
421
  ]
422
 
 
 
 
 
 
 
423
  [[package]]
424
  name = "gradio-client"
425
  version = "1.10.4"
@@ -530,6 +536,15 @@ wheels = [
530
  { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" },
531
  ]
532
 
 
 
 
 
 
 
 
 
 
533
  [[package]]
534
  name = "huggingface-hub"
535
  version = "0.33.2"
@@ -780,6 +795,26 @@ wheels = [
780
  { url = "https://files.pythonhosted.org/packages/6a/b9/59e120d24a2ec5fc2d30646adb2efb4621aab3c6d83d66fb2a7a182db032/matplotlib-3.10.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb73d8aa75a237457988f9765e4dfe1c0d2453c5ca4eabc897d4309672c8e014", size = 8594298, upload-time = "2025-05-08T19:10:51.738Z" },
781
  ]
782
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
783
  [[package]]
784
  name = "mdurl"
785
  version = "0.1.2"
@@ -1005,7 +1040,7 @@ name = "nvidia-cudnn-cu12"
1005
  version = "9.1.0.70"
1006
  source = { registry = "https://pypi.org/simple" }
1007
  dependencies = [
1008
- { name = "nvidia-cublas-cu12" },
1009
  ]
1010
  wheels = [
1011
  { url = "https://files.pythonhosted.org/packages/9f/fd/713452cd72343f682b1c7b9321e23829f00b842ceaedcda96e742ea0b0b3/nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f", size = 664752741, upload-time = "2024-04-22T15:24:15.253Z" },
@@ -1016,7 +1051,7 @@ name = "nvidia-cufft-cu12"
1016
  version = "11.2.1.3"
1017
  source = { registry = "https://pypi.org/simple" }
1018
  dependencies = [
1019
- { name = "nvidia-nvjitlink-cu12" },
1020
  ]
1021
  wheels = [
1022
  { url = "https://files.pythonhosted.org/packages/27/94/3266821f65b92b3138631e9c8e7fe1fb513804ac934485a8d05776e1dd43/nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f083fc24912aa410be21fa16d157fed2055dab1cc4b6934a0e03cba69eb242b9", size = 211459117, upload-time = "2024-04-03T20:57:40.402Z" },
@@ -1035,9 +1070,9 @@ name = "nvidia-cusolver-cu12"
1035
  version = "11.6.1.9"
1036
  source = { registry = "https://pypi.org/simple" }
1037
  dependencies = [
1038
- { name = "nvidia-cublas-cu12" },
1039
- { name = "nvidia-cusparse-cu12" },
1040
- { name = "nvidia-nvjitlink-cu12" },
1041
  ]
1042
  wheels = [
1043
  { url = "https://files.pythonhosted.org/packages/3a/e1/5b9089a4b2a4790dfdea8b3a006052cfecff58139d5a4e34cb1a51df8d6f/nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl", hash = "sha256:19e33fa442bcfd085b3086c4ebf7e8debc07cfe01e11513cc6d332fd918ac260", size = 127936057, upload-time = "2024-04-03T20:58:28.735Z" },
@@ -1048,7 +1083,7 @@ name = "nvidia-cusparse-cu12"
1048
  version = "12.3.1.170"
1049
  source = { registry = "https://pypi.org/simple" }
1050
  dependencies = [
1051
- { name = "nvidia-nvjitlink-cu12" },
1052
  ]
1053
  wheels = [
1054
  { url = "https://files.pythonhosted.org/packages/db/f7/97a9ea26ed4bbbfc2d470994b8b4f338ef663be97b8f677519ac195e113d/nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ea4f11a2904e2a8dc4b1833cc1b5181cde564edd0d5cd33e3c168eff2d1863f1", size = 207454763, upload-time = "2024-04-03T20:58:59.995Z" },
@@ -1420,6 +1455,20 @@ wheels = [
1420
  { url = "https://files.pythonhosted.org/packages/32/56/8a7ca5d2cd2cda1d245d34b1c9a942920a718082ae8e54e5f3e5a58b7add/pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1", size = 2066757, upload-time = "2025-04-23T18:33:30.645Z" },
1421
  ]
1422
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1423
  [[package]]
1424
  name = "pydub"
1425
  version = "0.25.1"
@@ -1459,6 +1508,15 @@ wheels = [
1459
  { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" },
1460
  ]
1461
 
 
 
 
 
 
 
 
 
 
1462
  [[package]]
1463
  name = "python-multipart"
1464
  version = "0.0.20"
@@ -1860,6 +1918,18 @@ wheels = [
1860
  { url = "https://files.pythonhosted.org/packages/d1/fa/9a83c960be03e81a01e6d4b252b340b8b2dd2c1ac7cd9795621860a86e01/spaces-0.37.1-py3-none-any.whl", hash = "sha256:1579e5747613a7dc5c0842cd6409dd44c4d1e20bc30060b1d0c0a581be9e414f", size = 31373, upload-time = "2025-06-20T14:38:05.302Z" },
1861
  ]
1862
 
 
 
 
 
 
 
 
 
 
 
 
 
1863
  [[package]]
1864
  name = "starlette"
1865
  version = "0.46.2"
@@ -2023,7 +2093,7 @@ name = "triton"
2023
  version = "3.1.0"
2024
  source = { registry = "https://pypi.org/simple" }
2025
  dependencies = [
2026
- { name = "filelock" },
2027
  ]
2028
  wheels = [
2029
  { url = "https://files.pythonhosted.org/packages/98/29/69aa56dc0b2eb2602b553881e34243475ea2afd9699be042316842788ff5/triton-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b0dd10a925263abbe9fa37dcde67a5e9b2383fc269fdf59f5657cac38c5d1d8", size = 209460013, upload-time = "2024-10-14T16:05:32.106Z" },
@@ -2105,7 +2175,7 @@ version = "0.1.0"
2105
  source = { virtual = "." }
2106
  dependencies = [
2107
  { name = "accelerate" },
2108
- { name = "gradio" },
2109
  { name = "hf-transfer" },
2110
  { name = "setuptools" },
2111
  { name = "spaces" },
@@ -2117,7 +2187,7 @@ dependencies = [
2117
  [package.metadata]
2118
  requires-dist = [
2119
  { name = "accelerate", specifier = ">=1.8.1" },
2120
- { name = "gradio", specifier = ">=5.35.0" },
2121
  { name = "hf-transfer", specifier = ">=0.1.9" },
2122
  { name = "setuptools", specifier = ">=80.9.0" },
2123
  { name = "spaces", specifier = ">=0.37.1" },
 
420
  { url = "https://files.pythonhosted.org/packages/69/9b/7c0e41bbcaae194b28f599191b5329e21ee91fd789607d6e6fb05ac58c1a/gradio-5.35.0-py3-none-any.whl", hash = "sha256:781a80df25355861e44fd2819fac4ed43cf08ea77911570fb0682f6ae16b9c7c", size = 54328513, upload-time = "2025-06-27T22:49:40.449Z" },
421
  ]
422
 
423
+ [package.optional-dependencies]
424
+ mcp = [
425
+ { name = "mcp" },
426
+ { name = "pydantic", marker = "sys_platform != 'emscripten'" },
427
+ ]
428
+
429
  [[package]]
430
  name = "gradio-client"
431
  version = "1.10.4"
 
536
  { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" },
537
  ]
538
 
539
+ [[package]]
540
+ name = "httpx-sse"
541
+ version = "0.4.1"
542
+ source = { registry = "https://pypi.org/simple" }
543
+ sdist = { url = "https://files.pythonhosted.org/packages/6e/fa/66bd985dd0b7c109a3bcb89272ee0bfb7e2b4d06309ad7b38ff866734b2a/httpx_sse-0.4.1.tar.gz", hash = "sha256:8f44d34414bc7b21bf3602713005c5df4917884f76072479b21f68befa4ea26e", size = 12998, upload-time = "2025-06-24T13:21:05.71Z" }
544
+ wheels = [
545
+ { url = "https://files.pythonhosted.org/packages/25/0a/6269e3473b09aed2dab8aa1a600c70f31f00ae1349bee30658f7e358a159/httpx_sse-0.4.1-py3-none-any.whl", hash = "sha256:cba42174344c3a5b06f255ce65b350880f962d99ead85e776f23c6618a377a37", size = 8054, upload-time = "2025-06-24T13:21:04.772Z" },
546
+ ]
547
+
548
  [[package]]
549
  name = "huggingface-hub"
550
  version = "0.33.2"
 
795
  { url = "https://files.pythonhosted.org/packages/6a/b9/59e120d24a2ec5fc2d30646adb2efb4621aab3c6d83d66fb2a7a182db032/matplotlib-3.10.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb73d8aa75a237457988f9765e4dfe1c0d2453c5ca4eabc897d4309672c8e014", size = 8594298, upload-time = "2025-05-08T19:10:51.738Z" },
796
  ]
797
 
798
+ [[package]]
799
+ name = "mcp"
800
+ version = "1.9.3"
801
+ source = { registry = "https://pypi.org/simple" }
802
+ dependencies = [
803
+ { name = "anyio" },
804
+ { name = "httpx" },
805
+ { name = "httpx-sse" },
806
+ { name = "pydantic" },
807
+ { name = "pydantic-settings" },
808
+ { name = "python-multipart" },
809
+ { name = "sse-starlette" },
810
+ { name = "starlette" },
811
+ { name = "uvicorn", marker = "sys_platform != 'emscripten'" },
812
+ ]
813
+ sdist = { url = "https://files.pythonhosted.org/packages/f2/df/8fefc0c6c7a5c66914763e3ff3893f9a03435628f6625d5e3b0dc45d73db/mcp-1.9.3.tar.gz", hash = "sha256:587ba38448e81885e5d1b84055cfcc0ca56d35cd0c58f50941cab01109405388", size = 333045, upload-time = "2025-06-05T15:48:25.681Z" }
814
+ wheels = [
815
+ { url = "https://files.pythonhosted.org/packages/79/45/823ad05504bea55cb0feb7470387f151252127ad5c72f8882e8fe6cf5c0e/mcp-1.9.3-py3-none-any.whl", hash = "sha256:69b0136d1ac9927402ed4cf221d4b8ff875e7132b0b06edd446448766f34f9b9", size = 131063, upload-time = "2025-06-05T15:48:24.171Z" },
816
+ ]
817
+
818
  [[package]]
819
  name = "mdurl"
820
  version = "0.1.2"
 
1040
  version = "9.1.0.70"
1041
  source = { registry = "https://pypi.org/simple" }
1042
  dependencies = [
1043
+ { name = "nvidia-cublas-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" },
1044
  ]
1045
  wheels = [
1046
  { url = "https://files.pythonhosted.org/packages/9f/fd/713452cd72343f682b1c7b9321e23829f00b842ceaedcda96e742ea0b0b3/nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f", size = 664752741, upload-time = "2024-04-22T15:24:15.253Z" },
 
1051
  version = "11.2.1.3"
1052
  source = { registry = "https://pypi.org/simple" }
1053
  dependencies = [
1054
+ { name = "nvidia-nvjitlink-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" },
1055
  ]
1056
  wheels = [
1057
  { url = "https://files.pythonhosted.org/packages/27/94/3266821f65b92b3138631e9c8e7fe1fb513804ac934485a8d05776e1dd43/nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f083fc24912aa410be21fa16d157fed2055dab1cc4b6934a0e03cba69eb242b9", size = 211459117, upload-time = "2024-04-03T20:57:40.402Z" },
 
1070
  version = "11.6.1.9"
1071
  source = { registry = "https://pypi.org/simple" }
1072
  dependencies = [
1073
+ { name = "nvidia-cublas-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" },
1074
+ { name = "nvidia-cusparse-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" },
1075
+ { name = "nvidia-nvjitlink-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" },
1076
  ]
1077
  wheels = [
1078
  { url = "https://files.pythonhosted.org/packages/3a/e1/5b9089a4b2a4790dfdea8b3a006052cfecff58139d5a4e34cb1a51df8d6f/nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl", hash = "sha256:19e33fa442bcfd085b3086c4ebf7e8debc07cfe01e11513cc6d332fd918ac260", size = 127936057, upload-time = "2024-04-03T20:58:28.735Z" },
 
1083
  version = "12.3.1.170"
1084
  source = { registry = "https://pypi.org/simple" }
1085
  dependencies = [
1086
+ { name = "nvidia-nvjitlink-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" },
1087
  ]
1088
  wheels = [
1089
  { url = "https://files.pythonhosted.org/packages/db/f7/97a9ea26ed4bbbfc2d470994b8b4f338ef663be97b8f677519ac195e113d/nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ea4f11a2904e2a8dc4b1833cc1b5181cde564edd0d5cd33e3c168eff2d1863f1", size = 207454763, upload-time = "2024-04-03T20:58:59.995Z" },
 
1455
  { url = "https://files.pythonhosted.org/packages/32/56/8a7ca5d2cd2cda1d245d34b1c9a942920a718082ae8e54e5f3e5a58b7add/pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1", size = 2066757, upload-time = "2025-04-23T18:33:30.645Z" },
1456
  ]
1457
 
1458
+ [[package]]
1459
+ name = "pydantic-settings"
1460
+ version = "2.10.1"
1461
+ source = { registry = "https://pypi.org/simple" }
1462
+ dependencies = [
1463
+ { name = "pydantic" },
1464
+ { name = "python-dotenv" },
1465
+ { name = "typing-inspection" },
1466
+ ]
1467
+ sdist = { url = "https://files.pythonhosted.org/packages/68/85/1ea668bbab3c50071ca613c6ab30047fb36ab0da1b92fa8f17bbc38fd36c/pydantic_settings-2.10.1.tar.gz", hash = "sha256:06f0062169818d0f5524420a360d632d5857b83cffd4d42fe29597807a1614ee", size = 172583, upload-time = "2025-06-24T13:26:46.841Z" }
1468
+ wheels = [
1469
+ { url = "https://files.pythonhosted.org/packages/58/f0/427018098906416f580e3cf1366d3b1abfb408a0652e9f31600c24a1903c/pydantic_settings-2.10.1-py3-none-any.whl", hash = "sha256:a60952460b99cf661dc25c29c0ef171721f98bfcb52ef8d9ea4c943d7c8cc796", size = 45235, upload-time = "2025-06-24T13:26:45.485Z" },
1470
+ ]
1471
+
1472
  [[package]]
1473
  name = "pydub"
1474
  version = "0.25.1"
 
1508
  { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" },
1509
  ]
1510
 
1511
+ [[package]]
1512
+ name = "python-dotenv"
1513
+ version = "1.1.1"
1514
+ source = { registry = "https://pypi.org/simple" }
1515
+ sdist = { url = "https://files.pythonhosted.org/packages/f6/b0/4bc07ccd3572a2f9df7e6782f52b0c6c90dcbb803ac4a167702d7d0dfe1e/python_dotenv-1.1.1.tar.gz", hash = "sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab", size = 41978, upload-time = "2025-06-24T04:21:07.341Z" }
1516
+ wheels = [
1517
+ { url = "https://files.pythonhosted.org/packages/5f/ed/539768cf28c661b5b068d66d96a2f155c4971a5d55684a514c1a0e0dec2f/python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc", size = 20556, upload-time = "2025-06-24T04:21:06.073Z" },
1518
+ ]
1519
+
1520
  [[package]]
1521
  name = "python-multipart"
1522
  version = "0.0.20"
 
1918
  { url = "https://files.pythonhosted.org/packages/d1/fa/9a83c960be03e81a01e6d4b252b340b8b2dd2c1ac7cd9795621860a86e01/spaces-0.37.1-py3-none-any.whl", hash = "sha256:1579e5747613a7dc5c0842cd6409dd44c4d1e20bc30060b1d0c0a581be9e414f", size = 31373, upload-time = "2025-06-20T14:38:05.302Z" },
1919
  ]
1920
 
1921
+ [[package]]
1922
+ name = "sse-starlette"
1923
+ version = "2.3.6"
1924
+ source = { registry = "https://pypi.org/simple" }
1925
+ dependencies = [
1926
+ { name = "anyio" },
1927
+ ]
1928
+ sdist = { url = "https://files.pythonhosted.org/packages/8c/f4/989bc70cb8091eda43a9034ef969b25145291f3601703b82766e5172dfed/sse_starlette-2.3.6.tar.gz", hash = "sha256:0382336f7d4ec30160cf9ca0518962905e1b69b72d6c1c995131e0a703b436e3", size = 18284, upload-time = "2025-05-30T13:34:12.914Z" }
1929
+ wheels = [
1930
+ { url = "https://files.pythonhosted.org/packages/81/05/78850ac6e79af5b9508f8841b0f26aa9fd329a1ba00bf65453c2d312bcc8/sse_starlette-2.3.6-py3-none-any.whl", hash = "sha256:d49a8285b182f6e2228e2609c350398b2ca2c36216c2675d875f81e93548f760", size = 10606, upload-time = "2025-05-30T13:34:11.703Z" },
1931
+ ]
1932
+
1933
  [[package]]
1934
  name = "starlette"
1935
  version = "0.46.2"
 
2093
  version = "3.1.0"
2094
  source = { registry = "https://pypi.org/simple" }
2095
  dependencies = [
2096
+ { name = "filelock", marker = "(python_full_version < '3.13' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.13' and sys_platform != 'darwin' and sys_platform != 'linux')" },
2097
  ]
2098
  wheels = [
2099
  { url = "https://files.pythonhosted.org/packages/98/29/69aa56dc0b2eb2602b553881e34243475ea2afd9699be042316842788ff5/triton-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b0dd10a925263abbe9fa37dcde67a5e9b2383fc269fdf59f5657cac38c5d1d8", size = 209460013, upload-time = "2024-10-14T16:05:32.106Z" },
 
2175
  source = { virtual = "." }
2176
  dependencies = [
2177
  { name = "accelerate" },
2178
+ { name = "gradio", extra = ["mcp"] },
2179
  { name = "hf-transfer" },
2180
  { name = "setuptools" },
2181
  { name = "spaces" },
 
2187
  [package.metadata]
2188
  requires-dist = [
2189
  { name = "accelerate", specifier = ">=1.8.1" },
2190
+ { name = "gradio", extras = ["mcp"], specifier = ">=5.35.0" },
2191
  { name = "hf-transfer", specifier = ">=0.1.9" },
2192
  { name = "setuptools", specifier = ">=80.9.0" },
2193
  { name = "spaces", specifier = ">=0.37.1" },