Golfn commited on
Commit
d7a9bc4
·
1 Parent(s): 13d452a

update dependency and cloned agent checker from huggingface

Browse files
Files changed (5) hide show
  1. .gitattributes +35 -0
  2. app.py +196 -0
  3. pdm.lock +341 -6
  4. pyproject.toml +1 -1
  5. requirements.txt +136 -0
.gitattributes ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
app.py ADDED
@@ -0,0 +1,196 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import gradio as gr
3
+ import requests
4
+ import inspect
5
+ import pandas as pd
6
+
7
+ # (Keep Constants as is)
8
+ # --- Constants ---
9
+ DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
10
+
11
+ # --- Basic Agent Definition ---
12
+ # ----- THIS IS WERE YOU CAN BUILD WHAT YOU WANT ------
13
+ class BasicAgent:
14
+ def __init__(self):
15
+ print("BasicAgent initialized.")
16
+ def __call__(self, question: str) -> str:
17
+ print(f"Agent received question (first 50 chars): {question[:50]}...")
18
+ fixed_answer = "This is a default answer."
19
+ print(f"Agent returning fixed answer: {fixed_answer}")
20
+ return fixed_answer
21
+
22
+ def run_and_submit_all( profile: gr.OAuthProfile | None):
23
+ """
24
+ Fetches all questions, runs the BasicAgent on them, submits all answers,
25
+ and displays the results.
26
+ """
27
+ # --- Determine HF Space Runtime URL and Repo URL ---
28
+ space_id = os.getenv("SPACE_ID") # Get the SPACE_ID for sending link to the code
29
+
30
+ if profile:
31
+ username= f"{profile.username}"
32
+ print(f"User logged in: {username}")
33
+ else:
34
+ print("User not logged in.")
35
+ return "Please Login to Hugging Face with the button.", None
36
+
37
+ api_url = DEFAULT_API_URL
38
+ questions_url = f"{api_url}/questions"
39
+ submit_url = f"{api_url}/submit"
40
+
41
+ # 1. Instantiate Agent ( modify this part to create your agent)
42
+ try:
43
+ agent = BasicAgent()
44
+ except Exception as e:
45
+ print(f"Error instantiating agent: {e}")
46
+ return f"Error initializing agent: {e}", None
47
+ # 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)
48
+ agent_code = f"https://huggingface.co/spaces/{space_id}/tree/main"
49
+ print(agent_code)
50
+
51
+ # 2. Fetch Questions
52
+ print(f"Fetching questions from: {questions_url}")
53
+ try:
54
+ response = requests.get(questions_url, timeout=15)
55
+ response.raise_for_status()
56
+ questions_data = response.json()
57
+ if not questions_data:
58
+ print("Fetched questions list is empty.")
59
+ return "Fetched questions list is empty or invalid format.", None
60
+ print(f"Fetched {len(questions_data)} questions.")
61
+ except requests.exceptions.RequestException as e:
62
+ print(f"Error fetching questions: {e}")
63
+ return f"Error fetching questions: {e}", None
64
+ except requests.exceptions.JSONDecodeError as e:
65
+ print(f"Error decoding JSON response from questions endpoint: {e}")
66
+ print(f"Response text: {response.text[:500]}")
67
+ return f"Error decoding server response for questions: {e}", None
68
+ except Exception as e:
69
+ print(f"An unexpected error occurred fetching questions: {e}")
70
+ return f"An unexpected error occurred fetching questions: {e}", None
71
+
72
+ # 3. Run your Agent
73
+ results_log = []
74
+ answers_payload = []
75
+ print(f"Running agent on {len(questions_data)} questions...")
76
+ for item in questions_data:
77
+ task_id = item.get("task_id")
78
+ question_text = item.get("question")
79
+ if not task_id or question_text is None:
80
+ print(f"Skipping item with missing task_id or question: {item}")
81
+ continue
82
+ try:
83
+ submitted_answer = agent(question_text)
84
+ answers_payload.append({"task_id": task_id, "submitted_answer": submitted_answer})
85
+ results_log.append({"Task ID": task_id, "Question": question_text, "Submitted Answer": submitted_answer})
86
+ except Exception as e:
87
+ print(f"Error running agent on task {task_id}: {e}")
88
+ results_log.append({"Task ID": task_id, "Question": question_text, "Submitted Answer": f"AGENT ERROR: {e}"})
89
+
90
+ if not answers_payload:
91
+ print("Agent did not produce any answers to submit.")
92
+ return "Agent did not produce any answers to submit.", pd.DataFrame(results_log)
93
+
94
+ # 4. Prepare Submission
95
+ submission_data = {"username": username.strip(), "agent_code": agent_code, "answers": answers_payload}
96
+ status_update = f"Agent finished. Submitting {len(answers_payload)} answers for user '{username}'..."
97
+ print(status_update)
98
+
99
+ # 5. Submit
100
+ print(f"Submitting {len(answers_payload)} answers to: {submit_url}")
101
+ try:
102
+ response = requests.post(submit_url, json=submission_data, timeout=60)
103
+ response.raise_for_status()
104
+ result_data = response.json()
105
+ final_status = (
106
+ f"Submission Successful!\n"
107
+ f"User: {result_data.get('username')}\n"
108
+ f"Overall Score: {result_data.get('score', 'N/A')}% "
109
+ f"({result_data.get('correct_count', '?')}/{result_data.get('total_attempted', '?')} correct)\n"
110
+ f"Message: {result_data.get('message', 'No message received.')}"
111
+ )
112
+ print("Submission successful.")
113
+ results_df = pd.DataFrame(results_log)
114
+ return final_status, results_df
115
+ except requests.exceptions.HTTPError as e:
116
+ error_detail = f"Server responded with status {e.response.status_code}."
117
+ try:
118
+ error_json = e.response.json()
119
+ error_detail += f" Detail: {error_json.get('detail', e.response.text)}"
120
+ except requests.exceptions.JSONDecodeError:
121
+ error_detail += f" Response: {e.response.text[:500]}"
122
+ status_message = f"Submission Failed: {error_detail}"
123
+ print(status_message)
124
+ results_df = pd.DataFrame(results_log)
125
+ return status_message, results_df
126
+ except requests.exceptions.Timeout:
127
+ status_message = "Submission Failed: The request timed out."
128
+ print(status_message)
129
+ results_df = pd.DataFrame(results_log)
130
+ return status_message, results_df
131
+ except requests.exceptions.RequestException as e:
132
+ status_message = f"Submission Failed: Network error - {e}"
133
+ print(status_message)
134
+ results_df = pd.DataFrame(results_log)
135
+ return status_message, results_df
136
+ except Exception as e:
137
+ status_message = f"An unexpected error occurred during submission: {e}"
138
+ print(status_message)
139
+ results_df = pd.DataFrame(results_log)
140
+ return status_message, results_df
141
+
142
+
143
+ # --- Build Gradio Interface using Blocks ---
144
+ with gr.Blocks() as demo:
145
+ gr.Markdown("# Basic Agent Evaluation Runner")
146
+ gr.Markdown(
147
+ """
148
+ **Instructions:**
149
+
150
+ 1. Please clone this space, then modify the code to define your agent's logic, the tools, the necessary packages, etc ...
151
+ 2. Log in to your Hugging Face account using the button below. This uses your HF username for submission.
152
+ 3. Click 'Run Evaluation & Submit All Answers' to fetch questions, run your agent, submit answers, and see the score.
153
+
154
+ ---
155
+ **Disclaimers:**
156
+ 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).
157
+ 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.
158
+ """
159
+ )
160
+
161
+ gr.LoginButton()
162
+
163
+ run_button = gr.Button("Run Evaluation & Submit All Answers")
164
+
165
+ status_output = gr.Textbox(label="Run Status / Submission Result", lines=5, interactive=False)
166
+ # Removed max_rows=10 from DataFrame constructor
167
+ results_table = gr.DataFrame(label="Questions and Agent Answers", wrap=True)
168
+
169
+ run_button.click(
170
+ fn=run_and_submit_all,
171
+ outputs=[status_output, results_table]
172
+ )
173
+
174
+ if __name__ == "__main__":
175
+ print("\n" + "-"*30 + " App Starting " + "-"*30)
176
+ # Check for SPACE_HOST and SPACE_ID at startup for information
177
+ space_host_startup = os.getenv("SPACE_HOST")
178
+ space_id_startup = os.getenv("SPACE_ID") # Get SPACE_ID at startup
179
+
180
+ if space_host_startup:
181
+ print(f"✅ SPACE_HOST found: {space_host_startup}")
182
+ print(f" Runtime URL should be: https://{space_host_startup}.hf.space")
183
+ else:
184
+ print("ℹ️ SPACE_HOST environment variable not found (running locally?).")
185
+
186
+ if space_id_startup: # Print repo URLs if SPACE_ID is found
187
+ print(f"✅ SPACE_ID found: {space_id_startup}")
188
+ print(f" Repo URL: https://huggingface.co/spaces/{space_id_startup}")
189
+ print(f" Repo Tree URL: https://huggingface.co/spaces/{space_id_startup}/tree/main")
190
+ else:
191
+ print("ℹ️ SPACE_ID environment variable not found (running locally?). Repo URL cannot be determined.")
192
+
193
+ print("-"*(60 + len(" App Starting ")) + "\n")
194
+
195
+ print("Launching Gradio Interface for Basic Agent Evaluation...")
196
+ demo.launch(debug=True, share=False)
pdm.lock CHANGED
@@ -5,11 +5,22 @@
5
  groups = ["default"]
