mahan_ym commited on
Commit
4c5de8f
·
1 Parent(s): d8cda25

Update README, add configuration for MCP servers, and enhance installation scripts

Browse files
Files changed (6) hide show
  1. README.md +26 -29
  2. claude_desktop_config.json +22 -0
  3. hf.sh +15 -1
  4. pyproject.toml +2 -1
  5. requirements.txt +1 -1
  6. uv.lock +80 -2
README.md CHANGED
@@ -4,18 +4,29 @@ emoji: 😻
4
  colorFrom: green
5
  colorTo: purple
6
  sdk: gradio
7
- sdk_version: 5.32.1
8
  app_file: src/app.py
9
  pinned: false
10
  license: apache-2.0
11
  short_description: 'Alfred of Images: An MCP server to handle your image edits.'
12
  ---
13
 
14
- ![Image Alfred](./src/assets/ImageAlfredIcon.png)
 
15
 
16
- # ImageAlfred
 
 
 
 
 
 
 
 
 
 
 
17
 
18
- ImageAlfred is an image Model Context Protocol (MCP) tool designed to streamline image processing workflows.
19
  <!-- It provides a user-friendly interface for interacting with image models, leveraging the power of Gradio for the frontend and Modal for scalable backend deployment. -->
20
 
21
  <!-- ## Features
@@ -25,10 +36,13 @@ ImageAlfred is an image Model Context Protocol (MCP) tool designed to streamline
25
  - Easily extendable for custom image models and workflows -->
26
 
27
  ## Maintainers
 
