santiagoahl commited on
Commit
a6ffc00
·
1 Parent(s): 5dfdf10

update gradio

Browse files
Files changed (5) hide show
  1. app.py +214 -0
  2. main.py +0 -0
  3. notebooks/tools_poc/web_search.ipynb +1 -1
  4. poetry.lock +303 -5
  5. pyproject.toml +1 -0
app.py CHANGED
@@ -0,0 +1,214 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import gradio as gr
3
+ import requests
4
+ import inspect
5
+ import pandas as pd
6
+ import sys
7
+ import asyncio
8
+
9
+
10
+ # Add local files
11
+ SRC_DIR = "src/"
12
+ AGENT_DIR = "src/agents"
13
+ TOOLS_DIR = "src/tools"
14
+ SYS_MSG_DIR = "prompts/agent"
15
+ sys.path.append(SRC_DIR)
16
+ sys.path.append(AGENT_DIR)
17
+ sys.path.append(TOOLS_DIR)
18
+ sys.path.append(SYS_MSG_DIR)
19
+
20
+ import tools
21
+ import react
22
+
23
+ # (Keep Constants as is)
24
+ # --- Constants ---
25
+ DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
26
+
27
+ # --- Basic Agent Definition ---
28
+ # ----- THIS IS WERE YOU CAN BUILD WHAT YOU WANT ------
29
+ class ReactAgent:
30
+ def __init__(self):
31
+ print("ReactAgent initialized.")
32
+ def __call__(self, question: str) -> str:
33
+ print(f"Agent received question (first 50 chars): {question[:50]}...")
34
+ agent_response = asyncio.run(
35
+ react.run_agent(user_query=question)
36
+ )
37
+ print(f"Agent returning fixed answer: {agent_response}")
38
+ return agent_response
39
+
40
+ def run_and_submit_all( profile: gr.OAuthProfile | None):
41
+ """
42
+ Fetches all questions, runs the ReactAgent on them, submits all answers,
43
+ and displays the results.
44
+ """
45
+ # --- Determine HF Space Runtime URL and Repo URL ---
46
+ space_id = os.getenv("SPACE_ID") # Get the SPACE_ID for sending link to the code
47
+
48
+ if profile:
49
+ username= f"{profile.username}"
50
+ print(f"User logged in: {username}")
51
+ else:
52
+ print("User not logged in.")
53
+ return "Please Login to Hugging Face with the button.", None
54
+
55
+ api_url = DEFAULT_API_URL
56
+ questions_url = f"{api_url}/questions"
57
+ submit_url = f"{api_url}/submit"
58
+
59
+ # 1. Instantiate Agent ( modify this part to create your agent)
60
+ try:
61
+ agent = ReactAgent()
62
+ except Exception as e:
63
+ print(f"Error instantiating agent: {e}")
64
+ return f"Error initializing agent: {e}", None
65
+ # In the case of an app running as a hugging Face space, this link points toward your codebase ( usefull for others so please keep it public)
66
+ agent_code = f"https://huggingface.co/spaces/{space_id}/tree/main"
67
+ print(agent_code)
68
+
69
+ # 2. Fetch Questions
70
+ print(f"Fetching questions from: {questions_url}")
71
+ try:
72
+ response = requests.get(questions_url, timeout=15)
73
+ response.raise_for_status()
74
+ questions_data = response.json()
75
+ if not questions_data:
76
+ print("Fetched questions list is empty.")
77
+ return "Fetched questions list is empty or invalid format.", None
78
+ print(f"Fetched {len(questions_data)} questions.")
79
+ except requests.exceptions.RequestException as e:
80
+ print(f"Error fetching questions: {e}")
81
+ return f"Error fetching questions: {e}", None
82
+ except requests.exceptions.JSONDecodeError as e:
83
+ print(f"Error decoding JSON response from questions endpoint: {e}")
84
+ print(f"Response text: {response.text[:500]}")
85
+ return f"Error decoding server response for questions: {e}", None
86
+ except Exception as e:
87
+ print(f"An unexpected error occurred fetching questions: {e}")
88
+ return f"An unexpected error occurred fetching questions: {e}", None
89
+
90
+ # 3. Run your Agent
91
+ results_log = []
92
+ answers_payload = []
93
+ print(f"Running agent on {len(questions_data)} questions...")
94
+ for item in questions_data:
95
+ task_id = item.get("task_id")
96
+ question_text = item.get("question")
97
+ if not task_id or question_text is None:
98
+ print(f"Skipping item with missing task_id or question: {item}")
99
+ continue
100
+ try:
101
+ submitted_answer = agent(question_text)
102
+ answers_payload.append({"task_id": task_id, "submitted_answer": submitted_answer})
103
+ results_log.append({"Task ID": task_id, "Question": question_text, "Submitted Answer": submitted_answer})
104
+ except Exception as e:
105
+ print(f"Error running agent on task {task_id}: {e}")
106
+ results_log.append({"Task ID": task_id, "Question": question_text, "Submitted Answer": f"AGENT ERROR: {e}"})
107
+
108
+ if not answers_payload:
109
+ print("Agent did not produce any answers to submit.")
110
+ return "Agent did not produce any answers to submit.", pd.DataFrame(results_log)
111
+
112
+ # 4. Prepare Submission
113
+ submission_data = {"username": username.strip(), "agent_code": agent_code, "answers": answers_payload}
114
+ status_update = f"Agent finished. Submitting {len(answers_payload)} answers for user '{username}'..."
115
+ print(status_update)
116
+
117
+ # 5. Submit
118
+ print(f"Submitting {len(answers_payload)} answers to: {submit_url}")
119
+ try:
120
+ response = requests.post(submit_url, json=submission_data, timeout=60)
121
+ response.raise_for_status()
122
+ result_data = response.json()
123
+ final_status = (
124
+ f"Submission Successful!\n"
125
+ f"User: {result_data.get('username')}\n"
126
+ f"Overall Score: {result_data.get('score', 'N/A')}% "
127
+ f"({result_data.get('correct_count', '?')}/{result_data.get('total_attempted', '?')} correct)\n"
128
+ f"Message: {result_data.get('message', 'No message received.')}"
129
+ )
130
+ print("Submission successful.")
131
+ results_df = pd.DataFrame(results_log)
132
+ return final_status, results_df
133
+ except requests.exceptions.HTTPError as e:
134
+ error_detail = f"Server responded with status {e.response.status_code}."
135
+ try:
136
+ error_json = e.response.json()
137
+ error_detail += f" Detail: {error_json.get('detail', e.response.text)}"
138
+ except requests.exceptions.JSONDecodeError:
139
+ error_detail += f" Response: {e.response.text[:500]}"
140
+ status_message = f"Submission Failed: {error_detail}"
141
+ print(status_message)
142
+ results_df = pd.DataFrame(results_log)
143
+ return status_message, results_df
144
+ except requests.exceptions.Timeout:
145
+ status_message = "Submission Failed: The request timed out."
146
+ print(status_message)
147
+ results_df = pd.DataFrame(results_log)
148
+ return status_message, results_df
149
+ except requests.exceptions.RequestException as e:
150
+ status_message = f"Submission Failed: Network error - {e}"
151
+ print(status_message)
152
+ results_df = pd.DataFrame(results_log)
153
+ return status_message, results_df
154
+ except Exception as e:
155
+ status_message = f"An unexpected error occurred during submission: {e}"
156
+ print(status_message)
157
+ results_df = pd.DataFrame(results_log)
158
+ return status_message, results_df
159
+
160
+
161
+ # --- Build Gradio Interface using Blocks ---
162
+ with gr.Blocks() as demo:
163
+ gr.Markdown("# Basic Agent Evaluation Runner")
164
+ gr.Markdown(
165
+ """
166
+ **Instructions:**
167
+
168
+ 1. Please clone this space, then modify the code to define your agent's logic, the tools, the necessary packages, etc ...
169
+ 2. Log in to your Hugging Face account using the button below. This uses your HF username for submission.
170
+ 3. Click 'Run Evaluation & Submit All Answers' to fetch questions, run your agent, submit answers, and see the score.
171
+
172
+ ---
173
+ **Disclaimers:**
174
+ Once clicking on the "submit button, it can take quite some time ( this is the time for the agent to go through all the questions).
175
+ This space provides a basic setup and is intentionally sub-optimal to encourage you to develop your own, more robust solution. For instance for the delay process of the submit button, a solution could be to cache the answers and submit in a seperate action or even to answer the questions in async.
176
+ """
177
+ )
178
+
179
+ gr.LoginButton()
180
+
181
+ run_button = gr.Button("Run Evaluation & Submit All Answers")
182
+
183
+ status_output = gr.Textbox(label="Run Status / Submission Result", lines=5, interactive=False)
184
+ # Removed max_rows=10 from DataFrame constructor
185
+ results_table = gr.DataFrame(label="Questions and Agent Answers", wrap=True)
186
+
187
+ run_button.click(
188
+ fn=run_and_submit_all,
189
+ outputs=[status_output, results_table]
190
+ )
191
+
192
+ if __name__ == "__main__":
193
+ print("\n" + "-"*30 + " App Starting " + "-"*30)
194
+ # Check for SPACE_HOST and SPACE_ID at startup for information
195
+ space_host_startup = os.getenv("SPACE_HOST")
196
+ space_id_startup = os.getenv("SPACE_ID") # Get SPACE_ID at startup
197
+
198
+ if space_host_startup:
199
+ print(f"✅ SPACE_HOST found: {space_host_startup}")
200
+ print(f" Runtime URL should be: https://{space_host_startup}.hf.space")
201
+ else:
202
+ print("ℹ️ SPACE_HOST environment variable not found (running locally?).")
203
+
204
+ if space_id_startup: # Print repo URLs if SPACE_ID is found
205
+ print(f"✅ SPACE_ID found: {space_id_startup}")
206
+ print(f" Repo URL: https://huggingface.co/spaces/{space_id_startup}")
207
+ print(f" Repo Tree URL: https://huggingface.co/spaces/{space_id_startup}/tree/main")
208
+ else:
209
+ print("ℹ️ SPACE_ID environment variable not found (running locally?). Repo URL cannot be determined.")
210
+
211
+ print("-"*(60 + len(" App Starting ")) + "\n")
212
+
213
+ print("Launching Gradio Interface for Basic Agent Evaluation...")
214
+ demo.launch(debug=True, share=False)
main.py DELETED
File without changes
notebooks/tools_poc/web_search.ipynb CHANGED
@@ -1178,7 +1178,7 @@
1178
  "metadata": {},
