bitcloud2 commited on
Commit
b0ed2e6
·
1 Parent(s): 81917a3

working app_dev. hopefully working app

Browse files
Files changed (12) hide show
  1. .gitattributes +2 -0
  2. .gitignore +8 -0
  3. Changelog.md +34 -0
  4. app.py +54 -28
  5. app_dev.py +280 -0
  6. gemini_model.py +177 -0
  7. magic.lock +1312 -0
  8. my_agent.py +45 -0
  9. pyproject.toml +19 -0
  10. requirements.txt +3 -1
  11. src/final_assignment_template/__init__.py +0 -0
  12. tools.py +4 -0
.gitattributes CHANGED
@@ -33,3 +33,5 @@ saved_model/**/* 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
 
 
 
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
36
+ # SCM syntax highlighting & preventing 3-way merges
37
+ pixi.lock merge=binary linguist-language=YAML linguist-generated=true
.gitignore ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+
2
+ # pixi environments
3
+ .pixi
4
+ *.egg-info
5
+ # magic environments
6
+ .magic
7
+ __pycache__/
8
+ *.pyc
Changelog.md ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ## [Unreleased]
2
+
3
+ ### Added
4
+ - Moved agent instantiation into a separate `instantiate_agent` function in `app_dev.py`.
5
+ - Extracted question fetching logic into a new `fetch_questions` function in `app_dev.py`.
6
+ - Created `my_agent.py` for custom agent implementation.
7
+ - Added `GeminiApiModel` for interacting with Google Gemini API.
8
+ - Refactored `SmolAgent` in `my_agent.py` to use `GeminiApiModel`.
9
+ - Removed standalone `call_gemini_api` function from `my_agent.py`.
10
+
11
+ ### Changed
12
+ - Simplified error handling in `run_and_submit_all` by removing redundant try-except block around `instantiate_agent` call.
13
+ - Updated `run_and_submit_all` to call `fetch_questions` and handle its return values.
14
+ - Updated `app_dev.py` to import and use `SmolAgent` from `my_agent.py`.
15
+
16
+ ### Deprecated
17
+
18
+ ### Removed
19
+
20
+ ### Fixed
21
+
22
+ ### Security
23
+
24
+ ## [0.1.0] - 2024-07-25
25
+
26
+ ### Added
27
+ - Initial project structure based on template.
28
+ - Basic Gradio app (`app.py`) for agent evaluation.
29
+ - Development version of app (`app_dev.py`) for local testing.
30
+ - Placeholder `BasicAgent` in `app_dev.py`.
31
+ - `README.md` with project overview and setup instructions.
32
+ - `Changelog.md` to track changes.
33
+ - `.gitignore` file.
34
+ - Placeholder `requirements.txt`.
app.py CHANGED
@@ -2,33 +2,38 @@ 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.")
@@ -40,7 +45,7 @@ def run_and_submit_all( profile: gr.OAuthProfile | None):
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
@@ -55,16 +60,16 @@ def run_and_submit_all( profile: gr.OAuthProfile | None):
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
@@ -81,18 +86,36 @@ def run_and_submit_all( profile: gr.OAuthProfile | None):
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
 
@@ -162,20 +185,19 @@ with gr.Blocks() as demo:
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}")
@@ -183,14 +205,18 @@ if __name__ == "__main__":
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)
 
2
  import gradio as gr
3
  import requests
4
  import inspect
5
+ import pandas as p
6
+
7
+ from my_agent import SmolAgent # Import the new agentd
8
 
9
  # (Keep Constants as is)
10
  # --- Constants ---
11
  DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
12
 
13
+
14
  # --- Basic Agent Definition ---
15
  # ----- THIS IS WERE YOU CAN BUILD WHAT YOU WANT ------
16
  class BasicAgent:
17
  def __init__(self):
18
  print("BasicAgent initialized.")
19
+
20
  def __call__(self, question: str) -> str:
21
  print(f"Agent received question (first 50 chars): {question[:50]}...")
22
  fixed_answer = "This is a default answer."
23
  print(f"Agent returning fixed answer: {fixed_answer}")
24
  return fixed_answer
25
 
26
+
27
+ def run_and_submit_all(profile: gr.OAuthProfile | None):
28
  """
29
  Fetches all questions, runs the BasicAgent on them, submits all answers,
30
  and displays the results.
31
  """
32
  # --- Determine HF Space Runtime URL and Repo URL ---
33
+ space_id = os.getenv("SPACE_ID") # Get the SPACE_ID for sending link to the code
34
 
35
  if profile:
36
+ username = f"{profile.username}"
37
  print(f"User logged in: {username}")
38
  else:
39
  print("User not logged in.")
 
45
 
46
  # 1. Instantiate Agent ( modify this part to create your agent)
47
  try:
48
+ agent = SmolAgent()
49
  except Exception as e:
50
  print(f"Error instantiating agent: {e}")
51
  return f"Error initializing agent: {e}", None
 
60
  response.raise_for_status()
61
  questions_data = response.json()
62
  if not questions_data:
63
+ print("Fetched questions list is empty.")
64
+ return "Fetched questions list is empty or invalid format.", None
65
  print(f"Fetched {len(questions_data)} questions.")
66
  except requests.exceptions.RequestException as e:
67
  print(f"Error fetching questions: {e}")
68
  return f"Error fetching questions: {e}", None
69
  except requests.exceptions.JSONDecodeError as e:
70
+ print(f"Error decoding JSON response from questions endpoint: {e}")
71
+ print(f"Response text: {response.text[:500]}")
72
+ return f"Error decoding server response for questions: {e}", None
73
  except Exception as e:
74
  print(f"An unexpected error occurred fetching questions: {e}")
75
  return f"An unexpected error occurred fetching questions: {e}", None
 
86
  continue
87
  try:
88
  submitted_answer = agent(question_text)
89
+ answers_payload.append(
90
+ {"task_id": task_id, "submitted_answer": submitted_answer}
91
+ )
92
+ results_log.append(
93
+ {
94
+ "Task ID": task_id,
95
+ "Question": question_text,
96
+ "Submitted Answer": submitted_answer,
97
+ }
98
+ )
99
  except Exception as e:
100
+ print(f"Error running agent on task {task_id}: {e}")
101
+ results_log.append(
102
+ {
103
+ "Task ID": task_id,
104
+ "Question": question_text,
105
+ "Submitted Answer": f"AGENT ERROR: {e}",
106
+ }
107
+ )
108
 
109
  if not answers_payload:
110
  print("Agent did not produce any answers to submit.")
111
  return "Agent did not produce any answers to submit.", pd.DataFrame(results_log)
112
 
113
+ # 4. Prepare Submission
114
+ submission_data = {
115
+ "username": username.strip(),
116
+ "agent_code": agent_code,
117
+ "answers": answers_payload,
118
+ }
119
  status_update = f"Agent finished. Submitting {len(answers_payload)} answers for user '{username}'..."
120
  print(status_update)
121
 
 
185
 
186
  run_button = gr.Button("Run Evaluation & Submit All Answers")
187
 
188
+ status_output = gr.Textbox(
189
+ label="Run Status / Submission Result", lines=5, interactive=False
190
+ )
191
  # Removed max_rows=10 from DataFrame constructor
192
  results_table = gr.DataFrame(label="Questions and Agent Answers", wrap=True)
193
 
194
+ run_button.click(fn=run_and_submit_all, outputs=[status_output, results_table])
 
 
 
195
 
196
  if __name__ == "__main__":
197
+ print("\n" + "-" * 30 + " App Starting " + "-" * 30)
198
  # Check for SPACE_HOST and SPACE_ID at startup for information
199
  space_host_startup = os.getenv("SPACE_HOST")
200
+ space_id_startup = os.getenv("SPACE_ID") # Get SPACE_ID at startup
201
 
202
  if space_host_startup:
203
  print(f"✅ SPACE_HOST found: {space_host_startup}")
 
205
  else:
206
  print("ℹ️ SPACE_HOST environment variable not found (running locally?).")
207
 
208
+ if space_id_startup: # Print repo URLs if SPACE_ID is found
209
  print(f"✅ SPACE_ID found: {space_id_startup}")
210
  print(f" Repo URL: https://huggingface.co/spaces/{space_id_startup}")
211
+ print(
212
+ f" Repo Tree URL: https://huggingface.co/spaces/{space_id_startup}/tree/main"
213
+ )
214
  else:
215
+ print(
216
+ "ℹ️ SPACE_ID environment variable not found (running locally?). Repo URL cannot be determined."
217
+ )
218
 
219
+ print("-" * (60 + len(" App Starting ")) + "\n")
220
 
221
  print("Launching Gradio Interface for Basic Agent Evaluation...")