28
  [Mahan Yarmohammad (Mahan-ym)](https://www.mahan-ym.com/)
29
- [Saaed Saadatipour (Soodoo)](https://soodoo.me/)
 
30
 
31
  # Used Tools
 
32
  - [Gradio](https://www.gradio.app/): Serving user interface and MCP server
33
  - [lang-segment-anything](https://github.com/luca-medeiros/lang-segment-anything): Which uses [SAM](https://segment-anything.com/) and [Grounding Dino](https://github.com/IDEA-Research/GroundingDINO) under the hood to segment images.
34
  - [HuggingFace](https://huggingface.co/): Downloading SAM and using Space for hosting.
@@ -37,43 +51,26 @@ ImageAlfred is an image Model Context Protocol (MCP) tool designed to streamline
37
  ## Getting Started
38
 
39
  ### Prerequisites
40
- - Python 3.13+
 
41
  - [uv](https://github.com/astral-sh/uv) (a fast Python package installer and virtual environment manager)
42
 
43
  ### Installation
44
 
45
- 1. **Create a virtual environment using uv:**
46
-
47
- ```bash
48
- uv venv
49
- ```
50
-
51
- 2. **Activate the virtual environment:**
52
 
53
  ```bash
54
- source .venv/bin/activate
55
- ```
56
-
57
- 3. **Install dependencies:**
58
-
59
- ```bash
60
- uv sync
61
- ```
62
-
63
- 4. **Setup Modal**
64
-
65
- ```bash
66
- modal setup
67
  ```
68
 
69
  ### Running the App
70
 
 
 
71
  ```bash
72
- uv run src/app.py
73
  ```
74
 
75
- This will launch the Gradio interface for ImageAlfred.
76
-
77
  ## License
78
 
79
  This project is licensed under the terms of the LICENSE file in this repository.
 
4
  colorFrom: green
5
  colorTo: purple
6
  sdk: gradio
7
+ sdk_version: 5.33
8
  app_file: src/app.py
9
  pinned: false
10
  license: apache-2.0
11
  short_description: 'Alfred of Images: An MCP server to handle your image edits.'
12
  ---
13
 
14
+ <div align="center">
15
+ <img src="./src/assets/icons/ImageAlfredIcon.png" alt="ImageAlfred" width=200 height=200>
16
 
17
+ <h2>Image Alfred</h2>
18
+
19
+ ImageAlfred is an image Model Context Protocol (MCP) tool designed to streamline image processing workflows
20
+
21
+ <img alt="Python Version from PEP 621 TOML" src="https://img.shields.io/python/required-version-toml?tomlFilePath=https%3A%2F%2Fraw.githubusercontent.com%2Fmahan-ym%2FImageAlfred%2Fmain%2Fpyproject.toml">
22
+ <img src="https://badge.mcpx.dev?type=server" title="MCP Server"/>
23
+ <img alt="GitHub License" src="https://img.shields.io/github/license/mahan-ym/ImageAlfred">
24
+
25
+ <a href=https://huggingface.co> <img src="src/assets/icons/hf-logo.svg" alt="huggingface" height=40> </a>
26
+ <a href="https://www.python.org"><img src="src/assets/icons/python-logo-only.svg" alt="python" height=40></a>
27
+ <!-- <a href="https://www.gradio.app" heigh=40><img src="src/assets/icons/gradio-color.svg"></a> -->
28
+ </div>
29
 
 
30
  <!-- It provides a user-friendly interface for interacting with image models, leveraging the power of Gradio for the frontend and Modal for scalable backend deployment. -->
31
 
32
  <!-- ## Features
 
36
  - Easily extendable for custom image models and workflows -->
37
 
38
  ## Maintainers
39
+
40
  [Mahan Yarmohammad (Mahan-ym)](https://www.mahan-ym.com/)
41
+
42
+ [Soodoo | Saaed Saadatipour](https://soodoo.me/)
43
 
44
  # Used Tools
45
+
46
  - [Gradio](https://www.gradio.app/): Serving user interface and MCP server
47
  - [lang-segment-anything](https://github.com/luca-medeiros/lang-segment-anything): Which uses [SAM](https://segment-anything.com/) and [Grounding Dino](https://github.com/IDEA-Research/GroundingDINO) under the hood to segment images.
48
  - [HuggingFace](https://huggingface.co/): Downloading SAM and using Space for hosting.
 
51
  ## Getting Started
52
 
53
  ### Prerequisites
54
+
55
+ - Python 3.12+
56
  - [uv](https://github.com/astral-sh/uv) (a fast Python package installer and virtual environment manager)
57
 
58
  ### Installation
59
 
60
+ It will create virtual environment, activate it, install dependecies and setup modal
 
 
 
 
 
 
61
 
62
  ```bash
63
+ make install
 
 
 
 
 
 
 
 
 
 
 
 
64
  ```
65
 
66
  ### Running the App
67
 
68
+ This will launch the Gradio interface for ImageAlfred.
69
+
70
  ```bash
71
+ make run
72
  ```
73
 
 
 
74
  ## License
75
 
76
  This project is licensed under the terms of the LICENSE file in this repository.
claude_desktop_config.json ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "mcpServers": {
3
+ "Image Alfred": {
4
+ "command": "npx",
5
+ "args": [
6
+ "mcp-remote",
7
+ "https://agents-mcp-hackathon-imagealfred.hf.space/gradio_api/mcp/sse",
8
+ "--transport",
9
+ "sse-only"
10
+ ]
11
+ },
12
+ "local Image Alfred": {
13
+ "command": "npx",
14
+ "args": [
15
+ "mcp-remote",
16
+ "http://127.0.0.1:7860/gradio_api/mcp/sse",
17
+ "--transport",
18
+ "sse-only"
19
+ ]
20
+ }
21
+ }
22
+ }
hf.sh CHANGED
@@ -5,7 +5,6 @@ REPO_URL="https://github.com/mahan-ym/ImageAlfred"
5
  REPO_DIR="ImageAlfred"
6
  TEMP_DIR="./tmp"
7
  SRC_DIR="src"
8
- REQUIREMENTS_FILE="requirements.txt"
9
 
10
  echo "🚀 Starting Huggingface Space update script..."
11
 
@@ -32,6 +31,21 @@ if [ -d "$SRC_DIR" ]; then
32
  fi
33
  cp -r "$TEMP_DIR/$REPO_DIR/$SRC_DIR" .
34
  mv "$TEMP_DIR/$REPO_DIR/Makefile" .
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
 
36
  # Check if copy was successful
37
  if [ $? -eq 0 ]; then
 
5
  REPO_DIR="ImageAlfred"
6
  TEMP_DIR="./tmp"
7
  SRC_DIR="src"
 
8
 
9
  echo "🚀 Starting Huggingface Space update script..."
10
 
 
31
  fi
32
  cp -r "$TEMP_DIR/$REPO_DIR/$SRC_DIR" .
33
  mv "$TEMP_DIR/$REPO_DIR/Makefile" .
34
+ mv "$TEMP_DIR/$REPO_DIR/requirements.txt" .
35
+ mv "$TEMP_DIR/$REPO_DIR/pyproject.toml" .
36
+ mv "$TEMP_DIR/$REPO_DIR/uv.lock" .
37
+ mv "$TEMP_DIR/$REPO_DIR/claude_desktop_config.json" .
38
+ mv "$TEMP_DIR/$REPO_DIR/LICENSE" .
39
+
40
+ # Concatenate README files
41
+ echo "📄 Creating combined README file..."
42
+ if [ -f "$TEMP_DIR/$REPO_DIR/hf_readme.md" ] && [ -f "$TEMP_DIR/$REPO_DIR/README.md" ]; then
43
+ cat "$TEMP_DIR/$REPO_DIR/hf_readme.md" "$TEMP_DIR/$REPO_DIR/README.md" > README.md
44
+ echo "✅ Combined README created successfully!"
45
+ else
46
+ echo "⚠️ Could not find one or both README files for concatenation."
47
+ fi
48
+
49
 
50
  # Check if copy was successful
51
  if [ $? -eq 0 ]; then
pyproject.toml CHANGED
@@ -9,7 +9,6 @@ requires-python = ">=3.12"
9
 
10
  dependencies = [
11
  "gradio[mcp]>=5.32.1",
12
- "matplotlib>=3.10.3",
13
  "modal>=1.0.2",
14
  "numpy>=2.2.6",
15
  "pillow>=11.2.1",
@@ -18,8 +17,10 @@ dependencies = [
18
  [dependency-groups]
19
  dev = [
20
  "jupyterlab>=4.4.3",
 
21
  "opencv-contrib-python>=4.11.0.86",
22
  "ruff>=0.11.12",
 
23
  ]
24
 
25
  [tool.ruff]
 
9
 
10
  dependencies = [
11
  "gradio[mcp]>=5.32.1",
 
12
  "modal>=1.0.2",
13
  "numpy>=2.2.6",
14
  "pillow>=11.2.1",
 
17
  [dependency-groups]
18
  dev = [
19
  "jupyterlab>=4.4.3",
20
+ "matplotlib>=3.10.3",
21
  "opencv-contrib-python>=4.11.0.86",
22
  "ruff>=0.11.12",
23
+ "supervision>=0.25.1",
24
  ]
25
 
26
  [tool.ruff]
requirements.txt CHANGED
@@ -1,4 +1,4 @@
1
  gradio[mcp]
2
  modal
3
  numpy
4
- pillow
 
1
  gradio[mcp]
2
  modal
3
  numpy
4
+ pillow
uv.lock CHANGED
@@ -831,7 +831,6 @@ version = "0.1.0"
831
  source = { virtual = "." }
832
  dependencies = [
833
  { name = "gradio", extra = ["mcp"] },
834
- { name = "matplotlib" },
835
  { name = "modal" },
836
  { name = "numpy" },
837
  { name = "pillow" },
@@ -840,14 +839,15 @@ dependencies = [
840
  [package.dev-dependencies]
841
  dev = [
842
  { name = "jupyterlab" },
 
843
  { name = "opencv-contrib-python" },
844
  { name = "ruff" },
 
845
  ]
846
 
847
  [package.metadata]
848
  requires-dist = [
849
  { name = "gradio", extras = ["mcp"], specifier = ">=5.32.1" },
850
- { name = "matplotlib", specifier = ">=3.10.3" },
851
  { name = "modal", specifier = ">=1.0.2" },
852
  { name = "numpy", specifier = ">=2.2.6" },
853
  { name = "pillow", specifier = ">=11.2.1" },
@@ -856,8 +856,10 @@ requires-dist = [
856
  [package.metadata.requires-dev]
857
  dev = [
858
  { name = "jupyterlab", specifier = ">=4.4.3" },
 
859
  { name = "opencv-contrib-python", specifier = ">=4.11.0.86" },
860
  { name = "ruff", specifier = ">=0.11.12" },
 
861
  ]
862
 
863
  [[package]]
@@ -1568,6 +1570,23 @@ wheels = [
1568
  { url = "https://files.pythonhosted.org/packages/0d/c6/146487546adc4726f0be591a65b466973feaa58cc3db711087e802e940fb/opencv_contrib_python-4.11.0.86-cp37-abi3-win_amd64.whl", hash = "sha256:654758a9ae8ca9a75fca7b64b19163636534f0eedffe1e14c3d7218988625c8d", size = 46185163, upload-time = "2025-01-16T13:52:39.745Z" },
1569
  ]
1570
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1571
  [[package]]
1572
  name = "orjson"
1573
  version = "3.10.18"
@@ -2258,6 +2277,44 @@ wheels = [
2258
  { url = "https://files.pythonhosted.org/packages/4d/c0/1108ad9f01567f66b3154063605b350b69c3c9366732e09e45f9fd0d1deb/safehttpx-0.1.6-py3-none-any.whl", hash = "sha256:407cff0b410b071623087c63dd2080c3b44dc076888d8c5823c00d1e58cb381c", size = 8692, upload-time = "2024-12-02T18:44:08.555Z" },
2259
  ]
2260
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2261
  [[package]]
2262
  name = "semantic-version"
2263
  version = "2.10.0"
@@ -2371,6 +2428,27 @@ wheels = [
2371
  { url = "https://files.pythonhosted.org/packages/8b/0c/9d30a4ebeb6db2b25a841afbb80f6ef9a854fc3b41be131d249a977b4959/starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35", size = 72037, upload-time = "2025-04-13T13:56:16.21Z" },
2372
  ]
2373
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2374
  [[package]]
2375
  name = "synchronicity"
2376
  version = "0.9.12"
 
831
  source = { virtual = "." }
832
  dependencies = [
833
  { name = "gradio", extra = ["mcp"] },
 
834
  { name = "modal" },
835
  { name = "numpy" },
836
  { name = "pillow" },
 
839
  [package.dev-dependencies]
840
  dev = [
841
  { name = "jupyterlab" },
842
+ { name = "matplotlib" },
843
  { name = "opencv-contrib-python" },
844
  { name = "ruff" },
845
+ { name = "supervision" },
846
  ]
847
 
848
  [package.metadata]
849
  requires-dist = [
850
  { name = "gradio", extras = ["mcp"], specifier = ">=5.32.1" },
 
851
  { name = "modal", specifier = ">=1.0.2" },
852
  { name = "numpy", specifier = ">=2.2.6" },
853
  { name = "pillow", specifier = ">=11.2.1" },
 
856
  [package.metadata.requires-dev]
857
  dev = [
858
  { name = "jupyterlab", specifier = ">=4.4.3" },
859
+ { name = "matplotlib", specifier = ">=3.10.3" },
860
  { name = "opencv-contrib-python", specifier = ">=4.11.0.86" },
861
  { name = "ruff", specifier = ">=0.11.12" },
862
+ { name = "supervision", specifier = ">=0.25.1" },
863
  ]
864
 
865
  [[package]]
 
1570
  { url = "https://files.pythonhosted.org/packages/0d/c6/146487546adc4726f0be591a65b466973feaa58cc3db711087e802e940fb/opencv_contrib_python-4.11.0.86-cp37-abi3-win_amd64.whl", hash = "sha256:654758a9ae8ca9a75fca7b64b19163636534f0eedffe1e14c3d7218988625c8d", size = 46185163, upload-time = "2025-01-16T13:52:39.745Z" },
1571
  ]
1572
 
1573
+ [[package]]
1574
+ name = "opencv-python"
1575
+ version = "4.11.0.86"
1576
+ source = { registry = "https://pypi.org/simple" }
1577
+ dependencies = [
1578
+ { name = "numpy" },
1579
+ ]
1580
+ sdist = { url = "https://files.pythonhosted.org/packages/17/06/68c27a523103dad5837dc5b87e71285280c4f098c60e4fe8a8db6486ab09/opencv-python-4.11.0.86.tar.gz", hash = "sha256:03d60ccae62304860d232272e4a4fda93c39d595780cb40b161b310244b736a4", size = 95171956, upload-time = "2025-01-16T13:52:24.737Z" }
1581
+ wheels = [
1582
+ { url = "https://files.pythonhosted.org/packages/05/4d/53b30a2a3ac1f75f65a59eb29cf2ee7207ce64867db47036ad61743d5a23/opencv_python-4.11.0.86-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:432f67c223f1dc2824f5e73cdfcd9db0efc8710647d4e813012195dc9122a52a", size = 37326322, upload-time = "2025-01-16T13:52:25.887Z" },
1583
+ { url = "https://files.pythonhosted.org/packages/3b/84/0a67490741867eacdfa37bc18df96e08a9d579583b419010d7f3da8ff503/opencv_python-4.11.0.86-cp37-abi3-macosx_13_0_x86_64.whl", hash = "sha256:9d05ef13d23fe97f575153558653e2d6e87103995d54e6a35db3f282fe1f9c66", size = 56723197, upload-time = "2025-01-16T13:55:21.222Z" },
1584
+ { url = "https://files.pythonhosted.org/packages/f3/bd/29c126788da65c1fb2b5fb621b7fed0ed5f9122aa22a0868c5e2c15c6d23/opencv_python-4.11.0.86-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b92ae2c8852208817e6776ba1ea0d6b1e0a1b5431e971a2a0ddd2a8cc398202", size = 42230439, upload-time = "2025-01-16T13:51:35.822Z" },
1585
+ { url = "https://files.pythonhosted.org/packages/2c/8b/90eb44a40476fa0e71e05a0283947cfd74a5d36121a11d926ad6f3193cc4/opencv_python-4.11.0.86-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b02611523803495003bd87362db3e1d2a0454a6a63025dc6658a9830570aa0d", size = 62986597, upload-time = "2025-01-16T13:52:08.836Z" },
1586
+ { url = "https://files.pythonhosted.org/packages/fb/d7/1d5941a9dde095468b288d989ff6539dd69cd429dbf1b9e839013d21b6f0/opencv_python-4.11.0.86-cp37-abi3-win32.whl", hash = "sha256:810549cb2a4aedaa84ad9a1c92fbfdfc14090e2749cedf2c1589ad8359aa169b", size = 29384337, upload-time = "2025-01-16T13:52:13.549Z" },
1587
+ { url = "https://files.pythonhosted.org/packages/a4/7d/f1c30a92854540bf789e9cd5dde7ef49bbe63f855b85a2e6b3db8135c591/opencv_python-4.11.0.86-cp37-abi3-win_amd64.whl", hash = "sha256:085ad9b77c18853ea66283e98affefe2de8cc4c1f43eda4c100cf9b2721142ec", size = 39488044, upload-time = "2025-01-16T13:52:21.928Z" },
1588
+ ]
1589
+
1590
  [[package]]
1591
  name = "orjson"
1592
  version = "3.10.18"
 
2277
  { url = "https://files.pythonhosted.org/packages/4d/c0/1108ad9f01567f66b3154063605b350b69c3c9366732e09e45f9fd0d1deb/safehttpx-0.1.6-py3-none-any.whl", hash = "sha256:407cff0b410b071623087c63dd2080c3b44dc076888d8c5823c00d1e58cb381c", size = 8692, upload-time = "2024-12-02T18:44:08.555Z" },
2278
  ]
2279
 
2280
+ [[package]]
2281
+ name = "scipy"
2282
+ version = "1.15.3"
2283
+ source = { registry = "https://pypi.org/simple" }
2284
+ dependencies = [
2285
+ { name = "numpy" },
2286
+ ]
2287
+ sdist = { url = "https://files.pythonhosted.org/packages/0f/37/6964b830433e654ec7485e45a00fc9a27cf868d622838f6b6d9c5ec0d532/scipy-1.15.3.tar.gz", hash = "sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf", size = 59419214, upload-time = "2025-05-08T16:13:05.955Z" }
2288
+ wheels = [
2289
+ { url = "https://files.pythonhosted.org/packages/37/4b/683aa044c4162e10ed7a7ea30527f2cbd92e6999c10a8ed8edb253836e9c/scipy-1.15.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6ac6310fdbfb7aa6612408bd2f07295bcbd3fda00d2d702178434751fe48e019", size = 38766735, upload-time = "2025-05-08T16:06:06.471Z" },
2290
+ { url = "https://files.pythonhosted.org/packages/7b/7e/f30be3d03de07f25dc0ec926d1681fed5c732d759ac8f51079708c79e680/scipy-1.15.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:185cd3d6d05ca4b44a8f1595af87f9c372bb6acf9c808e99aa3e9aa03bd98cf6", size = 30173284, upload-time = "2025-05-08T16:06:11.686Z" },
2291
+ { url = "https://files.pythonhosted.org/packages/07/9c/0ddb0d0abdabe0d181c1793db51f02cd59e4901da6f9f7848e1f96759f0d/scipy-1.15.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:05dc6abcd105e1a29f95eada46d4a3f251743cfd7d3ae8ddb4088047f24ea477", size = 22446958, upload-time = "2025-05-08T16:06:15.97Z" },
2292
+ { url = "https://files.pythonhosted.org/packages/af/43/0bce905a965f36c58ff80d8bea33f1f9351b05fad4beaad4eae34699b7a1/scipy-1.15.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:06efcba926324df1696931a57a176c80848ccd67ce6ad020c810736bfd58eb1c", size = 25242454, upload-time = "2025-05-08T16:06:20.394Z" },
2293
+ { url = "https://files.pythonhosted.org/packages/56/30/a6f08f84ee5b7b28b4c597aca4cbe545535c39fe911845a96414700b64ba/scipy-1.15.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05045d8b9bfd807ee1b9f38761993297b10b245f012b11b13b91ba8945f7e45", size = 35210199, upload-time = "2025-05-08T16:06:26.159Z" },
2294
+ { url = "https://files.pythonhosted.org/packages/0b/1f/03f52c282437a168ee2c7c14a1a0d0781a9a4a8962d84ac05c06b4c5b555/scipy-1.15.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271e3713e645149ea5ea3e97b57fdab61ce61333f97cfae392c28ba786f9bb49", size = 37309455, upload-time = "2025-05-08T16:06:32.778Z" },
2295
+ { url = "https://files.pythonhosted.org/packages/89/b1/fbb53137f42c4bf630b1ffdfc2151a62d1d1b903b249f030d2b1c0280af8/scipy-1.15.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6cfd56fc1a8e53f6e89ba3a7a7251f7396412d655bca2aa5611c8ec9a6784a1e", size = 36885140, upload-time = "2025-05-08T16:06:39.249Z" },
2296
+ { url = "https://files.pythonhosted.org/packages/2e/2e/025e39e339f5090df1ff266d021892694dbb7e63568edcfe43f892fa381d/scipy-1.15.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ff17c0bb1cb32952c09217d8d1eed9b53d1463e5f1dd6052c7857f83127d539", size = 39710549, upload-time = "2025-05-08T16:06:45.729Z" },
2297
+ { url = "https://files.pythonhosted.org/packages/e6/eb/3bf6ea8ab7f1503dca3a10df2e4b9c3f6b3316df07f6c0ded94b281c7101/scipy-1.15.3-cp312-cp312-win_amd64.whl", hash = "sha256:52092bc0472cfd17df49ff17e70624345efece4e1a12b23783a1ac59a1b728ed", size = 40966184, upload-time = "2025-05-08T16:06:52.623Z" },
2298
+ { url = "https://files.pythonhosted.org/packages/73/18/ec27848c9baae6e0d6573eda6e01a602e5649ee72c27c3a8aad673ebecfd/scipy-1.15.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2c620736bcc334782e24d173c0fdbb7590a0a436d2fdf39310a8902505008759", size = 38728256, upload-time = "2025-05-08T16:06:58.696Z" },
2299
+ { url = "https://files.pythonhosted.org/packages/74/cd/1aef2184948728b4b6e21267d53b3339762c285a46a274ebb7863c9e4742/scipy-1.15.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:7e11270a000969409d37ed399585ee530b9ef6aa99d50c019de4cb01e8e54e62", size = 30109540, upload-time = "2025-05-08T16:07:04.209Z" },
2300
+ { url = "https://files.pythonhosted.org/packages/5b/d8/59e452c0a255ec352bd0a833537a3bc1bfb679944c4938ab375b0a6b3a3e/scipy-1.15.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8c9ed3ba2c8a2ce098163a9bdb26f891746d02136995df25227a20e71c396ebb", size = 22383115, upload-time = "2025-05-08T16:07:08.998Z" },
2301
+ { url = "https://files.pythonhosted.org/packages/08/f5/456f56bbbfccf696263b47095291040655e3cbaf05d063bdc7c7517f32ac/scipy-1.15.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:0bdd905264c0c9cfa74a4772cdb2070171790381a5c4d312c973382fc6eaf730", size = 25163884, upload-time = "2025-05-08T16:07:14.091Z" },
2302
+ { url = "https://files.pythonhosted.org/packages/a2/66/a9618b6a435a0f0c0b8a6d0a2efb32d4ec5a85f023c2b79d39512040355b/scipy-1.15.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79167bba085c31f38603e11a267d862957cbb3ce018d8b38f79ac043bc92d825", size = 35174018, upload-time = "2025-05-08T16:07:19.427Z" },
2303
+ { url = "https://files.pythonhosted.org/packages/b5/09/c5b6734a50ad4882432b6bb7c02baf757f5b2f256041da5df242e2d7e6b6/scipy-1.15.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9deabd6d547aee2c9a81dee6cc96c6d7e9a9b1953f74850c179f91fdc729cb7", size = 37269716, upload-time = "2025-05-08T16:07:25.712Z" },
2304
+ { url = "https://files.pythonhosted.org/packages/77/0a/eac00ff741f23bcabd352731ed9b8995a0a60ef57f5fd788d611d43d69a1/scipy-1.15.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dde4fc32993071ac0c7dd2d82569e544f0bdaff66269cb475e0f369adad13f11", size = 36872342, upload-time = "2025-05-08T16:07:31.468Z" },
2305
+ { url = "https://files.pythonhosted.org/packages/fe/54/4379be86dd74b6ad81551689107360d9a3e18f24d20767a2d5b9253a3f0a/scipy-1.15.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f77f853d584e72e874d87357ad70f44b437331507d1c311457bed8ed2b956126", size = 39670869, upload-time = "2025-05-08T16:07:38.002Z" },
2306
+ { url = "https://files.pythonhosted.org/packages/87/2e/892ad2862ba54f084ffe8cc4a22667eaf9c2bcec6d2bff1d15713c6c0703/scipy-1.15.3-cp313-cp313-win_amd64.whl", hash = "sha256:b90ab29d0c37ec9bf55424c064312930ca5f4bde15ee8619ee44e69319aab163", size = 40988851, upload-time = "2025-05-08T16:08:33.671Z" },
2307
+ { url = "https://files.pythonhosted.org/packages/1b/e9/7a879c137f7e55b30d75d90ce3eb468197646bc7b443ac036ae3fe109055/scipy-1.15.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3ac07623267feb3ae308487c260ac684b32ea35fd81e12845039952f558047b8", size = 38863011, upload-time = "2025-05-08T16:07:44.039Z" },
2308
+ { url = "https://files.pythonhosted.org/packages/51/d1/226a806bbd69f62ce5ef5f3ffadc35286e9fbc802f606a07eb83bf2359de/scipy-1.15.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:6487aa99c2a3d509a5227d9a5e889ff05830a06b2ce08ec30df6d79db5fcd5c5", size = 30266407, upload-time = "2025-05-08T16:07:49.891Z" },
2309
+ { url = "https://files.pythonhosted.org/packages/e5/9b/f32d1d6093ab9eeabbd839b0f7619c62e46cc4b7b6dbf05b6e615bbd4400/scipy-1.15.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:50f9e62461c95d933d5c5ef4a1f2ebf9a2b4e83b0db374cb3f1de104d935922e", size = 22540030, upload-time = "2025-05-08T16:07:54.121Z" },
2310
+ { url = "https://files.pythonhosted.org/packages/e7/29/c278f699b095c1a884f29fda126340fcc201461ee8bfea5c8bdb1c7c958b/scipy-1.15.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:14ed70039d182f411ffc74789a16df3835e05dc469b898233a245cdfd7f162cb", size = 25218709, upload-time = "2025-05-08T16:07:58.506Z" },
2311
+ { url = "https://files.pythonhosted.org/packages/24/18/9e5374b617aba742a990581373cd6b68a2945d65cc588482749ef2e64467/scipy-1.15.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a769105537aa07a69468a0eefcd121be52006db61cdd8cac8a0e68980bbb723", size = 34809045, upload-time = "2025-05-08T16:08:03.929Z" },
2312
+ { url = "https://files.pythonhosted.org/packages/e1/fe/9c4361e7ba2927074360856db6135ef4904d505e9b3afbbcb073c4008328/scipy-1.15.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db984639887e3dffb3928d118145ffe40eff2fa40cb241a306ec57c219ebbbb", size = 36703062, upload-time = "2025-05-08T16:08:09.558Z" },
2313
+ { url = "https://files.pythonhosted.org/packages/b7/8e/038ccfe29d272b30086b25a4960f757f97122cb2ec42e62b460d02fe98e9/scipy-1.15.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:40e54d5c7e7ebf1aa596c374c49fa3135f04648a0caabcb66c52884b943f02b4", size = 36393132, upload-time = "2025-05-08T16:08:15.34Z" },
2314
+ { url = "https://files.pythonhosted.org/packages/10/7e/5c12285452970be5bdbe8352c619250b97ebf7917d7a9a9e96b8a8140f17/scipy-1.15.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5e721fed53187e71d0ccf382b6bf977644c533e506c4d33c3fb24de89f5c3ed5", size = 38979503, upload-time = "2025-05-08T16:08:21.513Z" },
2315
+ { url = "https://files.pythonhosted.org/packages/81/06/0a5e5349474e1cbc5757975b21bd4fad0e72ebf138c5592f191646154e06/scipy-1.15.3-cp313-cp313t-win_amd64.whl", hash = "sha256:76ad1fb5f8752eabf0fa02e4cc0336b4e8f021e2d5f061ed37d6d264db35e3ca", size = 40308097, upload-time = "2025-05-08T16:08:27.627Z" },
2316
+ ]
2317
+
2318
  [[package]]
2319
  name = "semantic-version"
2320
  version = "2.10.0"
 
2428
  { url = "https://files.pythonhosted.org/packages/8b/0c/9d30a4ebeb6db2b25a841afbb80f6ef9a854fc3b41be131d249a977b4959/starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35", size = 72037, upload-time = "2025-04-13T13:56:16.21Z" },
2429
  ]
2430
 
2431
+ [[package]]
2432
+ name = "supervision"
2433
+ version = "0.25.1"
2434
+ source = { registry = "https://pypi.org/simple" }
2435
+ dependencies = [
2436
+ { name = "contourpy" },
2437
+ { name = "defusedxml" },
2438
+ { name = "matplotlib" },
2439
+ { name = "numpy" },
2440
+ { name = "opencv-python" },
2441
+ { name = "pillow" },
2442
+ { name = "pyyaml" },
2443
+ { name = "requests" },
2444
+ { name = "scipy" },
2445
+ { name = "tqdm" },
2446
+ ]
2447
+ sdist = { url = "https://files.pythonhosted.org/packages/4c/87/3daaa3aec1766f93d4c07d33f933a5ded0a6243a099b6b399b6268053bfe/supervision-0.25.1.tar.gz", hash = "sha256:61781b4abe4fa6ff95c58af6aec7dd3451a78e7e6a797e9ea2787f93771dd031", size = 146657, upload-time = "2024-12-13T13:12:10.64Z" }
2448
+ wheels = [
2449
+ { url = "https://files.pythonhosted.org/packages/c1/24/d3bcad7ece751166ed308c6deb7e7d02a62a7f5a6e01e61ff2787c538fb0/supervision-0.25.1-py3-none-any.whl", hash = "sha256:ebc015c22983bc64563beda75f5f529e465e4020b318da07948ce03148307a72", size = 181480, upload-time = "2024-12-13T13:12:08.1Z" },
2450
+ ]
2451
+
2452
  [[package]]
2453
  name = "synchronicity"
2454
  version = "0.9.12"