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()
|