Spaces:
Running
Running
add logging, metaprompt setup, add planning flow for agent and update… (#7)
Browse files- .gitignore +3 -1
- README.md +4 -0
- agents/orchestrator_agent/get_orchestrator_prompt.py +57 -48
- agents/orchestrator_agent/orchestrator_agent.py +13 -5
- logs/__init__.py +5 -0
- logs/capture_agent_logs.py +61 -0
- prompts/__init__.py +4 -0
- prompts/get_plan_tool_usage_prompt.py +15 -0
- prompts/metaprompting/__init__.py +7 -0
- prompts/metaprompting/get_metaprompt_analysis_prompt.py +29 -0
- prompts/metaprompting/get_metaprompt_improvements_prompt.py +20 -0
- pyproject.toml +1 -0
- tools/__init__.py +3 -0
- tools/plan_tool.py +81 -0
- uv.lock +205 -3
.gitignore
CHANGED
|
@@ -92,4 +92,6 @@ Thumbs.db
|
|
| 92 |
*.sqlite
|
| 93 |
*.db
|
| 94 |
|
| 95 |
-
.gradio
|
|
|
|
|
|
|
|
|
| 92 |
*.sqlite
|
| 93 |
*.db
|
| 94 |
|
| 95 |
+
.gradio
|
| 96 |
+
|
| 97 |
+
execution_plan.json
|
README.md
CHANGED
|
@@ -14,6 +14,10 @@ tags:
|
|
| 14 |
- model-context-protocol
|
| 15 |
- fastmcp
|
| 16 |
- gradio
|
|
|
|
|
|
|
|
|
|
|
|
|
| 17 |
- enterprise
|
| 18 |
- gemini
|
| 19 |
- openai
|
|
|
|
| 14 |
- model-context-protocol
|
| 15 |
- fastmcp
|
| 16 |
- gradio
|
| 17 |
+
- context-engineering
|
| 18 |
+
- multi-agent
|
| 19 |
+
- smolagents
|
| 20 |
+
- supabase
|
| 21 |
- enterprise
|
| 22 |
- gemini
|
| 23 |
- openai
|
agents/orchestrator_agent/get_orchestrator_prompt.py
CHANGED
|
@@ -1,79 +1,88 @@
|
|
| 1 |
from models import AnalysisResult
|
| 2 |
from utils import pydantic_to_template
|
|
|
|
| 3 |
|
| 4 |
|
| 5 |
def get_orchestrator_prompt(user_prompt: str):
|
| 6 |
return f"""
|
| 7 |
-
You are the Orchestrator Agent of a training-planning system.
|
| 8 |
-
You
|
| 9 |
|
| 10 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 11 |
|
| 12 |
---
|
| 13 |
|
| 14 |
-
|
| 15 |
|
| 16 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 17 |
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
- Handles all Supabase queries: retrieving project contexts, assigned employees, skills/proficiency data, saved training plans, and persisting new plans.
|
| 21 |
-
- Always delegate any data retrieval or persistence to this agent; do not attempt to infer or fabricate database contents.
|
| 22 |
|
| 23 |
-
|
| 24 |
-
- Performs deep market research for courses, certifications, and learning paths.
|
| 25 |
-
- Returns curated JSON grouped by skill with provider, duration, cost, and justification.
|
| 26 |
-
- Summarize its findings and use only the highest-quality recommendations it surfaces.
|
| 27 |
-
|
| 28 |
-
Never hallucinate data that the managed agents can fetch. Each fact in your reasoning must cite which agent produced it.
|
| 29 |
-
|
| 30 |
-
Try to use the managed agents as much as possible and to delegate tasks to them in bulk. Extract from the database all the necessary info, then do the websearch, then use the websearch results to build the training plan.
|
| 31 |
-
|
| 32 |
-
Be as efficient as possible. Instruct your managed agents to batch calls and functions calls as much as possible, in order to execute them in parallel. Take advantage of the code execution abilities of the managed agents.
|
| 33 |
|
| 34 |
---
|
| 35 |
|
| 36 |
-
###
|
|
|
|
|
|
|
|
|
|
| 37 |
|
| 38 |
-
|
| 39 |
-
- Understand the project’s goals and requirements.
|
| 40 |
-
- Identify gaps in knowledge and delegate retrieval to the correct managed agent.
|
| 41 |
|
| 42 |
-
|
| 43 |
-
- Ask for project metadata, assigned employees, and existing analysis if available.
|
| 44 |
-
- Pull each employee’s role, experience, and current skills from Supabase through the agent.
|
| 45 |
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 49 |
|
| 50 |
-
|
| 51 |
-
- Request targeted web research for each skill gap.
|
| 52 |
-
- Evaluate and curate course options by:
|
| 53 |
-
- relevance,
|
| 54 |
-
- credibility of the provider,
|
| 55 |
-
- depth and applicability,
|
| 56 |
-
- expected time investment.
|
| 57 |
|
| 58 |
-
|
| 59 |
-
- Tailored training roadmap for each employee.
|
| 60 |
-
- Clear justification for each recommended course.
|
| 61 |
-
- Consolidated timeline showing how training leads to project readiness.
|
| 62 |
-
- Optional stretch-goals or advanced learning suggestions.
|
| 63 |
|
| 64 |
-
|
| 65 |
-
|
| 66 |
-
- Do not produce final answers until every necessary managed agent has been invoked at least once.
|
| 67 |
|
| 68 |
-
---
|
| 69 |
|
| 70 |
### Input
|
| 71 |
User prompt: {user_prompt}
|
| 72 |
|
| 73 |
-
Always begin by determining what information is missing and which managed agent must supply it. Never skip the delegation step.
|
| 74 |
|
| 75 |
-
|
|
|
|
|
|
|
|
|
|
| 76 |
|
| 77 |
-
|
|
|
|
|
|
|
| 78 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 79 |
"""
|
|
|
|
| 1 |
from models import AnalysisResult
|
| 2 |
from utils import pydantic_to_template
|
| 3 |
+
from prompts import get_plan_tool_usage_prompt
|
| 4 |
|
| 5 |
|
| 6 |
def get_orchestrator_prompt(user_prompt: str):
|
| 7 |
return f"""
|
| 8 |
+
You are the Orchestrator Agent of a training-planning system.
|
| 9 |
+
You never fetch HR data yourself. You only delegate work.
|
| 10 |
|
| 11 |
+
You specialize in:
|
| 12 |
+
- HR skill gap analysis
|
| 13 |
+
- Employee development planning
|
| 14 |
+
- High-quality training program design
|
| 15 |
+
- Efficient orchestration of specialized managed agents
|
| 16 |
|
| 17 |
---
|
| 18 |
|
| 19 |
+
## Managed Agents (You orchestrate, you do not solve)
|
| 20 |
|
| 21 |
+
### 1. supabase_agent (HR database access)
|
| 22 |
+
- Sole interface to our HR database.
|
| 23 |
+
- Must be used for ALL data retrieval and persistence.
|
| 24 |
+
- **When instructed to retrieve any data, it must ALWAYS:**
|
| 25 |
+
1) Prefer existing Supabase/Postgres functions (e.g., `select public.fn_get_project_skill_overview(p_project_id := 42)`, others it knows about).
|
| 26 |
+
2) Only if a suitable function does not exist, perform optimized batch queries.
|
| 27 |
+
3) Only if batching cannot cover the need, execute minimal direct SQL queries as a last resort.
|
| 28 |
+
- The Orchestrator must not ask “what functions exist”; it simply instructs the agent to check and use functions first.
|
| 29 |
+
- Never assume schema. Never improvise table names or columns. Let supabase_agent handle all DB specifics.
|
| 30 |
|
| 31 |
+
Example instruction style:
|
| 32 |
+
> “Retrieve project skill overview using an existing function if available; otherwise use an optimized batch query.”
|
|
|
|
|
|
|
| 33 |
|
| 34 |
+
You must NEVER fabricate database contents.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 35 |
|
| 36 |
---
|
| 37 |
|
| 38 |
+
### 2. web_search_agent (External training research)
|
| 39 |
+
- Performs curated skill-based course searches with provider credibility, depth, cost, and duration.
|
| 40 |
+
- Returns structured JSON grouped by skill.
|
| 41 |
+
- The Orchestrator summarizes and selects only the highest-quality items.
|
| 42 |
|
| 43 |
+
---
|
|
|
|
|
|
|
| 44 |
|
| 45 |
+
## Required Workflow (You orchestrate; do not compute data yourself)
|
|
|
|
|
|
|
| 46 |
|
| 47 |
+
You must:
|
| 48 |
+
1. Interpret the user’s request.
|
| 49 |
+
2. Instruct supabase_agent to retrieve:
|
| 50 |
+
- project metadata,
|
| 51 |
+
- employees assigned to the project,
|
| 52 |
+
- skill requirements and current skill proficiencies,
|
| 53 |
+
- historical data when helpful.
|
| 54 |
+
**Always instruct it to use database functions first.**
|
| 55 |
+
**Instruct it to return as comprehensive data as possible, including the gaps and proficiency levels.**
|
| 56 |
+
**A function may return already computed data, e.g. fn_get_project_skill_overview will return precalculated skill gaps, instruct it to return this info if it is useful for the analysis.**
|
| 57 |
+
3. Once data is retrieved, if there are no skill gaps returned, compute skill gaps with minimal reasoning (never invent values).
|
| 58 |
+
4. Delegate targeted skill searches to web_search_agent.
|
| 59 |
+
5. Build a structured training plan using retrieved course data.
|
| 60 |
|
| 61 |
+
Avoid multiple trivial calls; prefer batching.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 62 |
|
| 63 |
+
---
|
|
|
|
|
|
|
|
|
|
|
|
|
| 64 |
|
| 65 |
+
## Mandatory Use of Plan Tool (update_plan)
|
| 66 |
+
{get_plan_tool_usage_prompt()}
|
|
|
|
| 67 |
|
|
|
|
| 68 |
|
| 69 |
### Input
|
| 70 |
User prompt: {user_prompt}
|
| 71 |
|
|
|
|
| 72 |
|
| 73 |
+
---
|
| 74 |
+
|
| 75 |
+
## Output Format
|
| 76 |
+
Return data as:
|
| 77 |
|
| 78 |
+
{pydantic_to_template(AnalysisResult)}
|
| 79 |
+
|
| 80 |
+
---
|
| 81 |
|
| 82 |
+
## Final Rules
|
| 83 |
+
- NEVER hallucinate skills, data, structures, or training resources.
|
| 84 |
+
- ALWAYS delegate retrieval to supabase_agent and research to web_search_agent.
|
| 85 |
+
- When instructing supabase_agent, always tell it to prefer database functions first.
|
| 86 |
+
- Think and plan extensively before making tool calls.
|
| 87 |
+
- Be concise and efficient.
|
| 88 |
"""
|
agents/orchestrator_agent/orchestrator_agent.py
CHANGED
|
@@ -6,6 +6,8 @@ from models import AnalysisResult, EmployeeTrainingPlan
|
|
| 6 |
|
| 7 |
from .get_orchestrator_prompt import get_orchestrator_prompt
|
| 8 |
from .managed_agents import get_web_search_agent, get_supabase_agent
|
|
|
|
|
|
|
| 9 |
|
| 10 |
@tool
|
| 11 |
def final_answer_callback(project_id: str, project_name: str, team: List[EmployeeTrainingPlan]) -> AnalysisResult:
|
|
@@ -17,6 +19,9 @@ def final_answer_callback(project_id: str, project_name: str, team: List[Employe
|
|
| 17 |
project_name: Human-readable project title.
|
| 18 |
team: List of training plans per employee produced by earlier tool calls.
|
| 19 |
"""
|
|
|
|
|
|
|
|
|
|
| 20 |
return AnalysisResult(
|
| 21 |
project_id=project_id,
|
| 22 |
project_name=project_name,
|
|
@@ -53,21 +58,24 @@ class OrchestratorAgent:
|
|
| 53 |
|
| 54 |
self._agent = CodeAgent(
|
| 55 |
model=orchestrator_model,
|
| 56 |
-
tools=[final_answer_callback],
|
| 57 |
step_callbacks=step_callbacks,
|
| 58 |
managed_agents=[get_web_search_agent(step_callbacks), get_supabase_agent(step_callbacks)],
|
|
|
|
| 59 |
name="orchestrator_agent",
|
| 60 |
max_steps=20,
|
| 61 |
planning_interval=2,
|
| 62 |
description="An agent that orchestrates the training-plan analysis process.",
|
| 63 |
)
|
| 64 |
|
| 65 |
-
def _log_plan_step(self,
|
|
|
|
| 66 |
self._action_callback(f'{agent.name} is generating a plan')
|
| 67 |
|
| 68 |
-
def _log_action_step(self,
|
| 69 |
-
|
| 70 |
-
|
|
|
|
| 71 |
tool_name = call.name
|
| 72 |
if (tool_name == 'python_interpreter'):
|
| 73 |
self._action_callback(f"{agent.name} is running python code", call.arguments)
|
|
|
|
| 6 |
|
| 7 |
from .get_orchestrator_prompt import get_orchestrator_prompt
|
| 8 |
from .managed_agents import get_web_search_agent, get_supabase_agent
|
| 9 |
+
from tools import UpdatePlanTool
|
| 10 |
+
from logs import capture_agent_plan_log, capture_agent_action_log, flush_logs_to_json
|
| 11 |
|
| 12 |
@tool
|
| 13 |
def final_answer_callback(project_id: str, project_name: str, team: List[EmployeeTrainingPlan]) -> AnalysisResult:
|
|
|
|
| 19 |
project_name: Human-readable project title.
|
| 20 |
team: List of training plans per employee produced by earlier tool calls.
|
| 21 |
"""
|
| 22 |
+
|
| 23 |
+
flush_logs_to_json()
|
| 24 |
+
|
| 25 |
return AnalysisResult(
|
| 26 |
project_id=project_id,
|
| 27 |
project_name=project_name,
|
|
|
|
| 58 |
|
| 59 |
self._agent = CodeAgent(
|
| 60 |
model=orchestrator_model,
|
| 61 |
+
tools=[UpdatePlanTool(), final_answer_callback],
|
| 62 |
step_callbacks=step_callbacks,
|
| 63 |
managed_agents=[get_web_search_agent(step_callbacks), get_supabase_agent(step_callbacks)],
|
| 64 |
+
add_base_tools=True,
|
| 65 |
name="orchestrator_agent",
|
| 66 |
max_steps=20,
|
| 67 |
planning_interval=2,
|
| 68 |
description="An agent that orchestrates the training-plan analysis process.",
|
| 69 |
)
|
| 70 |
|
| 71 |
+
def _log_plan_step(self, planning_step: PlanningStep, agent: CodeAgent):
|
| 72 |
+
capture_agent_plan_log(planning_step)
|
| 73 |
self._action_callback(f'{agent.name} is generating a plan')
|
| 74 |
|
| 75 |
+
def _log_action_step(self, action_step: ActionStep, agent: CodeAgent):
|
| 76 |
+
capture_agent_action_log(action_step)
|
| 77 |
+
if (action_step.tool_calls is not None):
|
| 78 |
+
for call in action_step.tool_calls:
|
| 79 |
tool_name = call.name
|
| 80 |
if (tool_name == 'python_interpreter'):
|
| 81 |
self._action_callback(f"{agent.name} is running python code", call.arguments)
|
logs/__init__.py
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
from .capture_agent_logs import capture_agent_action_log, capture_agent_plan_log, flush_logs_to_json
|
| 3 |
+
|
| 4 |
+
__all__ = ['capture_agent_plan_log', 'capture_agent_action_log', 'flush_logs_to_json']
|
| 5 |
+
|
logs/capture_agent_logs.py
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import json
|
| 3 |
+
import time
|
| 4 |
+
|
| 5 |
+
from smolagents import PlanningStep, ActionStep
|
| 6 |
+
|
| 7 |
+
run_timestamp = str(time.time())
|
| 8 |
+
|
| 9 |
+
# Storage for logs
|
| 10 |
+
_agent_logs: list[dict] = []
|
| 11 |
+
|
| 12 |
+
def capture_agent_plan_log(step: PlanningStep):
|
| 13 |
+
"""
|
| 14 |
+
Accepts agent planning steps & persists them to memory + stdout.
|
| 15 |
+
"""
|
| 16 |
+
log_details = {
|
| 17 |
+
"timestamp": time.time(),
|
| 18 |
+
"plan": step.plan,
|
| 19 |
+
"model_output_message": getattr(step, 'model_output_message', None),
|
| 20 |
+
}
|
| 21 |
+
print("AGENT PLAN HAPPENED", log_details)
|
| 22 |
+
_agent_logs.append(log_details)
|
| 23 |
+
|
| 24 |
+
|
| 25 |
+
def capture_agent_action_log(step: ActionStep):
|
| 26 |
+
"""
|
| 27 |
+
Accepts agent action steps & persists them to memory + stdout.
|
| 28 |
+
"""
|
| 29 |
+
log_details = {
|
| 30 |
+
"timestamp": time.time(),
|
| 31 |
+
'tool_calls':getattr(step, 'tool_calls', None),
|
| 32 |
+
"output": getattr(step, 'output', None),
|
| 33 |
+
'code_action': getattr(step, 'code_action', None),
|
| 34 |
+
'observations': getattr(step, 'observations', None),
|
| 35 |
+
'code_output': getattr(step, 'code_outputs', None),
|
| 36 |
+
'is_final_answer': getattr(step, 'is_final_answer', False),
|
| 37 |
+
|
| 38 |
+
}
|
| 39 |
+
print("AGENT ACTION HAPPENED", log_details)
|
| 40 |
+
_agent_logs.append(log_details)
|
| 41 |
+
|
| 42 |
+
|
| 43 |
+
def flush_logs_to_json():
|
| 44 |
+
"""
|
| 45 |
+
Saves all logs for this run to: logs/<run_timestamp>.json
|
| 46 |
+
"""
|
| 47 |
+
# Ensure directory exists
|
| 48 |
+
os.makedirs("logs", exist_ok=True)
|
| 49 |
+
|
| 50 |
+
log_path = os.path.join("logs", f"{run_timestamp}.json")
|
| 51 |
+
|
| 52 |
+
with open(log_path, "w") as f:
|
| 53 |
+
json.dump(
|
| 54 |
+
{
|
| 55 |
+
"run_id": run_timestamp,
|
| 56 |
+
"logs": _agent_logs,
|
| 57 |
+
},
|
| 58 |
+
f,
|
| 59 |
+
indent=2
|
| 60 |
+
)
|
| 61 |
+
print(f"[AGENT LOG] Saved logs to {log_path}")
|
prompts/__init__.py
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from .metaprompting import *
|
| 2 |
+
from .get_plan_tool_usage_prompt import get_plan_tool_usage_prompt
|
| 3 |
+
|
| 4 |
+
__all__ = ['get_metaprompt_analysis_prompt', 'get_metaprompt_improvements_prompt', 'get_plan_tool_usage_prompt']
|
prompts/get_plan_tool_usage_prompt.py
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
def get_plan_tool_usage_prompt():
|
| 2 |
+
return """
|
| 3 |
+
<plan_tool_usage>
|
| 4 |
+
- For medium or larger tasks (e.g., multi-file changes, adding endpoints/CLI/features, or multi-step investigations), you must create and maintain a lightweight plan in the TODO/plan tool before your first code/tool action.
|
| 5 |
+
- Create 2–5 milestone/outcome items; avoid micro-steps and repetitive operational tasks (no “open file”, “run tests”, or similar operational steps). Never use a single catch-all item like “implement the entire feature”.
|
| 6 |
+
- Maintain statuses in the tool: exactly one item in_progress at a time; mark items complete when done; post timely status transitions (never more than ~8 tool calls without an update). Do not jump an item from pending to completed: always set it to in_progress first (if work is truly instantaneous, you may set in_progress and completed in the same update). Do not batch-complete multiple items after the fact.
|
| 7 |
+
- Finish with all items completed or explicitly canceled/deferred before ending the turn.
|
| 8 |
+
- End-of-turn invariant: zero in_progress and zero pending; complete or explicitly cancel/defer anything remaining with a brief reason.
|
| 9 |
+
- If you present a plan in chat for a medium/complex task, mirror it into the tool and reference those items in your updates.
|
| 10 |
+
- For very short, simple tasks (e.g., single-file changes ≲ ~10 lines), you may skip the tool. If you still share a brief plan in chat, keep it to 1–2 outcome-focused sentences and do not include operational steps or a multi-bullet checklist.
|
| 11 |
+
- Pre-flight check: before any non-trivial code change (e.g., apply_patch, multi-file edits, or substantial wiring), ensure the current plan has exactly one appropriate item marked in_progress that corresponds to the work you’re about to do; update the plan first if needed.
|
| 12 |
+
- Scope pivots: if understanding changes (split/merge/reorder items), update the plan before continuing. Do not let the plan go stale while coding.
|
| 13 |
+
- Never have more than one item in_progress; if that occurs, immediately correct the statuses so only the current phase is in_progress.
|
| 14 |
+
<plan_tool_usage>
|
| 15 |
+
"""
|
prompts/metaprompting/__init__.py
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from .get_metaprompt_analysis_prompt import get_metaprompt_analysis_prompt
|
| 2 |
+
from .get_metaprompt_improvements_prompt import get_metaprompt_improvements_prompt
|
| 3 |
+
|
| 4 |
+
__all__ = [
|
| 5 |
+
"get_metaprompt_analysis_prompt",
|
| 6 |
+
"get_metaprompt_improvements_prompt"
|
| 7 |
+
]
|
prompts/metaprompting/get_metaprompt_analysis_prompt.py
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
def get_metaprompt_analysis_prompt(system_prompt: str, failure_traces: str):
|
| 2 |
+
return f"""
|
| 3 |
+
You are a prompt engineer tasked with debugging a system prompt for an event-planning agent that uses tools to recommend venues, logistics, and sustainable options.
|
| 4 |
+
You are given:
|
| 5 |
+
1) The current system prompt:
|
| 6 |
+
<system_prompt>
|
| 7 |
+
{system_prompt}
|
| 8 |
+
</system_prompt>
|
| 9 |
+
2) A small set of logged failures. Each log has:
|
| 10 |
+
- query
|
| 11 |
+
- tools_called (as actually executed)
|
| 12 |
+
- final_answer (shortened if needed)
|
| 13 |
+
- eval_signal (e.g., thumbs_down, low rating, human grader, or user comment)
|
| 14 |
+
<failure_tracess>
|
| 15 |
+
{failure_traces}
|
| 16 |
+
</failure_traces>
|
| 17 |
+
Your tasks:
|
| 18 |
+
1) Identify the distinct failure mode you see (e.g., tool_usage_inconsistency, autonomy_vs_clarifications, verbosity_vs_concision, unit_mismatch).
|
| 19 |
+
2) For each failure mode, quote or paraphrase the specific lines or sections of the system prompt that are most likely causing or reinforcing it. Include any contradictions (e.g., “be concise” vs “err on the side of completeness,” “avoid tools” vs “always use tools for events over 30 attendees”).
|
| 20 |
+
3) Briefly explain, for each failure mode, how those lines are steering the agent toward the observed behavior.
|
| 21 |
+
Return your answer in a structured but readable format:
|
| 22 |
+
failure_modes:
|
| 23 |
+
- name: ...
|
| 24 |
+
description: ...
|
| 25 |
+
prompt_drivers:
|
| 26 |
+
- exact_or_paraphrased_line: ...
|
| 27 |
+
- why_it_matters: ...
|
| 28 |
+
"""
|
| 29 |
+
|
prompts/metaprompting/get_metaprompt_improvements_prompt.py
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
def get_metaprompt_improvements_prompt(system_prompt: str, failure_analysis: str):
|
| 2 |
+
return f"""
|
| 3 |
+
You previously analyzed this system prompt and its failure modes.
|
| 4 |
+
System prompt:
|
| 5 |
+
<system_prompt>
|
| 6 |
+
{system_prompt}
|
| 7 |
+
</system_prompt>
|
| 8 |
+
Failure-mode analysis:
|
| 9 |
+
{failure_analysis}
|
| 10 |
+
Please propose a surgical revision of the system prompt that reduces the observed issues while preserving the good behaviors.
|
| 11 |
+
Constraints:
|
| 12 |
+
- Do not redesign the agent from scratch.
|
| 13 |
+
- Prefer small, explicit edits: clarify conflicting rules, remove redundant or contradictory lines, tighten vague guidance.
|
| 14 |
+
- Make tradeoffs explicit (for example, clearly state when to prioritize concision over completeness, or exactly when tools must vs must not be called).
|
| 15 |
+
- Keep the structure and overall length roughly similar to the original, unless a short consolidation removes obvious duplication.
|
| 16 |
+
Output:
|
| 17 |
+
1) patch_notes: a concise list of the key changes and the reasoning behind each (e.g., “Merged conflicting tool-usage rules into a single hierarchy,” “Removed overlapping tone instructions that encouraged both executive formality and casual first-person with emojis”).
|
| 18 |
+
2) revised_system_prompt: the full updated system prompt with your edits applied, ready to drop into an agent configuration.
|
| 19 |
+
"""
|
| 20 |
+
|
pyproject.toml
CHANGED
|
@@ -13,6 +13,7 @@ dependencies = [
|
|
| 13 |
"supabase>=2.0.0",
|
| 14 |
"smolagents[mcp,openai]", # placeholder, update as needed
|
| 15 |
"fastmcp>=2.13.1",
|
|
|
|
| 16 |
]
|
| 17 |
|
| 18 |
[tool.uv]
|
|
|
|
| 13 |
"supabase>=2.0.0",
|
| 14 |
"smolagents[mcp,openai]", # placeholder, update as needed
|
| 15 |
"fastmcp>=2.13.1",
|
| 16 |
+
"ddgs>=9.9.1",
|
| 17 |
]
|
| 18 |
|
| 19 |
[tool.uv]
|
tools/__init__.py
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from .plan_tool import UpdatePlanTool
|
| 2 |
+
|
| 3 |
+
__all__ = ["UpdatePlanTool"]
|
tools/plan_tool.py
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import json, os
|
| 2 |
+
from smolagents import Tool
|
| 3 |
+
|
| 4 |
+
PLAN_PATH = "./execution_plan.json"
|
| 5 |
+
|
| 6 |
+
def load_plan():
|
| 7 |
+
if not os.path.exists(PLAN_PATH):
|
| 8 |
+
return []
|
| 9 |
+
with open(PLAN_PATH, "r") as f:
|
| 10 |
+
return json.load(f)
|
| 11 |
+
|
| 12 |
+
def save_plan(plan):
|
| 13 |
+
with open(PLAN_PATH, "w") as f:
|
| 14 |
+
json.dump(plan, f, indent=2)
|
| 15 |
+
|
| 16 |
+
class UpdatePlanTool(Tool):
|
| 17 |
+
"""
|
| 18 |
+
Tool to update the execution plan stored on disk.
|
| 19 |
+
|
| 20 |
+
Maintains a persistent execution plan that can be updated during multi-step operations.
|
| 21 |
+
The plan is stored in JSON format at './execution_plan.json'.
|
| 22 |
+
|
| 23 |
+
Usage:
|
| 24 |
+
- Set merge=False to overwrite the entire plan
|
| 25 |
+
- Set merge=True to update specific items by ID while preserving others
|
| 26 |
+
|
| 27 |
+
Example input:
|
| 28 |
+
{
|
| 29 |
+
"merge": true,
|
| 30 |
+
"todos": [
|
| 31 |
+
{"id": "1", "content": "Research market trends", "status": "completed"},
|
| 32 |
+
{"id": "2", "content": "Analyze competitor data", "status": "in_progress"}
|
| 33 |
+
]
|
| 34 |
+
}
|
| 35 |
+
|
| 36 |
+
|
| 37 |
+
Returns:
|
| 38 |
+
- {"result": "plan overwritten", "plan": updated_plan} when merge=False
|
| 39 |
+
- {"result": "plan updated", "plan": updated_plan} when merge=True
|
| 40 |
+
- {"error": "...", "plan": current_plan} when invariant violated
|
| 41 |
+
|
| 42 |
+
output_type: object
|
| 43 |
+
|
| 44 |
+
"""
|
| 45 |
+
name = "update_plan"
|
| 46 |
+
description = (
|
| 47 |
+
"Update the current execution plan on disk. "
|
| 48 |
+
"Use for multi-step tasks only. Maintains 2–5 non-operational items. "
|
| 49 |
+
"Requires exactly one item in_progress during execution."
|
| 50 |
+
)
|
| 51 |
+
inputs = {
|
| 52 |
+
"merge": {"type": "boolean", "description": "Merge with existing plan"},
|
| 53 |
+
"todos": {"type": "array", "description": "List of objects {id, content, status}"}
|
| 54 |
+
}
|
| 55 |
+
|
| 56 |
+
output_type = "string"
|
| 57 |
+
|
| 58 |
+
def forward(self, merge: bool, todos: list) -> str:
|
| 59 |
+
plan = load_plan()
|
| 60 |
+
|
| 61 |
+
if not merge:
|
| 62 |
+
save_plan(todos)
|
| 63 |
+
return json.dumps({"result": "plan overwritten", "plan": todos})
|
| 64 |
+
|
| 65 |
+
# merge: update items by id
|
| 66 |
+
plan_by_id = {item["id"]: item for item in plan}
|
| 67 |
+
for new_item in todos:
|
| 68 |
+
plan_by_id[new_item["id"]] = new_item
|
| 69 |
+
|
| 70 |
+
merged_plan = list(plan_by_id.values())
|
| 71 |
+
|
| 72 |
+
# enforce invariant: at most one in_progress
|
| 73 |
+
in_prog = [t for t in merged_plan if t["status"] == "in_progress"]
|
| 74 |
+
if len(in_prog) > 1:
|
| 75 |
+
return {
|
| 76 |
+
"error": "Only one item may be in_progress at a time. Fix your update.",
|
| 77 |
+
"plan": merged_plan
|
| 78 |
+
}
|
| 79 |
+
|
| 80 |
+
save_plan(merged_plan)
|
| 81 |
+
return json.dumps({"result": "plan updated", "plan": merged_plan})
|
uv.lock
CHANGED
|
@@ -8,9 +8,6 @@ resolution-markers = [
|
|
| 8 |
"python_full_version < '3.11'",
|
| 9 |
]
|
| 10 |
|
| 11 |
-
[options]
|
| 12 |
-
prerelease-mode = "allow"
|
| 13 |
-
|
| 14 |
[[package]]
|
| 15 |
name = "aiofiles"
|
| 16 |
version = "24.1.0"
|
|
@@ -206,6 +203,28 @@ wheels = [
|
|
| 206 |
{ url = "https://files.pythonhosted.org/packages/f5/10/56978295c14794b2c12007b07f3e41ba26acda9257457d7085b0bb3bb90c/brotli-1.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:e7c0af964e0b4e3412a0ebf341ea26ec767fa0b4cf81abb5e897c9338b5ad6a3", size = 375639, upload-time = "2025-11-05T18:38:55.67Z" },
|
| 207 |
]
|
| 208 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 209 |
[[package]]
|
| 210 |
name = "cachetools"
|
| 211 |
version = "6.2.2"
|
|
@@ -498,6 +517,22 @@ wheels = [
|
|
| 498 |
{ url = "https://files.pythonhosted.org/packages/d2/b2/fabcd6020b63b9d9f7a79cfc61b9c03c4e08ccb54f9cf9db9791be5669ef/cyclopts-4.2.4-py3-none-any.whl", hash = "sha256:41054f5e921a4f2b8ab9c839f12a274dec06a19560dc4898ce37cb775ca68ca4", size = 185023, upload-time = "2025-11-14T21:38:45.659Z" },
|
| 499 |
]
|
| 500 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 501 |
[[package]]
|
| 502 |
name = "deprecation"
|
| 503 |
version = "2.1.0"
|
|
@@ -560,6 +595,7 @@ name = "eastsync-ai"
|
|
| 560 |
version = "0.1.0"
|
| 561 |
source = { virtual = "." }
|
| 562 |
dependencies = [
|
|
|
|
| 563 |
{ name = "fastmcp" },
|
| 564 |
{ name = "gradio" },
|
| 565 |
{ name = "pydantic" },
|
|
@@ -569,6 +605,7 @@ dependencies = [
|
|
| 569 |
|
| 570 |
[package.metadata]
|
| 571 |
requires-dist = [
|
|
|
|
| 572 |
{ name = "fastmcp", specifier = ">=2.13.1" },
|
| 573 |
{ name = "gradio", specifier = "==6.0.0.dev1" },
|
| 574 |
{ name = "pydantic", specifier = ">=2.0.0" },
|
|
@@ -601,6 +638,15 @@ wheels = [
|
|
| 601 |
{ url = "https://files.pythonhosted.org/packages/36/f4/c6e662dade71f56cd2f3735141b265c3c79293c109549c1e6933b0651ffc/exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10", size = 16674, upload-time = "2025-05-10T17:42:49.33Z" },
|
| 602 |
]
|
| 603 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 604 |
[[package]]
|
| 605 |
name = "fastapi"
|
| 606 |
version = "0.121.2"
|
|
@@ -823,9 +869,16 @@ wheels = [
|
|
| 823 |
]
|
| 824 |
|
| 825 |
[package.optional-dependencies]
|
|
|
|
|
|
|
|
|
|
|
|
|
| 826 |
http2 = [
|
| 827 |
{ name = "h2" },
|
| 828 |
]
|
|
|
|
|
|
|
|
|
|
| 829 |
|
| 830 |
[[package]]
|
| 831 |
name = "httpx-sse"
|
|
@@ -1110,6 +1163,130 @@ wheels = [
|
|
| 1110 |
{ url = "https://files.pythonhosted.org/packages/81/db/e655086b7f3a705df045bf0933bdd9c2f79bb3c97bfef1384598bb79a217/keyring-25.7.0-py3-none-any.whl", hash = "sha256:be4a0b195f149690c166e850609a477c532ddbfbaed96a404d4e43f8d5e2689f", size = 39160, upload-time = "2025-11-16T16:26:08.402Z" },
|
| 1111 |
]
|
| 1112 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1113 |
[[package]]
|
| 1114 |
name = "markdown-it-py"
|
| 1115 |
version = "4.0.0"
|
|
@@ -1908,6 +2085,22 @@ wheels = [
|
|
| 1908 |
{ url = "https://files.pythonhosted.org/packages/99/b2/78d588d5acd1cc195bbbc26e9810a75371fdfd47489a653df4476867f220/postgrest-2.24.0-py3-none-any.whl", hash = "sha256:2127b7ff70c3e917791c17d4adfe36d1b721d5999eeda9d4ad3862d1bb6d15ae", size = 21581, upload-time = "2025-11-07T17:08:09.789Z" },
|
| 1909 |
]
|
| 1910 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1911 |
[[package]]
|
| 1912 |
name = "propcache"
|
| 1913 |
version = "0.4.1"
|
|
@@ -2644,6 +2837,15 @@ wheels = [
|
|
| 2644 |
{ url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" },
|
| 2645 |
]
|
| 2646 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2647 |
[[package]]
|
| 2648 |
name = "sse-starlette"
|
| 2649 |
version = "3.0.3"
|
|
|
|
| 8 |
"python_full_version < '3.11'",
|
| 9 |
]
|
| 10 |
|
|
|
|
|
|
|
|
|
|
| 11 |
[[package]]
|
| 12 |
name = "aiofiles"
|
| 13 |
version = "24.1.0"
|
|
|
|
| 203 |
{ url = "https://files.pythonhosted.org/packages/f5/10/56978295c14794b2c12007b07f3e41ba26acda9257457d7085b0bb3bb90c/brotli-1.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:e7c0af964e0b4e3412a0ebf341ea26ec767fa0b4cf81abb5e897c9338b5ad6a3", size = 375639, upload-time = "2025-11-05T18:38:55.67Z" },
|
| 204 |
]
|
| 205 |
|
| 206 |
+
[[package]]
|
| 207 |
+
name = "brotlicffi"
|
| 208 |
+
version = "1.1.0.0"
|
| 209 |
+
source = { registry = "https://pypi.org/simple" }
|
| 210 |
+
dependencies = [
|
| 211 |
+
{ name = "cffi" },
|
| 212 |
+
]
|
| 213 |
+
sdist = { url = "https://files.pythonhosted.org/packages/95/9d/70caa61192f570fcf0352766331b735afa931b4c6bc9a348a0925cc13288/brotlicffi-1.1.0.0.tar.gz", hash = "sha256:b77827a689905143f87915310b93b273ab17888fd43ef350d4832c4a71083c13", size = 465192, upload-time = "2023-09-14T14:22:40.707Z" }
|
| 214 |
+
wheels = [
|
| 215 |
+
{ url = "https://files.pythonhosted.org/packages/a2/11/7b96009d3dcc2c931e828ce1e157f03824a69fb728d06bfd7b2fc6f93718/brotlicffi-1.1.0.0-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9b7ae6bd1a3f0df532b6d67ff674099a96d22bc0948955cb338488c31bfb8851", size = 453786, upload-time = "2023-09-14T14:21:57.72Z" },
|
| 216 |
+
{ url = "https://files.pythonhosted.org/packages/d6/e6/a8f46f4a4ee7856fbd6ac0c6fb0dc65ed181ba46cd77875b8d9bbe494d9e/brotlicffi-1.1.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19ffc919fa4fc6ace69286e0a23b3789b4219058313cf9b45625016bf7ff996b", size = 2911165, upload-time = "2023-09-14T14:21:59.613Z" },
|
| 217 |
+
{ url = "https://files.pythonhosted.org/packages/be/20/201559dff14e83ba345a5ec03335607e47467b6633c210607e693aefac40/brotlicffi-1.1.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9feb210d932ffe7798ee62e6145d3a757eb6233aa9a4e7db78dd3690d7755814", size = 2927895, upload-time = "2023-09-14T14:22:01.22Z" },
|
| 218 |
+
{ url = "https://files.pythonhosted.org/packages/cd/15/695b1409264143be3c933f708a3f81d53c4a1e1ebbc06f46331decbf6563/brotlicffi-1.1.0.0-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84763dbdef5dd5c24b75597a77e1b30c66604725707565188ba54bab4f114820", size = 2851834, upload-time = "2023-09-14T14:22:03.571Z" },
|
| 219 |
+
{ url = "https://files.pythonhosted.org/packages/b4/40/b961a702463b6005baf952794c2e9e0099bde657d0d7e007f923883b907f/brotlicffi-1.1.0.0-cp37-abi3-win32.whl", hash = "sha256:1b12b50e07c3911e1efa3a8971543e7648100713d4e0971b13631cce22c587eb", size = 341731, upload-time = "2023-09-14T14:22:05.74Z" },
|
| 220 |
+
{ url = "https://files.pythonhosted.org/packages/1c/fa/5408a03c041114ceab628ce21766a4ea882aa6f6f0a800e04ee3a30ec6b9/brotlicffi-1.1.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:994a4f0681bb6c6c3b0925530a1926b7a189d878e6e5e38fae8efa47c5d9c613", size = 366783, upload-time = "2023-09-14T14:22:07.096Z" },
|
| 221 |
+
{ url = "https://files.pythonhosted.org/packages/e5/3b/bd4f3d2bcf2306ae66b0346f5b42af1962480b200096ffc7abc3bd130eca/brotlicffi-1.1.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2e4aeb0bd2540cb91b069dbdd54d458da8c4334ceaf2d25df2f4af576d6766ca", size = 397397, upload-time = "2023-09-14T14:22:08.519Z" },
|
| 222 |
+
{ url = "https://files.pythonhosted.org/packages/54/10/1fd57864449360852c535c2381ee7120ba8f390aa3869df967c44ca7eba1/brotlicffi-1.1.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b7b0033b0d37bb33009fb2fef73310e432e76f688af76c156b3594389d81391", size = 379698, upload-time = "2023-09-14T14:22:10.52Z" },
|
| 223 |
+
{ url = "https://files.pythonhosted.org/packages/e5/95/15aa422aa6450e6556e54a5fd1650ff59f470aed77ac739aa90ab63dc611/brotlicffi-1.1.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54a07bb2374a1eba8ebb52b6fafffa2afd3c4df85ddd38fcc0511f2bb387c2a8", size = 378635, upload-time = "2023-09-14T14:22:11.982Z" },
|
| 224 |
+
{ url = "https://files.pythonhosted.org/packages/6c/a7/f254e13b2cb43337d6d99a4ec10394c134e41bfda8a2eff15b75627f4a3d/brotlicffi-1.1.0.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7901a7dc4b88f1c1475de59ae9be59799db1007b7d059817948d8e4f12e24e35", size = 385719, upload-time = "2023-09-14T14:22:13.483Z" },
|
| 225 |
+
{ url = "https://files.pythonhosted.org/packages/72/a9/0971251c4427c14b2a827dba3d910d4d3330dabf23d4278bf6d06a978847/brotlicffi-1.1.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce01c7316aebc7fce59da734286148b1d1b9455f89cf2c8a4dfce7d41db55c2d", size = 361760, upload-time = "2023-09-14T14:22:14.767Z" },
|
| 226 |
+
]
|
| 227 |
+
|
| 228 |
[[package]]
|
| 229 |
name = "cachetools"
|
| 230 |
version = "6.2.2"
|
|
|
|
| 517 |
{ url = "https://files.pythonhosted.org/packages/d2/b2/fabcd6020b63b9d9f7a79cfc61b9c03c4e08ccb54f9cf9db9791be5669ef/cyclopts-4.2.4-py3-none-any.whl", hash = "sha256:41054f5e921a4f2b8ab9c839f12a274dec06a19560dc4898ce37cb775ca68ca4", size = 185023, upload-time = "2025-11-14T21:38:45.659Z" },
|
| 518 |
]
|
| 519 |
|
| 520 |
+
[[package]]
|
| 521 |
+
name = "ddgs"
|
| 522 |
+
version = "9.9.1"
|
| 523 |
+
source = { registry = "https://pypi.org/simple" }
|
| 524 |
+
dependencies = [
|
| 525 |
+
{ name = "click" },
|
| 526 |
+
{ name = "fake-useragent" },
|
| 527 |
+
{ name = "httpx", extra = ["brotli", "http2", "socks"] },
|
| 528 |
+
{ name = "lxml" },
|
| 529 |
+
{ name = "primp" },
|
| 530 |
+
]
|
| 531 |
+
sdist = { url = "https://files.pythonhosted.org/packages/f1/44/93fc35ddcca217b672554739cd731704b13245c6bfa5374189c38f7a51b3/ddgs-9.9.1.tar.gz", hash = "sha256:d33529abb56aa5b98eb436565a6bfa48f07eb04dca18d323df723b83cb007e4f", size = 36007, upload-time = "2025-11-14T16:03:51.794Z" }
|
| 532 |
+
wheels = [
|
| 533 |
+
{ url = "https://files.pythonhosted.org/packages/ce/c6/1c9fa4e017bf0a06af9211c1f8a9f3b383e92ff4a1f4e494e2cafdc9487d/ddgs-9.9.1-py3-none-any.whl", hash = "sha256:bba5701462bc9c8eac69fdd2edf7e833e74741b2bae3593489e470e125e9601d", size = 41439, upload-time = "2025-11-14T16:03:50.637Z" },
|
| 534 |
+
]
|
| 535 |
+
|
| 536 |
[[package]]
|
| 537 |
name = "deprecation"
|
| 538 |
version = "2.1.0"
|
|
|
|
| 595 |
version = "0.1.0"
|
| 596 |
source = { virtual = "." }
|
| 597 |
dependencies = [
|
| 598 |
+
{ name = "ddgs" },
|
| 599 |
{ name = "fastmcp" },
|
| 600 |
{ name = "gradio" },
|
| 601 |
{ name = "pydantic" },
|
|
|
|
| 605 |
|
| 606 |
[package.metadata]
|
| 607 |
requires-dist = [
|
| 608 |
+
{ name = "ddgs", specifier = ">=9.9.1" },
|
| 609 |
{ name = "fastmcp", specifier = ">=2.13.1" },
|
| 610 |
{ name = "gradio", specifier = "==6.0.0.dev1" },
|
| 611 |
{ name = "pydantic", specifier = ">=2.0.0" },
|
|
|
|
| 638 |
{ url = "https://files.pythonhosted.org/packages/36/f4/c6e662dade71f56cd2f3735141b265c3c79293c109549c1e6933b0651ffc/exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10", size = 16674, upload-time = "2025-05-10T17:42:49.33Z" },
|
| 639 |
]
|
| 640 |
|
| 641 |
+
[[package]]
|
| 642 |
+
name = "fake-useragent"
|
| 643 |
+
version = "2.2.0"
|
| 644 |
+
source = { registry = "https://pypi.org/simple" }
|
| 645 |
+
sdist = { url = "https://files.pythonhosted.org/packages/41/43/948d10bf42735709edb5ae51e23297d034086f17fc7279fef385a7acb473/fake_useragent-2.2.0.tar.gz", hash = "sha256:4e6ab6571e40cc086d788523cf9e018f618d07f9050f822ff409a4dfe17c16b2", size = 158898, upload-time = "2025-04-14T15:32:19.238Z" }
|
| 646 |
+
wheels = [
|
| 647 |
+
{ url = "https://files.pythonhosted.org/packages/51/37/b3ea9cd5558ff4cb51957caca2193981c6b0ff30bd0d2630ac62505d99d0/fake_useragent-2.2.0-py3-none-any.whl", hash = "sha256:67f35ca4d847b0d298187443aaf020413746e56acd985a611908c73dba2daa24", size = 161695, upload-time = "2025-04-14T15:32:17.732Z" },
|
| 648 |
+
]
|
| 649 |
+
|
| 650 |
[[package]]
|
| 651 |
name = "fastapi"
|
| 652 |
version = "0.121.2"
|
|
|
|
| 869 |
]
|
| 870 |
|
| 871 |
[package.optional-dependencies]
|
| 872 |
+
brotli = [
|
| 873 |
+
{ name = "brotli", marker = "platform_python_implementation == 'CPython'" },
|
| 874 |
+
{ name = "brotlicffi", marker = "platform_python_implementation != 'CPython'" },
|
| 875 |
+
]
|
| 876 |
http2 = [
|
| 877 |
{ name = "h2" },
|
| 878 |
]
|
| 879 |
+
socks = [
|
| 880 |
+
{ name = "socksio" },
|
| 881 |
+
]
|
| 882 |
|
| 883 |
[[package]]
|
| 884 |
name = "httpx-sse"
|
|
|
|
| 1163 |
{ url = "https://files.pythonhosted.org/packages/81/db/e655086b7f3a705df045bf0933bdd9c2f79bb3c97bfef1384598bb79a217/keyring-25.7.0-py3-none-any.whl", hash = "sha256:be4a0b195f149690c166e850609a477c532ddbfbaed96a404d4e43f8d5e2689f", size = 39160, upload-time = "2025-11-16T16:26:08.402Z" },
|
| 1164 |
]
|
| 1165 |
|
| 1166 |
+
[[package]]
|
| 1167 |
+
name = "lxml"
|
| 1168 |
+
version = "6.0.2"
|
| 1169 |
+
source = { registry = "https://pypi.org/simple" }
|
| 1170 |
+
sdist = { url = "https://files.pythonhosted.org/packages/aa/88/262177de60548e5a2bfc46ad28232c9e9cbde697bd94132aeb80364675cb/lxml-6.0.2.tar.gz", hash = "sha256:cd79f3367bd74b317dda655dc8fcfa304d9eb6e4fb06b7168c5cf27f96e0cd62", size = 4073426, upload-time = "2025-09-22T04:04:59.287Z" }
|
| 1171 |
+
wheels = [
|
| 1172 |
+
{ url = "https://files.pythonhosted.org/packages/db/8a/f8192a08237ef2fb1b19733f709db88a4c43bc8ab8357f01cb41a27e7f6a/lxml-6.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e77dd455b9a16bbd2a5036a63ddbd479c19572af81b624e79ef422f929eef388", size = 8590589, upload-time = "2025-09-22T04:00:10.51Z" },
|
| 1173 |
+
{ url = "https://files.pythonhosted.org/packages/12/64/27bcd07ae17ff5e5536e8d88f4c7d581b48963817a13de11f3ac3329bfa2/lxml-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d444858b9f07cefff6455b983aea9a67f7462ba1f6cbe4a21e8bf6791bf2153", size = 4629671, upload-time = "2025-09-22T04:00:15.411Z" },
|
| 1174 |
+
{ url = "https://files.pythonhosted.org/packages/02/5a/a7d53b3291c324e0b6e48f3c797be63836cc52156ddf8f33cd72aac78866/lxml-6.0.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f952dacaa552f3bb8834908dddd500ba7d508e6ea6eb8c52eb2d28f48ca06a31", size = 4999961, upload-time = "2025-09-22T04:00:17.619Z" },
|
| 1175 |
+
{ url = "https://files.pythonhosted.org/packages/f5/55/d465e9b89df1761674d8672bb3e4ae2c47033b01ec243964b6e334c6743f/lxml-6.0.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:71695772df6acea9f3c0e59e44ba8ac50c4f125217e84aab21074a1a55e7e5c9", size = 5157087, upload-time = "2025-09-22T04:00:19.868Z" },
|
| 1176 |
+
{ url = "https://files.pythonhosted.org/packages/62/38/3073cd7e3e8dfc3ba3c3a139e33bee3a82de2bfb0925714351ad3d255c13/lxml-6.0.2-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:17f68764f35fd78d7c4cc4ef209a184c38b65440378013d24b8aecd327c3e0c8", size = 5067620, upload-time = "2025-09-22T04:00:21.877Z" },
|
| 1177 |
+
{ url = "https://files.pythonhosted.org/packages/4a/d3/1e001588c5e2205637b08985597827d3827dbaaece16348c8822bfe61c29/lxml-6.0.2-cp310-cp310-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:058027e261afed589eddcfe530fcc6f3402d7fd7e89bfd0532df82ebc1563dba", size = 5406664, upload-time = "2025-09-22T04:00:23.714Z" },
|
| 1178 |
+
{ url = "https://files.pythonhosted.org/packages/20/cf/cab09478699b003857ed6ebfe95e9fb9fa3d3c25f1353b905c9b73cfb624/lxml-6.0.2-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8ffaeec5dfea5881d4c9d8913a32d10cfe3923495386106e4a24d45300ef79c", size = 5289397, upload-time = "2025-09-22T04:00:25.544Z" },
|
| 1179 |
+
{ url = "https://files.pythonhosted.org/packages/a3/84/02a2d0c38ac9a8b9f9e5e1bbd3f24b3f426044ad618b552e9549ee91bd63/lxml-6.0.2-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:f2e3b1a6bb38de0bc713edd4d612969dd250ca8b724be8d460001a387507021c", size = 4772178, upload-time = "2025-09-22T04:00:27.602Z" },
|
| 1180 |
+
{ url = "https://files.pythonhosted.org/packages/56/87/e1ceadcc031ec4aa605fe95476892d0b0ba3b7f8c7dcdf88fdeff59a9c86/lxml-6.0.2-cp310-cp310-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d6690ec5ec1cce0385cb20896b16be35247ac8c2046e493d03232f1c2414d321", size = 5358148, upload-time = "2025-09-22T04:00:29.323Z" },
|
| 1181 |
+
{ url = "https://files.pythonhosted.org/packages/fe/13/5bb6cf42bb228353fd4ac5f162c6a84fd68a4d6f67c1031c8cf97e131fc6/lxml-6.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f2a50c3c1d11cad0ebebbac357a97b26aa79d2bcaf46f256551152aa85d3a4d1", size = 5112035, upload-time = "2025-09-22T04:00:31.061Z" },
|
| 1182 |
+
{ url = "https://files.pythonhosted.org/packages/e4/e2/ea0498552102e59834e297c5c6dff8d8ded3db72ed5e8aad77871476f073/lxml-6.0.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:3efe1b21c7801ffa29a1112fab3b0f643628c30472d507f39544fd48e9549e34", size = 4799111, upload-time = "2025-09-22T04:00:33.11Z" },
|
| 1183 |
+
{ url = "https://files.pythonhosted.org/packages/6a/9e/8de42b52a73abb8af86c66c969b3b4c2a96567b6ac74637c037d2e3baa60/lxml-6.0.2-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:59c45e125140b2c4b33920d21d83681940ca29f0b83f8629ea1a2196dc8cfe6a", size = 5351662, upload-time = "2025-09-22T04:00:35.237Z" },
|
| 1184 |
+
{ url = "https://files.pythonhosted.org/packages/28/a2/de776a573dfb15114509a37351937c367530865edb10a90189d0b4b9b70a/lxml-6.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:452b899faa64f1805943ec1c0c9ebeaece01a1af83e130b69cdefeda180bb42c", size = 5314973, upload-time = "2025-09-22T04:00:37.086Z" },
|
| 1185 |
+
{ url = "https://files.pythonhosted.org/packages/50/a0/3ae1b1f8964c271b5eec91db2043cf8c6c0bce101ebb2a633b51b044db6c/lxml-6.0.2-cp310-cp310-win32.whl", hash = "sha256:1e786a464c191ca43b133906c6903a7e4d56bef376b75d97ccbb8ec5cf1f0a4b", size = 3611953, upload-time = "2025-09-22T04:00:39.224Z" },
|
| 1186 |
+
{ url = "https://files.pythonhosted.org/packages/d1/70/bd42491f0634aad41bdfc1e46f5cff98825fb6185688dc82baa35d509f1a/lxml-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:dacf3c64ef3f7440e3167aa4b49aa9e0fb99e0aa4f9ff03795640bf94531bcb0", size = 4032695, upload-time = "2025-09-22T04:00:41.402Z" },
|
| 1187 |
+
{ url = "https://files.pythonhosted.org/packages/d2/d0/05c6a72299f54c2c561a6c6cbb2f512e047fca20ea97a05e57931f194ac4/lxml-6.0.2-cp310-cp310-win_arm64.whl", hash = "sha256:45f93e6f75123f88d7f0cfd90f2d05f441b808562bf0bc01070a00f53f5028b5", size = 3680051, upload-time = "2025-09-22T04:00:43.525Z" },
|
| 1188 |
+
{ url = "https://files.pythonhosted.org/packages/77/d5/becbe1e2569b474a23f0c672ead8a29ac50b2dc1d5b9de184831bda8d14c/lxml-6.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:13e35cbc684aadf05d8711a5d1b5857c92e5e580efa9a0d2be197199c8def607", size = 8634365, upload-time = "2025-09-22T04:00:45.672Z" },
|
| 1189 |
+
{ url = "https://files.pythonhosted.org/packages/28/66/1ced58f12e804644426b85d0bb8a4478ca77bc1761455da310505f1a3526/lxml-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b1675e096e17c6fe9c0e8c81434f5736c0739ff9ac6123c87c2d452f48fc938", size = 4650793, upload-time = "2025-09-22T04:00:47.783Z" },
|
| 1190 |
+
{ url = "https://files.pythonhosted.org/packages/11/84/549098ffea39dfd167e3f174b4ce983d0eed61f9d8d25b7bf2a57c3247fc/lxml-6.0.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8ac6e5811ae2870953390452e3476694196f98d447573234592d30488147404d", size = 4944362, upload-time = "2025-09-22T04:00:49.845Z" },
|
| 1191 |
+
{ url = "https://files.pythonhosted.org/packages/ac/bd/f207f16abf9749d2037453d56b643a7471d8fde855a231a12d1e095c4f01/lxml-6.0.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5aa0fc67ae19d7a64c3fe725dc9a1bb11f80e01f78289d05c6f62545affec438", size = 5083152, upload-time = "2025-09-22T04:00:51.709Z" },
|
| 1192 |
+
{ url = "https://files.pythonhosted.org/packages/15/ae/bd813e87d8941d52ad5b65071b1affb48da01c4ed3c9c99e40abb266fbff/lxml-6.0.2-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de496365750cc472b4e7902a485d3f152ecf57bd3ba03ddd5578ed8ceb4c5964", size = 5023539, upload-time = "2025-09-22T04:00:53.593Z" },
|
| 1193 |
+
{ url = "https://files.pythonhosted.org/packages/02/cd/9bfef16bd1d874fbe0cb51afb00329540f30a3283beb9f0780adbb7eec03/lxml-6.0.2-cp311-cp311-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:200069a593c5e40b8f6fc0d84d86d970ba43138c3e68619ffa234bc9bb806a4d", size = 5344853, upload-time = "2025-09-22T04:00:55.524Z" },
|
| 1194 |
+
{ url = "https://files.pythonhosted.org/packages/b8/89/ea8f91594bc5dbb879734d35a6f2b0ad50605d7fb419de2b63d4211765cc/lxml-6.0.2-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d2de809c2ee3b888b59f995625385f74629707c9355e0ff856445cdcae682b7", size = 5225133, upload-time = "2025-09-22T04:00:57.269Z" },
|
| 1195 |
+
{ url = "https://files.pythonhosted.org/packages/b9/37/9c735274f5dbec726b2db99b98a43950395ba3d4a1043083dba2ad814170/lxml-6.0.2-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:b2c3da8d93cf5db60e8858c17684c47d01fee6405e554fb55018dd85fc23b178", size = 4677944, upload-time = "2025-09-22T04:00:59.052Z" },
|
| 1196 |
+
{ url = "https://files.pythonhosted.org/packages/20/28/7dfe1ba3475d8bfca3878365075abe002e05d40dfaaeb7ec01b4c587d533/lxml-6.0.2-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:442de7530296ef5e188373a1ea5789a46ce90c4847e597856570439621d9c553", size = 5284535, upload-time = "2025-09-22T04:01:01.335Z" },
|
| 1197 |
+
{ url = "https://files.pythonhosted.org/packages/e7/cf/5f14bc0de763498fc29510e3532bf2b4b3a1c1d5d0dff2e900c16ba021ef/lxml-6.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2593c77efde7bfea7f6389f1ab249b15ed4aa5bc5cb5131faa3b843c429fbedb", size = 5067343, upload-time = "2025-09-22T04:01:03.13Z" },
|
| 1198 |
+
{ url = "https://files.pythonhosted.org/packages/1c/b0/bb8275ab5472f32b28cfbbcc6db7c9d092482d3439ca279d8d6fa02f7025/lxml-6.0.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:3e3cb08855967a20f553ff32d147e14329b3ae70ced6edc2f282b94afbc74b2a", size = 4725419, upload-time = "2025-09-22T04:01:05.013Z" },
|
| 1199 |
+
{ url = "https://files.pythonhosted.org/packages/25/4c/7c222753bc72edca3b99dbadba1b064209bc8ed4ad448af990e60dcce462/lxml-6.0.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2ed6c667fcbb8c19c6791bbf40b7268ef8ddf5a96940ba9404b9f9a304832f6c", size = 5275008, upload-time = "2025-09-22T04:01:07.327Z" },
|
| 1200 |
+
{ url = "https://files.pythonhosted.org/packages/6c/8c/478a0dc6b6ed661451379447cdbec77c05741a75736d97e5b2b729687828/lxml-6.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b8f18914faec94132e5b91e69d76a5c1d7b0c73e2489ea8929c4aaa10b76bbf7", size = 5248906, upload-time = "2025-09-22T04:01:09.452Z" },
|
| 1201 |
+
{ url = "https://files.pythonhosted.org/packages/2d/d9/5be3a6ab2784cdf9accb0703b65e1b64fcdd9311c9f007630c7db0cfcce1/lxml-6.0.2-cp311-cp311-win32.whl", hash = "sha256:6605c604e6daa9e0d7f0a2137bdc47a2e93b59c60a65466353e37f8272f47c46", size = 3610357, upload-time = "2025-09-22T04:01:11.102Z" },
|
| 1202 |
+
{ url = "https://files.pythonhosted.org/packages/e2/7d/ca6fb13349b473d5732fb0ee3eec8f6c80fc0688e76b7d79c1008481bf1f/lxml-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e5867f2651016a3afd8dd2c8238baa66f1e2802f44bc17e236f547ace6647078", size = 4036583, upload-time = "2025-09-22T04:01:12.766Z" },
|
| 1203 |
+
{ url = "https://files.pythonhosted.org/packages/ab/a2/51363b5ecd3eab46563645f3a2c3836a2fc67d01a1b87c5017040f39f567/lxml-6.0.2-cp311-cp311-win_arm64.whl", hash = "sha256:4197fb2534ee05fd3e7afaab5d8bfd6c2e186f65ea7f9cd6a82809c887bd1285", size = 3680591, upload-time = "2025-09-22T04:01:14.874Z" },
|
| 1204 |
+
{ url = "https://files.pythonhosted.org/packages/f3/c8/8ff2bc6b920c84355146cd1ab7d181bc543b89241cfb1ebee824a7c81457/lxml-6.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a59f5448ba2ceccd06995c95ea59a7674a10de0810f2ce90c9006f3cbc044456", size = 8661887, upload-time = "2025-09-22T04:01:17.265Z" },
|
| 1205 |
+
{ url = "https://files.pythonhosted.org/packages/37/6f/9aae1008083bb501ef63284220ce81638332f9ccbfa53765b2b7502203cf/lxml-6.0.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e8113639f3296706fbac34a30813929e29247718e88173ad849f57ca59754924", size = 4667818, upload-time = "2025-09-22T04:01:19.688Z" },
|
| 1206 |
+
{ url = "https://files.pythonhosted.org/packages/f1/ca/31fb37f99f37f1536c133476674c10b577e409c0a624384147653e38baf2/lxml-6.0.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a8bef9b9825fa8bc816a6e641bb67219489229ebc648be422af695f6e7a4fa7f", size = 4950807, upload-time = "2025-09-22T04:01:21.487Z" },
|
| 1207 |
+
{ url = "https://files.pythonhosted.org/packages/da/87/f6cb9442e4bada8aab5ae7e1046264f62fdbeaa6e3f6211b93f4c0dd97f1/lxml-6.0.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:65ea18d710fd14e0186c2f973dc60bb52039a275f82d3c44a0e42b43440ea534", size = 5109179, upload-time = "2025-09-22T04:01:23.32Z" },
|
| 1208 |
+
{ url = "https://files.pythonhosted.org/packages/c8/20/a7760713e65888db79bbae4f6146a6ae5c04e4a204a3c48896c408cd6ed2/lxml-6.0.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c371aa98126a0d4c739ca93ceffa0fd7a5d732e3ac66a46e74339acd4d334564", size = 5023044, upload-time = "2025-09-22T04:01:25.118Z" },
|
| 1209 |
+
{ url = "https://files.pythonhosted.org/packages/a2/b0/7e64e0460fcb36471899f75831509098f3fd7cd02a3833ac517433cb4f8f/lxml-6.0.2-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:700efd30c0fa1a3581d80a748157397559396090a51d306ea59a70020223d16f", size = 5359685, upload-time = "2025-09-22T04:01:27.398Z" },
|
| 1210 |
+
{ url = "https://files.pythonhosted.org/packages/b9/e1/e5df362e9ca4e2f48ed6411bd4b3a0ae737cc842e96877f5bf9428055ab4/lxml-6.0.2-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c33e66d44fe60e72397b487ee92e01da0d09ba2d66df8eae42d77b6d06e5eba0", size = 5654127, upload-time = "2025-09-22T04:01:29.629Z" },
|
| 1211 |
+
{ url = "https://files.pythonhosted.org/packages/c6/d1/232b3309a02d60f11e71857778bfcd4acbdb86c07db8260caf7d008b08f8/lxml-6.0.2-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90a345bbeaf9d0587a3aaffb7006aa39ccb6ff0e96a57286c0cb2fd1520ea192", size = 5253958, upload-time = "2025-09-22T04:01:31.535Z" },
|
| 1212 |
+
{ url = "https://files.pythonhosted.org/packages/35/35/d955a070994725c4f7d80583a96cab9c107c57a125b20bb5f708fe941011/lxml-6.0.2-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:064fdadaf7a21af3ed1dcaa106b854077fbeada827c18f72aec9346847cd65d0", size = 4711541, upload-time = "2025-09-22T04:01:33.801Z" },
|
| 1213 |
+
{ url = "https://files.pythonhosted.org/packages/1e/be/667d17363b38a78c4bd63cfd4b4632029fd68d2c2dc81f25ce9eb5224dd5/lxml-6.0.2-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fbc74f42c3525ac4ffa4b89cbdd00057b6196bcefe8bce794abd42d33a018092", size = 5267426, upload-time = "2025-09-22T04:01:35.639Z" },
|
| 1214 |
+
{ url = "https://files.pythonhosted.org/packages/ea/47/62c70aa4a1c26569bc958c9ca86af2bb4e1f614e8c04fb2989833874f7ae/lxml-6.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6ddff43f702905a4e32bc24f3f2e2edfe0f8fde3277d481bffb709a4cced7a1f", size = 5064917, upload-time = "2025-09-22T04:01:37.448Z" },
|
| 1215 |
+
{ url = "https://files.pythonhosted.org/packages/bd/55/6ceddaca353ebd0f1908ef712c597f8570cc9c58130dbb89903198e441fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6da5185951d72e6f5352166e3da7b0dc27aa70bd1090b0eb3f7f7212b53f1bb8", size = 4788795, upload-time = "2025-09-22T04:01:39.165Z" },
|
| 1216 |
+
{ url = "https://files.pythonhosted.org/packages/cf/e8/fd63e15da5e3fd4c2146f8bbb3c14e94ab850589beab88e547b2dbce22e1/lxml-6.0.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:57a86e1ebb4020a38d295c04fc79603c7899e0df71588043eb218722dabc087f", size = 5676759, upload-time = "2025-09-22T04:01:41.506Z" },
|
| 1217 |
+
{ url = "https://files.pythonhosted.org/packages/76/47/b3ec58dc5c374697f5ba37412cd2728f427d056315d124dd4b61da381877/lxml-6.0.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2047d8234fe735ab77802ce5f2297e410ff40f5238aec569ad7c8e163d7b19a6", size = 5255666, upload-time = "2025-09-22T04:01:43.363Z" },
|
| 1218 |
+
{ url = "https://files.pythonhosted.org/packages/19/93/03ba725df4c3d72afd9596eef4a37a837ce8e4806010569bedfcd2cb68fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6f91fd2b2ea15a6800c8e24418c0775a1694eefc011392da73bc6cef2623b322", size = 5277989, upload-time = "2025-09-22T04:01:45.215Z" },
|
| 1219 |
+
{ url = "https://files.pythonhosted.org/packages/c6/80/c06de80bfce881d0ad738576f243911fccf992687ae09fd80b734712b39c/lxml-6.0.2-cp312-cp312-win32.whl", hash = "sha256:3ae2ce7d6fedfb3414a2b6c5e20b249c4c607f72cb8d2bb7cc9c6ec7c6f4e849", size = 3611456, upload-time = "2025-09-22T04:01:48.243Z" },
|
| 1220 |
+
{ url = "https://files.pythonhosted.org/packages/f7/d7/0cdfb6c3e30893463fb3d1e52bc5f5f99684a03c29a0b6b605cfae879cd5/lxml-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:72c87e5ee4e58a8354fb9c7c84cbf95a1c8236c127a5d1b7683f04bed8361e1f", size = 4011793, upload-time = "2025-09-22T04:01:50.042Z" },
|
| 1221 |
+
{ url = "https://files.pythonhosted.org/packages/ea/7b/93c73c67db235931527301ed3785f849c78991e2e34f3fd9a6663ffda4c5/lxml-6.0.2-cp312-cp312-win_arm64.whl", hash = "sha256:61cb10eeb95570153e0c0e554f58df92ecf5109f75eacad4a95baa709e26c3d6", size = 3672836, upload-time = "2025-09-22T04:01:52.145Z" },
|
| 1222 |
+
{ url = "https://files.pythonhosted.org/packages/53/fd/4e8f0540608977aea078bf6d79f128e0e2c2bba8af1acf775c30baa70460/lxml-6.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9b33d21594afab46f37ae58dfadd06636f154923c4e8a4d754b0127554eb2e77", size = 8648494, upload-time = "2025-09-22T04:01:54.242Z" },
|
| 1223 |
+
{ url = "https://files.pythonhosted.org/packages/5d/f4/2a94a3d3dfd6c6b433501b8d470a1960a20ecce93245cf2db1706adf6c19/lxml-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c8963287d7a4c5c9a432ff487c52e9c5618667179c18a204bdedb27310f022f", size = 4661146, upload-time = "2025-09-22T04:01:56.282Z" },
|
| 1224 |
+
{ url = "https://files.pythonhosted.org/packages/25/2e/4efa677fa6b322013035d38016f6ae859d06cac67437ca7dc708a6af7028/lxml-6.0.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1941354d92699fb5ffe6ed7b32f9649e43c2feb4b97205f75866f7d21aa91452", size = 4946932, upload-time = "2025-09-22T04:01:58.989Z" },
|
| 1225 |
+
{ url = "https://files.pythonhosted.org/packages/ce/0f/526e78a6d38d109fdbaa5049c62e1d32fdd70c75fb61c4eadf3045d3d124/lxml-6.0.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb2f6ca0ae2d983ded09357b84af659c954722bbf04dea98030064996d156048", size = 5100060, upload-time = "2025-09-22T04:02:00.812Z" },
|
| 1226 |
+
{ url = "https://files.pythonhosted.org/packages/81/76/99de58d81fa702cc0ea7edae4f4640416c2062813a00ff24bd70ac1d9c9b/lxml-6.0.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb2a12d704f180a902d7fa778c6d71f36ceb7b0d317f34cdc76a5d05aa1dd1df", size = 5019000, upload-time = "2025-09-22T04:02:02.671Z" },
|
| 1227 |
+
{ url = "https://files.pythonhosted.org/packages/b5/35/9e57d25482bc9a9882cb0037fdb9cc18f4b79d85df94fa9d2a89562f1d25/lxml-6.0.2-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:6ec0e3f745021bfed19c456647f0298d60a24c9ff86d9d051f52b509663feeb1", size = 5348496, upload-time = "2025-09-22T04:02:04.904Z" },
|
| 1228 |
+
{ url = "https://files.pythonhosted.org/packages/a6/8e/cb99bd0b83ccc3e8f0f528e9aa1f7a9965dfec08c617070c5db8d63a87ce/lxml-6.0.2-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:846ae9a12d54e368933b9759052d6206a9e8b250291109c48e350c1f1f49d916", size = 5643779, upload-time = "2025-09-22T04:02:06.689Z" },
|
| 1229 |
+
{ url = "https://files.pythonhosted.org/packages/d0/34/9e591954939276bb679b73773836c6684c22e56d05980e31d52a9a8deb18/lxml-6.0.2-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef9266d2aa545d7374938fb5c484531ef5a2ec7f2d573e62f8ce722c735685fd", size = 5244072, upload-time = "2025-09-22T04:02:08.587Z" },
|
| 1230 |
+
{ url = "https://files.pythonhosted.org/packages/8d/27/b29ff065f9aaca443ee377aff699714fcbffb371b4fce5ac4ca759e436d5/lxml-6.0.2-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:4077b7c79f31755df33b795dc12119cb557a0106bfdab0d2c2d97bd3cf3dffa6", size = 4718675, upload-time = "2025-09-22T04:02:10.783Z" },
|
| 1231 |
+
{ url = "https://files.pythonhosted.org/packages/2b/9f/f756f9c2cd27caa1a6ef8c32ae47aadea697f5c2c6d07b0dae133c244fbe/lxml-6.0.2-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a7c5d5e5f1081955358533be077166ee97ed2571d6a66bdba6ec2f609a715d1a", size = 5255171, upload-time = "2025-09-22T04:02:12.631Z" },
|
| 1232 |
+
{ url = "https://files.pythonhosted.org/packages/61/46/bb85ea42d2cb1bd8395484fd72f38e3389611aa496ac7772da9205bbda0e/lxml-6.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8f8d0cbd0674ee89863a523e6994ac25fd5be9c8486acfc3e5ccea679bad2679", size = 5057175, upload-time = "2025-09-22T04:02:14.718Z" },
|
| 1233 |
+
{ url = "https://files.pythonhosted.org/packages/95/0c/443fc476dcc8e41577f0af70458c50fe299a97bb6b7505bb1ae09aa7f9ac/lxml-6.0.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2cbcbf6d6e924c28f04a43f3b6f6e272312a090f269eff68a2982e13e5d57659", size = 4785688, upload-time = "2025-09-22T04:02:16.957Z" },
|
| 1234 |
+
{ url = "https://files.pythonhosted.org/packages/48/78/6ef0b359d45bb9697bc5a626e1992fa5d27aa3f8004b137b2314793b50a0/lxml-6.0.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dfb874cfa53340009af6bdd7e54ebc0d21012a60a4e65d927c2e477112e63484", size = 5660655, upload-time = "2025-09-22T04:02:18.815Z" },
|
| 1235 |
+
{ url = "https://files.pythonhosted.org/packages/ff/ea/e1d33808f386bc1339d08c0dcada6e4712d4ed8e93fcad5f057070b7988a/lxml-6.0.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:fb8dae0b6b8b7f9e96c26fdd8121522ce5de9bb5538010870bd538683d30e9a2", size = 5247695, upload-time = "2025-09-22T04:02:20.593Z" },
|
| 1236 |
+
{ url = "https://files.pythonhosted.org/packages/4f/47/eba75dfd8183673725255247a603b4ad606f4ae657b60c6c145b381697da/lxml-6.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:358d9adae670b63e95bc59747c72f4dc97c9ec58881d4627fe0120da0f90d314", size = 5269841, upload-time = "2025-09-22T04:02:22.489Z" },
|
| 1237 |
+
{ url = "https://files.pythonhosted.org/packages/76/04/5c5e2b8577bc936e219becb2e98cdb1aca14a4921a12995b9d0c523502ae/lxml-6.0.2-cp313-cp313-win32.whl", hash = "sha256:e8cd2415f372e7e5a789d743d133ae474290a90b9023197fd78f32e2dc6873e2", size = 3610700, upload-time = "2025-09-22T04:02:24.465Z" },
|
| 1238 |
+
{ url = "https://files.pythonhosted.org/packages/fe/0a/4643ccc6bb8b143e9f9640aa54e38255f9d3b45feb2cbe7ae2ca47e8782e/lxml-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:b30d46379644fbfc3ab81f8f82ae4de55179414651f110a1514f0b1f8f6cb2d7", size = 4010347, upload-time = "2025-09-22T04:02:26.286Z" },
|
| 1239 |
+
{ url = "https://files.pythonhosted.org/packages/31/ef/dcf1d29c3f530577f61e5fe2f1bd72929acf779953668a8a47a479ae6f26/lxml-6.0.2-cp313-cp313-win_arm64.whl", hash = "sha256:13dcecc9946dca97b11b7c40d29fba63b55ab4170d3c0cf8c0c164343b9bfdcf", size = 3671248, upload-time = "2025-09-22T04:02:27.918Z" },
|
| 1240 |
+
{ url = "https://files.pythonhosted.org/packages/03/15/d4a377b385ab693ce97b472fe0c77c2b16ec79590e688b3ccc71fba19884/lxml-6.0.2-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:b0c732aa23de8f8aec23f4b580d1e52905ef468afb4abeafd3fec77042abb6fe", size = 8659801, upload-time = "2025-09-22T04:02:30.113Z" },
|
| 1241 |
+
{ url = "https://files.pythonhosted.org/packages/c8/e8/c128e37589463668794d503afaeb003987373c5f94d667124ffd8078bbd9/lxml-6.0.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4468e3b83e10e0317a89a33d28f7aeba1caa4d1a6fd457d115dd4ffe90c5931d", size = 4659403, upload-time = "2025-09-22T04:02:32.119Z" },
|
| 1242 |
+
{ url = "https://files.pythonhosted.org/packages/00/ce/74903904339decdf7da7847bb5741fc98a5451b42fc419a86c0c13d26fe2/lxml-6.0.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:abd44571493973bad4598a3be7e1d807ed45aa2adaf7ab92ab7c62609569b17d", size = 4966974, upload-time = "2025-09-22T04:02:34.155Z" },
|
| 1243 |
+
{ url = "https://files.pythonhosted.org/packages/1f/d3/131dec79ce61c5567fecf82515bd9bc36395df42501b50f7f7f3bd065df0/lxml-6.0.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:370cd78d5855cfbffd57c422851f7d3864e6ae72d0da615fca4dad8c45d375a5", size = 5102953, upload-time = "2025-09-22T04:02:36.054Z" },
|
| 1244 |
+
{ url = "https://files.pythonhosted.org/packages/3a/ea/a43ba9bb750d4ffdd885f2cd333572f5bb900cd2408b67fdda07e85978a0/lxml-6.0.2-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:901e3b4219fa04ef766885fb40fa516a71662a4c61b80c94d25336b4934b71c0", size = 5055054, upload-time = "2025-09-22T04:02:38.154Z" },
|
| 1245 |
+
{ url = "https://files.pythonhosted.org/packages/60/23/6885b451636ae286c34628f70a7ed1fcc759f8d9ad382d132e1c8d3d9bfd/lxml-6.0.2-cp314-cp314-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:a4bf42d2e4cf52c28cc1812d62426b9503cdb0c87a6de81442626aa7d69707ba", size = 5352421, upload-time = "2025-09-22T04:02:40.413Z" },
|
| 1246 |
+
{ url = "https://files.pythonhosted.org/packages/48/5b/fc2ddfc94ddbe3eebb8e9af6e3fd65e2feba4967f6a4e9683875c394c2d8/lxml-6.0.2-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2c7fdaa4d7c3d886a42534adec7cfac73860b89b4e5298752f60aa5984641a0", size = 5673684, upload-time = "2025-09-22T04:02:42.288Z" },
|
| 1247 |
+
{ url = "https://files.pythonhosted.org/packages/29/9c/47293c58cc91769130fbf85531280e8cc7868f7fbb6d92f4670071b9cb3e/lxml-6.0.2-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:98a5e1660dc7de2200b00d53fa00bcd3c35a3608c305d45a7bbcaf29fa16e83d", size = 5252463, upload-time = "2025-09-22T04:02:44.165Z" },
|
| 1248 |
+
{ url = "https://files.pythonhosted.org/packages/9b/da/ba6eceb830c762b48e711ded880d7e3e89fc6c7323e587c36540b6b23c6b/lxml-6.0.2-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:dc051506c30b609238d79eda75ee9cab3e520570ec8219844a72a46020901e37", size = 4698437, upload-time = "2025-09-22T04:02:46.524Z" },
|
| 1249 |
+
{ url = "https://files.pythonhosted.org/packages/a5/24/7be3f82cb7990b89118d944b619e53c656c97dc89c28cfb143fdb7cd6f4d/lxml-6.0.2-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8799481bbdd212470d17513a54d568f44416db01250f49449647b5ab5b5dccb9", size = 5269890, upload-time = "2025-09-22T04:02:48.812Z" },
|
| 1250 |
+
{ url = "https://files.pythonhosted.org/packages/1b/bd/dcfb9ea1e16c665efd7538fc5d5c34071276ce9220e234217682e7d2c4a5/lxml-6.0.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9261bb77c2dab42f3ecd9103951aeca2c40277701eb7e912c545c1b16e0e4917", size = 5097185, upload-time = "2025-09-22T04:02:50.746Z" },
|
| 1251 |
+
{ url = "https://files.pythonhosted.org/packages/21/04/a60b0ff9314736316f28316b694bccbbabe100f8483ad83852d77fc7468e/lxml-6.0.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:65ac4a01aba353cfa6d5725b95d7aed6356ddc0a3cd734de00124d285b04b64f", size = 4745895, upload-time = "2025-09-22T04:02:52.968Z" },
|
| 1252 |
+
{ url = "https://files.pythonhosted.org/packages/d6/bd/7d54bd1846e5a310d9c715921c5faa71cf5c0853372adf78aee70c8d7aa2/lxml-6.0.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b22a07cbb82fea98f8a2fd814f3d1811ff9ed76d0fc6abc84eb21527596e7cc8", size = 5695246, upload-time = "2025-09-22T04:02:54.798Z" },
|
| 1253 |
+
{ url = "https://files.pythonhosted.org/packages/fd/32/5643d6ab947bc371da21323acb2a6e603cedbe71cb4c99c8254289ab6f4e/lxml-6.0.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:d759cdd7f3e055d6bc8d9bec3ad905227b2e4c785dc16c372eb5b5e83123f48a", size = 5260797, upload-time = "2025-09-22T04:02:57.058Z" },
|
| 1254 |
+
{ url = "https://files.pythonhosted.org/packages/33/da/34c1ec4cff1eea7d0b4cd44af8411806ed943141804ac9c5d565302afb78/lxml-6.0.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:945da35a48d193d27c188037a05fec5492937f66fb1958c24fc761fb9d40d43c", size = 5277404, upload-time = "2025-09-22T04:02:58.966Z" },
|
| 1255 |
+
{ url = "https://files.pythonhosted.org/packages/82/57/4eca3e31e54dc89e2c3507e1cd411074a17565fa5ffc437c4ae0a00d439e/lxml-6.0.2-cp314-cp314-win32.whl", hash = "sha256:be3aaa60da67e6153eb15715cc2e19091af5dc75faef8b8a585aea372507384b", size = 3670072, upload-time = "2025-09-22T04:03:38.05Z" },
|
| 1256 |
+
{ url = "https://files.pythonhosted.org/packages/e3/e0/c96cf13eccd20c9421ba910304dae0f619724dcf1702864fd59dd386404d/lxml-6.0.2-cp314-cp314-win_amd64.whl", hash = "sha256:fa25afbadead523f7001caf0c2382afd272c315a033a7b06336da2637d92d6ed", size = 4080617, upload-time = "2025-09-22T04:03:39.835Z" },
|
| 1257 |
+
{ url = "https://files.pythonhosted.org/packages/d5/5d/b3f03e22b3d38d6f188ef044900a9b29b2fe0aebb94625ce9fe244011d34/lxml-6.0.2-cp314-cp314-win_arm64.whl", hash = "sha256:063eccf89df5b24e361b123e257e437f9e9878f425ee9aae3144c77faf6da6d8", size = 3754930, upload-time = "2025-09-22T04:03:41.565Z" },
|
| 1258 |
+
{ url = "https://files.pythonhosted.org/packages/5e/5c/42c2c4c03554580708fc738d13414801f340c04c3eff90d8d2d227145275/lxml-6.0.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:6162a86d86893d63084faaf4ff937b3daea233e3682fb4474db07395794fa80d", size = 8910380, upload-time = "2025-09-22T04:03:01.645Z" },
|
| 1259 |
+
{ url = "https://files.pythonhosted.org/packages/bf/4f/12df843e3e10d18d468a7557058f8d3733e8b6e12401f30b1ef29360740f/lxml-6.0.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:414aaa94e974e23a3e92e7ca5b97d10c0cf37b6481f50911032c69eeb3991bba", size = 4775632, upload-time = "2025-09-22T04:03:03.814Z" },
|
| 1260 |
+
{ url = "https://files.pythonhosted.org/packages/e4/0c/9dc31e6c2d0d418483cbcb469d1f5a582a1cd00a1f4081953d44051f3c50/lxml-6.0.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:48461bd21625458dd01e14e2c38dd0aea69addc3c4f960c30d9f59d7f93be601", size = 4975171, upload-time = "2025-09-22T04:03:05.651Z" },
|
| 1261 |
+
{ url = "https://files.pythonhosted.org/packages/e7/2b/9b870c6ca24c841bdd887504808f0417aa9d8d564114689266f19ddf29c8/lxml-6.0.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:25fcc59afc57d527cfc78a58f40ab4c9b8fd096a9a3f964d2781ffb6eb33f4ed", size = 5110109, upload-time = "2025-09-22T04:03:07.452Z" },
|
| 1262 |
+
{ url = "https://files.pythonhosted.org/packages/bf/0c/4f5f2a4dd319a178912751564471355d9019e220c20d7db3fb8307ed8582/lxml-6.0.2-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5179c60288204e6ddde3f774a93350177e08876eaf3ab78aa3a3649d43eb7d37", size = 5041061, upload-time = "2025-09-22T04:03:09.297Z" },
|
| 1263 |
+
{ url = "https://files.pythonhosted.org/packages/12/64/554eed290365267671fe001a20d72d14f468ae4e6acef1e179b039436967/lxml-6.0.2-cp314-cp314t-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:967aab75434de148ec80597b75062d8123cadf2943fb4281f385141e18b21338", size = 5306233, upload-time = "2025-09-22T04:03:11.651Z" },
|
| 1264 |
+
{ url = "https://files.pythonhosted.org/packages/7a/31/1d748aa275e71802ad9722df32a7a35034246b42c0ecdd8235412c3396ef/lxml-6.0.2-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d100fcc8930d697c6561156c6810ab4a508fb264c8b6779e6e61e2ed5e7558f9", size = 5604739, upload-time = "2025-09-22T04:03:13.592Z" },
|
| 1265 |
+
{ url = "https://files.pythonhosted.org/packages/8f/41/2c11916bcac09ed561adccacceaedd2bf0e0b25b297ea92aab99fd03d0fa/lxml-6.0.2-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ca59e7e13e5981175b8b3e4ab84d7da57993eeff53c07764dcebda0d0e64ecd", size = 5225119, upload-time = "2025-09-22T04:03:15.408Z" },
|
| 1266 |
+
{ url = "https://files.pythonhosted.org/packages/99/05/4e5c2873d8f17aa018e6afde417c80cc5d0c33be4854cce3ef5670c49367/lxml-6.0.2-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:957448ac63a42e2e49531b9d6c0fa449a1970dbc32467aaad46f11545be9af1d", size = 4633665, upload-time = "2025-09-22T04:03:17.262Z" },
|
| 1267 |
+
{ url = "https://files.pythonhosted.org/packages/0f/c9/dcc2da1bebd6275cdc723b515f93edf548b82f36a5458cca3578bc899332/lxml-6.0.2-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b7fc49c37f1786284b12af63152fe1d0990722497e2d5817acfe7a877522f9a9", size = 5234997, upload-time = "2025-09-22T04:03:19.14Z" },
|
| 1268 |
+
{ url = "https://files.pythonhosted.org/packages/9c/e2/5172e4e7468afca64a37b81dba152fc5d90e30f9c83c7c3213d6a02a5ce4/lxml-6.0.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e19e0643cc936a22e837f79d01a550678da8377d7d801a14487c10c34ee49c7e", size = 5090957, upload-time = "2025-09-22T04:03:21.436Z" },
|
| 1269 |
+
{ url = "https://files.pythonhosted.org/packages/a5/b3/15461fd3e5cd4ddcb7938b87fc20b14ab113b92312fc97afe65cd7c85de1/lxml-6.0.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:1db01e5cf14345628e0cbe71067204db658e2fb8e51e7f33631f5f4735fefd8d", size = 4764372, upload-time = "2025-09-22T04:03:23.27Z" },
|
| 1270 |
+
{ url = "https://files.pythonhosted.org/packages/05/33/f310b987c8bf9e61c4dd8e8035c416bd3230098f5e3cfa69fc4232de7059/lxml-6.0.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:875c6b5ab39ad5291588aed6925fac99d0097af0dd62f33c7b43736043d4a2ec", size = 5634653, upload-time = "2025-09-22T04:03:25.767Z" },
|
| 1271 |
+
{ url = "https://files.pythonhosted.org/packages/70/ff/51c80e75e0bc9382158133bdcf4e339b5886c6ee2418b5199b3f1a61ed6d/lxml-6.0.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:cdcbed9ad19da81c480dfd6dd161886db6096083c9938ead313d94b30aadf272", size = 5233795, upload-time = "2025-09-22T04:03:27.62Z" },
|
| 1272 |
+
{ url = "https://files.pythonhosted.org/packages/56/4d/4856e897df0d588789dd844dbed9d91782c4ef0b327f96ce53c807e13128/lxml-6.0.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:80dadc234ebc532e09be1975ff538d154a7fa61ea5031c03d25178855544728f", size = 5257023, upload-time = "2025-09-22T04:03:30.056Z" },
|
| 1273 |
+
{ url = "https://files.pythonhosted.org/packages/0f/85/86766dfebfa87bea0ab78e9ff7a4b4b45225df4b4d3b8cc3c03c5cd68464/lxml-6.0.2-cp314-cp314t-win32.whl", hash = "sha256:da08e7bb297b04e893d91087df19638dc7a6bb858a954b0cc2b9f5053c922312", size = 3911420, upload-time = "2025-09-22T04:03:32.198Z" },
|
| 1274 |
+
{ url = "https://files.pythonhosted.org/packages/fe/1a/b248b355834c8e32614650b8008c69ffeb0ceb149c793961dd8c0b991bb3/lxml-6.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:252a22982dca42f6155125ac76d3432e548a7625d56f5a273ee78a5057216eca", size = 4406837, upload-time = "2025-09-22T04:03:34.027Z" },
|
| 1275 |
+
{ url = "https://files.pythonhosted.org/packages/92/aa/df863bcc39c5e0946263454aba394de8a9084dbaff8ad143846b0d844739/lxml-6.0.2-cp314-cp314t-win_arm64.whl", hash = "sha256:bb4c1847b303835d89d785a18801a883436cdfd5dc3d62947f9c49e24f0f5a2c", size = 3822205, upload-time = "2025-09-22T04:03:36.249Z" },
|
| 1276 |
+
{ url = "https://files.pythonhosted.org/packages/e7/9c/780c9a8fce3f04690b374f72f41306866b0400b9d0fdf3e17aaa37887eed/lxml-6.0.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e748d4cf8fef2526bb2a589a417eba0c8674e29ffcb570ce2ceca44f1e567bf6", size = 3939264, upload-time = "2025-09-22T04:04:32.892Z" },
|
| 1277 |
+
{ url = "https://files.pythonhosted.org/packages/f5/5a/1ab260c00adf645d8bf7dec7f920f744b032f69130c681302821d5debea6/lxml-6.0.2-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4ddb1049fa0579d0cbd00503ad8c58b9ab34d1254c77bc6a5576d96ec7853dba", size = 4216435, upload-time = "2025-09-22T04:04:34.907Z" },
|
| 1278 |
+
{ url = "https://files.pythonhosted.org/packages/f2/37/565f3b3d7ffede22874b6d86be1a1763d00f4ea9fc5b9b6ccb11e4ec8612/lxml-6.0.2-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cb233f9c95f83707dae461b12b720c1af9c28c2d19208e1be03387222151daf5", size = 4325913, upload-time = "2025-09-22T04:04:37.205Z" },
|
| 1279 |
+
{ url = "https://files.pythonhosted.org/packages/22/ec/f3a1b169b2fb9d03467e2e3c0c752ea30e993be440a068b125fc7dd248b0/lxml-6.0.2-pp310-pypy310_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bc456d04db0515ce3320d714a1eac7a97774ff0849e7718b492d957da4631dd4", size = 4269357, upload-time = "2025-09-22T04:04:39.322Z" },
|
| 1280 |
+
{ url = "https://files.pythonhosted.org/packages/77/a2/585a28fe3e67daa1cf2f06f34490d556d121c25d500b10082a7db96e3bcd/lxml-6.0.2-pp310-pypy310_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2613e67de13d619fd283d58bda40bff0ee07739f624ffee8b13b631abf33083d", size = 4412295, upload-time = "2025-09-22T04:04:41.647Z" },
|
| 1281 |
+
{ url = "https://files.pythonhosted.org/packages/7b/d9/a57dd8bcebd7c69386c20263830d4fa72d27e6b72a229ef7a48e88952d9a/lxml-6.0.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:24a8e756c982c001ca8d59e87c80c4d9dcd4d9b44a4cbeb8d9be4482c514d41d", size = 3516913, upload-time = "2025-09-22T04:04:43.602Z" },
|
| 1282 |
+
{ url = "https://files.pythonhosted.org/packages/0b/11/29d08bc103a62c0eba8016e7ed5aeebbf1e4312e83b0b1648dd203b0e87d/lxml-6.0.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1c06035eafa8404b5cf475bb37a9f6088b0aca288d4ccc9d69389750d5543700", size = 3949829, upload-time = "2025-09-22T04:04:45.608Z" },
|
| 1283 |
+
{ url = "https://files.pythonhosted.org/packages/12/b3/52ab9a3b31e5ab8238da241baa19eec44d2ab426532441ee607165aebb52/lxml-6.0.2-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c7d13103045de1bdd6fe5d61802565f1a3537d70cd3abf596aa0af62761921ee", size = 4226277, upload-time = "2025-09-22T04:04:47.754Z" },
|
| 1284 |
+
{ url = "https://files.pythonhosted.org/packages/a0/33/1eaf780c1baad88224611df13b1c2a9dfa460b526cacfe769103ff50d845/lxml-6.0.2-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0a3c150a95fbe5ac91de323aa756219ef9cf7fde5a3f00e2281e30f33fa5fa4f", size = 4330433, upload-time = "2025-09-22T04:04:49.907Z" },
|
| 1285 |
+
{ url = "https://files.pythonhosted.org/packages/7a/c1/27428a2ff348e994ab4f8777d3a0ad510b6b92d37718e5887d2da99952a2/lxml-6.0.2-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60fa43be34f78bebb27812ed90f1925ec99560b0fa1decdb7d12b84d857d31e9", size = 4272119, upload-time = "2025-09-22T04:04:51.801Z" },
|
| 1286 |
+
{ url = "https://files.pythonhosted.org/packages/f0/d0/3020fa12bcec4ab62f97aab026d57c2f0cfd480a558758d9ca233bb6a79d/lxml-6.0.2-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:21c73b476d3cfe836be731225ec3421fa2f048d84f6df6a8e70433dff1376d5a", size = 4417314, upload-time = "2025-09-22T04:04:55.024Z" },
|
| 1287 |
+
{ url = "https://files.pythonhosted.org/packages/6c/77/d7f491cbc05303ac6801651aabeb262d43f319288c1ea96c66b1d2692ff3/lxml-6.0.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:27220da5be049e936c3aca06f174e8827ca6445a4353a1995584311487fc4e3e", size = 3518768, upload-time = "2025-09-22T04:04:57.097Z" },
|
| 1288 |
+
]
|
| 1289 |
+
|
| 1290 |
[[package]]
|
| 1291 |
name = "markdown-it-py"
|
| 1292 |
version = "4.0.0"
|
|
|
|
| 2085 |
{ url = "https://files.pythonhosted.org/packages/99/b2/78d588d5acd1cc195bbbc26e9810a75371fdfd47489a653df4476867f220/postgrest-2.24.0-py3-none-any.whl", hash = "sha256:2127b7ff70c3e917791c17d4adfe36d1b721d5999eeda9d4ad3862d1bb6d15ae", size = 21581, upload-time = "2025-11-07T17:08:09.789Z" },
|
| 2086 |
]
|
| 2087 |
|
| 2088 |
+
[[package]]
|
| 2089 |
+
name = "primp"
|
| 2090 |
+
version = "0.15.0"
|
| 2091 |
+
source = { registry = "https://pypi.org/simple" }
|
| 2092 |
+
sdist = { url = "https://files.pythonhosted.org/packages/56/0b/a87556189da4de1fc6360ca1aa05e8335509633f836cdd06dd17f0743300/primp-0.15.0.tar.gz", hash = "sha256:1af8ea4b15f57571ff7fc5e282a82c5eb69bc695e19b8ddeeda324397965b30a", size = 113022, upload-time = "2025-04-17T11:41:05.315Z" }
|
| 2093 |
+
wheels = [
|
| 2094 |
+
{ url = "https://files.pythonhosted.org/packages/f5/5a/146ac964b99ea7657ad67eb66f770be6577dfe9200cb28f9a95baffd6c3f/primp-0.15.0-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:1b281f4ca41a0c6612d4c6e68b96e28acfe786d226a427cd944baa8d7acd644f", size = 3178914, upload-time = "2025-04-17T11:40:59.558Z" },
|
| 2095 |
+
{ url = "https://files.pythonhosted.org/packages/bc/8a/cc2321e32db3ce64d6e32950d5bcbea01861db97bfb20b5394affc45b387/primp-0.15.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:489cbab55cd793ceb8f90bb7423c6ea64ebb53208ffcf7a044138e3c66d77299", size = 2955079, upload-time = "2025-04-17T11:40:57.398Z" },
|
| 2096 |
+
{ url = "https://files.pythonhosted.org/packages/c3/7b/cbd5d999a07ff2a21465975d4eb477ae6f69765e8fe8c9087dab250180d8/primp-0.15.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c18b45c23f94016215f62d2334552224236217aaeb716871ce0e4dcfa08eb161", size = 3281018, upload-time = "2025-04-17T11:40:55.308Z" },
|
| 2097 |
+
{ url = "https://files.pythonhosted.org/packages/1b/6e/a6221c612e61303aec2bcac3f0a02e8b67aee8c0db7bdc174aeb8010f975/primp-0.15.0-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e985a9cba2e3f96a323722e5440aa9eccaac3178e74b884778e926b5249df080", size = 3255229, upload-time = "2025-04-17T11:40:47.811Z" },
|
| 2098 |
+
{ url = "https://files.pythonhosted.org/packages/3b/54/bfeef5aca613dc660a69d0760a26c6b8747d8fdb5a7f20cb2cee53c9862f/primp-0.15.0-cp38-abi3-manylinux_2_34_armv7l.whl", hash = "sha256:6b84a6ffa083e34668ff0037221d399c24d939b5629cd38223af860de9e17a83", size = 3014522, upload-time = "2025-04-17T11:40:50.191Z" },
|
| 2099 |
+
{ url = "https://files.pythonhosted.org/packages/ac/96/84078e09f16a1dad208f2fe0f8a81be2cf36e024675b0f9eec0c2f6e2182/primp-0.15.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:592f6079646bdf5abbbfc3b0a28dac8de943f8907a250ce09398cda5eaebd260", size = 3418567, upload-time = "2025-04-17T11:41:01.595Z" },
|
| 2100 |
+
{ url = "https://files.pythonhosted.org/packages/6c/80/8a7a9587d3eb85be3d0b64319f2f690c90eb7953e3f73a9ddd9e46c8dc42/primp-0.15.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5a728e5a05f37db6189eb413d22c78bd143fa59dd6a8a26dacd43332b3971fe8", size = 3606279, upload-time = "2025-04-17T11:41:03.61Z" },
|
| 2101 |
+
{ url = "https://files.pythonhosted.org/packages/0c/dd/f0183ed0145e58cf9d286c1b2c14f63ccee987a4ff79ac85acc31b5d86bd/primp-0.15.0-cp38-abi3-win_amd64.whl", hash = "sha256:aeb6bd20b06dfc92cfe4436939c18de88a58c640752cf7f30d9e4ae893cdec32", size = 3149967, upload-time = "2025-04-17T11:41:07.067Z" },
|
| 2102 |
+
]
|
| 2103 |
+
|
| 2104 |
[[package]]
|
| 2105 |
name = "propcache"
|
| 2106 |
version = "0.4.1"
|
|
|
|
| 2837 |
{ url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" },
|
| 2838 |
]
|
| 2839 |
|
| 2840 |
+
[[package]]
|
| 2841 |
+
name = "socksio"
|
| 2842 |
+
version = "1.0.0"
|
| 2843 |
+
source = { registry = "https://pypi.org/simple" }
|
| 2844 |
+
sdist = { url = "https://files.pythonhosted.org/packages/f8/5c/48a7d9495be3d1c651198fd99dbb6ce190e2274d0f28b9051307bdec6b85/socksio-1.0.0.tar.gz", hash = "sha256:f88beb3da5b5c38b9890469de67d0cb0f9d494b78b106ca1845f96c10b91c4ac", size = 19055, upload-time = "2020-04-17T15:50:34.664Z" }
|
| 2845 |
+
wheels = [
|
| 2846 |
+
{ url = "https://files.pythonhosted.org/packages/37/c3/6eeb6034408dac0fa653d126c9204ade96b819c936e136c5e8a6897eee9c/socksio-1.0.0-py3-none-any.whl", hash = "sha256:95dc1f15f9b34e8d7b16f06d74b8ccf48f609af32ab33c608d08761c5dcbb1f3", size = 12763, upload-time = "2020-04-17T15:50:31.878Z" },
|
| 2847 |
+
]
|
| 2848 |
+
|
| 2849 |
[[package]]
|
| 2850 |
name = "sse-starlette"
|
| 2851 |
version = "3.0.3"
|