222
+ demo.launch(debug=True, share=False)
app_dev.py ADDED
@@ -0,0 +1,280 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import gradio as gr
3
+ import requests
4
+ import inspect
5
+ import pandas as pd
6
+
7
+ from my_agent import SmolAgent # Import the new agent
8
+
9
+ # (Keep Constants as is)
10
+ # --- Constants ---
11
+ DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
12
+
13
+
14
+ # --- Basic Agent Definition ---
15
+ # ----- THIS IS WERE YOU CAN BUILD WHAT YOU WANT ------
16
+ class BasicAgent:
17
+ def __init__(self):
18
+ print("BasicAgent initialized.")
19
+
20
+ def __call__(self, question: str) -> str:
21
+ print(f"Agent received question (first 50 chars): {question[:50]}...")
22
+ fixed_answer = "This is a default answer."
23
+ print(f"Agent returning fixed answer: {fixed_answer}")
24
+ return fixed_answer
25
+
26
+
27
+ def instantiate_agent():
28
+ """Instantiates the agent."""
29
+ try:
30
+ # agent = BasicAgent()
31
+ agent = SmolAgent() # Use the new agent
32
+ return agent, None # Return agent and no error
33
+ except Exception as e:
34
+ print(f"Error instantiating agent: {e}")
35
+ return None, f"Error initializing agent: {e}" # Return None and error message
36
+
37
+
38
+ def fetch_questions(questions_url: str):
39
+ """Fetches questions from the specified URL."""
40
+ print(f"Fetching questions from: {questions_url}")
41
+ try:
42
+ response = requests.get(questions_url, timeout=15)
43
+ response.raise_for_status()
44
+ questions_data = response.json()
45
+ if not questions_data:
46
+ print("Fetched questions list is empty.")
47
+ return None, "Fetched questions list is empty or invalid format."
48
+ print(f"Fetched {len(questions_data)} questions.")
49
+ return questions_data, None # Return data and no error
50
+ except requests.exceptions.RequestException as e:
51
+ print(f"Error fetching questions: {e}")
52
+ return None, f"Error fetching questions: {e}"
53
+ except requests.exceptions.JSONDecodeError as e:
54
+ print(f"Error decoding JSON response from questions endpoint: {e}")
55
+ print(f"Response text: {response.text[:500]}")
56
+ return None, f"Error decoding server response for questions: {e}"
57
+ except Exception as e:
58
+ print(f"An unexpected error occurred fetching questions: {e}")
59
+ return None, f"An unexpected error occurred fetching questions: {e}"
60
+
61
+
62
+ def run_agent_on_questions(agent, questions_data):
63
+ """Runs the agent on each question and collects results."""
64
+ results_log = []
65
+ answers_payload = []
66
+ print(f"Running agent on {len(questions_data)} questions...")
67
+ for item in questions_data:
68
+ task_id = item.get("task_id")
69
+ question_text = item.get("question")
70
+ if not task_id or question_text is None:
71
+ print(f"Skipping item with missing task_id or question: {item}")
72
+ continue
73
+ try:
74
+ submitted_answer = agent(question_text)
75
+ answers_payload.append(
76
+ {"task_id": task_id, "submitted_answer": submitted_answer}
77
+ )
78
+ results_log.append(
79
+ {
80
+ "Task ID": task_id,
81
+ "Question": question_text,
82
+ "Submitted Answer": submitted_answer,
83
+ }
84
+ )
85
+ except Exception as e:
86
+ print(f"Error running agent on task {task_id}: {e}")
87
+ results_log.append(
88
+ {
89
+ "Task ID": task_id,
90
+ "Question": question_text,
91
+ "Submitted Answer": f"AGENT ERROR: {e}",
92
+ }
93
+ )
94
+ return answers_payload, results_log
95
+
96
+
97
+ def dev_run():
98
+ """
99
+ Fetches all questions, runs the BasicAgent on them,
100
+ and displays the results.
101
+ """
102
+ api_url = DEFAULT_API_URL
103
+ questions_url = f"{api_url}/questions"
104
+
105
+ agent, error_message = instantiate_agent()
106
+ if error_message:
107
+ return error_message, None # Return error message and None for results_df
108
+
109
+ # 2. Fetch Questions
110
+ questions_data, error_message = fetch_questions(questions_url)
111
+ if error_message:
112
+ # Return the error message from fetch_questions and None for the results DataFrame
113
+ return error_message, None
114
+
115
+ # 3. Run your Agent
116
+ answers_payload, results_log = run_agent_on_questions(agent, questions_data)
117
+
118
+ if not answers_payload:
119
+ print("Agent did not produce any answers to submit.")
120
+ return "Agent did not produce any answers to submit.", pd.DataFrame(results_log)
121
+
122
+ return answers_payload, pd.DataFrame(results_log)
123
+
124
+
125
+ def run_and_submit_all(profile: gr.OAuthProfile | None):
126
+ """
127
+ Fetches all questions, runs the BasicAgent on them, submits all answers,
128
+ and displays the results.
129
+ """
130
+ # --- Determine HF Space Runtime URL and Repo URL ---
131
+ space_id = os.getenv("SPACE_ID") # Get the SPACE_ID for sending link to the code
132
+
133
+ if profile:
134
+ username = f"{profile.username}"
135
+ print(f"User logged in: {username}")
136
+ else:
137
+ print("User not logged in.")
138
+ return "Please Login to Hugging Face with the button.", None
139
+
140
+ api_url = DEFAULT_API_URL
141
+ questions_url = f"{api_url}/questions"
142
+ submit_url = f"{api_url}/submit"
143
+
144
+ # 1. Instantiate Agent ( modify this part to create your agent)
145
+ agent, error_message = instantiate_agent()
146
+ if error_message:
147
+ return error_message, None # Return error message and None for results_df
148
+
149
+ # 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)
150
+ agent_code = f"https://huggingface.co/spaces/{space_id}/tree/main"
151
+ print(agent_code)
152
+
153
+ # 2. Fetch Questions
154
+ questions_data, error_message = fetch_questions(questions_url)
155
+ if error_message:
156
+ # Return the error message from fetch_questions and None for the results DataFrame
157
+ return error_message, None
158
+
159
+ # 3. Run your Agent
160
+ answers_payload, results_log = run_agent_on_questions(agent, questions_data)
161
+
162
+ if not answers_payload:
163
+ print("Agent did not produce any answers to submit.")
164
+ return "Agent did not produce any answers to submit.", pd.DataFrame(results_log)
165
+
166
+ # 4. Prepare Submission
167
+ submission_data = {
168
+ "username": username.strip(),
169
+ "agent_code": agent_code,
170
+ "answers": answers_payload,
171
+ }
172
+ status_update = f"Agent finished. Submitting {len(answers_payload)} answers for user '{username}'..."
173
+ print(status_update)
174
+
175
+ # 5. Submit
176
+ print(f"Submitting {len(answers_payload)} answers to: {submit_url}")
177
+ try:
178
+ response = requests.post(submit_url, json=submission_data, timeout=60)
179
+ response.raise_for_status()
180
+ result_data = response.json()
181
+ final_status = (
182
+ f"Submission Successful!\n"
183
+ f"User: {result_data.get('username')}\n"
184
+ f"Overall Score: {result_data.get('score', 'N/A')}% "
185
+ f"({result_data.get('correct_count', '?')}/{result_data.get('total_attempted', '?')} correct)\n"
186
+ f"Message: {result_data.get('message', 'No message received.')}"
187
+ )
188
+ print("Submission successful.")
189
+ results_df = pd.DataFrame(results_log)
190
+ return final_status, results_df
191
+ except requests.exceptions.HTTPError as e:
192
+ error_detail = f"Server responded with status {e.response.status_code}."
193
+ try:
194
+ error_json = e.response.json()
195
+ error_detail += f" Detail: {error_json.get('detail', e.response.text)}"
196
+ except requests.exceptions.JSONDecodeError:
197
+ error_detail += f" Response: {e.response.text[:500]}"
198
+ status_message = f"Submission Failed: {error_detail}"
199
+ print(status_message)
200
+ results_df = pd.DataFrame(results_log)
201
+ return status_message, results_df
202
+ except requests.exceptions.Timeout:
203
+ status_message = "Submission Failed: The request timed out."
204
+ print(status_message)
205
+ results_df = pd.DataFrame(results_log)
206
+ return status_message, results_df
207
+ except requests.exceptions.RequestException as e:
208
+ status_message = f"Submission Failed: Network error - {e}"
209
+ print(status_message)
210
+ results_df = pd.DataFrame(results_log)
211
+ return status_message, results_df
212
+ except Exception as e:
213
+ status_message = f"An unexpected error occurred during submission: {e}"
214
+ print(status_message)
215
+ results_df = pd.DataFrame(results_log)
216
+ return status_message, results_df
217
+
218
+
219
+ # # --- Build Gradio Interface using Blocks ---
220
+ # with gr.Blocks() as demo:
221
+ # gr.Markdown("# Basic Agent Evaluation Runner")
222
+ # gr.Markdown(
223
+ # """
224
+ # **Instructions:**
225
+
226
+ # 1. Please clone this space, then modify the code to define your agent's logic, the tools, the necessary packages, etc ...
227
+ # 2. Log in to your Hugging Face account using the button below. This uses your HF username for submission.
228
+ # 3. Click 'Run Evaluation & Submit All Answers' to fetch questions, run your agent, submit answers, and see the score.
229
+
230
+ # ---
231
+ # **Disclaimers:**
232
+ # 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).
233
+ # 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.
234
+ # """
235
+ # )
236
+
237
+ # gr.LoginButton()
238
+
239
+ # run_button = gr.Button("Run Evaluation & Submit All Answers")
240
+
241
+ # status_output = gr.Textbox(
242
+ # label="Run Status / Submission Result", lines=5, interactive=False
243
+ # )
244
+ # # Removed max_rows=10 from DataFrame constructor
245
+ # results_table = gr.DataFrame(label="Questions and Agent Answers", wrap=True)
246
+
247
+ # run_button.click(fn=run_and_submit_all, outputs=[status_output, results_table])
248
+
249
+ # if __name__ == "__main__":
250
+ # print("\n" + "-" * 30 + " App Starting " + "-" * 30)
251
+ # # Check for SPACE_HOST and SPACE_ID at startup for information
252
+ # space_host_startup = os.getenv("SPACE_HOST")
253
+ # space_id_startup = os.getenv("SPACE_ID") # Get SPACE_ID at startup
254
+
255
+ # if space_host_startup:
256
+ # print(f"✅ SPACE_HOST found: {space_host_startup}")
257
+ # print(f" Runtime URL should be: https://{space_host_startup}.hf.space")
258
+ # else:
259
+ # print("ℹ️ SPACE_HOST environment variable not found (running locally?).")
260
+
261
+ # if space_id_startup: # Print repo URLs if SPACE_ID is found
262
+ # print(f"✅ SPACE_ID found: {space_id_startup}")
263
+ # print(f" Repo URL: https://huggingface.co/spaces/{space_id_startup}")
264
+ # print(
265
+ # f" Repo Tree URL: https://huggingface.co/spaces/{space_id_startup}/tree/main"
266
+ # )
267
+ # else:
268
+ # print(
269
+ # "ℹ️ SPACE_ID environment variable not found (running locally?). Repo URL cannot be determined."
270
+ # )
271
+
272
+ # print("-" * (60 + len(" App Starting ")) + "\n")
273
+
274
+ # print("Launching Gradio Interface for Basic Agent Evaluation...")
275
+ # demo.launch(debug=True, share=False)
276
+
277
+ if __name__ == "__main__":
278
+ answers_payload, results_log = dev_run()
279
+ print(answers_payload)
280
+ print(results_log)
gemini_model.py ADDED
@@ -0,0 +1,177 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import time
3
+
4
+ import httpx
5
+ import warnings
6
+ from typing import List, Dict, Optional
7
+ from smolagents import ApiModel, ChatMessage
8
+
9
+
10
+ class GeminiApiModel(ApiModel):
11
+ """
12
+ ApiModel implementation using the Google Gemini API via direct HTTP requests.
13
+ """
14
+
15
+ def __init__(
16
+ self,
17
+ model_id: str = "gemini-pro",
18
+ api_key: Optional[str] = None,
19
+ **kwargs,
20
+ ):
21
+ """
22
+ Initializes the GeminiApiModel.
23
+
24
+ Args:
25
+ model_id (str): The Gemini model ID to use (e.g., "gemini-pro").
26
+ api_key (str, optional): Google AI Studio API key. Defaults to GEMINI_API_KEY environment variable.
27
+ **kwargs: Additional keyword arguments passed to the parent ApiModel.
28
+ """
29
+ self.model_id = model_id
30
+ # Prefer explicitly passed key, fallback to environment variable
31
+ self.api_key = api_key if api_key else os.environ.get("GEMINI_API_KEY")
32
+ if not self.api_key:
33
+ warnings.warn(
34
+ "GEMINI_API_KEY not provided via argument or environment variable. API calls will likely fail.",
35
+ UserWarning,
36
+ )
37
+ # Gemini API doesn't inherently support complex role structures or function calling like OpenAI.
38
+ # We'll flatten messages for simplicity.
39
+ super().__init__(
40
+ model_id=model_id,
41
+ flatten_messages_as_text=True, # Flatten messages to a single text prompt
42
+ **kwargs,
43
+ )
44
+
45
+ def create_client(self):
46
+ """No dedicated client needed as we use httpx directly."""
47
+ return None # Or potentially return httpx client if reused
48
+
49
+ def __call__(
50
+ self,
51
+ messages: List[Dict[str, str]],
52
+ stop_sequences: Optional[
53
+ List[str]
54
+ ] = None, # Note: Gemini API might not support stop sequences directly here
55
+ grammar: Optional[
56
+ str
57
+ ] = None, # Note: Gemini API doesn't support grammar directly
58
+ tools_to_call_from: Optional[
59
+ List["Tool"]
60
+ ] = None, # Note: Basic Gemini API doesn't support tools
61
+ **kwargs,
62
+ ) -> ChatMessage:
63
+ """
64
+ Calls the Google Gemini API with the provided messages.
65
+
66
+ Args:
67
+ messages: A list of message dictionaries (e.g., [{'role': 'user', 'content': '...'}]).
68
+ stop_sequences: Optional stop sequences (may not be supported).
69
+ grammar: Optional grammar constraint (not supported).
70
+ tools_to_call_from: Optional list of tools (not supported).
71
+ **kwargs: Additional keyword arguments.
72
+
73
+ Returns:
74
+ A ChatMessage object containing the response.
75
+ """
76
+ if not self.api_key:
77
+ raise ValueError("GEMINI_API_KEY is not set.")
78
+
79
+ # Prepare the prompt by concatenating message content
80
+ # The Gemini Pro basic API expects a simple text prompt.
81
+ prompt = self._messages_to_prompt(messages)
82
+ prompt += (
83
+ "\n\n"
84
+ + "If you have a result from a web search that looks helpful, please use httpx to get the HTML from the URL listed."
85
+ + "You are a general AI assistant. I will ask you a question. Report your thoughts, and finish your answer with the following template: FINAL ANSWER: [YOUR FINAL ANSWER]. YOUR FINAL ANSWER should be a number OR as few words as possible OR a comma separated list of numbers and/or strings. If you are asked for a number, don't use comma to write your number neither use units such as $ or percent sign unless specified otherwise. If you are asked for a string, don't use articles, neither abbreviations (e.g. for cities), and write the digits in plain text unless specified otherwise. If you are asked for a comma separated list, apply the above rules depending of whether the element to be put in the list is a number or a string."
86
+ )
87
+ # print(f"--- Gemini API prompt: ---\n{prompt}\n--- End of prompt ---")
88
+
89
+ url = f"https://generativelanguage.googleapis.com/v1beta/models/{self.model_id}:generateContent?key={self.api_key}"
90
+ headers = {"Content-Type": "application/json"}
91
+ # Construct the payload according to Gemini API requirements
92
+ data = {"contents": [{"parts": [{"text": prompt}]}]}
93
+
94
+ # Add generation config if provided via kwargs (optional)
95
+ generation_config = {}
96
+ if "temperature" in kwargs:
97
+ generation_config["temperature"] = kwargs["temperature"]
98
+ if "max_output_tokens" in kwargs:
99
+ generation_config["maxOutputTokens"] = kwargs["max_output_tokens"]
100
+ # Add other relevant config parameters here if needed
101
+
102
+ if generation_config:
103
+ data["generationConfig"] = generation_config
104
+
105
+ # Handle stop sequences if provided (basic support)
106
+ # Note: This is a best-effort addition, check Gemini API docs for formal support
107
+ if stop_sequences:
108
+ if "generationConfig" not in data:
109
+ data["generationConfig"] = {}
110
+ # Assuming Gemini API might support 'stopSequences' in generationConfig
111
+ data["generationConfig"]["stopSequences"] = stop_sequences
112
+
113
+ raw_response = None
114
+ try:
115
+ response = httpx.post(
116
+ url, headers=headers, json=data, timeout=120.0
117
+ ) # Increased timeout
118
+ time.sleep(6) # Add delay to respect rate limits
119
+ response.raise_for_status()
120
+ response_json = response.json()
121
+ raw_response = response_json # Store raw response
122
+
123
+ # Parse the response - adjust based on actual Gemini API structure
124
+ if "candidates" in response_json and response_json["candidates"]:
125
+ part = response_json["candidates"][0]["content"]["parts"][0]
126
+ if "text" in part:
127
+ content = part["text"]
128
+ # Simulate token counts if available, otherwise default to 0
129
+ # The basic generateContent API might not return usage directly in the main response
130
+ # It might be in safetyRatings or other metadata if enabled/available.
131
+ # Setting to 0 for now as it's not reliably present in the simplest call.
132
+ self.last_input_token_count = 0
133
+ self.last_output_token_count = 0
134
+ # If usage data becomes available in response_json, parse it here:
135
+ # e.g., if response_json.get("usageMetadata"):
136
+ # self.last_input_token_count = response_json["usageMetadata"].get("promptTokenCount", 0)
137
+ # self.last_output_token_count = response_json["usageMetadata"].get("candidatesTokenCount", 0)
138
+
139
+ return ChatMessage(
140
+ role="assistant", content=content, raw=raw_response
141
+ )
142
+
143
+ # Handle cases where the expected response structure isn't found
144
+ error_content = f"Error or unexpected response format: {response_json}"
145
+ return ChatMessage(
146
+ role="assistant", content=error_content, raw=raw_response
147
+ )
148
+
149
+ except httpx.RequestError as exc:
150
+ error_content = (
151
+ f"An error occurred while requesting {exc.request.url!r}: {exc}"
152
+ )
153
+ return ChatMessage(
154
+ role="assistant", content=error_content, raw={"error": str(exc)}
155
+ )
156
+ except httpx.HTTPStatusError as exc:
157
+ error_content = f"Error response {exc.response.status_code} while requesting {exc.request.url!r}: {exc.response.text}"
158
+ return ChatMessage(
159
+ role="assistant",
160
+ content=error_content,
161
+ raw={
162
+ "error": str(exc),
163
+ "status_code": exc.response.status_code,
164
+ "response_text": exc.response.text,
165
+ },
166
+ )
167
+ except Exception as e:
168
+ error_content = f"An unexpected error occurred: {e}"
169
+ return ChatMessage(
170
+ role="assistant", content=error_content, raw={"error": str(e)}
171
+ )
172
+
173
+ def _messages_to_prompt(self, messages: List[Dict[str, str]]) -> str:
174
+ """Converts a list of messages into a single string prompt."""
175
+ # Simple concatenation, could be more sophisticated based on roles if needed
176
+ # Ensure we handle cases where 'content' might not be a string (though it should be)
177
+ return "\n".join([str(msg.get("content", "")) for msg in messages])
magic.lock ADDED
@@ -0,0 +1,1312 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ version: 6
2
+ environments:
3
+ default:
4
+ channels:
5
+ - url: https://conda.modular.com/max-nightly/
6
+ - url: https://conda.modular.com/max/
7
+ - url: https://repo.prefix.dev/modular-community/
8
+ - url: https://conda.anaconda.org/conda-forge/
9
+ indexes:
10
+ - https://pypi.org/simple
11
+ packages:
12
+ linux-64:
13
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2
14
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2
15
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda
16
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda
17
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda
18
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda
19
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda
20
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda
21
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda
22
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda
23
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda
24
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-h4bc722e_0.conda
25
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_2.conda
26
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda
27
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda
28
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda
29
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_0.conda
30
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.3-hf636f53_101_cp313.conda
31
+ - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-7_cp313.conda
32
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda
33
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda
34
+ - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda
35
+ - pypi: https://files.pythonhosted.org/packages/a5/45/30bb92d442636f570cb5651bc661f52b610e2eec3f891a5dc3a4c3667db0/aiofiles-24.1.0-py3-none-any.whl
36
+ - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
37
+ - pypi: https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl
38
+ - pypi: https://files.pythonhosted.org/packages/7a/1d/54f4c58bae8dc8c64a75071c7e98e105ddaca35449376fcb0180f6e3c9df/audioop_lts-0.2.1-cp313-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
39
+ - pypi: https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl
40
+ - pypi: https://files.pythonhosted.org/packages/4a/7e/3db2bd1b1f9e95f7cddca6d6e75e2f2bd9f51b1246e546d88addca0106bd/certifi-2025.4.26-py3-none-any.whl
41
+ - pypi: https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
42
+ - pypi: https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl
43
+ - pypi: https://files.pythonhosted.org/packages/83/a2/66adca41164860dee6d2d47b506fef3262c8879aab727b687c798d67313f/duckduckgo_search-8.0.1-py3-none-any.whl
44
+ - pypi: https://files.pythonhosted.org/packages/50/b3/b51f09c2ba432a576fe63758bddc81f78f0c6309d9e5c10d194313bf021e/fastapi-0.115.12-py3-none-any.whl
45
+ - pypi: https://files.pythonhosted.org/packages/53/5d/65f40bd333463b3230b3a72d93873caaf49b0cbb5228598fafb75fcc5357/ffmpy-0.5.0-py3-none-any.whl
46
+ - pypi: https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl
47
+ - pypi: https://files.pythonhosted.org/packages/44/4b/e0cfc1a6f17e990f3e64b7d941ddc4acdc7b19d6edd51abf495f32b1a9e4/fsspec-2025.3.2-py3-none-any.whl
48
+ - pypi: https://files.pythonhosted.org/packages/c2/81/c02b50e8cf0e82a1ec284ee413f377fb755d93fdc9e9d3eba2400c321117/gradio-5.27.1-py3-none-any.whl
49
+ - pypi: https://files.pythonhosted.org/packages/7f/8a/46f40c96306abf6c9be48ac826425711a9b005fbc8cd6edc1661fd5d85ac/gradio_client-1.9.1-py3-none-any.whl
50
+ - pypi: https://files.pythonhosted.org/packages/28/27/3d6dcadc8a3214d8522c1e7f6a19554e33659be44546d44a2f7572ac7d2a/groovy-0.1.2-py3-none-any.whl
51
+ - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl
52
+ - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl
53
+ - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl
54
+ - pypi: https://files.pythonhosted.org/packages/93/27/1fb384a841e9661faad1c31cbfa62864f59632e876df5d795234da51c395/huggingface_hub-0.30.2-py3-none-any.whl
55
+ - pypi: https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl
56
+ - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl
57
+ - pypi: https://files.pythonhosted.org/packages/2f/04/6ef935dc74e729932e39478e44d8cfe6a83550552eaa072b7c05f6f22488/lxml-5.4.0-cp313-cp313-manylinux_2_28_x86_64.whl
58
+ - pypi: https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl
59
+ - pypi: https://files.pythonhosted.org/packages/64/11/b751af7ad41b254a802cf52f7bc1fca7cabe2388132f2ce60a1a6b9b9622/markdownify-1.1.0-py3-none-any.whl
60
+ - pypi: https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
61
+ - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl
62
+ - pypi: https://files.pythonhosted.org/packages/aa/fc/ebfd32c3e124e6a1043e19c0ab0769818aa69050ce5589b63d05ff185526/numpy-2.2.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
63
+ - pypi: https://files.pythonhosted.org/packages/d1/d0/e9e38aff63e1d7bbcb818e6f8d4df1056b7f8aeb3b660370e0d41dbc394c/orjson-3.10.17-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
64
+ - pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl
65
+ - pypi: https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
66
+ - pypi: https://files.pythonhosted.org/packages/13/eb/2552ecebc0b887f539111c2cd241f538b8ff5891b8903dfe672e997529be/pillow-11.2.1-cp313-cp313-manylinux_2_28_x86_64.whl
67
+ - pypi: https://files.pythonhosted.org/packages/c3/7b/cbd5d999a07ff2a21465975d4eb477ae6f69765e8fe8c9087dab250180d8/primp-0.15.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
68
+ - pypi: https://files.pythonhosted.org/packages/e7/12/46b65f3534d099349e38ef6ec98b1a5a81f42536d17e0ba382c28c67ba67/pydantic-2.11.4-py3-none-any.whl
69
+ - pypi: https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
70
+ - pypi: https://files.pythonhosted.org/packages/a6/53/d78dc063216e62fc55f6b2eebb447f6a4b0a59f55c8406376f76bf959b08/pydub-0.25.1-py2.py3-none-any.whl
71
+ - pypi: https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl
72
+ - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl
73
+ - pypi: https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl
74
+ - pypi: https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl
75
+ - pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl
76
+ - pypi: https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
77
+ - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl
78
+ - pypi: https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl
79
+ - pypi: https://files.pythonhosted.org/packages/0e/2c/1e364cc92970075d7d04c69c928430b23e43a433f044474f57e425cbed37/ruff-0.11.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
80
+ - pypi: https://files.pythonhosted.org/packages/4d/c0/1108ad9f01567f66b3154063605b350b69c3c9366732e09e45f9fd0d1deb/safehttpx-0.1.6-py3-none-any.whl
81
+ - pypi: https://files.pythonhosted.org/packages/6a/23/8146aad7d88f4fcb3a6218f41a60f6c2d4e3a72de72da1825dc7c8f7877c/semantic_version-2.10.0-py2.py3-none-any.whl
82
+ - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl
83
+ - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl
84
+ - pypi: https://files.pythonhosted.org/packages/2f/ce/dedad549d2b37e73d14c56aef25bd42a5f87fdb8e97bf2a78cac5aac8287/smolagents-1.14.0-py3-none-any.whl
85
+ - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl
86
+ - pypi: https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl
87
+ - pypi: https://files.pythonhosted.org/packages/8b/0c/9d30a4ebeb6db2b25a841afbb80f6ef9a854fc3b41be131d249a977b4959/starlette-0.46.2-py3-none-any.whl
88
+ - pypi: https://files.pythonhosted.org/packages/f9/b6/a447b5e4ec71e13871be01ba81f5dfc9d0af7e473da256ff46bc0e24026f/tomlkit-0.13.2-py3-none-any.whl
89
+ - pypi: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl
90
+ - pypi: https://files.pythonhosted.org/packages/48/20/9d953de6f4367163d23ec823200eb3ecb0050a2609691e512c8b95827a9b/typer-0.15.3-py3-none-any.whl
91
+ - pypi: https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl
92
+ - pypi: https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl
93
+ - pypi: https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl
94
+ - pypi: https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl
95
+ - pypi: https://files.pythonhosted.org/packages/b1/4b/4cef6ce21a2aaca9d852a6e84ef4f135d99fcd74fa75105e2fc0c8308acd/uvicorn-0.34.2-py3-none-any.whl
96
+ - pypi: https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
97
+ - pypi: .
98
+ packages:
99
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2
100
+ sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726
101
+ md5: d7c89558ba9fa0495403155b64376d81
102
+ license: None
103
+ purls: []
104
+ size: 2562
105
+ timestamp: 1578324546067
106
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2
107
+ build_number: 16
108
+ sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22
109
+ md5: 73aaf86a425cc6e73fcf236a5a46396d
110
+ depends:
111
+ - _libgcc_mutex 0.1 conda_forge
112
+ - libgomp >=7.5.0
113
+ constrains:
114
+ - openmp_impl 9999
115
+ license: BSD-3-Clause
116
+ license_family: BSD
117
+ purls: []
118
+ size: 23621
119
+ timestamp: 1650670423406
120
+ - pypi: https://files.pythonhosted.org/packages/a5/45/30bb92d442636f570cb5651bc661f52b610e2eec3f891a5dc3a4c3667db0/aiofiles-24.1.0-py3-none-any.whl
121
+ name: aiofiles
122
+ version: 24.1.0
123
+ sha256: b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5
124
+ requires_python: '>=3.8'
125
+ - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl
126
+ name: annotated-types
127
+ version: 0.7.0
128
+ sha256: 1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53
129
+ requires_dist:
130
+ - typing-extensions>=4.0.0 ; python_full_version < '3.9'
131
+ requires_python: '>=3.8'
132
+ - pypi: https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl
133
+ name: anyio
134
+ version: 4.9.0
135
+ sha256: 9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c
136
+ requires_dist:
137
+ - exceptiongroup>=1.0.2 ; python_full_version < '3.11'
138
+ - idna>=2.8
139
+ - sniffio>=1.1
140
+ - typing-extensions>=4.5 ; python_full_version < '3.13'
141
+ - trio>=0.26.1 ; extra == 'trio'
142
+ - anyio[trio] ; extra == 'test'
143
+ - blockbuster>=1.5.23 ; extra == 'test'
144
+ - coverage[toml]>=7 ; extra == 'test'
145
+ - exceptiongroup>=1.2.0 ; extra == 'test'
146
+ - hypothesis>=4.0 ; extra == 'test'
147
+ - psutil>=5.9 ; extra == 'test'
148
+ - pytest>=7.0 ; extra == 'test'
149
+ - trustme ; extra == 'test'
150
+ - truststore>=0.9.1 ; python_full_version >= '3.10' and extra == 'test'
151
+ - uvloop>=0.21 ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and sys_platform != 'win32' and extra == 'test'
152
+ - packaging ; extra == 'doc'
153
+ - sphinx~=8.2 ; extra == 'doc'
154
+ - sphinx-rtd-theme ; extra == 'doc'
155
+ - sphinx-autodoc-typehints>=1.2.0 ; extra == 'doc'
156
+ requires_python: '>=3.9'
157
+ - pypi: https://files.pythonhosted.org/packages/7a/1d/54f4c58bae8dc8c64a75071c7e98e105ddaca35449376fcb0180f6e3c9df/audioop_lts-0.2.1-cp313-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
158
+ name: audioop-lts
159
+ version: 0.2.1
160
+ sha256: c589f06407e8340e81962575fcffbba1e92671879a221186c3d4662de9fe804e
161
+ requires_python: '>=3.13'
162
+ - pypi: https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl
163
+ name: beautifulsoup4
164
+ version: 4.13.4
165
+ sha256: 9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b
166
+ requires_dist:
167
+ - soupsieve>1.2
168
+ - typing-extensions>=4.0.0
169
+ - cchardet ; extra == 'cchardet'
170
+ - chardet ; extra == 'chardet'
171
+ - charset-normalizer ; extra == 'charset-normalizer'
172
+ - html5lib ; extra == 'html5lib'
173
+ - lxml ; extra == 'lxml'
174
+ requires_python: '>=3.7.0'
175
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda
176
+ sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d
177
+ md5: 62ee74e96c5ebb0af99386de58cf9553
178
+ depends:
179
+ - __glibc >=2.17,<3.0.a0
180
+ - libgcc-ng >=12
181
+ license: bzip2-1.0.6
182
+ license_family: BSD
183
+ purls: []
184
+ size: 252783
185
+ timestamp: 1720974456583
186
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.4.26-hbd8a1cb_0.conda
187
+ sha256: 2a70ed95ace8a3f8a29e6cd1476a943df294a7111dfb3e152e3478c4c889b7ac
188
+ md5: 95db94f75ba080a22eb623590993167b
189
+ depends:
190
+ - __unix
191
+ license: ISC
192
+ purls: []
193
+ size: 152283
194
+ timestamp: 1745653616541
195
+ - pypi: https://files.pythonhosted.org/packages/4a/7e/3db2bd1b1f9e95f7cddca6d6e75e2f2bd9f51b1246e546d88addca0106bd/certifi-2025.4.26-py3-none-any.whl
196
+ name: certifi
197
+ version: 2025.4.26
198
+ sha256: 30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3
199
+ requires_python: '>=3.6'
200
+ - pypi: https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
201
+ name: charset-normalizer
202
+ version: 3.4.1
203
+ sha256: 955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11
204
+ requires_python: '>=3.7'
205
+ - pypi: https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl
206
+ name: click
207
+ version: 8.1.8
208
+ sha256: 63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2
209
+ requires_dist:
210
+ - colorama ; sys_platform == 'win32'
211
+ - importlib-metadata ; python_full_version < '3.8'
212
+ requires_python: '>=3.7'
213
+ - pypi: https://files.pythonhosted.org/packages/83/a2/66adca41164860dee6d2d47b506fef3262c8879aab727b687c798d67313f/duckduckgo_search-8.0.1-py3-none-any.whl
214
+ name: duckduckgo-search
215
+ version: 8.0.1
216
+ sha256: 87ea18d9abb1cd5dc8f63fc70ac867996acce2cb5e0129d191b9491c202420be
217
+ requires_dist:
218
+ - click>=8.1.8
219
+ - primp>=0.15.0
220
+ - lxml>=5.3.0
221
+ - mypy>=1.14.1 ; extra == 'dev'
222
+ - pytest>=8.3.4 ; extra == 'dev'
223
+ - pytest-dependency>=0.6.0 ; extra == 'dev'
224
+ - ruff>=0.9.2 ; extra == 'dev'
225
+ requires_python: '>=3.9'
226
+ - pypi: https://files.pythonhosted.org/packages/50/b3/b51f09c2ba432a576fe63758bddc81f78f0c6309d9e5c10d194313bf021e/fastapi-0.115.12-py3-none-any.whl
227
+ name: fastapi
228
+ version: 0.115.12
229
+ sha256: e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d
230
+ requires_dist:
231
+ - starlette>=0.40.0,<0.47.0
232
+ - pydantic>=1.7.4,!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0
233
+ - typing-extensions>=4.8.0
234
+ - fastapi-cli[standard]>=0.0.5 ; extra == 'standard'
235
+ - httpx>=0.23.0 ; extra == 'standard'
236
+ - jinja2>=3.1.5 ; extra == 'standard'
237
+ - python-multipart>=0.0.18 ; extra == 'standard'
238
+ - email-validator>=2.0.0 ; extra == 'standard'
239
+ - uvicorn[standard]>=0.12.0 ; extra == 'standard'
240
+ - fastapi-cli[standard]>=0.0.5 ; extra == 'all'
241
+ - httpx>=0.23.0 ; extra == 'all'
242
+ - jinja2>=3.1.5 ; extra == 'all'
243
+ - python-multipart>=0.0.18 ; extra == 'all'
244
+ - itsdangerous>=1.1.0 ; extra == 'all'
245
+ - pyyaml>=5.3.1 ; extra == 'all'
246
+ - ujson>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0 ; extra == 'all'
247
+ - orjson>=3.2.1 ; extra == 'all'
248
+ - email-validator>=2.0.0 ; extra == 'all'
249
+ - uvicorn[standard]>=0.12.0 ; extra == 'all'
250
+ - pydantic-settings>=2.0.0 ; extra == 'all'
251
+ - pydantic-extra-types>=2.0.0 ; extra == 'all'
252
+ requires_python: '>=3.8'
253
+ - pypi: https://files.pythonhosted.org/packages/53/5d/65f40bd333463b3230b3a72d93873caaf49b0cbb5228598fafb75fcc5357/ffmpy-0.5.0-py3-none-any.whl
254
+ name: ffmpy
255
+ version: 0.5.0
256
+ sha256: df3799cf5816daa56d4959a023630ee53c6768b66009dae6d131519ba4b80233
257
+ requires_python: '>=3.8,<4.0'
258
+ - pypi: https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl
259
+ name: filelock
260
+ version: 3.18.0
261
+ sha256: c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de
262
+ requires_dist:
263
+ - furo>=2024.8.6 ; extra == 'docs'
264
+ - sphinx-autodoc-typehints>=3 ; extra == 'docs'
265
+ - sphinx>=8.1.3 ; extra == 'docs'
266
+ - covdefaults>=2.3 ; extra == 'testing'
267
+ - coverage>=7.6.10 ; extra == 'testing'
268
+ - diff-cover>=9.2.1 ; extra == 'testing'
269
+ - pytest-asyncio>=0.25.2 ; extra == 'testing'
270
+ - pytest-cov>=6 ; extra == 'testing'
271
+ - pytest-mock>=3.14 ; extra == 'testing'
272
+ - pytest-timeout>=2.3.1 ; extra == 'testing'
273
+ - pytest>=8.3.4 ; extra == 'testing'
274
+ - virtualenv>=20.28.1 ; extra == 'testing'
275
+ - typing-extensions>=4.12.2 ; python_full_version < '3.11' and extra == 'typing'
276
+ requires_python: '>=3.9'
277
+ - pypi: .
278
+ name: final-assignment-template
279
+ version: 0.1.0
280
+ sha256: a05c68e03552cf851f097ff5f9e3403a789313efb75704b90c26bf2d87409030
281
+ requires_dist:
282
+ - smolagents>=1.14.0,<2
283
+ - gradio>=5.27.1,<6
284
+ - requests>=2.32.3,<3
285
+ - httpx>=0.28.1,<0.29
286
+ - beautifulsoup4>=4.13.4,<5
287
+ requires_python: '>=3.11'
288
+ editable: true
289
+ - pypi: https://files.pythonhosted.org/packages/44/4b/e0cfc1a6f17e990f3e64b7d941ddc4acdc7b19d6edd51abf495f32b1a9e4/fsspec-2025.3.2-py3-none-any.whl
290
+ name: fsspec
291
+ version: 2025.3.2
292
+ sha256: 2daf8dc3d1dfa65b6aa37748d112773a7a08416f6c70d96b264c96476ecaf711
293
+ requires_dist:
294
+ - adlfs ; extra == 'abfs'
295
+ - adlfs ; extra == 'adl'
296
+ - pyarrow>=1 ; extra == 'arrow'
297
+ - dask ; extra == 'dask'
298
+ - distributed ; extra == 'dask'
299
+ - pre-commit ; extra == 'dev'
300
+ - ruff ; extra == 'dev'
301
+ - numpydoc ; extra == 'doc'
302
+ - sphinx ; extra == 'doc'
303
+ - sphinx-design ; extra == 'doc'
304
+ - sphinx-rtd-theme ; extra == 'doc'
305
+ - yarl ; extra == 'doc'
306
+ - dropbox ; extra == 'dropbox'
307
+ - dropboxdrivefs ; extra == 'dropbox'
308
+ - requests ; extra == 'dropbox'
309
+ - adlfs ; extra == 'full'
310
+ - aiohttp!=4.0.0a0,!=4.0.0a1 ; extra == 'full'
311
+ - dask ; extra == 'full'
312
+ - distributed ; extra == 'full'
313
+ - dropbox ; extra == 'full'
314
+ - dropboxdrivefs ; extra == 'full'
315
+ - fusepy ; extra == 'full'
316
+ - gcsfs ; extra == 'full'
317
+ - libarchive-c ; extra == 'full'
318
+ - ocifs ; extra == 'full'
319
+ - panel ; extra == 'full'
320
+ - paramiko ; extra == 'full'
321
+ - pyarrow>=1 ; extra == 'full'
322
+ - pygit2 ; extra == 'full'
323
+ - requests ; extra == 'full'
324
+ - s3fs ; extra == 'full'
325
+ - smbprotocol ; extra == 'full'
326
+ - tqdm ; extra == 'full'
327
+ - fusepy ; extra == 'fuse'
328
+ - gcsfs ; extra == 'gcs'
329
+ - pygit2 ; extra == 'git'
330
+ - requests ; extra == 'github'
331
+ - gcsfs ; extra == 'gs'
332
+ - panel ; extra == 'gui'
333
+ - pyarrow>=1 ; extra == 'hdfs'
334
+ - aiohttp!=4.0.0a0,!=4.0.0a1 ; extra == 'http'
335
+ - libarchive-c ; extra == 'libarchive'
336
+ - ocifs ; extra == 'oci'
337
+ - s3fs ; extra == 's3'
338
+ - paramiko ; extra == 'sftp'
339
+ - smbprotocol ; extra == 'smb'
340
+ - paramiko ; extra == 'ssh'
341
+ - aiohttp!=4.0.0a0,!=4.0.0a1 ; extra == 'test'
342
+ - numpy ; extra == 'test'
343
+ - pytest ; extra == 'test'
344
+ - pytest-asyncio!=0.22.0 ; extra == 'test'
345
+ - pytest-benchmark ; extra == 'test'
346
+ - pytest-cov ; extra == 'test'
347
+ - pytest-mock ; extra == 'test'
348
+ - pytest-recording ; extra == 'test'
349
+ - pytest-rerunfailures ; extra == 'test'
350
+ - requests ; extra == 'test'
351
+ - aiobotocore>=2.5.4,<3.0.0 ; extra == 'test-downstream'
352
+ - dask[dataframe,test] ; extra == 'test-downstream'
353
+ - moto[server]>4,<5 ; extra == 'test-downstream'
354
+ - pytest-timeout ; extra == 'test-downstream'
355
+ - xarray ; extra == 'test-downstream'
356
+ - adlfs ; extra == 'test-full'
357
+ - aiohttp!=4.0.0a0,!=4.0.0a1 ; extra == 'test-full'
358
+ - cloudpickle ; extra == 'test-full'
359
+ - dask ; extra == 'test-full'
360
+ - distributed ; extra == 'test-full'
361
+ - dropbox ; extra == 'test-full'
362
+ - dropboxdrivefs ; extra == 'test-full'
363
+ - fastparquet ; extra == 'test-full'
364
+ - fusepy ; extra == 'test-full'
365
+ - gcsfs ; extra == 'test-full'
366
+ - jinja2 ; extra == 'test-full'
367
+ - kerchunk ; extra == 'test-full'
368
+ - libarchive-c ; extra == 'test-full'
369
+ - lz4 ; extra == 'test-full'
370
+ - notebook ; extra == 'test-full'
371
+ - numpy ; extra == 'test-full'
372
+ - ocifs ; extra == 'test-full'
373
+ - pandas ; extra == 'test-full'
374
+ - panel ; extra == 'test-full'
375
+ - paramiko ; extra == 'test-full'
376
+ - pyarrow ; extra == 'test-full'
377
+ - pyarrow>=1 ; extra == 'test-full'
378
+ - pyftpdlib ; extra == 'test-full'
379
+ - pygit2 ; extra == 'test-full'
380
+ - pytest ; extra == 'test-full'
381
+ - pytest-asyncio!=0.22.0 ; extra == 'test-full'
382
+ - pytest-benchmark ; extra == 'test-full'
383
+ - pytest-cov ; extra == 'test-full'
384
+ - pytest-mock ; extra == 'test-full'
385
+ - pytest-recording ; extra == 'test-full'
386
+ - pytest-rerunfailures ; extra == 'test-full'
387
+ - python-snappy ; extra == 'test-full'
388
+ - requests ; extra == 'test-full'
389
+ - smbprotocol ; extra == 'test-full'
390
+ - tqdm ; extra == 'test-full'
391
+ - urllib3 ; extra == 'test-full'
392
+ - zarr ; extra == 'test-full'
393
+ - zstandard ; extra == 'test-full'
394
+ - tqdm ; extra == 'tqdm'
395
+ requires_python: '>=3.9'
396
+ - pypi: https://files.pythonhosted.org/packages/c2/81/c02b50e8cf0e82a1ec284ee413f377fb755d93fdc9e9d3eba2400c321117/gradio-5.27.1-py3-none-any.whl
397
+ name: gradio
398
+ version: 5.27.1
399
+ sha256: b13c621a445e7d3fe688e7ecf0481329c309eaac59c842cb598420bdf4188a0e
400
+ requires_dist:
401
+ - aiofiles>=22.0,<25.0
402
+ - anyio>=3.0,<5.0
403
+ - audioop-lts<1.0 ; python_full_version >= '3.13'
404
+ - fastapi>=0.115.2,<1.0
405
+ - ffmpy
406
+ - gradio-client==1.9.1
407
+ - groovy~=0.1
408
+ - httpx>=0.24.1
409
+ - huggingface-hub>=0.28.1
410
+ - jinja2<4.0
411
+ - markupsafe>=2.0,<4.0
412
+ - numpy>=1.0,<3.0
413
+ - orjson~=3.0
414
+ - packaging
415
+ - pandas>=1.0,<3.0
416
+ - pillow>=8.0,<12.0
417
+ - pydantic>=2.0,<2.12
418
+ - pydub
419
+ - python-multipart>=0.0.18
420
+ - pyyaml>=5.0,<7.0
421
+ - ruff>=0.9.3 ; sys_platform != 'emscripten'
422
+ - safehttpx>=0.1.6,<0.2.0
423
+ - semantic-version~=2.0
424
+ - starlette>=0.40.0,<1.0 ; sys_platform != 'emscripten'
425
+ - tomlkit>=0.12.0,<0.14.0
426
+ - typer>=0.12,<1.0 ; sys_platform != 'emscripten'
427
+ - typing-extensions~=4.0
428
+ - urllib3~=2.0 ; sys_platform == 'emscripten'
429
+ - uvicorn>=0.14.0 ; sys_platform != 'emscripten'
430
+ - authlib ; extra == 'oauth'
431
+ - itsdangerous ; extra == 'oauth'
432
+ requires_python: '>=3.10'
433
+ - pypi: https://files.pythonhosted.org/packages/7f/8a/46f40c96306abf6c9be48ac826425711a9b005fbc8cd6edc1661fd5d85ac/gradio_client-1.9.1-py3-none-any.whl
434
+ name: gradio-client
435
+ version: 1.9.1
436
+ sha256: 1db4ccc5777f987c5c4e4b5b13d67ebe1f4514de526fbf9619abe69c55aeac8a
437
+ requires_dist:
438
+ - fsspec
439
+ - httpx>=0.24.1
440
+ - huggingface-hub>=0.19.3
441
+ - packaging
442
+ - typing-extensions~=4.0
443
+ - websockets>=10.0,<16.0
444
+ requires_python: '>=3.10'
445
+ - pypi: https://files.pythonhosted.org/packages/28/27/3d6dcadc8a3214d8522c1e7f6a19554e33659be44546d44a2f7572ac7d2a/groovy-0.1.2-py3-none-any.whl
446
+ name: groovy
447
+ version: 0.1.2
448
+ sha256: 7f7975bab18c729a257a8b1ae9dcd70b7cafb1720481beae47719af57c35fa64
449
+ requires_dist:
450
+ - pytest ; extra == 'dev'
451
+ - ruff==0.9.3 ; extra == 'dev'
452
+ requires_python: '>3.9'
453
+ - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl
454
+ name: h11
455
+ version: 0.16.0
456
+ sha256: 63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86
457
+ requires_python: '>=3.8'
458
+ - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl
459
+ name: httpcore
460
+ version: 1.0.9
461
+ sha256: 2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55
462
+ requires_dist:
463
+ - certifi
464
+ - h11>=0.16
465
+ - anyio>=4.0,<5.0 ; extra == 'asyncio'
466
+ - h2>=3,<5 ; extra == 'http2'
467
+ - socksio==1.* ; extra == 'socks'
468
+ - trio>=0.22.0,<1.0 ; extra == 'trio'
469
+ requires_python: '>=3.8'
470
+ - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl
471
+ name: httpx
472
+ version: 0.28.1
473
+ sha256: d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad
474
+ requires_dist:
475
+ - anyio
476
+ - certifi
477
+ - httpcore==1.*
478
+ - idna
479
+ - brotli ; platform_python_implementation == 'CPython' and extra == 'brotli'
480
+ - brotlicffi ; platform_python_implementation != 'CPython' and extra == 'brotli'
481
+ - click==8.* ; extra == 'cli'
482
+ - pygments==2.* ; extra == 'cli'
483
+ - rich>=10,<14 ; extra == 'cli'
484
+ - h2>=3,<5 ; extra == 'http2'
485
+ - socksio==1.* ; extra == 'socks'
486
+ - zstandard>=0.18.0 ; extra == 'zstd'
487
+ requires_python: '>=3.8'
488
+ - pypi: https://files.pythonhosted.org/packages/93/27/1fb384a841e9661faad1c31cbfa62864f59632e876df5d795234da51c395/huggingface_hub-0.30.2-py3-none-any.whl
489
+ name: huggingface-hub
490
+ version: 0.30.2
491
+ sha256: 68ff05969927058cfa41df4f2155d4bb48f5f54f719dd0390103eefa9b191e28
492
+ requires_dist:
493
+ - filelock
494
+ - fsspec>=2023.5.0
495
+ - packaging>=20.9
496
+ - pyyaml>=5.1
497
+ - requests
498
+ - tqdm>=4.42.1
499
+ - typing-extensions>=3.7.4.3
500
+ - inquirerpy==0.3.4 ; extra == 'all'
501
+ - aiohttp ; extra == 'all'
502
+ - jedi ; extra == 'all'
503
+ - jinja2 ; extra == 'all'
504
+ - pytest>=8.1.1,<8.2.2 ; extra == 'all'
505
+ - pytest-cov ; extra == 'all'
506
+ - pytest-env ; extra == 'all'
507
+ - pytest-xdist ; extra == 'all'
508
+ - pytest-vcr ; extra == 'all'
509
+ - pytest-asyncio ; extra == 'all'
510
+ - pytest-rerunfailures ; extra == 'all'
511
+ - pytest-mock ; extra == 'all'
512
+ - urllib3<2.0 ; extra == 'all'
513
+ - soundfile ; extra == 'all'
514
+ - pillow ; extra == 'all'
515
+ - gradio>=4.0.0 ; extra == 'all'
516
+ - numpy ; extra == 'all'
517
+ - fastapi ; extra == 'all'
518
+ - ruff>=0.9.0 ; extra == 'all'
519
+ - mypy==1.5.1 ; extra == 'all'
520
+ - libcst==1.4.0 ; extra == 'all'
521
+ - typing-extensions>=4.8.0 ; extra == 'all'
522
+ - types-pyyaml ; extra == 'all'
523
+ - types-requests ; extra == 'all'
524
+ - types-simplejson ; extra == 'all'
525
+ - types-toml ; extra == 'all'
526
+ - types-tqdm ; extra == 'all'
527
+ - types-urllib3 ; extra == 'all'
528
+ - inquirerpy==0.3.4 ; extra == 'cli'
529
+ - inquirerpy==0.3.4 ; extra == 'dev'
530
+ - aiohttp ; extra == 'dev'
531
+ - jedi ; extra == 'dev'
532
+ - jinja2 ; extra == 'dev'
533
+ - pytest>=8.1.1,<8.2.2 ; extra == 'dev'
534
+ - pytest-cov ; extra == 'dev'
535
+ - pytest-env ; extra == 'dev'
536
+ - pytest-xdist ; extra == 'dev'
537
+ - pytest-vcr ; extra == 'dev'
538
+ - pytest-asyncio ; extra == 'dev'
539
+ - pytest-rerunfailures ; extra == 'dev'
540
+ - pytest-mock ; extra == 'dev'
541
+ - urllib3<2.0 ; extra == 'dev'
542
+ - soundfile ; extra == 'dev'
543
+ - pillow ; extra == 'dev'
544
+ - gradio>=4.0.0 ; extra == 'dev'
545
+ - numpy ; extra == 'dev'
546
+ - fastapi ; extra == 'dev'
547
+ - ruff>=0.9.0 ; extra == 'dev'
548
+ - mypy==1.5.1 ; extra == 'dev'
549
+ - libcst==1.4.0 ; extra == 'dev'
550
+ - typing-extensions>=4.8.0 ; extra == 'dev'
551
+ - types-pyyaml ; extra == 'dev'
552
+ - types-requests ; extra == 'dev'
553
+ - types-simplejson ; extra == 'dev'
554
+ - types-toml ; extra == 'dev'
555
+ - types-tqdm ; extra == 'dev'
556
+ - types-urllib3 ; extra == 'dev'
557
+ - toml ; extra == 'fastai'
558
+ - fastai>=2.4 ; extra == 'fastai'
559
+ - fastcore>=1.3.27 ; extra == 'fastai'
560
+ - hf-transfer>=0.1.4 ; extra == 'hf-transfer'
561
+ - hf-xet>=0.1.4 ; extra == 'hf-xet'
562
+ - aiohttp ; extra == 'inference'
563
+ - ruff>=0.9.0 ; extra == 'quality'
564
+ - mypy==1.5.1 ; extra == 'quality'
565
+ - libcst==1.4.0 ; extra == 'quality'
566
+ - tensorflow ; extra == 'tensorflow'
567
+ - pydot ; extra == 'tensorflow'
568
+ - graphviz ; extra == 'tensorflow'
569
+ - tensorflow ; extra == 'tensorflow-testing'
570
+ - keras<3.0 ; extra == 'tensorflow-testing'
571
+ - inquirerpy==0.3.4 ; extra == 'testing'
572
+ - aiohttp ; extra == 'testing'
573
+ - jedi ; extra == 'testing'
574
+ - jinja2 ; extra == 'testing'
575
+ - pytest>=8.1.1,<8.2.2 ; extra == 'testing'
576
+ - pytest-cov ; extra == 'testing'
577
+ - pytest-env ; extra == 'testing'
578
+ - pytest-xdist ; extra == 'testing'
579
+ - pytest-vcr ; extra == 'testing'
580
+ - pytest-asyncio ; extra == 'testing'
581
+ - pytest-rerunfailures ; extra == 'testing'
582
+ - pytest-mock ; extra == 'testing'
583
+ - urllib3<2.0 ; extra == 'testing'
584
+ - soundfile ; extra == 'testing'
585
+ - pillow ; extra == 'testing'
586
+ - gradio>=4.0.0 ; extra == 'testing'
587
+ - numpy ; extra == 'testing'
588
+ - fastapi ; extra == 'testing'
589
+ - torch ; extra == 'torch'
590
+ - safetensors[torch] ; extra == 'torch'
591
+ - typing-extensions>=4.8.0 ; extra == 'typing'
592
+ - types-pyyaml ; extra == 'typing'
593
+ - types-requests ; extra == 'typing'
594
+ - types-simplejson ; extra == 'typing'
595
+ - types-toml ; extra == 'typing'
596
+ - types-tqdm ; extra == 'typing'
597
+ - types-urllib3 ; extra == 'typing'
598
+ requires_python: '>=3.8.0'
599
+ - pypi: https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl
600
+ name: idna
601
+ version: '3.10'
602
+ sha256: 946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3
603
+ requires_dist:
604
+ - ruff>=0.6.2 ; extra == 'all'
605
+ - mypy>=1.11.2 ; extra == 'all'
606
+ - pytest>=8.3.2 ; extra == 'all'
607
+ - flake8>=7.1.1 ; extra == 'all'
608
+ requires_python: '>=3.6'
609
+ - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl
610
+ name: jinja2
611
+ version: 3.1.6
612
+ sha256: 85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67
613
+ requires_dist:
614
+ - markupsafe>=2.0
615
+ - babel>=2.7 ; extra == 'i18n'
616
+ requires_python: '>=3.7'
617
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_4.conda
618
+ sha256: db73f38155d901a610b2320525b9dd3b31e4949215c870685fd92ea61b5ce472
619
+ md5: 01f8d123c96816249efd255a31ad7712
620
+ depends:
621
+ - __glibc >=2.17,<3.0.a0
622
+ constrains:
623
+ - binutils_impl_linux-64 2.43
624
+ license: GPL-3.0-only
625
+ license_family: GPL
626
+ purls: []
627
+ size: 671240
628
+ timestamp: 1740155456116
629
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.0-h5888daf_0.conda
630
+ sha256: 33ab03438aee65d6aa667cf7d90c91e5e7d734c19a67aa4c7040742c0a13d505
631
+ md5: db0bfbe7dd197b68ad5f30333bae6ce0
632
+ depends:
633
+ - __glibc >=2.17,<3.0.a0
634
+ - libgcc >=13
635
+ constrains:
636
+ - expat 2.7.0.*
637
+ license: MIT
638
+ license_family: MIT
639
+ purls: []
640
+ size: 74427
641
+ timestamp: 1743431794976
642
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda
643
+ sha256: 764432d32db45466e87f10621db5b74363a9f847d2b8b1f9743746cd160f06ab
644
+ md5: ede4673863426c0883c0063d853bbd85
645
+ depends:
646
+ - __glibc >=2.17,<3.0.a0
647
+ - libgcc >=13
648
+ license: MIT
649
+ license_family: MIT
650
+ purls: []
651
+ size: 57433
652
+ timestamp: 1743434498161
653
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h767d61c_2.conda
654
+ sha256: 3a572d031cb86deb541d15c1875aaa097baefc0c580b54dc61f5edab99215792
655
+ md5: ef504d1acbd74b7cc6849ef8af47dd03
656
+ depends:
657
+ - __glibc >=2.17,<3.0.a0
658
+ - _openmp_mutex >=4.5
659
+ constrains:
660
+ - libgomp 14.2.0 h767d61c_2
661
+ - libgcc-ng ==14.2.0=*_2
662
+ license: GPL-3.0-only WITH GCC-exception-3.1
663
+ license_family: GPL
664
+ purls: []
665
+ size: 847885
666
+ timestamp: 1740240653082
667
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_2.conda
668
+ sha256: fb7558c328b38b2f9d2e412c48da7890e7721ba018d733ebdfea57280df01904
669
+ md5: a2222a6ada71fb478682efe483ce0f92
670
+ depends:
671
+ - libgcc 14.2.0 h767d61c_2
672
+ license: GPL-3.0-only WITH GCC-exception-3.1
673
+ license_family: GPL
674
+ purls: []
675
+ size: 53758
676
+ timestamp: 1740240660904
677
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h767d61c_2.conda
678
+ sha256: 1a3130e0b9267e781b89399580f3163632d59fe5b0142900d63052ab1a53490e
679
+ md5: 06d02030237f4d5b3d9a7e7d348fe3c6
680
+ depends:
681
+ - __glibc >=2.17,<3.0.a0
682
+ license: GPL-3.0-only WITH GCC-exception-3.1
683
+ license_family: GPL
684
+ purls: []
685
+ size: 459862
686
+ timestamp: 1740240588123
687
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_0.conda
688
+ sha256: f4f21dfc54b08d462f707b771ecce3fa9bc702a2a05b55654f64154f48b141ef
689
+ md5: 0e87378639676987af32fee53ba32258
690
+ depends:
691
+ - __glibc >=2.17,<3.0.a0
692
+ - libgcc >=13
693
+ license: 0BSD
694
+ purls: []
695
+ size: 112709
696
+ timestamp: 1743771086123
697
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-h4bc722e_0.conda
698
+ sha256: d02d1d3304ecaf5c728e515eb7416517a0b118200cd5eacbe829c432d1664070
699
+ md5: aeb98fdeb2e8f25d43ef71fbacbeec80
700
+ depends:
701
+ - __glibc >=2.17,<3.0.a0
702
+ - libgcc-ng >=12
703
+ license: BSD-2-Clause
704
+ license_family: BSD
705
+ purls: []
706
+ size: 89991
707
+ timestamp: 1723817448345
708
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.49.1-hee588c1_2.conda
709
+ sha256: a086289bf75c33adc1daed3f1422024504ffb5c3c8b3285c49f025c29708ed16
710
+ md5: 962d6ac93c30b1dfc54c9cccafd1003e
711
+ depends:
712
+ - __glibc >=2.17,<3.0.a0
713
+ - libgcc >=13
714
+ - libzlib >=1.3.1,<2.0a0
715
+ license: Unlicense
716
+ purls: []
717
+ size: 918664
718
+ timestamp: 1742083674731
719
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda
720
+ sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18
721
+ md5: 40b61aab5c7ba9ff276c41cfffe6b80b
722
+ depends:
723
+ - libgcc-ng >=12
724
+ license: BSD-3-Clause
725
+ license_family: BSD
726
+ purls: []
727
+ size: 33601
728
+ timestamp: 1680112270483
729
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda
730
+ sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4
731
+ md5: edb0dca6bc32e4f4789199455a1dbeb8
732
+ depends:
733
+ - __glibc >=2.17,<3.0.a0
734
+ - libgcc >=13
735
+ constrains:
736
+ - zlib 1.3.1 *_2
737
+ license: Zlib
738
+ license_family: Other
739
+ purls: []
740
+ size: 60963
741
+ timestamp: 1727963148474
742
+ - pypi: https://files.pythonhosted.org/packages/2f/04/6ef935dc74e729932e39478e44d8cfe6a83550552eaa072b7c05f6f22488/lxml-5.4.0-cp313-cp313-manylinux_2_28_x86_64.whl
743
+ name: lxml
744
+ version: 5.4.0
745
+ sha256: 1a42b3a19346e5601d1b8296ff6ef3d76038058f311902edd574461e9c036982
746
+ requires_dist:
747
+ - cython>=3.0.11,<3.1.0 ; extra == 'source'
748
+ - cssselect>=0.7 ; extra == 'cssselect'
749
+ - html5lib ; extra == 'html5'
750
+ - beautifulsoup4 ; extra == 'htmlsoup'
751
+ - lxml-html-clean ; extra == 'html-clean'
752
+ requires_python: '>=3.6'
753
+ - pypi: https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl
754
+ name: markdown-it-py
755
+ version: 3.0.0
756
+ sha256: 355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1
757
+ requires_dist:
758
+ - mdurl~=0.1
759
+ - psutil ; extra == 'benchmarking'
760
+ - pytest ; extra == 'benchmarking'
761
+ - pytest-benchmark ; extra == 'benchmarking'
762
+ - pre-commit~=3.0 ; extra == 'code-style'
763
+ - commonmark~=0.9 ; extra == 'compare'
764
+ - markdown~=3.4 ; extra == 'compare'
765
+ - mistletoe~=1.0 ; extra == 'compare'
766
+ - mistune~=2.0 ; extra == 'compare'
767
+ - panflute~=2.3 ; extra == 'compare'
768
+ - linkify-it-py>=1,<3 ; extra == 'linkify'
769
+ - mdit-py-plugins ; extra == 'plugins'
770
+ - gprof2dot ; extra == 'profiling'
771
+ - mdit-py-plugins ; extra == 'rtd'
772
+ - myst-parser ; extra == 'rtd'
773
+ - pyyaml ; extra == 'rtd'
774
+ - sphinx ; extra == 'rtd'
775
+ - sphinx-copybutton ; extra == 'rtd'
776
+ - sphinx-design ; extra == 'rtd'
777
+ - sphinx-book-theme ; extra == 'rtd'
778
+ - jupyter-sphinx ; extra == 'rtd'
779
+ - coverage ; extra == 'testing'
780
+ - pytest ; extra == 'testing'
781
+ - pytest-cov ; extra == 'testing'
782
+ - pytest-regressions ; extra == 'testing'
783
+ requires_python: '>=3.8'
784
+ - pypi: https://files.pythonhosted.org/packages/64/11/b751af7ad41b254a802cf52f7bc1fca7cabe2388132f2ce60a1a6b9b9622/markdownify-1.1.0-py3-none-any.whl
785
+ name: markdownify
786
+ version: 1.1.0
787
+ sha256: 32a5a08e9af02c8a6528942224c91b933b4bd2c7d078f9012943776fc313eeef
788
+ requires_dist:
789
+ - beautifulsoup4>=4.9,<5
790
+ - six>=1.15,<2
791
+ - pypi: https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
792
+ name: markupsafe
793
+ version: 3.0.2
794
+ sha256: 15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396
795
+ requires_python: '>=3.9'
796
+ - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl
797
+ name: mdurl
798
+ version: 0.1.2
799
+ sha256: 84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8
800
+ requires_python: '>=3.7'
801
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda
802
+ sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586
803
+ md5: 47e340acb35de30501a76c7c799c41d7
804
+ depends:
805
+ - __glibc >=2.17,<3.0.a0
806
+ - libgcc >=13
807
+ license: X11 AND BSD-3-Clause
808
+ purls: []
809
+ size: 891641
810
+ timestamp: 1738195959188
811
+ - pypi: https://files.pythonhosted.org/packages/aa/fc/ebfd32c3e124e6a1043e19c0ab0769818aa69050ce5589b63d05ff185526/numpy-2.2.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
812
+ name: numpy
813
+ version: 2.2.5
814
+ sha256: 2ba321813a00e508d5421104464510cc962a6f791aa2fca1c97b1e65027da80d
815
+ requires_python: '>=3.10'
816
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.0-h7b32b05_0.conda
817
+ sha256: 38285d280f84f1755b7c54baf17eccf2e3e696287954ce0adca16546b85ee62c
818
+ md5: bb539841f2a3fde210f387d00ed4bb9d
819
+ depends:
820
+ - __glibc >=2.17,<3.0.a0
821
+ - ca-certificates
822
+ - libgcc >=13
823
+ license: Apache-2.0
824
+ license_family: Apache
825
+ purls: []
826
+ size: 3121673
827
+ timestamp: 1744132167438
828
+ - pypi: https://files.pythonhosted.org/packages/d1/d0/e9e38aff63e1d7bbcb818e6f8d4df1056b7f8aeb3b660370e0d41dbc394c/orjson-3.10.17-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
829
+ name: orjson
830
+ version: 3.10.17
831
+ sha256: 3af3e11abf8bd77a2b82863eeedd847c694fd64a4f9cb6b1644015a5aef44b84
832
+ requires_python: '>=3.9'
833
+ - pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl
834
+ name: packaging
835
+ version: '25.0'
836
+ sha256: 29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484
837
+ requires_python: '>=3.8'
838
+ - pypi: https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
839
+ name: pandas
840
+ version: 2.2.3
841
+ sha256: f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24
842
+ requires_dist:
843
+ - numpy>=1.22.4 ; python_full_version < '3.11'
844
+ - numpy>=1.23.2 ; python_full_version == '3.11.*'
845
+ - numpy>=1.26.0 ; python_full_version >= '3.12'
846
+ - python-dateutil>=2.8.2
847
+ - pytz>=2020.1
848
+ - tzdata>=2022.7
849
+ - hypothesis>=6.46.1 ; extra == 'test'
850
+ - pytest>=7.3.2 ; extra == 'test'
851
+ - pytest-xdist>=2.2.0 ; extra == 'test'
852
+ - pyarrow>=10.0.1 ; extra == 'pyarrow'
853
+ - bottleneck>=1.3.6 ; extra == 'performance'
854
+ - numba>=0.56.4 ; extra == 'performance'
855
+ - numexpr>=2.8.4 ; extra == 'performance'
856
+ - scipy>=1.10.0 ; extra == 'computation'
857
+ - xarray>=2022.12.0 ; extra == 'computation'
858
+ - fsspec>=2022.11.0 ; extra == 'fss'
859
+ - s3fs>=2022.11.0 ; extra == 'aws'
860
+ - gcsfs>=2022.11.0 ; extra == 'gcp'
861
+ - pandas-gbq>=0.19.0 ; extra == 'gcp'
862
+ - odfpy>=1.4.1 ; extra == 'excel'
863
+ - openpyxl>=3.1.0 ; extra == 'excel'
864
+ - python-calamine>=0.1.7 ; extra == 'excel'
865
+ - pyxlsb>=1.0.10 ; extra == 'excel'
866
+ - xlrd>=2.0.1 ; extra == 'excel'
867
+ - xlsxwriter>=3.0.5 ; extra == 'excel'
868
+ - pyarrow>=10.0.1 ; extra == 'parquet'
869
+ - pyarrow>=10.0.1 ; extra == 'feather'
870
+ - tables>=3.8.0 ; extra == 'hdf5'
871
+ - pyreadstat>=1.2.0 ; extra == 'spss'
872
+ - sqlalchemy>=2.0.0 ; extra == 'postgresql'
873
+ - psycopg2>=2.9.6 ; extra == 'postgresql'
874
+ - adbc-driver-postgresql>=0.8.0 ; extra == 'postgresql'
875
+ - sqlalchemy>=2.0.0 ; extra == 'mysql'
876
+ - pymysql>=1.0.2 ; extra == 'mysql'
877
+ - sqlalchemy>=2.0.0 ; extra == 'sql-other'
878
+ - adbc-driver-postgresql>=0.8.0 ; extra == 'sql-other'
879
+ - adbc-driver-sqlite>=0.8.0 ; extra == 'sql-other'
880
+ - beautifulsoup4>=4.11.2 ; extra == 'html'
881
+ - html5lib>=1.1 ; extra == 'html'
882
+ - lxml>=4.9.2 ; extra == 'html'
883
+ - lxml>=4.9.2 ; extra == 'xml'
884
+ - matplotlib>=3.6.3 ; extra == 'plot'
885
+ - jinja2>=3.1.2 ; extra == 'output-formatting'
886
+ - tabulate>=0.9.0 ; extra == 'output-formatting'
887
+ - pyqt5>=5.15.9 ; extra == 'clipboard'
888
+ - qtpy>=2.3.0 ; extra == 'clipboard'
889
+ - zstandard>=0.19.0 ; extra == 'compression'
890
+ - dataframe-api-compat>=0.1.7 ; extra == 'consortium-standard'
891
+ - adbc-driver-postgresql>=0.8.0 ; extra == 'all'
892
+ - adbc-driver-sqlite>=0.8.0 ; extra == 'all'
893
+ - beautifulsoup4>=4.11.2 ; extra == 'all'
894
+ - bottleneck>=1.3.6 ; extra == 'all'
895
+ - dataframe-api-compat>=0.1.7 ; extra == 'all'
896
+ - fastparquet>=2022.12.0 ; extra == 'all'
897
+ - fsspec>=2022.11.0 ; extra == 'all'
898
+ - gcsfs>=2022.11.0 ; extra == 'all'
899
+ - html5lib>=1.1 ; extra == 'all'
900
+ - hypothesis>=6.46.1 ; extra == 'all'
901
+ - jinja2>=3.1.2 ; extra == 'all'
902
+ - lxml>=4.9.2 ; extra == 'all'
903
+ - matplotlib>=3.6.3 ; extra == 'all'
904
+ - numba>=0.56.4 ; extra == 'all'
905
+ - numexpr>=2.8.4 ; extra == 'all'
906
+ - odfpy>=1.4.1 ; extra == 'all'
907
+ - openpyxl>=3.1.0 ; extra == 'all'
908
+ - pandas-gbq>=0.19.0 ; extra == 'all'
909
+ - psycopg2>=2.9.6 ; extra == 'all'
910
+ - pyarrow>=10.0.1 ; extra == 'all'
911
+ - pymysql>=1.0.2 ; extra == 'all'
912
+ - pyqt5>=5.15.9 ; extra == 'all'
913
+ - pyreadstat>=1.2.0 ; extra == 'all'
914
+ - pytest>=7.3.2 ; extra == 'all'
915
+ - pytest-xdist>=2.2.0 ; extra == 'all'
916
+ - python-calamine>=0.1.7 ; extra == 'all'
917
+ - pyxlsb>=1.0.10 ; extra == 'all'
918
+ - qtpy>=2.3.0 ; extra == 'all'
919
+ - scipy>=1.10.0 ; extra == 'all'
920
+ - s3fs>=2022.11.0 ; extra == 'all'
921
+ - sqlalchemy>=2.0.0 ; extra == 'all'
922
+ - tables>=3.8.0 ; extra == 'all'
923
+ - tabulate>=0.9.0 ; extra == 'all'
924
+ - xarray>=2022.12.0 ; extra == 'all'
925
+ - xlrd>=2.0.1 ; extra == 'all'
926
+ - xlsxwriter>=3.0.5 ; extra == 'all'
927
+ - zstandard>=0.19.0 ; extra == 'all'
928
+ requires_python: '>=3.9'
929
+ - pypi: https://files.pythonhosted.org/packages/13/eb/2552ecebc0b887f539111c2cd241f538b8ff5891b8903dfe672e997529be/pillow-11.2.1-cp313-cp313-manylinux_2_28_x86_64.whl
930
+ name: pillow
931
+ version: 11.2.1
932
+ sha256: ad275964d52e2243430472fc5d2c2334b4fc3ff9c16cb0a19254e25efa03a155
933
+ requires_dist:
934
+ - furo ; extra == 'docs'
935
+ - olefile ; extra == 'docs'
936
+ - sphinx>=8.2 ; extra == 'docs'
937
+ - sphinx-copybutton ; extra == 'docs'
938
+ - sphinx-inline-tabs ; extra == 'docs'
939
+ - sphinxext-opengraph ; extra == 'docs'
940
+ - olefile ; extra == 'fpx'
941
+ - olefile ; extra == 'mic'
942
+ - pyarrow ; extra == 'test-arrow'
943
+ - check-manifest ; extra == 'tests'
944
+ - coverage>=7.4.2 ; extra == 'tests'
945
+ - defusedxml ; extra == 'tests'
946
+ - markdown2 ; extra == 'tests'
947
+ - olefile ; extra == 'tests'
948
+ - packaging ; extra == 'tests'
949
+ - pyroma ; extra == 'tests'
950
+ - pytest ; extra == 'tests'
951
+ - pytest-cov ; extra == 'tests'
952
+ - pytest-timeout ; extra == 'tests'
953
+ - trove-classifiers>=2024.10.12 ; extra == 'tests'
954
+ - typing-extensions ; python_full_version < '3.10' and extra == 'typing'
955
+ - defusedxml ; extra == 'xmp'
956
+ requires_python: '>=3.9'
957
+ - pypi: https://files.pythonhosted.org/packages/c3/7b/cbd5d999a07ff2a21465975d4eb477ae6f69765e8fe8c9087dab250180d8/primp-0.15.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
958
+ name: primp
959
+ version: 0.15.0
960
+ sha256: c18b45c23f94016215f62d2334552224236217aaeb716871ce0e4dcfa08eb161
961
+ requires_dist:
962
+ - certifi ; extra == 'dev'
963
+ - pytest>=8.1.1 ; extra == 'dev'
964
+ - pytest-asyncio>=0.25.3 ; extra == 'dev'
965
+ - typing-extensions ; python_full_version < '3.12' and extra == 'dev'
966
+ - mypy>=1.14.1 ; extra == 'dev'
967
+ - ruff>=0.9.2 ; extra == 'dev'
968
+ requires_python: '>=3.8'
969
+ - pypi: https://files.pythonhosted.org/packages/e7/12/46b65f3534d099349e38ef6ec98b1a5a81f42536d17e0ba382c28c67ba67/pydantic-2.11.4-py3-none-any.whl
970
+ name: pydantic
971
+ version: 2.11.4
972
+ sha256: d9615eaa9ac5a063471da949c8fc16376a84afb5024688b3ff885693506764eb
973
+ requires_dist:
974
+ - annotated-types>=0.6.0
975
+ - pydantic-core==2.33.2
976
+ - typing-extensions>=4.12.2
977
+ - typing-inspection>=0.4.0
978
+ - email-validator>=2.0.0 ; extra == 'email'
979
+ - tzdata ; python_full_version >= '3.9' and sys_platform == 'win32' and extra == 'timezone'
980
+ requires_python: '>=3.9'
981
+ - pypi: https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
982
+ name: pydantic-core
983
+ version: 2.33.2
984
+ sha256: 9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d
985
+ requires_dist:
986
+ - typing-extensions>=4.6.0,!=4.7.0
987
+ requires_python: '>=3.9'
988
+ - pypi: https://files.pythonhosted.org/packages/a6/53/d78dc063216e62fc55f6b2eebb447f6a4b0a59f55c8406376f76bf959b08/pydub-0.25.1-py2.py3-none-any.whl
989
+ name: pydub
990
+ version: 0.25.1
991
+ sha256: 65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6
992
+ - pypi: https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl
993
+ name: pygments
994
+ version: 2.19.1
995
+ sha256: 9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c
996
+ requires_dist:
997
+ - colorama>=0.4.6 ; extra == 'windows-terminal'
998
+ requires_python: '>=3.8'
999
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.13.3-hf636f53_101_cp313.conda
1000
+ build_number: 101
1001
+ sha256: eecb11ea60f8143deeb301eab2e04d04f7acb83659bb20fdfeacd431a5f31168
1002
+ md5: 10622e12d649154af0bd76bcf33a7c5c
1003
+ depends:
1004
+ - __glibc >=2.17,<3.0.a0
1005
+ - bzip2 >=1.0.8,<2.0a0
1006
+ - ld_impl_linux-64 >=2.36.1
1007
+ - libexpat >=2.7.0,<3.0a0
1008
+ - libffi >=3.4.6,<3.5.0a0
1009
+ - libgcc >=13
1010
+ - liblzma >=5.8.1,<6.0a0
1011
+ - libmpdec >=4.0.0,<5.0a0
1012
+ - libsqlite >=3.49.1,<4.0a0
1013
+ - libuuid >=2.38.1,<3.0a0
1014
+ - libzlib >=1.3.1,<2.0a0
1015
+ - ncurses >=6.5,<7.0a0
1016
+ - openssl >=3.5.0,<4.0a0
1017
+ - python_abi 3.13.* *_cp313
1018
+ - readline >=8.2,<9.0a0
1019
+ - tk >=8.6.13,<8.7.0a0
1020
+ - tzdata
1021
+ license: Python-2.0
1022
+ purls: []
1023
+ size: 33268245
1024
+ timestamp: 1744665022734
1025
+ python_site_packages_path: lib/python3.13/site-packages
1026
+ - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl
1027
+ name: python-dateutil
1028
+ version: 2.9.0.post0
1029
+ sha256: a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427
1030
+ requires_dist:
1031
+ - six>=1.5
1032
+ requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*'
1033
+ - pypi: https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl
1034
+ name: python-dotenv
1035
+ version: 1.1.0
1036
+ sha256: d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d
1037
+ requires_dist:
1038
+ - click>=5.0 ; extra == 'cli'
1039
+ requires_python: '>=3.9'
1040
+ - pypi: https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl
1041
+ name: python-multipart
1042
+ version: 0.0.20
1043
+ sha256: 8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104
1044
+ requires_python: '>=3.8'
1045
+ - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.13-7_cp313.conda
1046
+ build_number: 7
1047
+ sha256: 0595134584589064f56e67d3de1d8fcbb673a972946bce25fb593fb092fdcd97
1048
+ md5: e84b44e6300f1703cb25d29120c5b1d8
1049
+ constrains:
1050
+ - python 3.13.* *_cp313
1051
+ license: BSD-3-Clause
1052
+ license_family: BSD
1053
+ purls: []
1054
+ size: 6988
1055
+ timestamp: 1745258852285
1056
+ - pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl
1057
+ name: pytz
1058
+ version: '2025.2'
1059
+ sha256: 5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00
1060
+ - pypi: https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
1061
+ name: pyyaml
1062
+ version: 6.0.2
1063
+ sha256: 70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5
1064
+ requires_python: '>=3.8'
1065
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda
1066
+ sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c
1067
+ md5: 283b96675859b20a825f8fa30f311446
1068
+ depends:
1069
+ - libgcc >=13
1070
+ - ncurses >=6.5,<7.0a0
1071
+ license: GPL-3.0-only
1072
+ license_family: GPL
1073
+ purls: []
1074
+ size: 282480
1075
+ timestamp: 1740379431762
1076
+ - pypi: https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl
1077
+ name: requests
1078
+ version: 2.32.3
1079
+ sha256: 70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6
1080
+ requires_dist:
1081
+ - charset-normalizer>=2,<4
1082
+ - idna>=2.5,<4
1083
+ - urllib3>=1.21.1,<3
1084
+ - certifi>=2017.4.17
1085
+ - pysocks>=1.5.6,!=1.5.7 ; extra == 'socks'
1086
+ - chardet>=3.0.2,<6 ; extra == 'use-chardet-on-py3'
1087
+ requires_python: '>=3.8'
1088
+ - pypi: https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl
1089
+ name: rich
1090
+ version: 14.0.0
1091
+ sha256: 1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0
1092
+ requires_dist:
1093
+ - ipywidgets>=7.5.1,<9 ; extra == 'jupyter'
1094
+ - markdown-it-py>=2.2.0
1095
+ - pygments>=2.13.0,<3.0.0
1096
+ - typing-extensions>=4.0.0,<5.0 ; python_full_version < '3.11'
1097
+ requires_python: '>=3.8.0'
1098
+ - pypi: https://files.pythonhosted.org/packages/0e/2c/1e364cc92970075d7d04c69c928430b23e43a433f044474f57e425cbed37/ruff-0.11.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
1099
+ name: ruff
1100
+ version: 0.11.7
1101
+ sha256: 7940665e74e7b65d427b82bffc1e46710ec7f30d58b4b2d5016e3f0321436502
1102
+ requires_python: '>=3.7'
1103
+ - pypi: https://files.pythonhosted.org/packages/4d/c0/1108ad9f01567f66b3154063605b350b69c3c9366732e09e45f9fd0d1deb/safehttpx-0.1.6-py3-none-any.whl
1104
+ name: safehttpx
1105
+ version: 0.1.6
1106
+ sha256: 407cff0b410b071623087c63dd2080c3b44dc076888d8c5823c00d1e58cb381c
1107
+ requires_dist:
1108
+ - httpx
1109
+ - pytest ; extra == 'dev'
1110
+ requires_python: '>3.9'
1111
+ - pypi: https://files.pythonhosted.org/packages/6a/23/8146aad7d88f4fcb3a6218f41a60f6c2d4e3a72de72da1825dc7c8f7877c/semantic_version-2.10.0-py2.py3-none-any.whl
1112
+ name: semantic-version
1113
+ version: 2.10.0
1114
+ sha256: de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177
1115
+ requires_dist:
1116
+ - django>=1.11 ; extra == 'dev'
1117
+ - nose2 ; extra == 'dev'
1118
+ - tox ; extra == 'dev'
1119
+ - check-manifest ; extra == 'dev'
1120
+ - coverage ; extra == 'dev'
1121
+ - flake8 ; extra == 'dev'
1122
+ - wheel ; extra == 'dev'
1123
+ - zest-releaser[recommended] ; extra == 'dev'
1124
+ - readme-renderer<25.0 ; python_full_version == '3.4.*' and extra == 'dev'
1125
+ - colorama<=0.4.1 ; python_full_version == '3.4.*' and extra == 'dev'
1126
+ - sphinx ; extra == 'doc'
1127
+ - sphinx-rtd-theme ; extra == 'doc'
1128
+ requires_python: '>=2.7'
1129
+ - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl
1130
+ name: shellingham
1131
+ version: 1.5.4
1132
+ sha256: 7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686
1133
+ requires_python: '>=3.7'
1134
+ - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl
1135
+ name: six
1136
+ version: 1.17.0
1137
+ sha256: 4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274
1138
+ requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*'
1139
+ - pypi: https://files.pythonhosted.org/packages/2f/ce/dedad549d2b37e73d14c56aef25bd42a5f87fdb8e97bf2a78cac5aac8287/smolagents-1.14.0-py3-none-any.whl
1140
+ name: smolagents
1141
+ version: 1.14.0
1142
+ sha256: 3444a5231bf395ea8c8cc39905aaa17e9ef434b7f4a03bde91b83ea08dd0a856
1143
+ requires_dist:
1144
+ - huggingface-hub>=0.28.0
1145
+ - requests>=2.32.3
1146
+ - rich>=13.9.4
1147
+ - jinja2>=3.1.4
1148
+ - pillow>=11.0.0
1149
+ - markdownify>=0.14.1
1150
+ - duckduckgo-search>=6.3.7
1151
+ - python-dotenv
1152
+ - boto3>=1.36.18 ; extra == 'bedrock'
1153
+ - torch ; extra == 'torch'
1154
+ - torchvision ; extra == 'torch'
1155
+ - numpy>=1.21.2 ; extra == 'torch'
1156
+ - soundfile ; extra == 'audio'
1157
+ - smolagents[torch] ; extra == 'audio'
1158
+ - docker>=7.1.0 ; extra == 'docker'
1159
+ - websocket-client ; extra == 'docker'
1160
+ - e2b-code-interpreter>=1.0.3 ; extra == 'e2b'
1161
+ - python-dotenv>=1.0.1 ; extra == 'e2b'
1162
+ - gradio>=5.13.2 ; extra == 'gradio'
1163
+ - litellm>=1.60.2 ; extra == 'litellm'
1164
+ - mcpadapt>=0.0.19 ; extra == 'mcp'
1165
+ - mcp ; extra == 'mcp'
1166
+ - mlx-lm ; extra == 'mlx-lm'
1167
+ - openai>=1.58.1 ; extra == 'openai'
1168
+ - arize-phoenix ; extra == 'telemetry'
1169
+ - opentelemetry-sdk ; extra == 'telemetry'
1170
+ - opentelemetry-exporter-otlp ; extra == 'telemetry'
1171
+ - openinference-instrumentation-smolagents>=0.1.4 ; extra == 'telemetry'
1172
+ - accelerate ; extra == 'transformers'
1173
+ - transformers>=4.0.0 ; extra == 'transformers'
1174
+ - smolagents[torch] ; extra == 'transformers'
1175
+ - helium ; extra == 'vision'
1176
+ - selenium ; extra == 'vision'
1177
+ - vllm ; extra == 'vllm'
1178
+ - torch ; extra == 'vllm'
1179
+ - smolagents[audio,bedrock,docker,e2b,gradio,litellm,mcp,mlx-lm,openai,telemetry,transformers,vision] ; extra == 'all'
1180
+ - ruff>=0.9.0 ; extra == 'quality'
1181
+ - ipython>=8.31.0 ; extra == 'test'
1182
+ - pandas>=2.2.3 ; extra == 'test'
1183
+ - pytest>=8.1.0 ; extra == 'test'
1184
+ - pytest-datadir ; extra == 'test'
1185
+ - python-dotenv>=1.0.1 ; extra == 'test'
1186
+ - smolagents[all] ; extra == 'test'
1187
+ - rank-bm25 ; extra == 'test'
1188
+ - wikipedia-api>=0.8.1 ; extra == 'test'
1189
+ - smolagents[quality,test] ; extra == 'dev'
1190
+ - sqlalchemy ; extra == 'dev'
1191
+ requires_python: '>=3.10'
1192
+ - pypi: https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl
1193
+ name: sniffio
1194
+ version: 1.3.1
1195
+ sha256: 2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2
1196
+ requires_python: '>=3.7'
1197
+ - pypi: https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl
1198
+ name: soupsieve
1199
+ version: '2.7'
1200
+ sha256: 6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4
1201
+ requires_python: '>=3.8'
1202
+ - pypi: https://files.pythonhosted.org/packages/8b/0c/9d30a4ebeb6db2b25a841afbb80f6ef9a854fc3b41be131d249a977b4959/starlette-0.46.2-py3-none-any.whl
1203
+ name: starlette
1204
+ version: 0.46.2
1205
+ sha256: 595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35
1206
+ requires_dist:
1207
+ - anyio>=3.6.2,<5
1208
+ - typing-extensions>=3.10.0 ; python_full_version < '3.10'
1209
+ - httpx>=0.27.0,<0.29.0 ; extra == 'full'
1210
+ - itsdangerous ; extra == 'full'
1211
+ - jinja2 ; extra == 'full'
1212
+ - python-multipart>=0.0.18 ; extra == 'full'
1213
+ - pyyaml ; extra == 'full'
1214
+ requires_python: '>=3.9'
1215
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda
1216
+ sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e
1217
+ md5: d453b98d9c83e71da0741bb0ff4d76bc
1218
+ depends:
1219
+ - libgcc-ng >=12
1220
+ - libzlib >=1.2.13,<2.0.0a0
1221
+ license: TCL
1222
+ license_family: BSD
1223
+ purls: []
1224
+ size: 3318875
1225
+ timestamp: 1699202167581
1226
+ - pypi: https://files.pythonhosted.org/packages/f9/b6/a447b5e4ec71e13871be01ba81f5dfc9d0af7e473da256ff46bc0e24026f/tomlkit-0.13.2-py3-none-any.whl
1227
+ name: tomlkit
1228
+ version: 0.13.2
1229
+ sha256: 7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde
1230
+ requires_python: '>=3.8'
1231
+ - pypi: https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl
1232
+ name: tqdm
1233
+ version: 4.67.1
1234
+ sha256: 26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2
1235
+ requires_dist:
1236
+ - colorama ; sys_platform == 'win32'
1237
+ - pytest>=6 ; extra == 'dev'
1238
+ - pytest-cov ; extra == 'dev'
1239
+ - pytest-timeout ; extra == 'dev'
1240
+ - pytest-asyncio>=0.24 ; extra == 'dev'
1241
+ - nbval ; extra == 'dev'
1242
+ - requests ; extra == 'discord'
1243
+ - slack-sdk ; extra == 'slack'
1244
+ - requests ; extra == 'telegram'
1245
+ - ipywidgets>=6 ; extra == 'notebook'
1246
+ requires_python: '>=3.7'
1247
+ - pypi: https://files.pythonhosted.org/packages/48/20/9d953de6f4367163d23ec823200eb3ecb0050a2609691e512c8b95827a9b/typer-0.15.3-py3-none-any.whl
1248
+ name: typer
1249
+ version: 0.15.3
1250
+ sha256: c86a65ad77ca531f03de08d1b9cb67cd09ad02ddddf4b34745b5008f43b239bd
1251
+ requires_dist:
1252
+ - click>=8.0.0
1253
+ - typing-extensions>=3.7.4.3
1254
+ - shellingham>=1.3.0
1255
+ - rich>=10.11.0
1256
+ requires_python: '>=3.7'
1257
+ - pypi: https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl
1258
+ name: typing-extensions
1259
+ version: 4.13.2
1260
+ sha256: a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c
1261
+ requires_python: '>=3.8'
1262
+ - pypi: https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl
1263
+ name: typing-inspection
1264
+ version: 0.4.0
1265
+ sha256: 50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f
1266
+ requires_dist:
1267
+ - typing-extensions>=4.12.0
1268
+ requires_python: '>=3.9'
1269
+ - pypi: https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl
1270
+ name: tzdata
1271
+ version: '2025.2'
1272
+ sha256: 1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8
1273
+ requires_python: '>=2'
1274
+ - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda
1275
+ sha256: 5aaa366385d716557e365f0a4e9c3fca43ba196872abbbe3d56bb610d131e192
1276
+ md5: 4222072737ccff51314b5ece9c7d6f5a
1277
+ license: LicenseRef-Public-Domain
1278
+ purls: []
1279
+ size: 122968
1280
+ timestamp: 1742727099393
1281
+ - pypi: https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl
1282
+ name: urllib3
1283
+ version: 2.4.0
1284
+ sha256: 4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813
1285
+ requires_dist:
1286
+ - brotli>=1.0.9 ; platform_python_implementation == 'CPython' and extra == 'brotli'
1287
+ - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'brotli'
1288
+ - h2>=4,<5 ; extra == 'h2'
1289
+ - pysocks>=1.5.6,!=1.5.7,<2.0 ; extra == 'socks'
1290
+ - zstandard>=0.18.0 ; extra == 'zstd'
1291
+ requires_python: '>=3.9'
1292
+ - pypi: https://files.pythonhosted.org/packages/b1/4b/4cef6ce21a2aaca9d852a6e84ef4f135d99fcd74fa75105e2fc0c8308acd/uvicorn-0.34.2-py3-none-any.whl
1293
+ name: uvicorn
1294
+ version: 0.34.2
1295
+ sha256: deb49af569084536d269fe0a6d67e3754f104cf03aba7c11c40f01aadf33c403
1296
+ requires_dist:
1297
+ - click>=7.0
1298
+ - h11>=0.8
1299
+ - typing-extensions>=4.0 ; python_full_version < '3.11'
1300
+ - colorama>=0.4 ; sys_platform == 'win32' and extra == 'standard'
1301
+ - httptools>=0.6.3 ; extra == 'standard'
1302
+ - python-dotenv>=0.13 ; extra == 'standard'
1303
+ - pyyaml>=5.1 ; extra == 'standard'
1304
+ - uvloop>=0.14.0,!=0.15.0,!=0.15.1 ; platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32' and extra == 'standard'
1305
+ - watchfiles>=0.13 ; extra == 'standard'
1306
+ - websockets>=10.4 ; extra == 'standard'
1307
+ requires_python: '>=3.9'
1308
+ - pypi: https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
1309
+ name: websockets
1310
+ version: 15.0.1
1311
+ sha256: 0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8
1312
+ requires_python: '>=3.9'
my_agent.py ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import math
2
+ import os
3
+ import re
4
+
5
+ from bs4 import BeautifulSoup
6
+ import httpx
7
+ from smolagents import CodeAgent
8
+ from tools import search_tool
9
+ from gemini_model import GeminiApiModel
10
+
11
+
12
+ class SmolAgent:
13
+ """
14
+ A simple agent using the custom GeminiApiModel.
15
+ Replace the __call__ method with your actual agent logic
16
+ using Hugging Face libraries (e.g., smolagents, transformers, inference API).
17
+ """
18
+
19
+ def __init__(self):
20
+ model = GeminiApiModel(model_id="gemini-2.0-flash")
21
+ self.agent = CodeAgent(
22
+ tools=[search_tool],
23
+ model=model,
24
+ max_steps=5,
25
+ verbosity_level=0,
26
+ additional_authorized_imports=["httpx", "math", "os", "re", "bs4"],
27
+ )
28
+ print("SmolAgent initialized with GeminiApiModel.")
29
+ # Initialize any required components here
30
+ # e.g., load a model, tokenizer, setup API clients
31
+
32
+ def __call__(self, question: str) -> str:
33
+ """
34
+ Processes the input question and returns an answer.
35
+ This is where the core agent logic should reside.
36
+ """
37
+ print(f"SmolAgent received question (first 50 chars): {question[:50]}...")
38
+
39
+ # --- Agent Logic ---
40
+ # The CodeAgent will now use GeminiApiModel internally
41
+ answer = self.agent.run(question)
42
+ # -------------------------
43
+
44
+ print(f"SmolAgent returning answer (first 50 chars): {str(answer)[:50]}...")
45
+ return str(answer)
pyproject.toml ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [project]
2
+ authors = [{name = "bitcloud2", email = "bitcloud22@gmail.com"}]
3
+ name = "Final_Assignment_Template"
4
+ requires-python = ">= 3.11"
5
+ version = "0.1.0"
6
+ dependencies = ["smolagents>=1.14.0,<2", "gradio>=5.27.1,<6", "requests>=2.32.3,<3", "httpx>=0.28.1,<0.29", "beautifulsoup4>=4.13.4,<5"]
7
+
8
+ [build-system]
9
+ build-backend = "hatchling.build"
10
+ requires = ["hatchling"]
11
+
12
+ [tool.pixi.project]
13
+ channels = ["https://conda.modular.com/max-nightly", "https://conda.modular.com/max", "https://repo.prefix.dev/modular-community", "conda-forge"]
14
+ platforms = ["linux-64"]
15
+
16
+ [tool.pixi.pypi-dependencies]
17
+ final_assignment_template = { path = ".", editable = true }
18
+
19
+ [tool.pixi.tasks]
requirements.txt CHANGED
@@ -1,2 +1,4 @@
1
  gradio
2
- requests
 
 
 
1
  gradio
2
+ requests
3
+ smolagents
4
+ httpx
src/final_assignment_template/__init__.py ADDED
File without changes
tools.py ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ from smolagents import DuckDuckGoSearchTool
2
+
3
+
4
+ search_tool = DuckDuckGoSearchTool()