6
  strategy = ["inherit_metadata"]
7
  lock_version = "4.5.0"
8
- content_hash = "sha256:da5747f1ee40700b81298a5464962761e4777d0a7790ba934a6c71bf4bb35d58"
9
 
10
  [[metadata.targets]]
11
  requires_python = "==3.12.*"
12
 
 
 
 
 
 
 
 
 
 
 
 
13
  [[package]]
14
  name = "aiohappyeyeballs"
15
  version = "2.6.1"
@@ -175,16 +186,17 @@ files = [
175
 
176
  [[package]]
177
  name = "click"
178
- version = "8.2.0"
179
- requires_python = ">=3.10"
180
  summary = "Composable command line interface toolkit"
181
  groups = ["default"]
182
  dependencies = [
183
  "colorama; platform_system == \"Windows\"",
 
184
  ]
185
  files = [
186
- {file = "click-8.2.0-py3-none-any.whl", hash = "sha256:6b303f0b2aa85f1cb4e5303078fadcbcd4e476f114fab9b5007005711839325c"},
187
- {file = "click-8.2.0.tar.gz", hash = "sha256:f5452aeddd9988eefa20f90f05ab66f17fce1ee2a36907fd30b05bbb5953814d"},
188
  ]
189
 
190
  [[package]]
@@ -290,6 +302,33 @@ files = [
290
  {file = "duckduckgo_search-8.0.2.tar.gz", hash = "sha256:3109a99967b29cab8862823bbe320d140d5c792415de851b9d6288de2311b3ec"},
291
  ]
292
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
293
  [[package]]
294
  name = "filelock"
295
  version = "3.18.0"
@@ -356,6 +395,67 @@ files = [
356
  {file = "fsspec-2025.3.0.tar.gz", hash = "sha256:a935fd1ea872591f2b5148907d103488fc523295e6c64b835cfad8c3eca44972"},
357
  ]
358
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
359
  [[package]]
360
  name = "greenlet"
361
  version = "3.2.2"
@@ -376,6 +476,17 @@ files = [
376
  {file = "greenlet-3.2.2.tar.gz", hash = "sha256:ad053d34421a2debba45aa3cc39acf454acbcd025b3fc1a9f8a0dee237abd485"},
377
  ]
378
 
 
 
 
 
 
 
 
 
 
 
 
379
  [[package]]
380
  name = "h11"
381
  version = "0.16.0"
@@ -762,6 +873,21 @@ files = [
762
  {file = "lxml-5.4.0.tar.gz", hash = "sha256:d12832e1dbea4be280b22fd0ea7c9b87f0d8fc51ba06e92dc62d52f804f78ebd"},
763
  ]
764
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
765
  [[package]]
766
  name = "markupsafe"
767
  version = "3.0.2"
@@ -796,6 +922,18 @@ files = [
796
  {file = "marshmallow-3.26.1.tar.gz", hash = "sha256:e6d8affb6cb61d39d26402096dc0aee12d5a26d490a121f118d2e81dc0719dc6"},
797
  ]
798
 
 
 
 
 
 
 
 
 
 
 
 
 
799
  [[package]]
800
  name = "mpmath"
801
  version = "1.3.0"
@@ -1127,7 +1265,6 @@ version = "3.10.18"
1127
  requires_python = ">=3.9"
1128
  summary = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy"
1129
  groups = ["default"]
1130
- marker = "platform_python_implementation != \"PyPy\" or python_version < \"4.0\""
1131
  files = [
1132
  {file = "orjson-3.10.18-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:50c15557afb7f6d63bc6d6348e0337a880a04eaa9cd7c9d569bcb4e760a24753"},
1133
  {file = "orjson-3.10.18-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:356b076f1662c9813d5fa56db7d63ccceef4c271b1fb3dd522aca291375fcf17"},
@@ -1358,6 +1495,28 @@ files = [
1358
  {file = "pydantic_settings-2.9.1.tar.gz", hash = "sha256:c509bf79d27563add44e8446233359004ed85066cd096d8b510f715e6ef5d268"},
1359
  ]
1360
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1361
  [[package]]
1362
  name = "python-dateutil"
1363
  version = "2.9.0.post0"
@@ -1383,6 +1542,17 @@ files = [
1383
  {file = "python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5"},
1384
  ]
1385
 
 
 
 
 
 
 
 
 
 
 
 
1386
  [[package]]
1387
  name = "pytz"
1388
  version = "2025.2"
@@ -1481,6 +1651,65 @@ files = [
1481
  {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"},
1482
  ]
1483
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1484
  [[package]]
1485
  name = "safetensors"
1486
  version = "0.5.3"
@@ -1548,6 +1777,17 @@ files = [
1548
  {file = "scipy-1.15.3.tar.gz", hash = "sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf"},
1549
  ]
1550
 
 
 
 
 
 
 
 
 
 
 
 
1551
  [[package]]
1552
  name = "sentence-transformers"
1553
  version = "4.1.0"
@@ -1581,6 +1821,18 @@ files = [
1581
  {file = "setuptools-80.7.1.tar.gz", hash = "sha256:f6ffc5f0142b1bd8d0ca94ee91b30c0ca862ffd50826da1ea85258a06fd94552"},
1582
  ]
1583
 
 
 
 
 
 
 
 
 
 
 
 
 
1584
  [[package]]
1585
  name = "six"
1586
  version = "1.17.0"
@@ -1627,6 +1879,21 @@ files = [
1627
  {file = "sqlalchemy-2.0.41.tar.gz", hash = "sha256:edba70118c4be3c2b1f90754d308d0b79c6fe2c0fdc52d8ddf603916f83f4db9"},
1628
  ]
1629
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1630
  [[package]]
1631
  name = "sympy"
1632
  version = "1.14.0"
@@ -1710,6 +1977,17 @@ files = [
1710
  {file = "tokenizers-0.21.1.tar.gz", hash = "sha256:a1bb04dc5b448985f86ecd4b05407f5a8d97cb2c0532199b2a302a604a0165ab"},
1711
  ]
1712
 
 
 
 
 
 
 
 
 
 
 
 
1713
  [[package]]
1714
  name = "torch"
1715
  version = "2.7.0"
@@ -1797,6 +2075,24 @@ files = [
1797
  {file = "triton-3.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b68c778f6c4218403a6bd01be7484f6dc9e20fe2083d22dd8aef33e3b87a10a3"},
1798
  ]
1799
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1800
  [[package]]
1801
  name = "typing-extensions"
1802
  version = "4.13.2"
@@ -1859,6 +2155,45 @@ files = [
1859
  {file = "urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466"},
1860
  ]
1861
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1862
  [[package]]
1863
  name = "xxhash"
1864
  version = "3.5.0"
 
5
  groups = ["default"]
6
  strategy = ["inherit_metadata"]
7
  lock_version = "4.5.0"
8
+ content_hash = "sha256:7d897c624862c0f5d78bd04991a5a3021c3254763618e02ec50e0e7c5d255944"
9
 
10
  [[metadata.targets]]
11
  requires_python = "==3.12.*"
12
 
13
+ [[package]]
14
+ name = "aiofiles"
15
+ version = "24.1.0"
16
+ requires_python = ">=3.8"
17
+ summary = "File support for asyncio."
18
+ groups = ["default"]
19
+ files = [
20
+ {file = "aiofiles-24.1.0-py3-none-any.whl", hash = "sha256:b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5"},
21
+ {file = "aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c"},
22
+ ]
23
+
24
  [[package]]
25
  name = "aiohappyeyeballs"
26
  version = "2.6.1"
 
186
 
187
  [[package]]
188
  name = "click"
189
+ version = "8.1.8"
190
+ requires_python = ">=3.7"
191
  summary = "Composable command line interface toolkit"
192
  groups = ["default"]
193
  dependencies = [
194
  "colorama; platform_system == \"Windows\"",
195
+ "importlib-metadata; python_version < \"3.8\"",
196
  ]
197
  files = [
198
+ {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"},
199
+ {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"},
200
  ]
201
 
202
  [[package]]
 
302
  {file = "duckduckgo_search-8.0.2.tar.gz", hash = "sha256:3109a99967b29cab8862823bbe320d140d5c792415de851b9d6288de2311b3ec"},
303
  ]
304
 
305
+ [[package]]
306
+ name = "fastapi"
307
+ version = "0.115.12"
308
+ requires_python = ">=3.8"
309
+ summary = "FastAPI framework, high performance, easy to learn, fast to code, ready for production"
310
+ groups = ["default"]
311
+ dependencies = [
312
+ "pydantic!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0,>=1.7.4",
313
+ "starlette<0.47.0,>=0.40.0",
314
+ "typing-extensions>=4.8.0",
315
+ ]
316
+ files = [
317
+ {file = "fastapi-0.115.12-py3-none-any.whl", hash = "sha256:e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d"},
318
+ {file = "fastapi-0.115.12.tar.gz", hash = "sha256:1e2c2a2646905f9e83d32f04a3f86aff4a286669c6c950ca95b5fd68c2602681"},
319
+ ]
320
+
321
+ [[package]]
322
+ name = "ffmpy"
323
+ version = "0.5.0"
324
+ requires_python = "<4.0,>=3.8"
325
+ summary = "A simple Python wrapper for FFmpeg"
326
+ groups = ["default"]
327
+ files = [
328
+ {file = "ffmpy-0.5.0-py3-none-any.whl", hash = "sha256:df3799cf5816daa56d4959a023630ee53c6768b66009dae6d131519ba4b80233"},
329
+ {file = "ffmpy-0.5.0.tar.gz", hash = "sha256:277e131f246d18e9dcfee9bb514c50749031c43582ce5ef82c57b51e3d3955c3"},
330
+ ]
331
+
332
  [[package]]
333
  name = "filelock"
334
  version = "3.18.0"
 
395
  {file = "fsspec-2025.3.0.tar.gz", hash = "sha256:a935fd1ea872591f2b5148907d103488fc523295e6c64b835cfad8c3eca44972"},
396
  ]
397
 
398
+ [[package]]
399
+ name = "gradio"
400
+ version = "5.29.1"
401
+ requires_python = ">=3.10"
402
+ summary = "Python library for easily interacting with trained machine learning models"
403
+ groups = ["default"]
404
+ dependencies = [
405
+ "aiofiles<25.0,>=22.0",
406
+ "anyio<5.0,>=3.0",
407
+ "audioop-lts<1.0; python_version >= \"3.13\"",
408
+ "fastapi<1.0,>=0.115.2",
409
+ "ffmpy",
410
+ "gradio-client==1.10.1",
411
+ "groovy~=0.1",
412
+ "httpx>=0.24.1",
413
+ "huggingface-hub>=0.28.1",
414
+ "jinja2<4.0",
415
+ "markupsafe<4.0,>=2.0",
416
+ "numpy<3.0,>=1.0",
417
+ "orjson~=3.0",
418
+ "packaging",
419
+ "pandas<3.0,>=1.0",
420
+ "pillow<12.0,>=8.0",
421
+ "pydantic<2.12,>=2.0",
422
+ "pydub",
423
+ "python-multipart>=0.0.18",
424
+ "pyyaml<7.0,>=5.0",
425
+ "ruff>=0.9.3; sys_platform != \"emscripten\"",
426
+ "safehttpx<0.2.0,>=0.1.6",
427
+ "semantic-version~=2.0",
428
+ "starlette<1.0,>=0.40.0; sys_platform != \"emscripten\"",
429
+ "tomlkit<0.14.0,>=0.12.0",
430
+ "typer<1.0,>=0.12; sys_platform != \"emscripten\"",
431
+ "typing-extensions~=4.0",
432
+ "urllib3~=2.0; sys_platform == \"emscripten\"",
433
+ "uvicorn>=0.14.0; sys_platform != \"emscripten\"",
434
+ ]
435
+ files = [
436
+ {file = "gradio-5.29.1-py3-none-any.whl", hash = "sha256:e6fb5e984c514a8a863feaa7a6d56a8c5ded16e14c301bb3716ebe2c1ca0556c"},
437
+ {file = "gradio-5.29.1.tar.gz", hash = "sha256:34a39d1d2d21e73f01912ec59d15a507d6501b158840ebf63696b5cff1a9d8a6"},
438
+ ]
439
+
440
+ [[package]]
441
+ name = "gradio-client"
442
+ version = "1.10.1"
443
+ requires_python = ">=3.10"
444
+ summary = "Python library for easily interacting with trained machine learning models"
445
+ groups = ["default"]
446
+ dependencies = [
447
+ "fsspec",
448
+ "httpx>=0.24.1",
449
+ "huggingface-hub>=0.19.3",
450
+ "packaging",
451
+ "typing-extensions~=4.0",
452
+ "websockets<16.0,>=10.0",
453
+ ]
454
+ files = [
455
+ {file = "gradio_client-1.10.1-py3-none-any.whl", hash = "sha256:fcff53f6aad3dfa9dd082adedb94256172d6b20666b1ef66480d82023e1907db"},
456
+ {file = "gradio_client-1.10.1.tar.gz", hash = "sha256:550662eae8dc0d06d44cb8d42be74f214db1e793ad4d789d7b7ecb42e82ca045"},
457
+ ]
458
+
459
  [[package]]
460
  name = "greenlet"
461
  version = "3.2.2"
 
476
  {file = "greenlet-3.2.2.tar.gz", hash = "sha256:ad053d34421a2debba45aa3cc39acf454acbcd025b3fc1a9f8a0dee237abd485"},
477
  ]
478
 
479
+ [[package]]
480
+ name = "groovy"
481
+ version = "0.1.2"
482
+ requires_python = ">3.9"
483
+ summary = "A small Python library created to help developers protect their applications from Server Side Request Forgery (SSRF) attacks."
484
+ groups = ["default"]
485
+ files = [
486
+ {file = "groovy-0.1.2-py3-none-any.whl", hash = "sha256:7f7975bab18c729a257a8b1ae9dcd70b7cafb1720481beae47719af57c35fa64"},
487
+ {file = "groovy-0.1.2.tar.gz", hash = "sha256:25c1dc09b3f9d7e292458aa762c6beb96ea037071bf5e917fc81fb78d2231083"},
488
+ ]
489
+
490
  [[package]]
491
  name = "h11"
492
  version = "0.16.0"
 
873
  {file = "lxml-5.4.0.tar.gz", hash = "sha256:d12832e1dbea4be280b22fd0ea7c9b87f0d8fc51ba06e92dc62d52f804f78ebd"},
874
  ]
875
 
876
+ [[package]]
877
+ name = "markdown-it-py"
878
+ version = "3.0.0"
879
+ requires_python = ">=3.8"
880
+ summary = "Python port of markdown-it. Markdown parsing, done right!"
881
+ groups = ["default"]
882
+ marker = "sys_platform != \"emscripten\""
883
+ dependencies = [
884
+ "mdurl~=0.1",
885
+ ]
886
+ files = [
887
+ {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"},
888
+ {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"},
889
+ ]
890
+
891
  [[package]]
892
  name = "markupsafe"
893
  version = "3.0.2"
 
922
  {file = "marshmallow-3.26.1.tar.gz", hash = "sha256:e6d8affb6cb61d39d26402096dc0aee12d5a26d490a121f118d2e81dc0719dc6"},
923
  ]
924
 
925
+ [[package]]
926
+ name = "mdurl"
927
+ version = "0.1.2"
928
+ requires_python = ">=3.7"
929
+ summary = "Markdown URL utilities"
930
+ groups = ["default"]
931
+ marker = "sys_platform != \"emscripten\""
932
+ files = [
933
+ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"},
934
+ {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"},
935
+ ]
936
+
937
  [[package]]
938
  name = "mpmath"
939
  version = "1.3.0"
 
1265
  requires_python = ">=3.9"
1266
  summary = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy"
1267
  groups = ["default"]
 
1268
  files = [
1269
  {file = "orjson-3.10.18-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:50c15557afb7f6d63bc6d6348e0337a880a04eaa9cd7c9d569bcb4e760a24753"},
1270
  {file = "orjson-3.10.18-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:356b076f1662c9813d5fa56db7d63ccceef4c271b1fb3dd522aca291375fcf17"},
 
1495
  {file = "pydantic_settings-2.9.1.tar.gz", hash = "sha256:c509bf79d27563add44e8446233359004ed85066cd096d8b510f715e6ef5d268"},
1496
  ]
1497
 
1498
+ [[package]]
1499
+ name = "pydub"
1500
+ version = "0.25.1"
1501
+ summary = "Manipulate audio with an simple and easy high level interface"
1502
+ groups = ["default"]
1503
+ files = [
1504
+ {file = "pydub-0.25.1-py2.py3-none-any.whl", hash = "sha256:65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6"},
1505
+ {file = "pydub-0.25.1.tar.gz", hash = "sha256:980a33ce9949cab2a569606b65674d748ecbca4f0796887fd6f46173a7b0d30f"},
1506
+ ]
1507
+
1508
+ [[package]]
1509
+ name = "pygments"
1510
+ version = "2.19.1"
1511
+ requires_python = ">=3.8"
1512
+ summary = "Pygments is a syntax highlighting package written in Python."
1513
+ groups = ["default"]
1514
+ marker = "sys_platform != \"emscripten\""
1515
+ files = [
1516
+ {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"},
1517
+ {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"},
1518
+ ]
1519
+
1520
  [[package]]
1521
  name = "python-dateutil"
1522
  version = "2.9.0.post0"
 
1542
  {file = "python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5"},
1543
  ]
1544
 
1545
+ [[package]]
1546
+ name = "python-multipart"
1547
+ version = "0.0.20"
1548
+ requires_python = ">=3.8"
1549
+ summary = "A streaming multipart parser for Python"
1550
+ groups = ["default"]
1551
+ files = [
1552
+ {file = "python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104"},
1553
+ {file = "python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13"},
1554
+ ]
1555
+
1556
  [[package]]
1557
  name = "pytz"
1558
  version = "2025.2"
 
1651
  {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"},
1652
  ]
1653
 
1654
+ [[package]]
1655
+ name = "rich"
1656
+ version = "14.0.0"
1657
+ requires_python = ">=3.8.0"
1658
+ summary = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal"
1659
+ groups = ["default"]
1660
+ marker = "sys_platform != \"emscripten\""
1661
+ dependencies = [
1662
+ "markdown-it-py>=2.2.0",
1663
+ "pygments<3.0.0,>=2.13.0",
1664
+ "typing-extensions<5.0,>=4.0.0; python_version < \"3.11\"",
1665
+ ]
1666
+ files = [
1667
+ {file = "rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0"},
1668
+ {file = "rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725"},
1669
+ ]
1670
+
1671
+ [[package]]
1672
+ name = "ruff"
1673
+ version = "0.11.10"
1674
+ requires_python = ">=3.7"
1675
+ summary = "An extremely fast Python linter and code formatter, written in Rust."
1676
+ groups = ["default"]
1677
+ marker = "sys_platform != \"emscripten\""
1678
+ files = [
1679
+ {file = "ruff-0.11.10-py3-none-linux_armv6l.whl", hash = "sha256:859a7bfa7bc8888abbea31ef8a2b411714e6a80f0d173c2a82f9041ed6b50f58"},
1680
+ {file = "ruff-0.11.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:968220a57e09ea5e4fd48ed1c646419961a0570727c7e069842edd018ee8afed"},
1681
+ {file = "ruff-0.11.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:1067245bad978e7aa7b22f67113ecc6eb241dca0d9b696144256c3a879663bca"},
1682
+ {file = "ruff-0.11.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4854fd09c7aed5b1590e996a81aeff0c9ff51378b084eb5a0b9cd9518e6cff2"},
1683
+ {file = "ruff-0.11.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8b4564e9f99168c0f9195a0fd5fa5928004b33b377137f978055e40008a082c5"},
1684
+ {file = "ruff-0.11.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b6a9cc5b62c03cc1fea0044ed8576379dbaf751d5503d718c973d5418483641"},
1685
+ {file = "ruff-0.11.10-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:607ecbb6f03e44c9e0a93aedacb17b4eb4f3563d00e8b474298a201622677947"},
1686
+ {file = "ruff-0.11.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7b3a522fa389402cd2137df9ddefe848f727250535c70dafa840badffb56b7a4"},
1687
+ {file = "ruff-0.11.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f071b0deed7e9245d5820dac235cbdd4ef99d7b12ff04c330a241ad3534319f"},
1688
+ {file = "ruff-0.11.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a60e3a0a617eafba1f2e4186d827759d65348fa53708ca547e384db28406a0b"},
1689
+ {file = "ruff-0.11.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:da8ec977eaa4b7bf75470fb575bea2cb41a0e07c7ea9d5a0a97d13dbca697bf2"},
1690
+ {file = "ruff-0.11.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:ddf8967e08227d1bd95cc0851ef80d2ad9c7c0c5aab1eba31db49cf0a7b99523"},
1691
+ {file = "ruff-0.11.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5a94acf798a82db188f6f36575d80609072b032105d114b0f98661e1679c9125"},
1692
+ {file = "ruff-0.11.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:3afead355f1d16d95630df28d4ba17fb2cb9c8dfac8d21ced14984121f639bad"},
1693
+ {file = "ruff-0.11.10-py3-none-win32.whl", hash = "sha256:dc061a98d32a97211af7e7f3fa1d4ca2fcf919fb96c28f39551f35fc55bdbc19"},
1694
+ {file = "ruff-0.11.10-py3-none-win_amd64.whl", hash = "sha256:5cc725fbb4d25b0f185cb42df07ab6b76c4489b4bfb740a175f3a59c70e8a224"},
1695
+ {file = "ruff-0.11.10-py3-none-win_arm64.whl", hash = "sha256:ef69637b35fb8b210743926778d0e45e1bffa850a7c61e428c6b971549b5f5d1"},
1696
+ {file = "ruff-0.11.10.tar.gz", hash = "sha256:d522fb204b4959909ecac47da02830daec102eeb100fb50ea9554818d47a5fa6"},
1697
+ ]
1698
+
1699
+ [[package]]
1700
+ name = "safehttpx"
1701
+ version = "0.1.6"
1702
+ requires_python = ">3.9"
1703
+ summary = "A small Python library created to help developers protect their applications from Server Side Request Forgery (SSRF) attacks."
1704
+ groups = ["default"]
1705
+ dependencies = [
1706
+ "httpx",
1707
+ ]
1708
+ files = [
1709
+ {file = "safehttpx-0.1.6-py3-none-any.whl", hash = "sha256:407cff0b410b071623087c63dd2080c3b44dc076888d8c5823c00d1e58cb381c"},
1710
+ {file = "safehttpx-0.1.6.tar.gz", hash = "sha256:b356bfc82cee3a24c395b94a2dbeabbed60aff1aa5fa3b5fe97c4f2456ebce42"},
1711
+ ]
1712
+
1713
  [[package]]
1714
  name = "safetensors"
1715
  version = "0.5.3"
 
1777
  {file = "scipy-1.15.3.tar.gz", hash = "sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf"},
1778
  ]
1779
 
1780
+ [[package]]
1781
+ name = "semantic-version"
1782
+ version = "2.10.0"
1783
+ requires_python = ">=2.7"
1784
+ summary = "A library implementing the 'SemVer' scheme."
1785
+ groups = ["default"]
1786
+ files = [
1787
+ {file = "semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177"},
1788
+ {file = "semantic_version-2.10.0.tar.gz", hash = "sha256:bdabb6d336998cbb378d4b9db3a4b56a1e3235701dc05ea2690d9a997ed5041c"},
1789
+ ]
1790
+
1791
  [[package]]
1792
  name = "sentence-transformers"
1793
  version = "4.1.0"
 
1821
  {file = "setuptools-80.7.1.tar.gz", hash = "sha256:f6ffc5f0142b1bd8d0ca94ee91b30c0ca862ffd50826da1ea85258a06fd94552"},
1822
  ]
1823
 
1824
+ [[package]]
1825
+ name = "shellingham"
1826
+ version = "1.5.4"
1827
+ requires_python = ">=3.7"
1828
+ summary = "Tool to Detect Surrounding Shell"
1829
+ groups = ["default"]
1830
+ marker = "sys_platform != \"emscripten\""
1831
+ files = [
1832
+ {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"},
1833
+ {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"},
1834
+ ]
1835
+
1836
  [[package]]
1837
  name = "six"
1838
  version = "1.17.0"
 
1879
  {file = "sqlalchemy-2.0.41.tar.gz", hash = "sha256:edba70118c4be3c2b1f90754d308d0b79c6fe2c0fdc52d8ddf603916f83f4db9"},
1880
  ]
1881
 
1882
+ [[package]]
1883
+ name = "starlette"
1884
+ version = "0.46.2"
1885
+ requires_python = ">=3.9"
1886
+ summary = "The little ASGI library that shines."
1887
+ groups = ["default"]
1888
+ dependencies = [
1889
+ "anyio<5,>=3.6.2",
1890
+ "typing-extensions>=3.10.0; python_version < \"3.10\"",
1891
+ ]
1892
+ files = [
1893
+ {file = "starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35"},
1894
+ {file = "starlette-0.46.2.tar.gz", hash = "sha256:7f7361f34eed179294600af672f565727419830b54b7b084efe44bb82d2fccd5"},
1895
+ ]
1896
+
1897
  [[package]]
1898
  name = "sympy"
1899
  version = "1.14.0"
 
1977
  {file = "tokenizers-0.21.1.tar.gz", hash = "sha256:a1bb04dc5b448985f86ecd4b05407f5a8d97cb2c0532199b2a302a604a0165ab"},
1978
  ]
1979
 
1980
+ [[package]]
1981
+ name = "tomlkit"
1982
+ version = "0.13.2"
1983
+ requires_python = ">=3.8"
1984
+ summary = "Style preserving TOML library"
1985
+ groups = ["default"]
1986
+ files = [
1987
+ {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"},
1988
+ {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"},
1989
+ ]
1990
+
1991
  [[package]]
1992
  name = "torch"
1993
  version = "2.7.0"
 
2075
  {file = "triton-3.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b68c778f6c4218403a6bd01be7484f6dc9e20fe2083d22dd8aef33e3b87a10a3"},
2076
  ]
2077
 
2078
+ [[package]]
2079
+ name = "typer"
2080
+ version = "0.15.4"
2081
+ requires_python = ">=3.7"
2082
+ summary = "Typer, build great CLIs. Easy to code. Based on Python type hints."
2083
+ groups = ["default"]
2084
+ marker = "sys_platform != \"emscripten\""
2085
+ dependencies = [
2086
+ "click<8.2,>=8.0.0",
2087
+ "rich>=10.11.0",
2088
+ "shellingham>=1.3.0",
2089
+ "typing-extensions>=3.7.4.3",
2090
+ ]
2091
+ files = [
2092
+ {file = "typer-0.15.4-py3-none-any.whl", hash = "sha256:eb0651654dcdea706780c466cf06d8f174405a659ffff8f163cfbfee98c0e173"},
2093
+ {file = "typer-0.15.4.tar.gz", hash = "sha256:89507b104f9b6a0730354f27c39fae5b63ccd0c95b1ce1f1a6ba0cfd329997c3"},
2094
+ ]
2095
+
2096
  [[package]]
2097
  name = "typing-extensions"
2098
  version = "4.13.2"
 
2155
  {file = "urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466"},
2156
  ]
2157
 
2158
+ [[package]]
2159
+ name = "uvicorn"
2160
+ version = "0.34.2"
2161
+ requires_python = ">=3.9"
2162
+ summary = "The lightning-fast ASGI server."
2163
+ groups = ["default"]
2164
+ marker = "sys_platform != \"emscripten\""
2165
+ dependencies = [
2166
+ "click>=7.0",
2167
+ "h11>=0.8",
2168
+ "typing-extensions>=4.0; python_version < \"3.11\"",
2169
+ ]
2170
+ files = [
2171
+ {file = "uvicorn-0.34.2-py3-none-any.whl", hash = "sha256:deb49af569084536d269fe0a6d67e3754f104cf03aba7c11c40f01aadf33c403"},
2172
+ {file = "uvicorn-0.34.2.tar.gz", hash = "sha256:0e929828f6186353a80b58ea719861d2629d766293b6d19baf086ba31d4f3328"},
2173
+ ]
2174
+
2175
+ [[package]]
2176
+ name = "websockets"
2177
+ version = "15.0.1"
2178
+ requires_python = ">=3.9"
2179
+ summary = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)"
2180
+ groups = ["default"]
2181
+ files = [
2182
+ {file = "websockets-15.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3"},
2183
+ {file = "websockets-15.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:592f1a9fe869c778694f0aa806ba0374e97648ab57936f092fd9d87f8bc03665"},
2184
+ {file = "websockets-15.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2"},
2185
+ {file = "websockets-15.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215"},
2186
+ {file = "websockets-15.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0af68c55afbd5f07986df82831c7bff04846928ea8d1fd7f30052638788bc9b5"},
2187
+ {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"},
2188
+ {file = "websockets-15.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d5f6b181bb38171a8ad1d6aa58a67a6aa9d4b38d0f8c5f496b9e42561dfc62fe"},
2189
+ {file = "websockets-15.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5d54b09eba2bada6011aea5375542a157637b91029687eb4fdb2dab11059c1b4"},
2190
+ {file = "websockets-15.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597"},
2191
+ {file = "websockets-15.0.1-cp312-cp312-win32.whl", hash = "sha256:c338ffa0520bdb12fbc527265235639fb76e7bc7faafbb93f6ba80d9c06578a9"},
2192
+ {file = "websockets-15.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcd5cf9e305d7b8338754470cf69cf81f420459dbae8a3b40cee57417f4614a7"},
2193
+ {file = "websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f"},
2194
+ {file = "websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee"},
2195
+ ]
2196
+
2197
  [[package]]
2198
  name = "xxhash"
2199
  version = "3.5.0"
pyproject.toml CHANGED
@@ -5,7 +5,7 @@ description = "Default template for PDM package"
5
  authors = [
6
  {name = "Supphawit_Golf", email = "supphawit.n@gmail.com"},
7
  ]
8
- dependencies = ["langchain>=0.3.25", "huggingface-hub>=0.31.2", "pandas>=2.2.3", "langgraph>=0.4.5", "langchain-openai>=0.3.17", "dotenv>=0.9.9", "datasets>=3.6.0", "langchain-community>=0.3.24", "rank-bm25>=0.2.2", "langchain-huggingface>=0.2.0", "duckduckgo-search>=8.0.2", "requests>=2.32.3"]
9
  requires-python = "==3.12.*"
10
  readme = "README.md"
11
  license = {text = "MIT"}
 
5
  authors = [
6
  {name = "Supphawit_Golf", email = "supphawit.n@gmail.com"},
7
  ]
8
+ dependencies = ["langchain>=0.3.25", "huggingface-hub>=0.31.2", "pandas>=2.2.3", "langgraph>=0.4.5", "langchain-openai>=0.3.17", "dotenv>=0.9.9", "datasets>=3.6.0", "langchain-community>=0.3.24", "rank-bm25>=0.2.2", "langchain-huggingface>=0.2.0", "duckduckgo-search>=8.0.2", "requests>=2.32.3", "gradio>=5.29.1"]
9
  requires-python = "==3.12.*"
10
  readme = "README.md"
11
  license = {text = "MIT"}
requirements.txt ADDED
@@ -0,0 +1,136 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # This file is @generated by PDM.
2
+ # Please do not edit it manually.
3
+
4
+ aiofiles==24.1.0
5
+ aiohappyeyeballs==2.6.1
6
+ aiohttp==3.11.18
7
+ aiosignal==1.3.2
8
+ annotated-types==0.7.0
9
+ anyio==4.9.0
10
+ attrs==25.3.0
11
+ certifi==2025.4.26
12
+ cffi==1.17.1; platform_python_implementation == "PyPy"
13
+ charset-normalizer==3.4.2
14
+ click==8.1.8
15
+ colorama==0.4.6; platform_system == "Windows"
16
+ dataclasses-json==0.6.7
17
+ datasets==3.6.0
18
+ dill==0.3.8
19
+ distro==1.9.0
20
+ dotenv==0.9.9
21
+ duckduckgo-search==8.0.2
22
+ fastapi==0.115.12
23
+ ffmpy==0.5.0
24
+ filelock==3.18.0
25
+ frozenlist==1.6.0
26
+ fsspec[http]==2025.3.0
27
+ gradio==5.29.1
28
+ gradio-client==1.10.1
29
+ greenlet==3.2.2; (platform_machine == "win32" or platform_machine == "WIN32" or platform_machine == "AMD64" or platform_machine == "amd64" or platform_machine == "x86_64" or platform_machine == "ppc64le" or platform_machine == "aarch64") and python_version < "3.14"
30
+ groovy==0.1.2
31
+ h11==0.16.0
32
+ httpcore==1.0.9
33
+ httpx==0.28.1
34
+ httpx-sse==0.4.0
35
+ huggingface-hub==0.31.2
36
+ idna==3.10
37
+ jinja2==3.1.6
38
+ jiter==0.9.0
39
+ joblib==1.5.0
40
+ jsonpatch==1.33
41
+ jsonpointer==3.0.0
42
+ langchain==0.3.25
43
+ langchain-community==0.3.24
44
+ langchain-core==0.3.60
45
+ langchain-huggingface==0.2.0
46
+ langchain-openai==0.3.17
47
+ langchain-text-splitters==0.3.8
48
+ langgraph==0.4.5
49
+ langgraph-checkpoint==2.0.26
50
+ langgraph-prebuilt==0.1.8; python_version < "4.0"
51
+ langgraph-sdk==0.1.69; python_version < "4.0"
52
+ langsmith==0.3.42
53
+ lxml==5.4.0
54
+ markdown-it-py==3.0.0; sys_platform != "emscripten"
55
+ markupsafe==3.0.2
56
+ marshmallow==3.26.1
57
+ mdurl==0.1.2; sys_platform != "emscripten"
58
+ mpmath==1.3.0
59
+ multidict==6.4.3
60
+ multiprocess==0.70.16
61
+ mypy-extensions==1.1.0
62
+ networkx==3.4.2
63
+ numpy==2.2.5
64
+ nvidia-cublas-cu12==12.6.4.1; platform_system == "Linux" and platform_machine == "x86_64"
65
+ nvidia-cuda-cupti-cu12==12.6.80; platform_system == "Linux" and platform_machine == "x86_64"
66
+ nvidia-cuda-nvrtc-cu12==12.6.77; platform_system == "Linux" and platform_machine == "x86_64"
67
+ nvidia-cuda-runtime-cu12==12.6.77; platform_system == "Linux" and platform_machine == "x86_64"
68
+ nvidia-cudnn-cu12==9.5.1.17; platform_system == "Linux" and platform_machine == "x86_64"
69
+ nvidia-cufft-cu12==11.3.0.4; platform_system == "Linux" and platform_machine == "x86_64"
70
+ nvidia-cufile-cu12==1.11.1.6; platform_system == "Linux" and platform_machine == "x86_64"
71
+ nvidia-curand-cu12==10.3.7.77; platform_system == "Linux" and platform_machine == "x86_64"
72
+ nvidia-cusolver-cu12==11.7.1.2; platform_system == "Linux" and platform_machine == "x86_64"
73
+ nvidia-cusparse-cu12==12.5.4.2; platform_system == "Linux" and platform_machine == "x86_64"
74
+ nvidia-cusparselt-cu12==0.6.3; platform_system == "Linux" and platform_machine == "x86_64"
75
+ nvidia-nccl-cu12==2.26.2; platform_system == "Linux" and platform_machine == "x86_64"
76
+ nvidia-nvjitlink-cu12==12.6.85; platform_system == "Linux" and platform_machine == "x86_64"
77
+ nvidia-nvtx-cu12==12.6.77; platform_system == "Linux" and platform_machine == "x86_64"
78
+ openai==1.79.0
79
+ orjson==3.10.18
80
+ ormsgpack==1.9.1
81
+ packaging==24.2
82
+ pandas==2.2.3
83
+ pillow==11.2.1
84
+ primp==0.15.0
85
+ propcache==0.3.1
86
+ pyarrow==20.0.0
87
+ pycparser==2.22; platform_python_implementation == "PyPy"
88
+ pydantic==2.11.4
89
+ pydantic-core==2.33.2
90
+ pydantic-settings==2.9.1
91
+ pydub==0.25.1
92
+ pygments==2.19.1; sys_platform != "emscripten"
93
+ python-dateutil==2.9.0.post0
94
+ python-dotenv==1.1.0
95
+ python-multipart==0.0.20
96
+ pytz==2025.2
97
+ pyyaml==6.0.2
98
+ rank-bm25==0.2.2
99
+ regex==2024.11.6
100
+ requests==2.32.3
101
+ requests-toolbelt==1.0.0
102
+ rich==14.0.0; sys_platform != "emscripten"
103
+ ruff==0.11.10; sys_platform != "emscripten"
104
+ safehttpx==0.1.6
105
+ safetensors==0.5.3
106
+ scikit-learn==1.6.1
107
+ scipy==1.15.3
108
+ semantic-version==2.10.0
109
+ sentence-transformers==4.1.0
110
+ setuptools==80.7.1; platform_system == "Linux" and platform_machine == "x86_64" or python_version >= "3.12"
111
+ shellingham==1.5.4; sys_platform != "emscripten"
112
+ six==1.17.0
113
+ sniffio==1.3.1
114
+ sqlalchemy==2.0.41
115
+ starlette==0.46.2
116
+ sympy==1.14.0
117
+ tenacity==9.1.2
118
+ threadpoolctl==3.6.0
119
+ tiktoken==0.9.0
120
+ tokenizers==0.21.1
121
+ tomlkit==0.13.2
122
+ torch==2.7.0
123
+ tqdm==4.67.1
124
+ transformers==4.51.3
125
+ triton==3.3.0; platform_system == "Linux" and platform_machine == "x86_64"
126
+ typer==0.15.4; sys_platform != "emscripten"
127
+ typing-extensions==4.13.2
128
+ typing-inspect==0.9.0
129
+ typing-inspection==0.4.0
130
+ tzdata==2025.2
131
+ urllib3==2.4.0
132
+ uvicorn==0.34.2; sys_platform != "emscripten"
133
+ websockets==15.0.1
134
+ xxhash==3.5.0
135
+ yarl==1.20.0
136
+ zstandard==0.23.0