1179
  "outputs": [],
1180
  "source": [
1181
- "react.run_app(user_query=sample_yt_question + \". Just use the pull_youtube_video and the transcriber tools. Try to figure out the number of bird species from the transcript as those are mentioned\")"
1182
  ]
1183
  },
1184
  {
 
1178
  "metadata": {},
1179
  "outputs": [],
1180
  "source": [
1181
+ "react.run_agent(user_query=sample_yt_question + \". Just use the pull_youtube_video and the transcriber tools. Try to figure out the number of bird species from the transcript as those are mentioned\")"
1182
  ]
1183
  },
1184
  {
poetry.lock CHANGED
@@ -1109,6 +1109,26 @@ files = [
1109
  [package.extras]
1110
  tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"]
1111
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1112
  [[package]]
1113
  name = "ffmpeg"
1114
  version = "1.4"
@@ -1119,6 +1139,20 @@ files = [
1119
  {file = "ffmpeg-1.4.tar.gz", hash = "sha256:6931692c890ff21d39938433c2189747815dca0c60ddc7f9bb97f199dba0b5b9"},
1120
  ]
1121
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1122
  [[package]]
1123
  name = "filelock"
1124
  version = "3.18.0"
@@ -1413,6 +1447,70 @@ files = [
1413
  [package.dependencies]
1414
  six = "*"
1415
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1416
  [[package]]
1417
  name = "greenlet"
1418
  version = "3.2.3"
@@ -1480,6 +1578,20 @@ files = [
1480
  docs = ["Sphinx", "furo"]
1481
  test = ["objgraph", "psutil"]
1482
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1483
  [[package]]
1484
  name = "grpcio"
1485
  version = "1.73.1"
@@ -4840,6 +4952,17 @@ gcp-secret-manager = ["google-cloud-secret-manager (>=2.23.1)"]
4840
  toml = ["tomli (>=2.0.1)"]
4841
  yaml = ["pyyaml (>=6.0.1)"]
4842
 
 
 
 
 
 
 
 
 
 
 
 
4843
  [[package]]
4844
  name = "pyee"
4845
  version = "13.0.0"
@@ -5673,6 +5796,50 @@ pygments = ">=2.13.0,<3.0.0"
5673
  [package.extras]
5674
  jupyter = ["ipywidgets (>=7.5.1,<9)"]
5675
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5676
  [[package]]
5677
  name = "safetensors"
5678
  version = "0.5.3"
@@ -5813,6 +5980,21 @@ dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodest
5813
  doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.19.1)", "jupytext", "linkify-it-py", "matplotlib (>=3.5)", "myst-nb (>=1.2.0)", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.2.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"]
5814
  test = ["Cython", "array-api-strict (>=2.3.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"]
5815
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5816
  [[package]]
5817
  name = "setuptools"
5818
  version = "80.9.0"
@@ -5890,6 +6072,17 @@ numpy = ">=1.21"
5890
  docs = ["matplotlib", "numpydoc (==1.1.*)", "sphinx", "sphinx-book-theme", "sphinx-remove-toctrees"]
5891
  test = ["pytest", "pytest-cov", "scipy-doctest"]
5892
 
 
 
 
 
 
 
 
 
 
 
 
5893
  [[package]]
5894
  name = "six"
5895
  version = "1.17.0"
@@ -6058,18 +6251,17 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"]
6058
 
6059
  [[package]]
6060
  name = "starlette"
6061
- version = "0.47.1"
6062
  description = "The little ASGI library that shines."
6063
  optional = false
6064
  python-versions = ">=3.9"
6065
  files = [
6066
- {file = "starlette-0.47.1-py3-none-any.whl", hash = "sha256:5e11c9f5c7c3f24959edbf2dffdc01bba860228acf657129467d8a7468591527"},
6067
- {file = "starlette-0.47.1.tar.gz", hash = "sha256:aef012dd2b6be325ffa16698f9dc533614fb1cebd593a906b90dc1025529a79b"},
6068
  ]
6069
 
6070
  [package.dependencies]
6071
  anyio = ">=3.6.2,<5"
6072
- typing-extensions = {version = ">=4.10.0", markers = "python_version < \"3.13\""}
6073
 
6074
  [package.extras]
6075
  full = ["httpx (>=0.27.0,<0.29.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.18)", "pyyaml"]
@@ -6435,6 +6627,17 @@ dev = ["tokenizers[testing]"]
6435
  docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"]
6436
  testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"]
6437
 
 
 
 
 
 
 
 
 
 
 
 
6438
  [[package]]
6439
  name = "torch"
6440
  version = "2.7.1"
@@ -6736,6 +6939,23 @@ tls = ["idna (>=2.4)", "pyopenssl (>=21.0.0)", "service-identity (>=18.1.0)"]
6736
  websocket = ["wsproto"]
6737
  windows-platform = ["appdirs (>=1.4.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.1.3)", "bcrypt (>=3.1.3)", "cryptography (>=3.3)", "cryptography (>=3.3)", "cython-test-exception-raiser (>=1.0.2,<2)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.2,<5.0)", "h2 (>=3.2,<5.0)", "httpx[http2] (>=0.27)", "httpx[http2] (>=0.27)", "hypothesis (>=6.56)", "hypothesis (>=6.56)", "idna (>=2.4)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "priority (>=1.1.0,<2.0)", "pyhamcrest (>=2)", "pyhamcrest (>=2)", "pyopenssl (>=21.0.0)", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "pywin32 (!=226)", "pywin32 (!=226)", "pywin32 (!=226)", "service-identity (>=18.1.0)", "service-identity (>=18.1.0)", "twisted-iocpsupport (>=1.0.2)", "twisted-iocpsupport (>=1.0.2)", "wsproto", "wsproto"]
6738
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6739
  [[package]]
6740
  name = "typing-extensions"
6741
  version = "4.14.0"
@@ -7118,6 +7338,84 @@ files = [
7118
  {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"},
7119
  ]
7120
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7121
  [[package]]
7122
  name = "werkzeug"
7123
  version = "3.1.3"
@@ -7656,4 +7954,4 @@ cffi = ["cffi (>=1.11)"]
7656
  [metadata]
7657
  lock-version = "2.0"
7658
  python-versions = "3.11.13"
7659
- content-hash = "1dfc0a856745e4c25b1421e36ce61f3d06278b19b4b916787229c359cf6f2a40"
 
1109
  [package.extras]
1110
  tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"]
1111
 
1112
+ [[package]]
1113
+ name = "fastapi"
1114
+ version = "0.115.14"
1115
+ description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production"
1116
+ optional = false
1117
+ python-versions = ">=3.8"
1118
+ files = [
1119
+ {file = "fastapi-0.115.14-py3-none-any.whl", hash = "sha256:6c0c8bf9420bd58f565e585036d971872472b4f7d3f6c73b698e10cffdefb3ca"},
1120
+ {file = "fastapi-0.115.14.tar.gz", hash = "sha256:b1de15cdc1c499a4da47914db35d0e4ef8f1ce62b624e94e0e5824421df99739"},
1121
+ ]
1122
+
1123
+ [package.dependencies]
1124
+ pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0"
1125
+ starlette = ">=0.40.0,<0.47.0"
1126
+ typing-extensions = ">=4.8.0"
1127
+
1128
+ [package.extras]
1129
+ all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=3.1.5)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"]
1130
+ standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "jinja2 (>=3.1.5)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"]
1131
+
1132
  [[package]]
1133
  name = "ffmpeg"
1134
  version = "1.4"
 
1139
  {file = "ffmpeg-1.4.tar.gz", hash = "sha256:6931692c890ff21d39938433c2189747815dca0c60ddc7f9bb97f199dba0b5b9"},
1140
  ]
1141
 
1142
+ [[package]]
1143
+ name = "ffmpy"
1144
+ version = "0.6.0"
1145
+ description = "A simple Python wrapper for FFmpeg"
1146
+ optional = false
1147
+ python-versions = ">=3.9"
1148
+ files = [
1149
+ {file = "ffmpy-0.6.0-py3-none-any.whl", hash = "sha256:c8369bf45f8bd5285ebad94c4a789a79e7af86eded74c1f8c36eccf57aaea58c"},
1150
+ {file = "ffmpy-0.6.0.tar.gz", hash = "sha256:332dd93198a162db61e527e866a04578d3713e577bfe68f2ed26ba9d09dbc948"},
1151
+ ]
1152
+
1153
+ [package.extras]
1154
+ psutil = ["psutil (>=5.8.0)"]
1155
+
1156
  [[package]]
1157
  name = "filelock"
1158
  version = "3.18.0"
 
1447
  [package.dependencies]
1448
  six = "*"
1449
 
1450
+ [[package]]
1451
+ name = "gradio"
1452
+ version = "5.35.0"
1453
+ description = "Python library for easily interacting with trained machine learning models"
1454
+ optional = false
1455
+ python-versions = ">=3.10"
1456
+ files = [
1457
+ {file = "gradio-5.35.0-py3-none-any.whl", hash = "sha256:781a80df25355861e44fd2819fac4ed43cf08ea77911570fb0682f6ae16b9c7c"},
1458
+ {file = "gradio-5.35.0.tar.gz", hash = "sha256:f3e68ab02cfe0d9f364068883c8caf30b5b6fb62c10a19ccea3583a0c2e50acd"},
1459
+ ]
1460
+
1461
+ [package.dependencies]
1462
+ aiofiles = ">=22.0,<25.0"
1463
+ anyio = ">=3.0,<5.0"
1464
+ fastapi = ">=0.115.2,<1.0"
1465
+ ffmpy = "*"
1466
+ gradio-client = "1.10.4"
1467
+ groovy = ">=0.1,<1.0"
1468
+ httpx = ">=0.24.1"
1469
+ huggingface-hub = ">=0.28.1"
1470
+ jinja2 = "<4.0"
1471
+ markupsafe = ">=2.0,<4.0"
1472
+ numpy = ">=1.0,<3.0"
1473
+ orjson = ">=3.0,<4.0"
1474
+ packaging = "*"
1475
+ pandas = ">=1.0,<3.0"
1476
+ pillow = ">=8.0,<12.0"
1477
+ pydantic = ">=2.0,<2.12"
1478
+ pydub = "*"
1479
+ python-multipart = ">=0.0.18"
1480
+ pyyaml = ">=5.0,<7.0"
1481
+ ruff = {version = ">=0.9.3", markers = "sys_platform != \"emscripten\""}
1482
+ safehttpx = ">=0.1.6,<0.2.0"
1483
+ semantic-version = ">=2.0,<3.0"
1484
+ starlette = {version = ">=0.40.0,<1.0", markers = "sys_platform != \"emscripten\""}
1485
+ tomlkit = ">=0.12.0,<0.14.0"
1486
+ typer = {version = ">=0.12,<1.0", markers = "sys_platform != \"emscripten\""}
1487
+ typing-extensions = ">=4.0,<5.0"
1488
+ urllib3 = {version = ">=2.0,<3.0", markers = "sys_platform == \"emscripten\""}
1489
+ uvicorn = {version = ">=0.14.0", markers = "sys_platform != \"emscripten\""}
1490
+
1491
+ [package.extras]
1492
+ mcp = ["mcp (==1.9.3)", "pydantic (>=2.11)"]
1493
+ oauth = ["authlib", "itsdangerous"]
1494
+
1495
+ [[package]]
1496
+ name = "gradio-client"
1497
+ version = "1.10.4"
1498
+ description = "Python library for easily interacting with trained machine learning models"
1499
+ optional = false
1500
+ python-versions = ">=3.10"
1501
+ files = [
1502
+ {file = "gradio_client-1.10.4-py3-none-any.whl", hash = "sha256:271018368f4f0a2d2dfb943bbd495277518172be50e44f54d99c62fa5533ae09"},
1503
+ {file = "gradio_client-1.10.4.tar.gz", hash = "sha256:5dd0ff615f859b8d9fd3ce88555278e3d48bb6ffef79eb956a01e132edbcc1b0"},
1504
+ ]
1505
+
1506
+ [package.dependencies]
1507
+ fsspec = "*"
1508
+ httpx = ">=0.24.1"
1509
+ huggingface-hub = ">=0.19.3"
1510
+ packaging = "*"
1511
+ typing-extensions = ">=4.0,<5.0"
1512
+ websockets = ">=10.0,<16.0"
1513
+
1514
  [[package]]
1515
  name = "greenlet"
1516
  version = "3.2.3"
 
1578
  docs = ["Sphinx", "furo"]
1579
  test = ["objgraph", "psutil"]
1580
 
1581
+ [[package]]
1582
+ name = "groovy"
1583
+ version = "0.1.2"
1584
+ description = "A small Python library created to help developers protect their applications from Server Side Request Forgery (SSRF) attacks."
1585
+ optional = false
1586
+ python-versions = ">3.9"
1587
+ files = [
1588
+ {file = "groovy-0.1.2-py3-none-any.whl", hash = "sha256:7f7975bab18c729a257a8b1ae9dcd70b7cafb1720481beae47719af57c35fa64"},
1589
+ {file = "groovy-0.1.2.tar.gz", hash = "sha256:25c1dc09b3f9d7e292458aa762c6beb96ea037071bf5e917fc81fb78d2231083"},
1590
+ ]
1591
+
1592
+ [package.extras]
1593
+ dev = ["pytest", "ruff (==0.9.3)"]
1594
+
1595
  [[package]]
1596
  name = "grpcio"
1597
  version = "1.73.1"
 
4952
  toml = ["tomli (>=2.0.1)"]
4953
  yaml = ["pyyaml (>=6.0.1)"]
4954
 
4955
+ [[package]]
4956
+ name = "pydub"
4957
+ version = "0.25.1"
4958
+ description = "Manipulate audio with an simple and easy high level interface"
4959
+ optional = false
4960
+ python-versions = "*"
4961
+ files = [
4962
+ {file = "pydub-0.25.1-py2.py3-none-any.whl", hash = "sha256:65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6"},
4963
+ {file = "pydub-0.25.1.tar.gz", hash = "sha256:980a33ce9949cab2a569606b65674d748ecbca4f0796887fd6f46173a7b0d30f"},
4964
+ ]
4965
+
4966
  [[package]]
4967
  name = "pyee"
4968
  version = "13.0.0"
 
5796
  [package.extras]
5797
  jupyter = ["ipywidgets (>=7.5.1,<9)"]
5798
 
5799
+ [[package]]
5800
+ name = "ruff"
5801
+ version = "0.12.1"
5802
+ description = "An extremely fast Python linter and code formatter, written in Rust."
5803
+ optional = false
5804
+ python-versions = ">=3.7"
5805
+ files = [
5806
+ {file = "ruff-0.12.1-py3-none-linux_armv6l.whl", hash = "sha256:6013a46d865111e2edb71ad692fbb8262e6c172587a57c0669332a449384a36b"},
5807
+ {file = "ruff-0.12.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b3f75a19e03a4b0757d1412edb7f27cffb0c700365e9d6b60bc1b68d35bc89e0"},
5808
+ {file = "ruff-0.12.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:9a256522893cb7e92bb1e1153283927f842dea2e48619c803243dccc8437b8be"},
5809
+ {file = "ruff-0.12.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:069052605fe74c765a5b4272eb89880e0ff7a31e6c0dbf8767203c1fbd31c7ff"},
5810
+ {file = "ruff-0.12.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a684f125a4fec2d5a6501a466be3841113ba6847827be4573fddf8308b83477d"},
5811
+ {file = "ruff-0.12.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bdecdef753bf1e95797593007569d8e1697a54fca843d78f6862f7dc279e23bd"},
5812
+ {file = "ruff-0.12.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:70d52a058c0e7b88b602f575d23596e89bd7d8196437a4148381a3f73fcd5010"},
5813
+ {file = "ruff-0.12.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84d0a69d1e8d716dfeab22d8d5e7c786b73f2106429a933cee51d7b09f861d4e"},
5814
+ {file = "ruff-0.12.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6cc32e863adcf9e71690248607ccdf25252eeeab5193768e6873b901fd441fed"},
5815
+ {file = "ruff-0.12.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7fd49a4619f90d5afc65cf42e07b6ae98bb454fd5029d03b306bd9e2273d44cc"},
5816
+ {file = "ruff-0.12.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ed5af6aaaea20710e77698e2055b9ff9b3494891e1b24d26c07055459bb717e9"},
5817
+ {file = "ruff-0.12.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:801d626de15e6bf988fbe7ce59b303a914ff9c616d5866f8c79eb5012720ae13"},
5818
+ {file = "ruff-0.12.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:2be9d32a147f98a1972c1e4df9a6956d612ca5f5578536814372113d09a27a6c"},
5819
+ {file = "ruff-0.12.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:49b7ce354eed2a322fbaea80168c902de9504e6e174fd501e9447cad0232f9e6"},
5820
+ {file = "ruff-0.12.1-py3-none-win32.whl", hash = "sha256:d973fa626d4c8267848755bd0414211a456e99e125dcab147f24daa9e991a245"},
5821
+ {file = "ruff-0.12.1-py3-none-win_amd64.whl", hash = "sha256:9e1123b1c033f77bd2590e4c1fe7e8ea72ef990a85d2484351d408224d603013"},
5822
+ {file = "ruff-0.12.1-py3-none-win_arm64.whl", hash = "sha256:78ad09a022c64c13cc6077707f036bab0fac8cd7088772dcd1e5be21c5002efc"},
5823
+ {file = "ruff-0.12.1.tar.gz", hash = "sha256:806bbc17f1104fd57451a98a58df35388ee3ab422e029e8f5cf30aa4af2c138c"},
5824
+ ]
5825
+
5826
+ [[package]]
5827
+ name = "safehttpx"
5828
+ version = "0.1.6"
5829
+ description = "A small Python library created to help developers protect their applications from Server Side Request Forgery (SSRF) attacks."
5830
+ optional = false
5831
+ python-versions = ">3.9"
5832
+ files = [
5833
+ {file = "safehttpx-0.1.6-py3-none-any.whl", hash = "sha256:407cff0b410b071623087c63dd2080c3b44dc076888d8c5823c00d1e58cb381c"},
5834
+ {file = "safehttpx-0.1.6.tar.gz", hash = "sha256:b356bfc82cee3a24c395b94a2dbeabbed60aff1aa5fa3b5fe97c4f2456ebce42"},
5835
+ ]
5836
+
5837
+ [package.dependencies]
5838
+ httpx = "*"
5839
+
5840
+ [package.extras]
5841
+ dev = ["pytest"]
5842
+
5843
  [[package]]
5844
  name = "safetensors"
5845
  version = "0.5.3"
 
5980
  doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.19.1)", "jupytext", "linkify-it-py", "matplotlib (>=3.5)", "myst-nb (>=1.2.0)", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.2.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"]
