Spaces:
Sleeping
Sleeping
working app_dev. hopefully working app
Browse files- .gitattributes +2 -0
- .gitignore +8 -0
- Changelog.md +34 -0
- app.py +54 -28
- app_dev.py +280 -0
- gemini_model.py +177 -0
- magic.lock +1312 -0
- my_agent.py +45 -0
- pyproject.toml +19 -0
- requirements.txt +3 -1
- src/final_assignment_template/__init__.py +0 -0
- 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
|
|
|
|
|
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 |
-
|
|
|
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")
|
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 =
|
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 |
-
|
59 |
-
|
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 |
-
|
66 |
-
|
67 |
-
|
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(
|
85 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
86 |
except Exception as e:
|
87 |
-
|
88 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
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 = {
|
|
|
|
|
|
|
|
|
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(
|
|
|
|
|
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")
|
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:
|
187 |
print(f"✅ SPACE_ID found: {space_id_startup}")
|
188 |
print(f" Repo URL: https://huggingface.co/spaces/{space_id_startup}")
|
189 |
-
print(
|
|
|
|
|
190 |
else:
|
191 |
-
print(
|
|
|
|
|
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()
|