5981
  test = ["Cython", "array-api-strict (>=2.3.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"]
5982
 
5983
+ [[package]]
5984
+ name = "semantic-version"
5985
+ version = "2.10.0"
5986
+ description = "A library implementing the 'SemVer' scheme."
5987
+ optional = false
5988
+ python-versions = ">=2.7"
5989
+ files = [
5990
+ {file = "semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177"},
5991
+ {file = "semantic_version-2.10.0.tar.gz", hash = "sha256:bdabb6d336998cbb378d4b9db3a4b56a1e3235701dc05ea2690d9a997ed5041c"},
5992
+ ]
5993
+
5994
+ [package.extras]
5995
+ dev = ["Django (>=1.11)", "check-manifest", "colorama (<=0.4.1)", "coverage", "flake8", "nose2", "readme-renderer (<25.0)", "tox", "wheel", "zest.releaser[recommended]"]
5996
+ doc = ["Sphinx", "sphinx-rtd-theme"]
5997
+
5998
  [[package]]
5999
  name = "setuptools"
6000
  version = "80.9.0"
 
6072
  docs = ["matplotlib", "numpydoc (==1.1.*)", "sphinx", "sphinx-book-theme", "sphinx-remove-toctrees"]
6073
  test = ["pytest", "pytest-cov", "scipy-doctest"]
6074
 
6075
+ [[package]]
6076
+ name = "shellingham"
6077
+ version = "1.5.4"
6078
+ description = "Tool to Detect Surrounding Shell"
6079
+ optional = false
6080
+ python-versions = ">=3.7"
6081
+ files = [
6082
+ {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"},
6083
+ {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"},
6084
+ ]
6085
+
6086
  [[package]]
6087
  name = "six"
6088
  version = "1.17.0"
 
6251
 
6252
  [[package]]
6253
  name = "starlette"
6254
+ version = "0.46.2"
6255
  description = "The little ASGI library that shines."
6256
  optional = false
6257
  python-versions = ">=3.9"
6258
  files = [
6259
+ {file = "starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35"},
6260
+ {file = "starlette-0.46.2.tar.gz", hash = "sha256:7f7361f34eed179294600af672f565727419830b54b7b084efe44bb82d2fccd5"},
6261
  ]
6262
 
6263
  [package.dependencies]
6264
  anyio = ">=3.6.2,<5"
 
6265
 
6266
  [package.extras]
6267
  full = ["httpx (>=0.27.0,<0.29.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.18)", "pyyaml"]
 
6627
  docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"]
6628
  testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"]
6629
 
6630
+ [[package]]
6631
+ name = "tomlkit"
6632
+ version = "0.13.3"
6633
+ description = "Style preserving TOML library"
6634
+ optional = false
6635
+ python-versions = ">=3.8"
6636
+ files = [
6637
+ {file = "tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0"},
6638
+ {file = "tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1"},
6639
+ ]
6640
+
6641
  [[package]]
6642
  name = "torch"
6643
  version = "2.7.1"
 
6939
  websocket = ["wsproto"]
6940
  windows-platform = ["appdirs (>=1.4.0)", "appdirs (>=1.4.0)", "bcrypt (>=3.1.3)", "bcrypt (>=3.1.3)", "cryptography (>=3.3)", "cryptography (>=3.3)", "cython-test-exception-raiser (>=1.0.2,<2)", "cython-test-exception-raiser (>=1.0.2,<2)", "h2 (>=3.2,<5.0)", "h2 (>=3.2,<5.0)", "httpx[http2] (>=0.27)", "httpx[http2] (>=0.27)", "hypothesis (>=6.56)", "hypothesis (>=6.56)", "idna (>=2.4)", "idna (>=2.4)", "priority (>=1.1.0,<2.0)", "priority (>=1.1.0,<2.0)", "pyhamcrest (>=2)", "pyhamcrest (>=2)", "pyopenssl (>=21.0.0)", "pyopenssl (>=21.0.0)", "pyserial (>=3.0)", "pyserial (>=3.0)", "pywin32 (!=226)", "pywin32 (!=226)", "pywin32 (!=226)", "pywin32 (!=226)", "service-identity (>=18.1.0)", "service-identity (>=18.1.0)", "twisted-iocpsupport (>=1.0.2)", "twisted-iocpsupport (>=1.0.2)", "wsproto", "wsproto"]
6941
 
6942
+ [[package]]
6943
+ name = "typer"
6944
+ version = "0.16.0"
6945
+ description = "Typer, build great CLIs. Easy to code. Based on Python type hints."
6946
+ optional = false
6947
+ python-versions = ">=3.7"
6948
+ files = [
6949
+ {file = "typer-0.16.0-py3-none-any.whl", hash = "sha256:1f79bed11d4d02d4310e3c1b7ba594183bcedb0ac73b27a9e5f28f6fb5b98855"},
6950
+ {file = "typer-0.16.0.tar.gz", hash = "sha256:af377ffaee1dbe37ae9440cb4e8f11686ea5ce4e9bae01b84ae7c63b87f1dd3b"},
6951
+ ]
6952
+
6953
+ [package.dependencies]
6954
+ click = ">=8.0.0"
6955
+ rich = ">=10.11.0"
6956
+ shellingham = ">=1.3.0"
6957
+ typing-extensions = ">=3.7.4.3"
6958
+
6959
  [[package]]
6960
  name = "typing-extensions"
6961
  version = "4.14.0"
 
7338
  {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"},
7339
  ]
7340
 
7341
+ [[package]]
7342
+ name = "websockets"
7343
+ version = "15.0.1"
7344
+ description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)"
7345
+ optional = false
7346
+ python-versions = ">=3.9"
7347
+ files = [
7348
+ {file = "websockets-15.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d63efaa0cd96cf0c5fe4d581521d9fa87744540d4bc999ae6e08595a1014b45b"},
7349
+ {file = "websockets-15.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac60e3b188ec7574cb761b08d50fcedf9d77f1530352db4eef1707fe9dee7205"},
7350
+ {file = "websockets-15.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5756779642579d902eed757b21b0164cd6fe338506a8083eb58af5c372e39d9a"},
7351
+ {file = "websockets-15.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fdfe3e2a29e4db3659dbd5bbf04560cea53dd9610273917799f1cde46aa725e"},
7352
+ {file = "websockets-15.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c2529b320eb9e35af0fa3016c187dffb84a3ecc572bcee7c3ce302bfeba52bf"},
7353
+ {file = "websockets-15.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac1e5c9054fe23226fb11e05a6e630837f074174c4c2f0fe442996112a6de4fb"},
7354
+ {file = "websockets-15.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5df592cd503496351d6dc14f7cdad49f268d8e618f80dce0cd5a36b93c3fc08d"},
7355
+ {file = "websockets-15.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0a34631031a8f05657e8e90903e656959234f3a04552259458aac0b0f9ae6fd9"},
7356
+ {file = "websockets-15.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3d00075aa65772e7ce9e990cab3ff1de702aa09be3940d1dc88d5abf1ab8a09c"},
7357
+ {file = "websockets-15.0.1-cp310-cp310-win32.whl", hash = "sha256:1234d4ef35db82f5446dca8e35a7da7964d02c127b095e172e54397fb6a6c256"},
7358
+ {file = "websockets-15.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:39c1fec2c11dc8d89bba6b2bf1556af381611a173ac2b511cf7231622058af41"},
7359
+ {file = "websockets-15.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:823c248b690b2fd9303ba00c4f66cd5e2d8c3ba4aa968b2779be9532a4dad431"},
7360
+ {file = "websockets-15.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678999709e68425ae2593acf2e3ebcbcf2e69885a5ee78f9eb80e6e371f1bf57"},
7361
+ {file = "websockets-15.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d50fd1ee42388dcfb2b3676132c78116490976f1300da28eb629272d5d93e905"},
7362
+ {file = "websockets-15.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d99e5546bf73dbad5bf3547174cd6cb8ba7273062a23808ffea025ecb1cf8562"},
7363
+ {file = "websockets-15.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66dd88c918e3287efc22409d426c8f729688d89a0c587c88971a0faa2c2f3792"},
7364
+ {file = "websockets-15.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8dd8327c795b3e3f219760fa603dcae1dcc148172290a8ab15158cf85a953413"},
7365
+ {file = "websockets-15.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fdc51055e6ff4adeb88d58a11042ec9a5eae317a0a53d12c062c8a8865909e8"},
7366
+ {file = "websockets-15.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:693f0192126df6c2327cce3baa7c06f2a117575e32ab2308f7f8216c29d9e2e3"},
7367
+ {file = "websockets-15.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54479983bd5fb469c38f2f5c7e3a24f9a4e70594cd68cd1fa6b9340dadaff7cf"},
7368
+ {file = "websockets-15.0.1-cp311-cp311-win32.whl", hash = "sha256:16b6c1b3e57799b9d38427dda63edcbe4926352c47cf88588c0be4ace18dac85"},
7369
+ {file = "websockets-15.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:27ccee0071a0e75d22cb35849b1db43f2ecd3e161041ac1ee9d2352ddf72f065"},
7370
+ {file = "websockets-15.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3"},
7371
+ {file = "websockets-15.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:592f1a9fe869c778694f0aa806ba0374e97648ab57936f092fd9d87f8bc03665"},
7372
+ {file = "websockets-15.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2"},
7373
+ {file = "websockets-15.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215"},
7374
+ {file = "websockets-15.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0af68c55afbd5f07986df82831c7bff04846928ea8d1fd7f30052638788bc9b5"},
7375
+ {file = "websockets-15.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dee438fed052b52e4f98f76c5790513235efaa1ef7f3f2192c392cd7c91b65"},
7376
+ {file = "websockets-15.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d5f6b181bb38171a8ad1d6aa58a67a6aa9d4b38d0f8c5f496b9e42561dfc62fe"},
7377
+ {file = "websockets-15.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5d54b09eba2bada6011aea5375542a157637b91029687eb4fdb2dab11059c1b4"},
7378
+ {file = "websockets-15.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597"},
7379
+ {file = "websockets-15.0.1-cp312-cp312-win32.whl", hash = "sha256:c338ffa0520bdb12fbc527265235639fb76e7bc7faafbb93f6ba80d9c06578a9"},
7380
+ {file = "websockets-15.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcd5cf9e305d7b8338754470cf69cf81f420459dbae8a3b40cee57417f4614a7"},
7381
+ {file = "websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931"},
7382
+ {file = "websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675"},
7383
+ {file = "websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151"},
7384
+ {file = "websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22"},
7385
+ {file = "websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f"},
7386
+ {file = "websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8"},
7387
+ {file = "websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375"},
7388
+ {file = "websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d"},
7389
+ {file = "websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4"},
7390
+ {file = "websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa"},
7391
+ {file = "websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561"},
7392
+ {file = "websockets-15.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5f4c04ead5aed67c8a1a20491d54cdfba5884507a48dd798ecaf13c74c4489f5"},
7393
+ {file = "websockets-15.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abdc0c6c8c648b4805c5eacd131910d2a7f6455dfd3becab248ef108e89ab16a"},
7394
+ {file = "websockets-15.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a625e06551975f4b7ea7102bc43895b90742746797e2e14b70ed61c43a90f09b"},
7395
+ {file = "websockets-15.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d591f8de75824cbb7acad4e05d2d710484f15f29d4a915092675ad3456f11770"},
7396
+ {file = "websockets-15.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47819cea040f31d670cc8d324bb6435c6f133b8c7a19ec3d61634e62f8d8f9eb"},
7397
+ {file = "websockets-15.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac017dd64572e5c3bd01939121e4d16cf30e5d7e110a119399cf3133b63ad054"},
7398
+ {file = "websockets-15.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4a9fac8e469d04ce6c25bb2610dc535235bd4aa14996b4e6dbebf5e007eba5ee"},
7399
+ {file = "websockets-15.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363c6f671b761efcb30608d24925a382497c12c506b51661883c3e22337265ed"},
7400
+ {file = "websockets-15.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2034693ad3097d5355bfdacfffcbd3ef5694f9718ab7f29c29689a9eae841880"},
7401
+ {file = "websockets-15.0.1-cp39-cp39-win32.whl", hash = "sha256:3b1ac0d3e594bf121308112697cf4b32be538fb1444468fb0a6ae4feebc83411"},
7402
+ {file = "websockets-15.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:b7643a03db5c95c799b89b31c036d5f27eeb4d259c798e878d6937d71832b1e4"},
7403
+ {file = "websockets-15.0.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0c9e74d766f2818bb95f84c25be4dea09841ac0f734d1966f415e4edfc4ef1c3"},
7404
+ {file = "websockets-15.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1009ee0c7739c08a0cd59de430d6de452a55e42d6b522de7aa15e6f67db0b8e1"},
7405
+ {file = "websockets-15.0.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76d1f20b1c7a2fa82367e04982e708723ba0e7b8d43aa643d3dcd404d74f1475"},
7406
+ {file = "websockets-15.0.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f29d80eb9a9263b8d109135351caf568cc3f80b9928bccde535c235de55c22d9"},
7407
+ {file = "websockets-15.0.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b359ed09954d7c18bbc1680f380c7301f92c60bf924171629c5db97febb12f04"},
7408
+ {file = "websockets-15.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:cad21560da69f4ce7658ca2cb83138fb4cf695a2ba3e475e0559e05991aa8122"},
7409
+ {file = "websockets-15.0.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7f493881579c90fc262d9cdbaa05a6b54b3811c2f300766748db79f098db9940"},
7410
+ {file = "websockets-15.0.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:47b099e1f4fbc95b701b6e85768e1fcdaf1630f3cbe4765fa216596f12310e2e"},
7411
+ {file = "websockets-15.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67f2b6de947f8c757db2db9c71527933ad0019737ec374a8a6be9a956786aaf9"},
7412
+ {file = "websockets-15.0.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d08eb4c2b7d6c41da6ca0600c077e93f5adcfd979cd777d747e9ee624556da4b"},
7413
+ {file = "websockets-15.0.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b826973a4a2ae47ba357e4e82fa44a463b8f168e1ca775ac64521442b19e87f"},
7414
+ {file = "websockets-15.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:21c1fa28a6a7e3cbdc171c694398b6df4744613ce9b36b1a498e816787e28123"},
7415
+ {file = "websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f"},
7416
+ {file = "websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee"},
7417
+ ]
7418
+
7419
  [[package]]
7420
  name = "werkzeug"
7421
  version = "3.1.3"
 
7954
  [metadata]
7955
  lock-version = "2.0"
7956
  python-versions = "3.11.13"
7957
+ content-hash = "25d134a2d5337a7b074800f24776e939cf074e534d880e577b5e038e6a9e544e"
pyproject.toml CHANGED
@@ -54,6 +54,7 @@ unstructured-inference = "^1.0.5"
54
  pi-heif = "^0.22.0"
55
  pdfminer-six = "^20250506"
56
  unstructured = "^0.18.1"
 
57
 
58
  [tool.poetry.group.dev.dependencies]
59
  ipykernel = "^6.29.5"
 
54
  pi-heif = "^0.22.0"
55
  pdfminer-six = "^20250506"
56
  unstructured = "^0.18.1"
57
+ gradio = "5.35.0"
58
 
59
  [tool.poetry.group.dev.dependencies]
60
  ipykernel = "^6.29.5"