Spaces:
Sleeping
Sleeping
Merge pull request #12 from danghoangnhan/feat/ui-model-selector
Browse files- .gitignore +4 -0
- agents/base.py +1 -0
- agents/crew_orchestrator.py +4 -2
- agents/orchestrator.py +1 -0
- config.yaml +12 -0
- config/settings.py +1 -0
- pyproject.toml +1 -1
- server/routes.py +8 -0
- uv.lock +264 -5
- web/index.html +45 -0
.gitignore
CHANGED
|
@@ -5,3 +5,7 @@ output/
|
|
| 5 |
.venv/
|
| 6 |
.worktrees/
|
| 7 |
.env
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5 |
.venv/
|
| 6 |
.worktrees/
|
| 7 |
.env
|
| 8 |
+
|
| 9 |
+
# Claude Code
|
| 10 |
+
CLAUDE.md
|
| 11 |
+
.claude/
|
agents/base.py
CHANGED
|
@@ -28,6 +28,7 @@ class BaseOrchestrator(ABC):
|
|
| 28 |
mentions: list[str] | None = None,
|
| 29 |
design_state: DesignState | None = None,
|
| 30 |
plan_context: bool = False,
|
|
|
|
| 31 |
) -> ChatTurnResponse:
|
| 32 |
"""Run one chat turn. Returns ChatTurnResponse."""
|
| 33 |
...
|
|
|
|
| 28 |
mentions: list[str] | None = None,
|
| 29 |
design_state: DesignState | None = None,
|
| 30 |
plan_context: bool = False,
|
| 31 |
+
model: str | None = None,
|
| 32 |
) -> ChatTurnResponse:
|
| 33 |
"""Run one chat turn. Returns ChatTurnResponse."""
|
| 34 |
...
|
agents/crew_orchestrator.py
CHANGED
|
@@ -111,6 +111,7 @@ class CrewOrchestrator(BaseOrchestrator):
|
|
| 111 |
max_history: int = 30,
|
| 112 |
design_state: DesignState | None = None,
|
| 113 |
plan_context: bool = False,
|
|
|
|
| 114 |
) -> ChatTurnResponse:
|
| 115 |
# Backward compat: accept dict during migration
|
| 116 |
state = design_state if isinstance(design_state, DesignState) else DesignState(**(design_state or {}))
|
|
@@ -127,7 +128,7 @@ class CrewOrchestrator(BaseOrchestrator):
|
|
| 127 |
return self._fallback(message, history, mentions, max_history, state, plan_context)
|
| 128 |
|
| 129 |
try:
|
| 130 |
-
return self._run_crew(message, history, mentions, max_history, state, plan_context)
|
| 131 |
except Exception as exc:
|
| 132 |
logger.warning("CrewAI run failed (%s), falling back", exc, exc_info=True)
|
| 133 |
try:
|
|
@@ -151,6 +152,7 @@ class CrewOrchestrator(BaseOrchestrator):
|
|
| 151 |
max_history: int,
|
| 152 |
design_state: DesignState | None,
|
| 153 |
plan_context: bool = False,
|
|
|
|
| 154 |
) -> ChatTurnResponse:
|
| 155 |
from agents.agent_flow import AgentFlowState, AgentDispatchFlow, collect_responses
|
| 156 |
from agents.tools import set_design_state
|
|
@@ -184,7 +186,7 @@ class CrewOrchestrator(BaseOrchestrator):
|
|
| 184 |
flow = AgentDispatchFlow(initial_state=AgentFlowState(
|
| 185 |
message=message,
|
| 186 |
context=context,
|
| 187 |
-
model_str=_get_crewai_model(self.backend_name),
|
| 188 |
mentions=list(mentions) if mentions else [],
|
| 189 |
is_approved_phase=is_approved,
|
| 190 |
))
|
|
|
|
| 111 |
max_history: int = 30,
|
| 112 |
design_state: DesignState | None = None,
|
| 113 |
plan_context: bool = False,
|
| 114 |
+
model: str | None = None,
|
| 115 |
) -> ChatTurnResponse:
|
| 116 |
# Backward compat: accept dict during migration
|
| 117 |
state = design_state if isinstance(design_state, DesignState) else DesignState(**(design_state or {}))
|
|
|
|
| 128 |
return self._fallback(message, history, mentions, max_history, state, plan_context)
|
| 129 |
|
| 130 |
try:
|
| 131 |
+
return self._run_crew(message, history, mentions, max_history, state, plan_context, model=model)
|
| 132 |
except Exception as exc:
|
| 133 |
logger.warning("CrewAI run failed (%s), falling back", exc, exc_info=True)
|
| 134 |
try:
|
|
|
|
| 152 |
max_history: int,
|
| 153 |
design_state: DesignState | None,
|
| 154 |
plan_context: bool = False,
|
| 155 |
+
model: str | None = None,
|
| 156 |
) -> ChatTurnResponse:
|
| 157 |
from agents.agent_flow import AgentFlowState, AgentDispatchFlow, collect_responses
|
| 158 |
from agents.tools import set_design_state
|
|
|
|
| 186 |
flow = AgentDispatchFlow(initial_state=AgentFlowState(
|
| 187 |
message=message,
|
| 188 |
context=context,
|
| 189 |
+
model_str=f"{self.backend_name}/{model}" if model else _get_crewai_model(self.backend_name),
|
| 190 |
mentions=list(mentions) if mentions else [],
|
| 191 |
is_approved_phase=is_approved,
|
| 192 |
))
|
agents/orchestrator.py
CHANGED
|
@@ -149,6 +149,7 @@ class MockChatBackend(BaseOrchestrator):
|
|
| 149 |
max_history: int = 30,
|
| 150 |
design_state: DesignState | None = None,
|
| 151 |
plan_context: bool = False,
|
|
|
|
| 152 |
) -> ChatTurnResponse:
|
| 153 |
"""Run one mock chat turn. Returns a ChatTurnResponse."""
|
| 154 |
state = design_state if isinstance(design_state, DesignState) else DesignState(**(design_state or {}))
|
|
|
|
| 149 |
max_history: int = 30,
|
| 150 |
design_state: DesignState | None = None,
|
| 151 |
plan_context: bool = False,
|
| 152 |
+
model: str | None = None,
|
| 153 |
) -> ChatTurnResponse:
|
| 154 |
"""Run one mock chat turn. Returns a ChatTurnResponse."""
|
| 155 |
state = design_state if isinstance(design_state, DesignState) else DesignState(**(design_state or {}))
|
config.yaml
CHANGED
|
@@ -20,6 +20,18 @@ backends:
|
|
| 20 |
gemini: "gemini/gemini-2.5-flash"
|
| 21 |
anthropic: "anthropic/claude-sonnet-4-20250514"
|
| 22 |
openai: "openai/gpt-4o"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
max_tokens: 8192
|
| 24 |
temperature: 0.2
|
| 25 |
|
|
|
|
| 20 |
gemini: "gemini/gemini-2.5-flash"
|
| 21 |
anthropic: "anthropic/claude-sonnet-4-20250514"
|
| 22 |
openai: "openai/gpt-4o"
|
| 23 |
+
model_options:
|
| 24 |
+
gemini:
|
| 25 |
+
- gemini-2.5-flash
|
| 26 |
+
- gemini-2.5-pro
|
| 27 |
+
- gemini-2.0-flash
|
| 28 |
+
openai:
|
| 29 |
+
- gpt-4o
|
| 30 |
+
- gpt-4o-mini
|
| 31 |
+
- o4-mini
|
| 32 |
+
anthropic:
|
| 33 |
+
- claude-sonnet-4-20250514
|
| 34 |
+
- claude-haiku-4-5-20251001
|
| 35 |
max_tokens: 8192
|
| 36 |
temperature: 0.2
|
| 37 |
|
config/settings.py
CHANGED
|
@@ -35,6 +35,7 @@ class BackendsConfig(BaseModel):
|
|
| 35 |
default: str = "gemini"
|
| 36 |
models: dict[str, str] = Field(default_factory=dict)
|
| 37 |
crewai_models: dict[str, str] = Field(default_factory=dict)
|
|
|
|
| 38 |
max_tokens: int = 8192
|
| 39 |
temperature: float = 0.2
|
| 40 |
|
|
|
|
| 35 |
default: str = "gemini"
|
| 36 |
models: dict[str, str] = Field(default_factory=dict)
|
| 37 |
crewai_models: dict[str, str] = Field(default_factory=dict)
|
| 38 |
+
model_options: dict[str, list[str]] = Field(default_factory=dict)
|
| 39 |
max_tokens: int = 8192
|
| 40 |
temperature: float = 0.2
|
| 41 |
|
pyproject.toml
CHANGED
|
@@ -11,7 +11,7 @@ dependencies = [
|
|
| 11 |
"anthropic>=0.25.0",
|
| 12 |
"openai>=1.30.0",
|
| 13 |
"google-genai>=1.0.0",
|
| 14 |
-
"crewai>=0.100.0",
|
| 15 |
"mcp>=1.0.0",
|
| 16 |
"fastapi>=0.110.0",
|
| 17 |
"uvicorn>=0.29.0",
|
|
|
|
| 11 |
"anthropic>=0.25.0",
|
| 12 |
"openai>=1.30.0",
|
| 13 |
"google-genai>=1.0.0",
|
| 14 |
+
"crewai[tools]>=0.100.0",
|
| 15 |
"mcp>=1.0.0",
|
| 16 |
"fastapi>=0.110.0",
|
| 17 |
"uvicorn>=0.29.0",
|
server/routes.py
CHANGED
|
@@ -35,6 +35,7 @@ class ChatRequest(BaseModel):
|
|
| 35 |
history: list[ChatMessage] = Field(default_factory=list)
|
| 36 |
mentions: list[str] = Field(default_factory=list)
|
| 37 |
backend: str = "gemini"
|
|
|
|
| 38 |
design_state: DesignState = Field(default_factory=DesignState)
|
| 39 |
plan_context: bool = False
|
| 40 |
|
|
@@ -84,6 +85,7 @@ async def chat(body: ChatRequest):
|
|
| 84 |
mentions=mentions,
|
| 85 |
design_state=body.design_state,
|
| 86 |
plan_context=body.plan_context,
|
|
|
|
| 87 |
)
|
| 88 |
return JSONResponse(result.model_dump())
|
| 89 |
except Exception as e:
|
|
@@ -160,6 +162,12 @@ async def list_agents():
|
|
| 160 |
})
|
| 161 |
|
| 162 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 163 |
@router.post("/api/plan/approve")
|
| 164 |
async def plan_approve(body: PlanApproveRequest):
|
| 165 |
"""Approve (possibly edited) design plan, merge into state."""
|
|
|
|
| 35 |
history: list[ChatMessage] = Field(default_factory=list)
|
| 36 |
mentions: list[str] = Field(default_factory=list)
|
| 37 |
backend: str = "gemini"
|
| 38 |
+
model: str = ""
|
| 39 |
design_state: DesignState = Field(default_factory=DesignState)
|
| 40 |
plan_context: bool = False
|
| 41 |
|
|
|
|
| 85 |
mentions=mentions,
|
| 86 |
design_state=body.design_state,
|
| 87 |
plan_context=body.plan_context,
|
| 88 |
+
model=body.model or None,
|
| 89 |
)
|
| 90 |
return JSONResponse(result.model_dump())
|
| 91 |
except Exception as e:
|
|
|
|
| 162 |
})
|
| 163 |
|
| 164 |
|
| 165 |
+
@router.get("/api/backend-models")
|
| 166 |
+
async def backend_models():
|
| 167 |
+
"""Return available models grouped by backend."""
|
| 168 |
+
return JSONResponse(settings.backends.model_options)
|
| 169 |
+
|
| 170 |
+
|
| 171 |
@router.post("/api/plan/approve")
|
| 172 |
async def plan_approve(body: PlanApproveRequest):
|
| 173 |
"""Approve (possibly edited) design plan, merge into state."""
|
uv.lock
CHANGED
|
@@ -328,6 +328,19 @@ wheels = [
|
|
| 328 |
{ url = "https://files.pythonhosted.org/packages/e4/f8/972c96f5a2b6c4b3deca57009d93e946bbdbe2241dca9806d502f29dd3ee/bcrypt-5.0.0-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:6b8f520b61e8781efee73cba14e3e8c9556ccfb375623f4f97429544734545b4", size = 273375, upload-time = "2025-09-25T19:50:45.43Z" },
|
| 329 |
]
|
| 330 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 331 |
[[package]]
|
| 332 |
name = "build"
|
| 333 |
version = "1.4.2"
|
|
@@ -893,6 +906,30 @@ wheels = [
|
|
| 893 |
{ url = "https://files.pythonhosted.org/packages/b4/cd/f582ff265e2ccc5196aacf4822aecad3c3d40bd62d247fd691412ff333cd/crewai-1.14.0-py3-none-any.whl", hash = "sha256:fb358763372fec7518e5c1fb6abb493b5453bebc19126f96456080965349b4e7", size = 1041218, upload-time = "2026-04-07T17:49:08.136Z" },
|
| 894 |
]
|
| 895 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 896 |
[[package]]
|
| 897 |
name = "cryptography"
|
| 898 |
version = "46.0.7"
|
|
@@ -962,6 +999,15 @@ wheels = [
|
|
| 962 |
{ url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" },
|
| 963 |
]
|
| 964 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 965 |
[[package]]
|
| 966 |
name = "deprecation"
|
| 967 |
version = "2.1.0"
|
|
@@ -1974,6 +2020,124 @@ wheels = [
|
|
| 1974 |
{ url = "https://files.pythonhosted.org/packages/b4/de/88b3be5c31b22333b3ca2f6ff1de4e863d8fe45aaea7485f591970ec1d3e/linkify_it_py-2.1.0-py3-none-any.whl", hash = "sha256:0d252c1594ecba2ecedc444053db5d3a9b7ec1b0dd929c8f1d74dce89f86c05e", size = 19878, upload-time = "2026-03-01T07:48:46.098Z" },
|
| 1975 |
]
|
| 1976 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1977 |
[[package]]
|
| 1978 |
name = "markdown-it-py"
|
| 1979 |
version = "4.0.0"
|
|
@@ -2545,7 +2709,7 @@ dependencies = [
|
|
| 2545 |
{ name = "anthropic" },
|
| 2546 |
{ name = "cadquery" },
|
| 2547 |
{ name = "cadquery-ocp" },
|
| 2548 |
-
{ name = "crewai" },
|
| 2549 |
{ name = "fastapi" },
|
| 2550 |
{ name = "google-genai" },
|
| 2551 |
{ name = "mcp" },
|
|
@@ -2570,7 +2734,7 @@ requires-dist = [
|
|
| 2570 |
{ name = "anthropic", specifier = ">=0.25.0" },
|
| 2571 |
{ name = "cadquery", specifier = ">=2.7.0" },
|
| 2572 |
{ name = "cadquery-ocp", specifier = ">=7.8.0" },
|
| 2573 |
-
{ name = "crewai", specifier = ">=0.100.0" },
|
| 2574 |
{ name = "fastapi", specifier = ">=0.110.0" },
|
| 2575 |
{ name = "google-genai", specifier = ">=1.0.0" },
|
| 2576 |
{ name = "mcp", specifier = ">=1.0.0" },
|
|
@@ -3797,6 +3961,21 @@ crypto = [
|
|
| 3797 |
{ name = "cryptography" },
|
| 3798 |
]
|
| 3799 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3800 |
[[package]]
|
| 3801 |
name = "pyparsing"
|
| 3802 |
version = "3.3.2"
|
|
@@ -3886,6 +4065,19 @@ wheels = [
|
|
| 3886 |
{ url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" },
|
| 3887 |
]
|
| 3888 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3889 |
[[package]]
|
| 3890 |
name = "python-dotenv"
|
| 3891 |
version = "1.1.1"
|
|
@@ -3904,6 +4096,15 @@ wheels = [
|
|
| 3904 |
{ url = "https://files.pythonhosted.org/packages/a3/73/89930efabd4da63cea44a3f438aeb753d600123570e6d6264e763617a9ce/python_multipart-0.0.24-py3-none-any.whl", hash = "sha256:9b110a98db707df01a53c194f0af075e736a770dc5058089650d70b4a182f950", size = 24420, upload-time = "2026-04-05T20:49:12.555Z" },
|
| 3905 |
]
|
| 3906 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3907 |
[[package]]
|
| 3908 |
name = "pywin32"
|
| 3909 |
version = "311"
|
|
@@ -4127,7 +4328,7 @@ wheels = [
|
|
| 4127 |
|
| 4128 |
[[package]]
|
| 4129 |
name = "requests"
|
| 4130 |
-
version = "2.
|
| 4131 |
source = { registry = "https://pypi.org/simple" }
|
| 4132 |
dependencies = [
|
| 4133 |
{ name = "certifi" },
|
|
@@ -4135,9 +4336,9 @@ dependencies = [
|
|
| 4135 |
{ name = "idna" },
|
| 4136 |
{ name = "urllib3" },
|
| 4137 |
]
|
| 4138 |
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
| 4139 |
wheels = [
|
| 4140 |
-
{ url = "https://files.pythonhosted.org/packages/
|
| 4141 |
]
|
| 4142 |
|
| 4143 |
[[package]]
|
|
@@ -4349,6 +4550,15 @@ wheels = [
|
|
| 4349 |
{ 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" },
|
| 4350 |
]
|
| 4351 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4352 |
[[package]]
|
| 4353 |
name = "sse-starlette"
|
| 4354 |
version = "3.3.4"
|
|
@@ -4413,6 +4623,42 @@ wheels = [
|
|
| 4413 |
{ url = "https://files.pythonhosted.org/packages/0e/28/a81d6ce9f4804818bd1231a9a6e4d56ea84ebbe8385c49591444f0234fa2/textual-8.2.3-py3-none-any.whl", hash = "sha256:5008ac581bebf1f6fa0520404261844a231e5715fdbddd10ca73916a3af48ca2", size = 724231, upload-time = "2026-04-05T09:12:48.747Z" },
|
| 4414 |
]
|
| 4415 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4416 |
[[package]]
|
| 4417 |
name = "tokenizers"
|
| 4418 |
version = "0.22.2"
|
|
@@ -5076,6 +5322,19 @@ wheels = [
|
|
| 5076 |
{ url = "https://files.pythonhosted.org/packages/69/68/c8739671f5699c7dc470580a4f821ef37c32c4cb0b047ce223a7f115757f/yarl-1.23.0-py3-none-any.whl", hash = "sha256:a2df6afe50dea8ae15fa34c9f824a3ee958d785fd5d089063d960bae1daa0a3f", size = 48288, upload-time = "2026-03-01T22:07:51.388Z" },
|
| 5077 |
]
|
| 5078 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5079 |
[[package]]
|
| 5080 |
name = "zipp"
|
| 5081 |
version = "3.23.0"
|
|
|
|
| 328 |
{ url = "https://files.pythonhosted.org/packages/e4/f8/972c96f5a2b6c4b3deca57009d93e946bbdbe2241dca9806d502f29dd3ee/bcrypt-5.0.0-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:6b8f520b61e8781efee73cba14e3e8c9556ccfb375623f4f97429544734545b4", size = 273375, upload-time = "2025-09-25T19:50:45.43Z" },
|
| 329 |
]
|
| 330 |
|
| 331 |
+
[[package]]
|
| 332 |
+
name = "beautifulsoup4"
|
| 333 |
+
version = "4.13.5"
|
| 334 |
+
source = { registry = "https://pypi.org/simple" }
|
| 335 |
+
dependencies = [
|
| 336 |
+
{ name = "soupsieve" },
|
| 337 |
+
{ name = "typing-extensions" },
|
| 338 |
+
]
|
| 339 |
+
sdist = { url = "https://files.pythonhosted.org/packages/85/2e/3e5079847e653b1f6dc647aa24549d68c6addb4c595cc0d902d1b19308ad/beautifulsoup4-4.13.5.tar.gz", hash = "sha256:5e70131382930e7c3de33450a2f54a63d5e4b19386eab43a5b34d594268f3695", size = 622954, upload-time = "2025-08-24T14:06:13.168Z" }
|
| 340 |
+
wheels = [
|
| 341 |
+
{ url = "https://files.pythonhosted.org/packages/04/eb/f4151e0c7377a6e08a38108609ba5cede57986802757848688aeedd1b9e8/beautifulsoup4-4.13.5-py3-none-any.whl", hash = "sha256:642085eaa22233aceadff9c69651bc51e8bf3f874fb6d7104ece2beb24b47c4a", size = 105113, upload-time = "2025-08-24T14:06:14.884Z" },
|
| 342 |
+
]
|
| 343 |
+
|
| 344 |
[[package]]
|
| 345 |
name = "build"
|
| 346 |
version = "1.4.2"
|
|
|
|
| 906 |
{ url = "https://files.pythonhosted.org/packages/b4/cd/f582ff265e2ccc5196aacf4822aecad3c3d40bd62d247fd691412ff333cd/crewai-1.14.0-py3-none-any.whl", hash = "sha256:fb358763372fec7518e5c1fb6abb493b5453bebc19126f96456080965349b4e7", size = 1041218, upload-time = "2026-04-07T17:49:08.136Z" },
|
| 907 |
]
|
| 908 |
|
| 909 |
+
[package.optional-dependencies]
|
| 910 |
+
tools = [
|
| 911 |
+
{ name = "crewai-tools" },
|
| 912 |
+
]
|
| 913 |
+
|
| 914 |
+
[[package]]
|
| 915 |
+
name = "crewai-tools"
|
| 916 |
+
version = "1.14.0"
|
| 917 |
+
source = { registry = "https://pypi.org/simple" }
|
| 918 |
+
dependencies = [
|
| 919 |
+
{ name = "beautifulsoup4" },
|
| 920 |
+
{ name = "crewai" },
|
| 921 |
+
{ name = "pymupdf" },
|
| 922 |
+
{ name = "python-docx" },
|
| 923 |
+
{ name = "pytube" },
|
| 924 |
+
{ name = "requests" },
|
| 925 |
+
{ name = "tiktoken" },
|
| 926 |
+
{ name = "youtube-transcript-api" },
|
| 927 |
+
]
|
| 928 |
+
sdist = { url = "https://files.pythonhosted.org/packages/64/83/5a86e501674b1a07e166f399cbb17ce3d3891a87574a5f81251f82227ba8/crewai_tools-1.14.0.tar.gz", hash = "sha256:39fcd3e1ef0a469f8c690ed9e9024fc404b2a8f9c9cb9f6bcc92dcb7e85c6ea7", size = 865825, upload-time = "2026-04-07T17:49:16.157Z" }
|
| 929 |
+
wheels = [
|
| 930 |
+
{ url = "https://files.pythonhosted.org/packages/8c/48/1d4a6adbaf12f2e49e11812b7fb2b175066989862fdf3d21dd739bd39e6a/crewai_tools-1.14.0-py3-none-any.whl", hash = "sha256:bcc88da3eb877a5c336d901d396c6aeb29a0408add003b398374f3e257465da7", size = 779732, upload-time = "2026-04-07T17:49:14.289Z" },
|
| 931 |
+
]
|
| 932 |
+
|
| 933 |
[[package]]
|
| 934 |
name = "cryptography"
|
| 935 |
version = "46.0.7"
|
|
|
|
| 999 |
{ url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" },
|
| 1000 |
]
|
| 1001 |
|
| 1002 |
+
[[package]]
|
| 1003 |
+
name = "defusedxml"
|
| 1004 |
+
version = "0.7.1"
|
| 1005 |
+
source = { registry = "https://pypi.org/simple" }
|
| 1006 |
+
sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload-time = "2021-03-08T10:59:26.269Z" }
|
| 1007 |
+
wheels = [
|
| 1008 |
+
{ url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" },
|
| 1009 |
+
]
|
| 1010 |
+
|
| 1011 |
[[package]]
|
| 1012 |
name = "deprecation"
|
| 1013 |
version = "2.1.0"
|
|
|
|
| 2020 |
{ url = "https://files.pythonhosted.org/packages/b4/de/88b3be5c31b22333b3ca2f6ff1de4e863d8fe45aaea7485f591970ec1d3e/linkify_it_py-2.1.0-py3-none-any.whl", hash = "sha256:0d252c1594ecba2ecedc444053db5d3a9b7ec1b0dd929c8f1d74dce89f86c05e", size = 19878, upload-time = "2026-03-01T07:48:46.098Z" },
|
| 2021 |
]
|
| 2022 |
|
| 2023 |
+
[[package]]
|
| 2024 |
+
name = "lxml"
|
| 2025 |
+
version = "6.0.3"
|
| 2026 |
+
source = { registry = "https://pypi.org/simple" }
|
| 2027 |
+
sdist = { url = "https://files.pythonhosted.org/packages/43/42/149c7747977db9d68faee960c1a3391eb25e94d4bb677f8e2df8328e4098/lxml-6.0.3.tar.gz", hash = "sha256:a1664c5139755df44cab3834f4400b331b02205d62d3fdcb1554f63439bf3372", size = 4237567, upload-time = "2026-04-09T14:39:09.664Z" }
|
| 2028 |
+
wheels = [
|
| 2029 |
+
{ url = "https://files.pythonhosted.org/packages/c6/bd/8d24ca9079146eafc442e7fc33aa15b42d85fa88c02aac42dd80cee2f4af/lxml-6.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88c524cf8c3b8d71dfc3de6cfb225138a876862a92d88bfa22eb9ff020729d45", size = 8540496, upload-time = "2026-04-09T14:33:38.86Z" },
|
| 2030 |
+
{ url = "https://files.pythonhosted.org/packages/15/72/b2e51e3cc0b808c030169581928802dd8802495445943ed610c21a244cde/lxml-6.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a10f9967859229cae38b1aa7a96eb655c96b8adc96989b52c5b1f77d963a77a4", size = 4601807, upload-time = "2026-04-09T14:33:41.532Z" },
|
| 2031 |
+
{ url = "https://files.pythonhosted.org/packages/9d/10/bd0a0447162f0895e118b5e38f62fbdcf9187a285c294e93de25ca2ea7cf/lxml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:edccf1157677db1da741d042601754b94af3926310c5763179200718ca738e70", size = 5000670, upload-time = "2026-04-09T14:33:43.934Z" },
|
| 2032 |
+
{ url = "https://files.pythonhosted.org/packages/de/e3/e2f36bac7eb86d2911da073a822e5351b8e3b48c3ed6016fc618db77ace0/lxml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:20f8caa9beb61a688c4428631cb47fd6e0ba75ef30091cec5fee992138b2be77", size = 5154581, upload-time = "2026-04-09T14:33:46.317Z" },
|
| 2033 |
+
{ url = "https://files.pythonhosted.org/packages/b1/59/45a2aa9d0c0eb4365da07f388f4de4e19e3ce9644063302e8d713943ea58/lxml-6.0.3-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e0c88ca5fb307f7e817fc427681126e4712d3452258577bcb4ca86594c934852", size = 5055184, upload-time = "2026-04-09T14:33:48.946Z" },
|
| 2034 |
+
{ url = "https://files.pythonhosted.org/packages/fa/3d/df07a4ac8d3beaef42e145436cd56e06a8f9e2f490de5b5692d9b1b8da59/lxml-6.0.3-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:72d108ef9e39f45c6865ea8a5ba6736c0b1a33ddd6343653775349869e58c30b", size = 5285602, upload-time = "2026-04-09T14:33:51.147Z" },
|
| 2035 |
+
{ url = "https://files.pythonhosted.org/packages/46/76/7565456ec16d875b01c7c85b881df0bd96c5d3cd1e0f154bf3a5f0383f9b/lxml-6.0.3-cp310-cp310-manylinux_2_28_i686.whl", hash = "sha256:b044fe3bdb8b68efa33cb5917ae9379f07ec2e416ecd18cf5d333650d6d2fcbb", size = 5410242, upload-time = "2026-04-09T14:33:53.071Z" },
|
| 2036 |
+
{ url = "https://files.pythonhosted.org/packages/93/6e/388bd48adbc95f83fe1dab79bbac3f275c09dd33120ead403c6ae876e097/lxml-6.0.3-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:a4dc9f81707b9b56888fa7d3a889ac5219724cf0fbecab90ea5b197faf649534", size = 4769200, upload-time = "2026-04-09T14:33:55.166Z" },
|
| 2037 |
+
{ url = "https://files.pythonhosted.org/packages/5f/fa/c7dc493d5d99f9b32f507cca80ac32845f68cd6e6c77b8b328711e0fb176/lxml-6.0.3-cp310-cp310-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:59ff244cee0270fc4cf5f2ee920d4493ee88d0bcbc6e8465e9ef01439f1785e7", size = 5358843, upload-time = "2026-04-09T14:33:57.481Z" },
|
| 2038 |
+
{ url = "https://files.pythonhosted.org/packages/d5/12/682e1f903784f4f6360ed66064e87f0fb824e9f05f304e8c8621405a2d63/lxml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2a49123cc3209ccad7c4c5a4133bcfcfd4875f30461ea4d0aaa84e6608f712c5", size = 5107019, upload-time = "2026-04-09T14:33:59.457Z" },
|
| 2039 |
+
{ url = "https://files.pythonhosted.org/packages/ff/49/eebd2774692723a54bdac5e3fb4b1ee8f28ec497a609b97eab0011b54fde/lxml-6.0.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:26cdd7c3f4c3b932b28859d0b70966c2ec8b67c106717d6320121002f8f99025", size = 4802429, upload-time = "2026-04-09T14:34:01.545Z" },
|
| 2040 |
+
{ url = "https://files.pythonhosted.org/packages/a3/16/edfbf5fdfaeff145b329e435ed744e9ea9c3b78993ddab1cd6dd2b703f73/lxml-6.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:6556b3197bd8a237a16fcd7278d09f094c5777ae36a1435b5e8e488826386d96", size = 5348717, upload-time = "2026-04-09T14:34:03.508Z" },
|
| 2041 |
+
{ url = "https://files.pythonhosted.org/packages/58/e2/bf1277aaef92781b00b0bc0739cddde11da129405cbcb088b577cf2a8369/lxml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:87bebd6836e88c0a007f66b89814daf5d7041430eb491c91d1851abc89aa6e93", size = 5307591, upload-time = "2026-04-09T14:34:05.647Z" },
|
| 2042 |
+
{ url = "https://files.pythonhosted.org/packages/b1/4b/ba1ef23b8881217a416250e8882c2630c63c18564ad65dcaa73cfbefaf7c/lxml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:0b012cf200736d90f828b3ab4206857772c61b710f0a98d3814c7994decb6652", size = 3597651, upload-time = "2026-04-09T14:34:07.668Z" },
|
| 2043 |
+
{ url = "https://files.pythonhosted.org/packages/44/10/a1f60ffc05595cfcc4dd5988bea98c44c6b78b89966b565087a4451395c7/lxml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:794b42f0112adfa3f23670aba5bc0ac9c9adfcee699c0df129b0186c812ac3ff", size = 4020048, upload-time = "2026-04-09T14:34:09.467Z" },
|
| 2044 |
+
{ url = "https://files.pythonhosted.org/packages/e8/3b/1333642a8c362e8e23b5f51affc69744db04c59f7ebe3c79fdbcd58c7b56/lxml-6.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:ecdded59dc50c0c28f652a98f69a7ada8bd2377248bf48c4a83c81204eb58b33", size = 3667324, upload-time = "2026-04-09T14:34:11.996Z" },
|
| 2045 |
+
{ url = "https://files.pythonhosted.org/packages/da/ce/8a0b4747bb5dd47fec3443f0506a2a2d4f58946d7176bc3fdcae781ac666/lxml-6.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c8184fdb2259bda1db2db9d6e25f667769afc2531830b4fa29f83f66a7872dea", size = 8524445, upload-time = "2026-04-09T14:34:14.244Z" },
|
| 2046 |
+
{ url = "https://files.pythonhosted.org/packages/e5/14/b74a06da69d212d1ac27e4bcf124e966d1d63c4d23522add86fbcf20324e/lxml-6.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4b0f01fb8bdcaf4aa69cf55b2b2f8ef722e4423e1c020e7250dcb89a1d5db38e", size = 4594891, upload-time = "2026-04-09T14:34:17.123Z" },
|
| 2047 |
+
{ url = "https://files.pythonhosted.org/packages/39/9a/364392e9740ddcdba380c5dbb79464956aadf81135344d57153631c8e4a2/lxml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fab00cef83d4f9d76c5e0722346e84bc174b071d68b4f725aeb0bf3877b9e6a6", size = 4922596, upload-time = "2026-04-09T14:34:19.632Z" },
|
| 2048 |
+
{ url = "https://files.pythonhosted.org/packages/24/b6/6e4a53869a8e031dc5ea564a9857f6dd520a05412aea8d1b6565e8b2d43d/lxml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7f753db5785ce019d7b25bb75638ef5a42a0e208aa9f19933262134e668ca6af", size = 5067033, upload-time = "2026-04-09T14:34:22.015Z" },
|
| 2049 |
+
{ url = "https://files.pythonhosted.org/packages/2d/cc/12035c0d104fbe64e56e7b2cd9d4942ffa2a1689f093f44de0eef73538ae/lxml-6.0.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:27e317e554bc6086a082688ddf137437e5f7f20ffdd736a6f5b4e3ed1ecf1247", size = 5000434, upload-time = "2026-04-09T14:34:23.934Z" },
|
| 2050 |
+
{ url = "https://files.pythonhosted.org/packages/73/37/b9f9b28b542d0e62bb9353753cbec7e321f7394fea10470c6b8e5739b61d/lxml-6.0.3-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:feb5b9ed7d0510663a78b94f2b417a41c41b42a7bb157ef398ef9d78e6f0fd50", size = 5201705, upload-time = "2026-04-09T14:34:26.328Z" },
|
| 2051 |
+
{ url = "https://files.pythonhosted.org/packages/2d/26/9473de56eb74293c7061ff1a6ac352d5b89c83067f315accd73cf97a3b07/lxml-6.0.3-cp311-cp311-manylinux_2_28_i686.whl", hash = "sha256:51014ee2ab2091dcd9cdef92532f0a1addb7c2cc52a2bd70682e441363de5c0d", size = 5329269, upload-time = "2026-04-09T14:34:29.563Z" },
|
| 2052 |
+
{ url = "https://files.pythonhosted.org/packages/a2/a3/502f97b6221e0958da94fde5eb17119f2104694a88126ef82fa189d5d7a4/lxml-6.0.3-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:abc39c4fb67f029400608f9a3a4a3f351ccb3c061b05fd3ad113e4cfbba8a8ee", size = 4658312, upload-time = "2026-04-09T14:34:31.62Z" },
|
| 2053 |
+
{ url = "https://files.pythonhosted.org/packages/d1/26/935d0297d1c272282e950986f14f044c8e4c34e60a8774bc993d26ddcf32/lxml-6.0.3-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:38652c280cf50cc5cf955e3d0b691fa6a97046d84407bbae340d8e353f9014ef", size = 5264811, upload-time = "2026-04-09T14:34:33.566Z" },
|
| 2054 |
+
{ url = "https://files.pythonhosted.org/packages/bb/a0/4755420775ded42b4cc9017357ce72ee7cd08fbfb72da3ac7e48fa2326bb/lxml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c3de55b53f69ffa2fcfd897bd8a7e62f0f88a40a8a0c544e171e813f9d4ddbf5", size = 5043997, upload-time = "2026-04-09T14:34:35.506Z" },
|
| 2055 |
+
{ url = "https://files.pythonhosted.org/packages/b7/54/61f21fcf0b5c0f30e58c369aacfa01f5a21ef0f8c9c773c413010c18a705/lxml-6.0.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:bd4f70e091f2df300396bc9ce36963f90b87611324c2ca750072a6e6375beba2", size = 4711595, upload-time = "2026-04-09T14:34:38.195Z" },
|
| 2056 |
+
{ url = "https://files.pythonhosted.org/packages/ca/9e/b9f73274a7e3819c821033ea9d8e777b297fcbe789765948d8c9d4fb9cfc/lxml-6.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:c157bfef4e3b19688eb4da783c5bfabf5a3ac1ac8d317e0906f3feb18d4c89b7", size = 5251294, upload-time = "2026-04-09T14:34:40.461Z" },
|
| 2057 |
+
{ url = "https://files.pythonhosted.org/packages/38/8c/73e463041bad522c348c8a8c908a63c32f80215cff596210bbf24d69b3ee/lxml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8d10a75e4d0a6a9ac2fec2f7ade682f468b51935102c70dab638fa4e94ffcb04", size = 5224927, upload-time = "2026-04-09T14:34:42.986Z" },
|
| 2058 |
+
{ url = "https://files.pythonhosted.org/packages/3f/05/42820ad63897bfd35cb7e591d79e8d21524c9da1520fa156b71d32f6953b/lxml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:d573b81c29e20b1513afa386a544797a99cecde5497e6c77b6dfa4484112c819", size = 3593261, upload-time = "2026-04-09T14:34:44.804Z" },
|
| 2059 |
+
{ url = "https://files.pythonhosted.org/packages/e1/04/43c561e2293ede683f5259ceaccaf24ad6e830631123f197c1db483439ba/lxml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:ac63a1ef1899ccadace10ac937c41321672771378374c254e931d001448ae372", size = 4023698, upload-time = "2026-04-09T14:34:46.845Z" },
|
| 2060 |
+
{ url = "https://files.pythonhosted.org/packages/8e/5f/13fde57b45a0f88b8c4bb02156fb115e99ad48354029cb522b543f502563/lxml-6.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:10bc4f37c28b4e1b3e901dde66e3a096eb128acf388d5b2962dc2941284293bb", size = 3666947, upload-time = "2026-04-09T14:34:48.675Z" },
|
| 2061 |
+
{ url = "https://files.pythonhosted.org/packages/ac/4c/552571c619edd607432cbbf25e312a5d02859f2a7de421494a644b48451e/lxml-6.0.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ad6952810349cbfb843fe15e8afc580b2712359ae42b1d2b05d097bd48c4aea4", size = 8570109, upload-time = "2026-04-09T14:34:50.969Z" },
|
| 2062 |
+
{ url = "https://files.pythonhosted.org/packages/ac/49/cf08843a6a923cd1eef40797a31e61424ac257c43634b5c9cff3bee93696/lxml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8b81ec1ecac3be8c1ff1e00ca1c1baf8122e87db9000cd2549963847bd5e3b41", size = 4623404, upload-time = "2026-04-09T14:34:53.79Z" },
|
| 2063 |
+
{ url = "https://files.pythonhosted.org/packages/b6/59/ffde0037a781b10c854abdf9e34fbf60d8f375ce8026551982b9f26695cc/lxml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:448e69211e59c39f398990753d15ba49f7218ec128f64ac8012ef16762e509a3", size = 4929662, upload-time = "2026-04-09T14:34:55.763Z" },
|
| 2064 |
+
{ url = "https://files.pythonhosted.org/packages/84/29/c468055e45954a93e1bc043a964d327d6784552d6551dc2364a1f83c53a1/lxml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6289cb9145fbbc5b0e159c9fcd7fc09446dadc6b60b72c4d1012e80c7c727970", size = 5092106, upload-time = "2026-04-09T14:34:58.522Z" },
|
| 2065 |
+
{ url = "https://files.pythonhosted.org/packages/59/a3/8400c79a6defe609e24ce7b580f48d53f08acbf4c998eede0083a89f16f0/lxml-6.0.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b68c29aac4788438b07d768057836de47589c7deaa3ad8dc4af488dfc27be388", size = 5004214, upload-time = "2026-04-09T14:35:00.531Z" },
|
| 2066 |
+
{ url = "https://files.pythonhosted.org/packages/57/b5/797246619cd0831c8d239f91fd4683683abbe7144854c6f33c68a6ea9f42/lxml-6.0.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:50293e024afe5e2c25da2be68c8ceca8618912a0701a73f75b488317c8081aa6", size = 5630889, upload-time = "2026-04-09T14:35:02.89Z" },
|
| 2067 |
+
{ url = "https://files.pythonhosted.org/packages/a0/fa/b86302385dc896d02ebb2803e4522a923acaa30e6cb35223492257ee24ab/lxml-6.0.3-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ac65c08ba1bd90f662cb1d5c79f7ae4c53b1c100f0bb6ec5df1f40ac29028a7e", size = 5237728, upload-time = "2026-04-09T14:35:05.827Z" },
|
| 2068 |
+
{ url = "https://files.pythonhosted.org/packages/9b/7d/812c054b7d15f4dfb3a6fc877c2936023fcd8ac8b53807f996c8c60c4f57/lxml-6.0.3-cp312-cp312-manylinux_2_28_i686.whl", hash = "sha256:16fbcf06ae534b2fa5bcdc19fcf6abd9df2e74fe8563147d1c5a687a130efed4", size = 5349527, upload-time = "2026-04-09T14:35:08.121Z" },
|
| 2069 |
+
{ url = "https://files.pythonhosted.org/packages/b8/4a/33a572874924809928747cd156b172b04cd19c1ec1d10925fc77dfeb676d/lxml-6.0.3-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:3a0484bd1e84f82766befcbd71cccd7307dacfe08071e4dbc1d9a9b498d321e8", size = 4693177, upload-time = "2026-04-09T14:35:10.4Z" },
|
| 2070 |
+
{ url = "https://files.pythonhosted.org/packages/36/d5/71842813ca0c43718f641e770195e278832f8c01870eaac857a3de34448a/lxml-6.0.3-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c137f8c8419c3de93e2998131d94628805f148e52b34da6d7533454e4d78bc2a", size = 5243928, upload-time = "2026-04-09T14:35:12.393Z" },
|
| 2071 |
+
{ url = "https://files.pythonhosted.org/packages/da/a7/330845ae467c6086ef35977c335bb252fa11490082335f9ccfd0465bdfb7/lxml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:775266571f7027b1d77f5fce18a247b24f51a4404bdc1b90ec56be9b1e3801b9", size = 5046937, upload-time = "2026-04-09T14:35:15.209Z" },
|
| 2072 |
+
{ url = "https://files.pythonhosted.org/packages/02/3d/b58b0aee0cf7e0b7eb5d24795a129c634c6d07f032d8b902bb0859319d13/lxml-6.0.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:aa18653b795d2c273b8676f7ad2ca916d846d15864e335f746658e4c28eb5168", size = 4776758, upload-time = "2026-04-09T14:35:17.758Z" },
|
| 2073 |
+
{ url = "https://files.pythonhosted.org/packages/8c/4c/f421b50f08c1b724a24c4a778db8888d0a2d948b4dd08b80f4f05a0804ff/lxml-6.0.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:cbffd22fc8e4d80454efa968b0c93440a00b8b8a817ce0c29d2c6cb5ad324362", size = 5644912, upload-time = "2026-04-09T14:35:20.438Z" },
|
| 2074 |
+
{ url = "https://files.pythonhosted.org/packages/a7/99/eabfedb111ca1f26c8fe890413eabc7e2b0010f075fdf5bceb42737c3894/lxml-6.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7373ede7ccb89e6f6e39c1423b3a4d4ee48035d3b4619a6addced5c8b48d0ecc", size = 5233509, upload-time = "2026-04-09T14:35:23.137Z" },
|
| 2075 |
+
{ url = "https://files.pythonhosted.org/packages/9f/17/050a105ca1154025b68c19901d45292cbdcee6f25bd056c178ad6b55e534/lxml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e759ff1b244725fef428c6b54f3dab4954c293b2d242a5f2e79db5cc3873de51", size = 5260150, upload-time = "2026-04-09T14:35:25.385Z" },
|
| 2076 |
+
{ url = "https://files.pythonhosted.org/packages/61/a0/ed83517d12e9fe00101a21fe08a168fd69f57875d9416353e2a38c401df7/lxml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:f179bae37ad673f57756b59f26833b7922230bef471fdb29492428f152bae8c6", size = 3595160, upload-time = "2026-04-09T14:35:27.519Z" },
|
| 2077 |
+
{ url = "https://files.pythonhosted.org/packages/55/d3/101726831f45951fe3ddd03cffbd2a4ac6261fc63ada399e6f7051d43af6/lxml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:8eeec925ad7f81886d413b3a1f8715551f75543519229a9b35e957771e1826d5", size = 3996108, upload-time = "2026-04-09T14:35:29.608Z" },
|
| 2078 |
+
{ url = "https://files.pythonhosted.org/packages/49/9f/ab1c58ad55bfcd4b55bafd98f19ff24f34315441f13aa787d5220def0702/lxml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:f96bba9a26a064ce9e11099bad12fb08384b64d3acc0acf94bf386ca5cf4f95f", size = 3658906, upload-time = "2026-04-09T14:35:32.451Z" },
|
| 2079 |
+
{ url = "https://files.pythonhosted.org/packages/86/a6/2cdc9c5a634b1b890927f968febc2474fa3eb6fed99db82ea3c008bbbda4/lxml-6.0.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:83c1d75e9d124ab82a4ddaf59135112f0dc49526b47355e5928ae6126a68e236", size = 8559579, upload-time = "2026-04-09T14:35:35.644Z" },
|
| 2080 |
+
{ url = "https://files.pythonhosted.org/packages/97/3c/adfbcdab17f89f72e069c5df5661c81e0511e3cdb353550f778e9ffaa08e/lxml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b683665d0287308adafc90a5617a51a508d8af8c7040693693bb333b5f4474fe", size = 4617332, upload-time = "2026-04-09T14:35:38.901Z" },
|
| 2081 |
+
{ url = "https://files.pythonhosted.org/packages/5e/d4/ee1a5c734a5ad79024fa85808f3efc18d5733813141e2bb2726a7d9d8bea/lxml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ed31e5852cd938704bc6c7a3822cbf84c7fa00ebfa914a1b4e2392d44f45bdfb", size = 4922821, upload-time = "2026-04-09T14:35:41.521Z" },
|
| 2082 |
+
{ url = "https://files.pythonhosted.org/packages/f1/1f/87efcc0b93ba4f95303ec8f80164f3c50db20a3a5612a285133f9ad6cb7e/lxml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8922a30704a4421d69a19e0499db5861da686c0bccc3a79cf3946e3155cf25f9", size = 5081226, upload-time = "2026-04-09T14:35:44.02Z" },
|
| 2083 |
+
{ url = "https://files.pythonhosted.org/packages/65/8b/fd0fadd9ec8a6ac9d694014ccdb9504e28705abb2e08c9ca23c609020325/lxml-6.0.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9a1adb0e220cb8691202ba9d97646a06292657a122df4b92733861d42f7cf4d2", size = 4992884, upload-time = "2026-04-09T14:35:46.769Z" },
|
| 2084 |
+
{ url = "https://files.pythonhosted.org/packages/68/75/2fb0e534225214c6386496b7847195d7297b913cf563c5ccea394afc346b/lxml-6.0.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:821fd53699eb498990c915ba955a392d07246454c9405e6c1d0692362503013d", size = 5613383, upload-time = "2026-04-09T14:35:49.303Z" },
|
| 2085 |
+
{ url = "https://files.pythonhosted.org/packages/54/3a/8f560f8fb2f5f092e18ac7a13a94b77e0e5213fe7c424d12e98393dcc7d8/lxml-6.0.3-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:04b7cedf52e125f86d0d426635e7fbe8e353d4cc272a1757888e3c072424381d", size = 5228398, upload-time = "2026-04-09T14:35:51.611Z" },
|
| 2086 |
+
{ url = "https://files.pythonhosted.org/packages/aa/d5/6bf993c02a0173eb5883ace61958c55c245d3daf7753fb5f931a9691b440/lxml-6.0.3-cp313-cp313-manylinux_2_28_i686.whl", hash = "sha256:9d98063e6ae0da5084ec46952bb0a5ccb5e2cad168e32b4d65d1ec84e4b4ebd4", size = 5342198, upload-time = "2026-04-09T14:35:54.311Z" },
|
| 2087 |
+
{ url = "https://files.pythonhosted.org/packages/bb/18/637130349ca6aa33b6dc4796732835ede5017a811c5f55763a1c468f7971/lxml-6.0.3-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:ce01ab3449015358f766a1950b3d818eedf9d4cdec3fa87e4eecaad10c0784db", size = 4699178, upload-time = "2026-04-09T14:35:56.647Z" },
|
| 2088 |
+
{ url = "https://files.pythonhosted.org/packages/bb/19/239daafcc1cfa42b8aa6384509a9fd2cb1aa281679c6e8395adf9ccbc189/lxml-6.0.3-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d38c25bad123d6ce30bb37931d90a4e8a167cd796eeae9cd16c2bfce52718f8e", size = 5231869, upload-time = "2026-04-09T14:36:00.41Z" },
|
| 2089 |
+
{ url = "https://files.pythonhosted.org/packages/0a/74/db7fcadc651b988502bed00d48acfd8b997ecb5dd52ebcc05f39bf946d9e/lxml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9b8e0779780026979f217603385995202f364adc9807bd21210d81b9f562fc4e", size = 5043669, upload-time = "2026-04-09T14:36:02.463Z" },
|
| 2090 |
+
{ url = "https://files.pythonhosted.org/packages/55/99/af795b579182fa04aa87fcb0bd112e22705d982f71eb53874a8d356b4091/lxml-6.0.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:8c082ad2398664213a4bb5d133e2eb8bf239220b7d6688f8c8ffa9050057501f", size = 4769745, upload-time = "2026-04-09T14:36:04.716Z" },
|
| 2091 |
+
{ url = "https://files.pythonhosted.org/packages/52/4d/10e652edc55d206188a1b738d1033aad3497886d34cb7f5fc753e67ecb49/lxml-6.0.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dfc80c74233fe01157ab550fb12b9d07a2f1fa7c5900cefb484e3bf02e856fbc", size = 5635496, upload-time = "2026-04-09T14:36:06.815Z" },
|
| 2092 |
+
{ url = "https://files.pythonhosted.org/packages/ab/68/95371835ec15bb46feee27b090bcabbe579f4ad04efbef08e2713bcfea16/lxml-6.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:5c45bdcdc2ca6cf26fddff3faa5de7a2ed7c7f6016b3de80125313a37f972378", size = 5223564, upload-time = "2026-04-09T14:36:09.057Z" },
|
| 2093 |
+
{ url = "https://files.pythonhosted.org/packages/aa/a6/0a9e5b63e8959487551be5d5496bb758ed2424c77ed7b25a9b8aae3b60c6/lxml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:99457524afd384c330dc51e527976653d543ccadfa815d9f2d92c5911626e536", size = 5250124, upload-time = "2026-04-09T14:36:11.337Z" },
|
| 2094 |
+
{ url = "https://files.pythonhosted.org/packages/d9/80/de3d3a790edf6d026c829fe8ccf54845058f57f8bb788e420c3b227eecef/lxml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:c8e3b8a54e65393ce1d5c7d9753fe756f0d96089e7163b20ddec3e5bb56a963e", size = 3596004, upload-time = "2026-04-09T14:36:13.446Z" },
|
| 2095 |
+
{ url = "https://files.pythonhosted.org/packages/9f/cf/43c9a5926060e39d99593921f37d7e88f129bc32ab6266b8460483abd613/lxml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:724b26a38cef98d6869d00a33cb66083bee967598e44f6a8e53f1dd283c851b0", size = 3994750, upload-time = "2026-04-09T14:36:15.686Z" },
|
| 2096 |
+
{ url = "https://files.pythonhosted.org/packages/e5/d3/b224dbc282bfef52d2e05645e405b5ed89c6391144dc09864229fe9ce88c/lxml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:f27373113fda6621e4201f529908a24c8a190c2af355aed4711dadca44db4673", size = 3657620, upload-time = "2026-04-09T14:36:17.952Z" },
|
| 2097 |
+
{ url = "https://files.pythonhosted.org/packages/d3/40/b637359bacf3813f1174d15b08516020ba5beb355e04377105d561e6e00a/lxml-6.0.3-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8c08926678852a233bf1ef645c4d683d56107f814482f8f41b21ef2c7659790e", size = 8575318, upload-time = "2026-04-09T14:36:20.608Z" },
|
| 2098 |
+
{ url = "https://files.pythonhosted.org/packages/7f/91/d5286a45202ed91f1e428e68c6e1c11bcb2b42715c48424871fc73485b05/lxml-6.0.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2ce76d113a7c3bf42761ec1de7ca615b0cbf9d8ae478eb1d6c20111d9c9fc098", size = 4623084, upload-time = "2026-04-09T14:36:24.015Z" },
|
| 2099 |
+
{ url = "https://files.pythonhosted.org/packages/8a/5f/7ea1af571ee13ed1e5fba007fd83cd0794723ca76a51eed0ef9513363b1f/lxml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:83eca62141314d641ebe8089ffa532bbf572ea07dd6255b58c40130d06bb2509", size = 4948797, upload-time = "2026-04-09T14:36:26.662Z" },
|
| 2100 |
+
{ url = "https://files.pythonhosted.org/packages/82/be/3a9b8d787d9877cbe17e02ef5af2523bd14ecc177ce308397c485c56fe18/lxml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d8781d812bb8efd47c35651639da38980383ff0d0c1f3269ade23e3a90799079", size = 5085983, upload-time = "2026-04-09T14:36:29.486Z" },
|
| 2101 |
+
{ url = "https://files.pythonhosted.org/packages/c4/2b/645abaef837b11414c81513c31b308a001fb8cd370f665c3ebc854be5ba5/lxml-6.0.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:19b079e81aa3a31b523a224b0dd46da4f56e1b1e248eef9a599e5c885c788813", size = 5031039, upload-time = "2026-04-09T14:36:31.735Z" },
|
| 2102 |
+
{ url = "https://files.pythonhosted.org/packages/3b/4f/561f30b77e9edbb373e2b6b7203a7d6ab219c495abca219536c66f3a44b2/lxml-6.0.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6c055bafdcb53e7f9f75e22c009cd183dd410475e21c296d599531d7f03d1bf5", size = 5646718, upload-time = "2026-04-09T14:36:34.127Z" },
|
| 2103 |
+
{ url = "https://files.pythonhosted.org/packages/d7/ba/2a72e673d109b563c2ab77097f2f4ca64e2927d2f04836ba07aaabe1da0e/lxml-6.0.3-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f1594a183cee73f9a1dbfd35871c4e04b461f47eeb9bcf80f7d7856b1b136d", size = 5239360, upload-time = "2026-04-09T14:36:37.195Z" },
|
| 2104 |
+
{ url = "https://files.pythonhosted.org/packages/52/98/4e5a4ef87d846af90cc9c1ee2f8af2af34c221e620aad317b3a535361b93/lxml-6.0.3-cp314-cp314-manylinux_2_28_i686.whl", hash = "sha256:a6380c5035598e4665272ad3fc86c96ddb2a220d4059cce5ba4b660f78346ad9", size = 5351233, upload-time = "2026-04-09T14:36:39.634Z" },
|
| 2105 |
+
{ url = "https://files.pythonhosted.org/packages/cb/b8/cff0af5fe48ede6b1949dc2e14171470c0c68a15789037c1fed90602b89d/lxml-6.0.3-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:143ac903fb6c9be6da613390825c8e8bb8c8d71517d43882031f6b9bc89770ef", size = 4696677, upload-time = "2026-04-09T14:36:42.037Z" },
|
| 2106 |
+
{ url = "https://files.pythonhosted.org/packages/0c/6e/0b2a918fb15c30b00ff112df16c548df011db37b58d764bd17f47db74905/lxml-6.0.3-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c4fff7d77f440378cd841e340398edf5dbefee334816efbf521bb6e31651e54e", size = 5250503, upload-time = "2026-04-09T14:36:44.417Z" },
|
| 2107 |
+
{ url = "https://files.pythonhosted.org/packages/57/1b/4697918f9d4c2e643e2c59cedb37c2f3a9f76fb1217d767f6dff476813d8/lxml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:631567ffc3ddb989ccdcd28f6b9fa5aab1ec7fc0e99fe65572b006a6aad347e2", size = 5084563, upload-time = "2026-04-09T14:36:46.762Z" },
|
| 2108 |
+
{ url = "https://files.pythonhosted.org/packages/7b/8c/d7ec96246f0632773912c6556288d3b6bb6580f3a967441ca4636ddc3f73/lxml-6.0.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:38acf7171535ffa7fff1fcec8b82ebd4e55cd02e581efe776928108421accaa1", size = 4737407, upload-time = "2026-04-09T14:36:49.826Z" },
|
| 2109 |
+
{ url = "https://files.pythonhosted.org/packages/d2/0c/603e35bf77aeb28c972f39eece35e7c0f6579ff33a7bed095cc2f7f942d9/lxml-6.0.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:06b9f3ac459b4565bbaa97aa5512aa7f9a1188c662f0108364f288f6daf35773", size = 5670919, upload-time = "2026-04-09T14:36:52.231Z" },
|
| 2110 |
+
{ url = "https://files.pythonhosted.org/packages/92/08/6d3f188e6705cf0bfd8b5788055c7381bb3ffa786dfba9fa0b0ed5778506/lxml-6.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2773dbe2cedee81f2769bd5d24ceb4037706cf032e1703513dd0e9476cd9375f", size = 5237771, upload-time = "2026-04-09T14:36:55.286Z" },
|
| 2111 |
+
{ url = "https://files.pythonhosted.org/packages/f1/4c/01639533b90e9ff622909c113df2ab2dbdd1d78540eb153d13b66a9c96ba/lxml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:30c437d8bb9a9a9edff27e85b694342e47a26a6abc249abe00584a4824f9d80d", size = 5263862, upload-time = "2026-04-09T14:36:58.247Z" },
|
| 2112 |
+
{ url = "https://files.pythonhosted.org/packages/06/0e/bd1157d7b09d1f5e1d580c124203cee656130a3f8908365760a593b21daf/lxml-6.0.3-cp314-cp314-win32.whl", hash = "sha256:1b60a3a1205f869bd47874787c792087174453b1a869db4837bf5b3ff92be017", size = 3656378, upload-time = "2026-04-09T14:37:47.74Z" },
|
| 2113 |
+
{ url = "https://files.pythonhosted.org/packages/c5/cc/d50cbce8cd5687670868bea33bbeefa0866c5e5d02c5e11c4a04c79fc45e/lxml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:5b6913a68d98c58c673667c864500ba31bc9b0f462effac98914e9a92ebacd2e", size = 4062518, upload-time = "2026-04-09T14:37:49.911Z" },
|
| 2114 |
+
{ url = "https://files.pythonhosted.org/packages/fd/c7/ece11a1e51390502894838aa384e9f98af7bef4d6806a927197153a16972/lxml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:1b36a3c73f2a6d9c2bfae78089ca7aedae5c2ee5fd5214a15f00b2f89e558ba7", size = 3741064, upload-time = "2026-04-09T14:37:52.185Z" },
|
| 2115 |
+
{ url = "https://files.pythonhosted.org/packages/2c/ae/918d7f89635fb6456cd732c12246c0e504dd9c49e8006f3593c9ecdb90ff/lxml-6.0.3-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:239e9a6be3a79c03ec200d26f7bb17a4414704a208059e20050bf161e2d8848a", size = 8826590, upload-time = "2026-04-09T14:37:00.862Z" },
|
| 2116 |
+
{ url = "https://files.pythonhosted.org/packages/07/cf/bda0ae583758704719976b9ea69c8b089fa5f92e49683e517386539b21cf/lxml-6.0.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:16e5cbaa1a6351f2abefa4072e9aac1f09103b47fe7ab4496d54e5995b065162", size = 4735028, upload-time = "2026-04-09T14:37:03.602Z" },
|
| 2117 |
+
{ url = "https://files.pythonhosted.org/packages/2f/0e/3bfb18778c6f73c7ead2d49a256501fa3052888b899826f5d1df1fbdf83b/lxml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:89f8746c206d8cf2c167221831645d6cc2b24464afd9c428a5eb3fd34c584eb1", size = 4969184, upload-time = "2026-04-09T14:37:05.914Z" },
|
| 2118 |
+
{ url = "https://files.pythonhosted.org/packages/29/e6/796c77751a682d6d1bb9aa3fe43851b41a21b0377100e246a4a83a81d668/lxml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5d559a84b2fd583e5bcf8ec4af1ec895f98811684d5fbd6524ea31a04f92d4ad", size = 5103548, upload-time = "2026-04-09T14:37:08.605Z" },
|
| 2119 |
+
{ url = "https://files.pythonhosted.org/packages/f9/5e/a02aee214f657f29d4690d88161de8ffb8f1b5139e792bae313b9479e317/lxml-6.0.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7966fbce2d18fde579d5593933d36ad98cc7c8dc7f2b1916d127057ce0415062", size = 5027775, upload-time = "2026-04-09T14:37:11.283Z" },
|
| 2120 |
+
{ url = "https://files.pythonhosted.org/packages/20/e5/65dd25f2c366879d696d1c720af9a96fa0969d2d135a27b6140222fc6f68/lxml-6.0.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a1f258e6aa0e6eda2c1199f5582c062c96c7d4a28d96d0c4daa79e39b3f2a764", size = 5595348, upload-time = "2026-04-09T14:37:13.618Z" },
|
| 2121 |
+
{ url = "https://files.pythonhosted.org/packages/f7/1f/2f0e80d7fd2ad9755d771af4ad46ea14bf871bc5a1d2d365a3f948940ddf/lxml-6.0.3-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:738aef404c862d2c3cd951364ee7175c9d50e8290f5726611c4208c0fba8d186", size = 5224217, upload-time = "2026-04-09T14:37:16.519Z" },
|
| 2122 |
+
{ url = "https://files.pythonhosted.org/packages/3b/28/e1aaeee7d6a4c9f24a3e4535a4e19ce64b99eefbe7437d325b61623b1817/lxml-6.0.3-cp314-cp314t-manylinux_2_28_i686.whl", hash = "sha256:5c35e5c3ed300990a46a144d3514465713f812b35dacfa83e928c60db7c90af7", size = 5312245, upload-time = "2026-04-09T14:37:19.387Z" },
|
| 2123 |
+
{ url = "https://files.pythonhosted.org/packages/0a/ac/9633cb919124473e03c62862b0494bf0e1705f902fbd9627be4f648bddfb/lxml-6.0.3-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:4ff774b43712b0cf40d9888a5494ca39aefe990c946511cc947b9fddcf74a29b", size = 4637952, upload-time = "2026-04-09T14:37:21.648Z" },
|
| 2124 |
+
{ url = "https://files.pythonhosted.org/packages/50/aa/135baeea457d41989bafa78e437fe3a370c793aab0d8fb3da73ccae10095/lxml-6.0.3-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d20af2784c763928d0d0879cbc5a3739e4d81eefa0d68962d3478bff4c13e644", size = 5232782, upload-time = "2026-04-09T14:37:24.6Z" },
|
| 2125 |
+
{ url = "https://files.pythonhosted.org/packages/0e/77/d05183ac8440cbc4c6fa386edb7ba9718bee4f097e58485b1cd1f9479d56/lxml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fdb7786ebefaa0dad0d399dfeaf146b370a14591af2f3aea59e06f931a426678", size = 5083889, upload-time = "2026-04-09T14:37:27.432Z" },
|
| 2126 |
+
{ url = "https://files.pythonhosted.org/packages/6d/58/e9fda8fb82775491ad0290c7b17252f944b6c3a6974cd820d65910690351/lxml-6.0.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:c71a387ea133481e725079cff22de45593bf0b834824de22829365ab1d2386c9", size = 4758658, upload-time = "2026-04-09T14:37:29.81Z" },
|
| 2127 |
+
{ url = "https://files.pythonhosted.org/packages/8b/32/4aae9f004f79f9d200efd8343809cfe46077f8e5bd58f08708c320a20fcd/lxml-6.0.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:841b89fc3d910d61c7c267db6bb7dc3a8b3dac240edb66220fcdf96fe70a0552", size = 5619494, upload-time = "2026-04-09T14:37:33.482Z" },
|
| 2128 |
+
{ url = "https://files.pythonhosted.org/packages/f9/49/407fa9e3c91e7c6d0762eaeedd50d4695bcd26db817e933ca689eb1f3df4/lxml-6.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:ac2d6cdafa29672d6a604c641bf67ace3fd0735ec6885501a94943379219ddbf", size = 5228386, upload-time = "2026-04-09T14:37:36.058Z" },
|
| 2129 |
+
{ url = "https://files.pythonhosted.org/packages/99/92/39982f818acbb1dd67dd5d20c2a06bcb9f1f3b9a8ff0021e367904f82417/lxml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:609bf136a7339aeca2bd4268c7cd190f33d13118975fe9964eda8e5138f42802", size = 5247973, upload-time = "2026-04-09T14:37:38.836Z" },
|
| 2130 |
+
{ url = "https://files.pythonhosted.org/packages/66/68/fcdbb78c8cda81a86e17b31abf103b7e474e474a09fb291a99e7a9b43eb8/lxml-6.0.3-cp314-cp314t-win32.whl", hash = "sha256:bf98f5f87f6484302e7cce4e2ca5af43562902852063d916c3e2f1c115fdce60", size = 3896249, upload-time = "2026-04-09T14:37:41.068Z" },
|
| 2131 |
+
{ url = "https://files.pythonhosted.org/packages/88/fb/6292681ac4a4223b700569ce98f71662cb07c5a3ade4f346f5f0d5c574cf/lxml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:d3d65e511e4e656ec67b472110f7a72cbf8547ca15f76fe74cffa4e97412a064", size = 4391091, upload-time = "2026-04-09T14:37:43.357Z" },
|
| 2132 |
+
{ url = "https://files.pythonhosted.org/packages/99/39/a0f486360a6f1b36fd2f5eb62d037652bef503d82b6f853aee6664cdfcac/lxml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:cbc7ce67f85b92db97c92219985432be84dc1ba9a028e68c6933e89551234df2", size = 3816374, upload-time = "2026-04-09T14:37:45.532Z" },
|
| 2133 |
+
{ url = "https://files.pythonhosted.org/packages/a5/7c/3889981b55e83af1a710b2b54d40d5a9c7a2f7eab2e00cba6ba608fbdd22/lxml-6.0.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:093786037b934ef4747b0e8a0e1599fe7df7dd8246e7f07d43bba1c4c8bd7b84", size = 3929454, upload-time = "2026-04-09T14:38:54.873Z" },
|
| 2134 |
+
{ url = "https://files.pythonhosted.org/packages/0b/29/a88dfb805c882b4fc81ef35d342629715a482037a0acd78ea8114e115d76/lxml-6.0.3-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6364aa77b13e04459df6a9d2b806465287e7540955527e75ebd5fda48532913d", size = 4209854, upload-time = "2026-04-09T14:38:57.541Z" },
|
| 2135 |
+
{ url = "https://files.pythonhosted.org/packages/ca/01/44e71ace8c72bbb9aeb38551a4d314508133da88daf0dd9120a648af74ce/lxml-6.0.3-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:955550c78afb2be47755bd1b8153724292a5b539cf3f21665b310c145d08e6f8", size = 4317247, upload-time = "2026-04-09T14:38:59.977Z" },
|
| 2136 |
+
{ url = "https://files.pythonhosted.org/packages/18/1a/ec02aafa56ff7675873e8fd4b6c7747aceaae037767434359e75d0b1075b/lxml-6.0.3-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a9a79144a8051bc5fbb223fac895b87eb67b361f27b00c2ed4a07ee34246b90", size = 4250372, upload-time = "2026-04-09T14:39:02.289Z" },
|
| 2137 |
+
{ url = "https://files.pythonhosted.org/packages/35/13/94acd22f85e34e22eb984b4ac3db4c1b0c1e3daa0433dac5053fd26954d8/lxml-6.0.3-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8243937d4673b46da90b4f5ea2627fd26842225e62e885828fdb8133aa1f7b32", size = 4401010, upload-time = "2026-04-09T14:39:04.598Z" },
|
| 2138 |
+
{ url = "https://files.pythonhosted.org/packages/28/7a/b3e8ed85413a4bd5c4850dfbd1eb18be7428127be0986f2a679d9d6098ad/lxml-6.0.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:5892d2ef99449ebd8e30544af5bc61fd9c30e9e989093a10589766422f6c5e1a", size = 3507669, upload-time = "2026-04-09T14:39:06.873Z" },
|
| 2139 |
+
]
|
| 2140 |
+
|
| 2141 |
[[package]]
|
| 2142 |
name = "markdown-it-py"
|
| 2143 |
version = "4.0.0"
|
|
|
|
| 2709 |
{ name = "anthropic" },
|
| 2710 |
{ name = "cadquery" },
|
| 2711 |
{ name = "cadquery-ocp" },
|
| 2712 |
+
{ name = "crewai", extra = ["tools"] },
|
| 2713 |
{ name = "fastapi" },
|
| 2714 |
{ name = "google-genai" },
|
| 2715 |
{ name = "mcp" },
|
|
|
|
| 2734 |
{ name = "anthropic", specifier = ">=0.25.0" },
|
| 2735 |
{ name = "cadquery", specifier = ">=2.7.0" },
|
| 2736 |
{ name = "cadquery-ocp", specifier = ">=7.8.0" },
|
| 2737 |
+
{ name = "crewai", extras = ["tools"], specifier = ">=0.100.0" },
|
| 2738 |
{ name = "fastapi", specifier = ">=0.110.0" },
|
| 2739 |
{ name = "google-genai", specifier = ">=1.0.0" },
|
| 2740 |
{ name = "mcp", specifier = ">=1.0.0" },
|
|
|
|
| 3961 |
{ name = "cryptography" },
|
| 3962 |
]
|
| 3963 |
|
| 3964 |
+
[[package]]
|
| 3965 |
+
name = "pymupdf"
|
| 3966 |
+
version = "1.26.7"
|
| 3967 |
+
source = { registry = "https://pypi.org/simple" }
|
| 3968 |
+
sdist = { url = "https://files.pythonhosted.org/packages/48/d6/09b28f027b510838559f7748807192149c419b30cb90e6d5f0cf916dc9dc/pymupdf-1.26.7.tar.gz", hash = "sha256:71add8bdc8eb1aaa207c69a13400693f06ad9b927bea976f5d5ab9df0bb489c3", size = 84327033, upload-time = "2025-12-11T21:48:50.694Z" }
|
| 3969 |
+
wheels = [
|
| 3970 |
+
{ url = "https://files.pythonhosted.org/packages/94/35/cd74cea1787b2247702ef8522186bdef32e9cb30a099e6bb864627ef6045/pymupdf-1.26.7-cp310-abi3-macosx_10_9_x86_64.whl", hash = "sha256:07085718dfdae5ab83b05eb5eb397f863bcc538fe05135318a01ea353e7a1353", size = 23179369, upload-time = "2025-12-11T21:47:21.587Z" },
|
| 3971 |
+
{ url = "https://files.pythonhosted.org/packages/72/74/448b6172927c829c6a3fba80078d7b0a016ebbe2c9ee528821f5ea21677a/pymupdf-1.26.7-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:31aa9c8377ea1eea02934b92f4dcf79fb2abba0bf41f8a46d64c3e31546a3c02", size = 22470101, upload-time = "2025-12-11T21:47:37.105Z" },
|
| 3972 |
+
{ url = "https://files.pythonhosted.org/packages/65/e7/47af26f3ac76be7ac3dd4d6cc7ee105948a8355d774e5ca39857bf91c11c/pymupdf-1.26.7-cp310-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:e419b609996434a14a80fa060adec72c434a1cca6a511ec54db9841bc5d51b3c", size = 23502486, upload-time = "2025-12-12T09:51:25.824Z" },
|
| 3973 |
+
{ url = "https://files.pythonhosted.org/packages/2a/6b/3de1714d734ff949be1e90a22375d0598d3540b22ae73eb85c2d7d1f36a9/pymupdf-1.26.7-cp310-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:69dfc78f206a96e5b3ac22741263ebab945fdf51f0dbe7c5757c3511b23d9d72", size = 24115727, upload-time = "2025-12-11T21:47:51.274Z" },
|
| 3974 |
+
{ url = "https://files.pythonhosted.org/packages/62/9b/f86224847949577a523be2207315ae0fd3155b5d909cd66c274d095349a3/pymupdf-1.26.7-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1d5106f46e1ca0d64d46bd51892372a4f82076bdc14a9678d33d630702abca36", size = 24324386, upload-time = "2025-12-12T14:58:45.483Z" },
|
| 3975 |
+
{ url = "https://files.pythonhosted.org/packages/85/8e/a117d39092ca645fde8b903f4a941d9aa75b370a67b4f1f435f56393dc5a/pymupdf-1.26.7-cp310-abi3-win32.whl", hash = "sha256:7c9645b6f5452629c747690190350213d3e5bbdb6b2eca227d82702b327f6eee", size = 17203888, upload-time = "2025-12-12T13:59:57.613Z" },
|
| 3976 |
+
{ url = "https://files.pythonhosted.org/packages/dd/c3/d0047678146c294469c33bae167c8ace337deafb736b0bf97b9bc481aa65/pymupdf-1.26.7-cp310-abi3-win_amd64.whl", hash = "sha256:425b1befe40d41b72eb0fe211711c7ae334db5eb60307e9dd09066ed060cceba", size = 18405952, upload-time = "2025-12-11T21:48:02.947Z" },
|
| 3977 |
+
]
|
| 3978 |
+
|
| 3979 |
[[package]]
|
| 3980 |
name = "pyparsing"
|
| 3981 |
version = "3.3.2"
|
|
|
|
| 4065 |
{ url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" },
|
| 4066 |
]
|
| 4067 |
|
| 4068 |
+
[[package]]
|
| 4069 |
+
name = "python-docx"
|
| 4070 |
+
version = "1.2.0"
|
| 4071 |
+
source = { registry = "https://pypi.org/simple" }
|
| 4072 |
+
dependencies = [
|
| 4073 |
+
{ name = "lxml" },
|
| 4074 |
+
{ name = "typing-extensions" },
|
| 4075 |
+
]
|
| 4076 |
+
sdist = { url = "https://files.pythonhosted.org/packages/a9/f7/eddfe33871520adab45aaa1a71f0402a2252050c14c7e3009446c8f4701c/python_docx-1.2.0.tar.gz", hash = "sha256:7bc9d7b7d8a69c9c02ca09216118c86552704edc23bac179283f2e38f86220ce", size = 5723256, upload-time = "2025-06-16T20:46:27.921Z" }
|
| 4077 |
+
wheels = [
|
| 4078 |
+
{ url = "https://files.pythonhosted.org/packages/d0/00/1e03a4989fa5795da308cd774f05b704ace555a70f9bf9d3be057b680bcf/python_docx-1.2.0-py3-none-any.whl", hash = "sha256:3fd478f3250fbbbfd3b94fe1e985955737c145627498896a8a6bf81f4baf66c7", size = 252987, upload-time = "2025-06-16T20:46:22.506Z" },
|
| 4079 |
+
]
|
| 4080 |
+
|
| 4081 |
[[package]]
|
| 4082 |
name = "python-dotenv"
|
| 4083 |
version = "1.1.1"
|
|
|
|
| 4096 |
{ url = "https://files.pythonhosted.org/packages/a3/73/89930efabd4da63cea44a3f438aeb753d600123570e6d6264e763617a9ce/python_multipart-0.0.24-py3-none-any.whl", hash = "sha256:9b110a98db707df01a53c194f0af075e736a770dc5058089650d70b4a182f950", size = 24420, upload-time = "2026-04-05T20:49:12.555Z" },
|
| 4097 |
]
|
| 4098 |
|
| 4099 |
+
[[package]]
|
| 4100 |
+
name = "pytube"
|
| 4101 |
+
version = "15.0.0"
|
| 4102 |
+
source = { registry = "https://pypi.org/simple" }
|
| 4103 |
+
sdist = { url = "https://files.pythonhosted.org/packages/d8/e7/16fec46c8d255c4bbc4b185d89c91dc92cdb802836570d8004d0db169c91/pytube-15.0.0.tar.gz", hash = "sha256:076052efe76f390dfa24b1194ff821d4e86c17d41cb5562f3a276a8bcbfc9d1d", size = 67229, upload-time = "2023-05-07T19:39:01.903Z" }
|
| 4104 |
+
wheels = [
|
| 4105 |
+
{ url = "https://files.pythonhosted.org/packages/51/64/bcf8632ed2b7a36bbf84a0544885ffa1d0b4bcf25cc0903dba66ec5fdad9/pytube-15.0.0-py3-none-any.whl", hash = "sha256:07b9904749e213485780d7eb606e5e5b8e4341aa4dccf699160876da00e12d78", size = 57594, upload-time = "2023-05-07T19:38:59.191Z" },
|
| 4106 |
+
]
|
| 4107 |
+
|
| 4108 |
[[package]]
|
| 4109 |
name = "pywin32"
|
| 4110 |
version = "311"
|
|
|
|
| 4328 |
|
| 4329 |
[[package]]
|
| 4330 |
name = "requests"
|
| 4331 |
+
version = "2.32.5"
|
| 4332 |
source = { registry = "https://pypi.org/simple" }
|
| 4333 |
dependencies = [
|
| 4334 |
{ name = "certifi" },
|
|
|
|
| 4336 |
{ name = "idna" },
|
| 4337 |
{ name = "urllib3" },
|
| 4338 |
]
|
| 4339 |
+
sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" }
|
| 4340 |
wheels = [
|
| 4341 |
+
{ url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" },
|
| 4342 |
]
|
| 4343 |
|
| 4344 |
[[package]]
|
|
|
|
| 4550 |
{ 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" },
|
| 4551 |
]
|
| 4552 |
|
| 4553 |
+
[[package]]
|
| 4554 |
+
name = "soupsieve"
|
| 4555 |
+
version = "2.8.3"
|
| 4556 |
+
source = { registry = "https://pypi.org/simple" }
|
| 4557 |
+
sdist = { url = "https://files.pythonhosted.org/packages/7b/ae/2d9c981590ed9999a0d91755b47fc74f74de286b0f5cee14c9269041e6c4/soupsieve-2.8.3.tar.gz", hash = "sha256:3267f1eeea4251fb42728b6dfb746edc9acaffc4a45b27e19450b676586e8349", size = 118627, upload-time = "2026-01-20T04:27:02.457Z" }
|
| 4558 |
+
wheels = [
|
| 4559 |
+
{ url = "https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl", hash = "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95", size = 37016, upload-time = "2026-01-20T04:27:01.012Z" },
|
| 4560 |
+
]
|
| 4561 |
+
|
| 4562 |
[[package]]
|
| 4563 |
name = "sse-starlette"
|
| 4564 |
version = "3.3.4"
|
|
|
|
| 4623 |
{ url = "https://files.pythonhosted.org/packages/0e/28/a81d6ce9f4804818bd1231a9a6e4d56ea84ebbe8385c49591444f0234fa2/textual-8.2.3-py3-none-any.whl", hash = "sha256:5008ac581bebf1f6fa0520404261844a231e5715fdbddd10ca73916a3af48ca2", size = 724231, upload-time = "2026-04-05T09:12:48.747Z" },
|
| 4624 |
]
|
| 4625 |
|
| 4626 |
+
[[package]]
|
| 4627 |
+
name = "tiktoken"
|
| 4628 |
+
version = "0.8.0"
|
| 4629 |
+
source = { registry = "https://pypi.org/simple" }
|
| 4630 |
+
dependencies = [
|
| 4631 |
+
{ name = "regex" },
|
| 4632 |
+
{ name = "requests" },
|
| 4633 |
+
]
|
| 4634 |
+
sdist = { url = "https://files.pythonhosted.org/packages/37/02/576ff3a6639e755c4f70997b2d315f56d6d71e0d046f4fb64cb81a3fb099/tiktoken-0.8.0.tar.gz", hash = "sha256:9ccbb2740f24542534369c5635cfd9b2b3c2490754a78ac8831d99f89f94eeb2", size = 35107, upload-time = "2024-10-03T22:44:04.196Z" }
|
| 4635 |
+
wheels = [
|
| 4636 |
+
{ url = "https://files.pythonhosted.org/packages/c9/ba/a35fad753bbca8ba0cc1b0f3402a70256a110ced7ac332cf84ba89fc87ab/tiktoken-0.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b07e33283463089c81ef1467180e3e00ab00d46c2c4bbcef0acab5f771d6695e", size = 1039905, upload-time = "2024-10-03T22:43:17.292Z" },
|
| 4637 |
+
{ url = "https://files.pythonhosted.org/packages/91/05/13dab8fd7460391c387b3e69e14bf1e51ff71fe0a202cd2933cc3ea93fb6/tiktoken-0.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9269348cb650726f44dd3bbb3f9110ac19a8dcc8f54949ad3ef652ca22a38e21", size = 982417, upload-time = "2024-10-03T22:43:19.437Z" },
|
| 4638 |
+
{ url = "https://files.pythonhosted.org/packages/e9/98/18ec4a8351a6cf4537e40cd6e19a422c10cce1ef00a2fcb716e0a96af58b/tiktoken-0.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e13f37bc4ef2d012731e93e0fef21dc3b7aea5bb9009618de9a4026844e560", size = 1144915, upload-time = "2024-10-03T22:43:21.385Z" },
|
| 4639 |
+
{ url = "https://files.pythonhosted.org/packages/2e/28/cf3633018cbcc6deb7805b700ccd6085c9a5a7f72b38974ee0bffd56d311/tiktoken-0.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f13d13c981511331eac0d01a59b5df7c0d4060a8be1e378672822213da51e0a2", size = 1177221, upload-time = "2024-10-03T22:43:23.325Z" },
|
| 4640 |
+
{ url = "https://files.pythonhosted.org/packages/57/81/8a5be305cbd39d4e83a794f9e80c7f2c84b524587b7feb27c797b2046d51/tiktoken-0.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6b2ddbc79a22621ce8b1166afa9f9a888a664a579350dc7c09346a3b5de837d9", size = 1237398, upload-time = "2024-10-03T22:43:24.71Z" },
|
| 4641 |
+
{ url = "https://files.pythonhosted.org/packages/dc/da/8d1cc3089a83f5cf11c2e489332752981435280285231924557350523a59/tiktoken-0.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d8c2d0e5ba6453a290b86cd65fc51fedf247e1ba170191715b049dac1f628005", size = 884215, upload-time = "2024-10-03T22:43:26.793Z" },
|
| 4642 |
+
{ url = "https://files.pythonhosted.org/packages/f6/1e/ca48e7bfeeccaf76f3a501bd84db1fa28b3c22c9d1a1f41af9fb7579c5f6/tiktoken-0.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d622d8011e6d6f239297efa42a2657043aaed06c4f68833550cac9e9bc723ef1", size = 1039700, upload-time = "2024-10-03T22:43:28.315Z" },
|
| 4643 |
+
{ url = "https://files.pythonhosted.org/packages/8c/f8/f0101d98d661b34534769c3818f5af631e59c36ac6d07268fbfc89e539ce/tiktoken-0.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2efaf6199717b4485031b4d6edb94075e4d79177a172f38dd934d911b588d54a", size = 982413, upload-time = "2024-10-03T22:43:29.807Z" },
|
| 4644 |
+
{ url = "https://files.pythonhosted.org/packages/ac/3c/2b95391d9bd520a73830469f80a96e3790e6c0a5ac2444f80f20b4b31051/tiktoken-0.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5637e425ce1fc49cf716d88df3092048359a4b3bbb7da762840426e937ada06d", size = 1144242, upload-time = "2024-10-04T04:42:53.66Z" },
|
| 4645 |
+
{ url = "https://files.pythonhosted.org/packages/01/c4/c4a4360de845217b6aa9709c15773484b50479f36bb50419c443204e5de9/tiktoken-0.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fb0e352d1dbe15aba082883058b3cce9e48d33101bdaac1eccf66424feb5b47", size = 1176588, upload-time = "2024-10-03T22:43:31.136Z" },
|
| 4646 |
+
{ url = "https://files.pythonhosted.org/packages/f8/a3/ef984e976822cd6c2227c854f74d2e60cf4cd6fbfca46251199914746f78/tiktoken-0.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:56edfefe896c8f10aba372ab5706b9e3558e78db39dd497c940b47bf228bc419", size = 1237261, upload-time = "2024-10-03T22:43:32.75Z" },
|
| 4647 |
+
{ url = "https://files.pythonhosted.org/packages/1e/86/eea2309dc258fb86c7d9b10db536434fc16420feaa3b6113df18b23db7c2/tiktoken-0.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:326624128590def898775b722ccc327e90b073714227175ea8febbc920ac0a99", size = 884537, upload-time = "2024-10-03T22:43:34.592Z" },
|
| 4648 |
+
{ url = "https://files.pythonhosted.org/packages/c1/22/34b2e136a6f4af186b6640cbfd6f93400783c9ef6cd550d9eab80628d9de/tiktoken-0.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:881839cfeae051b3628d9823b2e56b5cc93a9e2efb435f4cf15f17dc45f21586", size = 1039357, upload-time = "2024-10-03T22:43:36.362Z" },
|
| 4649 |
+
{ url = "https://files.pythonhosted.org/packages/04/d2/c793cf49c20f5855fd6ce05d080c0537d7418f22c58e71f392d5e8c8dbf7/tiktoken-0.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fe9399bdc3f29d428f16a2f86c3c8ec20be3eac5f53693ce4980371c3245729b", size = 982616, upload-time = "2024-10-03T22:43:37.658Z" },
|
| 4650 |
+
{ url = "https://files.pythonhosted.org/packages/b3/a1/79846e5ef911cd5d75c844de3fa496a10c91b4b5f550aad695c5df153d72/tiktoken-0.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a58deb7075d5b69237a3ff4bb51a726670419db6ea62bdcd8bd80c78497d7ab", size = 1144011, upload-time = "2024-10-03T22:43:39.092Z" },
|
| 4651 |
+
{ url = "https://files.pythonhosted.org/packages/26/32/e0e3a859136e95c85a572e4806dc58bf1ddf651108ae8b97d5f3ebe1a244/tiktoken-0.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2908c0d043a7d03ebd80347266b0e58440bdef5564f84f4d29fb235b5df3b04", size = 1175432, upload-time = "2024-10-03T22:43:40.323Z" },
|
| 4652 |
+
{ url = "https://files.pythonhosted.org/packages/c7/89/926b66e9025b97e9fbabeaa59048a736fe3c3e4530a204109571104f921c/tiktoken-0.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:294440d21a2a51e12d4238e68a5972095534fe9878be57d905c476017bff99fc", size = 1236576, upload-time = "2024-10-03T22:43:41.516Z" },
|
| 4653 |
+
{ url = "https://files.pythonhosted.org/packages/45/e2/39d4aa02a52bba73b2cd21ba4533c84425ff8786cc63c511d68c8897376e/tiktoken-0.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:d8f3192733ac4d77977432947d563d7e1b310b96497acd3c196c9bddb36ed9db", size = 883824, upload-time = "2024-10-03T22:43:43.33Z" },
|
| 4654 |
+
{ url = "https://files.pythonhosted.org/packages/e3/38/802e79ba0ee5fcbf240cd624143f57744e5d411d2e9d9ad2db70d8395986/tiktoken-0.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:02be1666096aff7da6cbd7cdaa8e7917bfed3467cd64b38b1f112e96d3b06a24", size = 1039648, upload-time = "2024-10-03T22:43:45.22Z" },
|
| 4655 |
+
{ url = "https://files.pythonhosted.org/packages/b1/da/24cdbfc302c98663fbea66f5866f7fa1048405c7564ab88483aea97c3b1a/tiktoken-0.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94ff53c5c74b535b2cbf431d907fc13c678bbd009ee633a2aca269a04389f9a", size = 982763, upload-time = "2024-10-03T22:43:46.571Z" },
|
| 4656 |
+
{ url = "https://files.pythonhosted.org/packages/e4/f0/0ecf79a279dfa41fc97d00adccf976ecc2556d3c08ef3e25e45eb31f665b/tiktoken-0.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b231f5e8982c245ee3065cd84a4712d64692348bc609d84467c57b4b72dcbc5", size = 1144417, upload-time = "2024-10-03T22:43:48.633Z" },
|
| 4657 |
+
{ url = "https://files.pythonhosted.org/packages/ab/d3/155d2d4514f3471a25dc1d6d20549ef254e2aa9bb5b1060809b1d3b03d3a/tiktoken-0.8.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4177faa809bd55f699e88c96d9bb4635d22e3f59d635ba6fd9ffedf7150b9953", size = 1175108, upload-time = "2024-10-03T22:43:50.568Z" },
|
| 4658 |
+
{ url = "https://files.pythonhosted.org/packages/19/eb/5989e16821ee8300ef8ee13c16effc20dfc26c777d05fbb6825e3c037b81/tiktoken-0.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5376b6f8dc4753cd81ead935c5f518fa0fbe7e133d9e25f648d8c4dabdd4bad7", size = 1236520, upload-time = "2024-10-03T22:43:51.759Z" },
|
| 4659 |
+
{ url = "https://files.pythonhosted.org/packages/40/59/14b20465f1d1cb89cfbc96ec27e5617b2d41c79da12b5e04e96d689be2a7/tiktoken-0.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:18228d624807d66c87acd8f25fc135665617cab220671eb65b50f5d70fa51f69", size = 883849, upload-time = "2024-10-03T22:43:53.999Z" },
|
| 4660 |
+
]
|
| 4661 |
+
|
| 4662 |
[[package]]
|
| 4663 |
name = "tokenizers"
|
| 4664 |
version = "0.22.2"
|
|
|
|
| 5322 |
{ url = "https://files.pythonhosted.org/packages/69/68/c8739671f5699c7dc470580a4f821ef37c32c4cb0b047ce223a7f115757f/yarl-1.23.0-py3-none-any.whl", hash = "sha256:a2df6afe50dea8ae15fa34c9f824a3ee958d785fd5d089063d960bae1daa0a3f", size = 48288, upload-time = "2026-03-01T22:07:51.388Z" },
|
| 5323 |
]
|
| 5324 |
|
| 5325 |
+
[[package]]
|
| 5326 |
+
name = "youtube-transcript-api"
|
| 5327 |
+
version = "1.2.4"
|
| 5328 |
+
source = { registry = "https://pypi.org/simple" }
|
| 5329 |
+
dependencies = [
|
| 5330 |
+
{ name = "defusedxml" },
|
| 5331 |
+
{ name = "requests" },
|
| 5332 |
+
]
|
| 5333 |
+
sdist = { url = "https://files.pythonhosted.org/packages/60/43/4104185a2eaa839daa693b30e15c37e7e58795e8e09ec414f22b3db54bec/youtube_transcript_api-1.2.4.tar.gz", hash = "sha256:b72d0e96a335df599d67cee51d49e143cff4f45b84bcafc202ff51291603ddcd", size = 469839, upload-time = "2026-01-29T09:09:17.088Z" }
|
| 5334 |
+
wheels = [
|
| 5335 |
+
{ url = "https://files.pythonhosted.org/packages/be/95/129ea37efd6cd6ed00f62baae6543345c677810b8a3bf0026756e1d3cf3c/youtube_transcript_api-1.2.4-py3-none-any.whl", hash = "sha256:03878759356da5caf5edac77431780b91448fb3d8c21d4496015bdc8a7bc43ff", size = 485227, upload-time = "2026-01-29T09:09:15.427Z" },
|
| 5336 |
+
]
|
| 5337 |
+
|
| 5338 |
[[package]]
|
| 5339 |
name = "zipp"
|
| 5340 |
version = "3.23.0"
|
web/index.html
CHANGED
|
@@ -169,6 +169,22 @@
|
|
| 169 |
color: var(--text-secondary);
|
| 170 |
}
|
| 171 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 172 |
.lang-toggle {
|
| 173 |
display: flex;
|
| 174 |
align-items: center;
|
|
@@ -1450,6 +1466,7 @@
|
|
| 1450 |
<button id="btn-gemini" class="active" onclick="setBackend('gemini')">GEMINI</button>
|
| 1451 |
<button id="btn-openai" onclick="setBackend('openai')">OPENAI</button>
|
| 1452 |
</div>
|
|
|
|
| 1453 |
<button class="gallery-btn" onclick="openGallery()">
|
| 1454 |
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="7" height="7" rx="1"/><rect x="14" y="3" width="7" height="7" rx="1"/><rect x="3" y="14" width="7" height="7" rx="1"/><rect x="14" y="14" width="7" height="7" rx="1"/></svg>
|
| 1455 |
<span data-i18n="gallery">GALLERY</span>
|
|
@@ -1694,6 +1711,8 @@
|
|
| 1694 |
// ── STATE ─────────────────────────────────────────────
|
| 1695 |
|
| 1696 |
let currentBackend = 'gemini';
|
|
|
|
|
|
|
| 1697 |
let chatHistory = [];
|
| 1698 |
let designState = {};
|
| 1699 |
let chatPanelOpen = true;
|
|
@@ -2804,8 +2823,32 @@ function setBackend(name) {
|
|
| 2804 |
currentBackend = name;
|
| 2805 |
document.getElementById('btn-gemini').classList.toggle('active', name === 'gemini');
|
| 2806 |
document.getElementById('btn-openai').classList.toggle('active', name === 'openai');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2807 |
}
|
| 2808 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2809 |
// ── CHAT PANEL TOGGLE ─────────────────────────────────
|
| 2810 |
|
| 2811 |
function toggleChat() {
|
|
@@ -2863,6 +2906,7 @@ async function sendMessage(text, options) {
|
|
| 2863 |
history: chatHistory,
|
| 2864 |
mentions: mentions,
|
| 2865 |
backend: currentBackend,
|
|
|
|
| 2866 |
design_state: designState,
|
| 2867 |
plan_context: !!options.planContext,
|
| 2868 |
}),
|
|
@@ -3478,6 +3522,7 @@ setInterval(checkServer, 15000);
|
|
| 3478 |
|
| 3479 |
loadState();
|
| 3480 |
loadServerModels();
|
|
|
|
| 3481 |
// Apply saved language
|
| 3482 |
setLang(currentLang);
|
| 3483 |
// Re-render restored messages
|
|
|
|
| 169 |
color: var(--text-secondary);
|
| 170 |
}
|
| 171 |
|
| 172 |
+
.model-select {
|
| 173 |
+
background: var(--bg-void);
|
| 174 |
+
border: 1px solid var(--border);
|
| 175 |
+
border-radius: 4px;
|
| 176 |
+
color: var(--text-secondary);
|
| 177 |
+
font-family: var(--font-mono);
|
| 178 |
+
font-size: 11px;
|
| 179 |
+
padding: 4px 8px;
|
| 180 |
+
cursor: pointer;
|
| 181 |
+
outline: none;
|
| 182 |
+
}
|
| 183 |
+
|
| 184 |
+
.model-select:focus {
|
| 185 |
+
border-color: var(--accent);
|
| 186 |
+
}
|
| 187 |
+
|
| 188 |
.lang-toggle {
|
| 189 |
display: flex;
|
| 190 |
align-items: center;
|
|
|
|
| 1466 |
<button id="btn-gemini" class="active" onclick="setBackend('gemini')">GEMINI</button>
|
| 1467 |
<button id="btn-openai" onclick="setBackend('openai')">OPENAI</button>
|
| 1468 |
</div>
|
| 1469 |
+
<select id="model-select" class="model-select" title="Select model"></select>
|
| 1470 |
<button class="gallery-btn" onclick="openGallery()">
|
| 1471 |
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="7" height="7" rx="1"/><rect x="14" y="3" width="7" height="7" rx="1"/><rect x="3" y="14" width="7" height="7" rx="1"/><rect x="14" y="14" width="7" height="7" rx="1"/></svg>
|
| 1472 |
<span data-i18n="gallery">GALLERY</span>
|
|
|
|
| 1711 |
// ── STATE ─────────────────────────────────────────────
|
| 1712 |
|
| 1713 |
let currentBackend = 'gemini';
|
| 1714 |
+
let currentModel = '';
|
| 1715 |
+
let backendModels = {};
|
| 1716 |
let chatHistory = [];
|
| 1717 |
let designState = {};
|
| 1718 |
let chatPanelOpen = true;
|
|
|
|
| 2823 |
currentBackend = name;
|
| 2824 |
document.getElementById('btn-gemini').classList.toggle('active', name === 'gemini');
|
| 2825 |
document.getElementById('btn-openai').classList.toggle('active', name === 'openai');
|
| 2826 |
+
updateModelSelect();
|
| 2827 |
+
}
|
| 2828 |
+
|
| 2829 |
+
function updateModelSelect() {
|
| 2830 |
+
const select = document.getElementById('model-select');
|
| 2831 |
+
const models = backendModels[currentBackend] || [];
|
| 2832 |
+
select.innerHTML = models.map(m =>
|
| 2833 |
+
'<option value="' + m + '"' + (m === currentModel ? ' selected' : '') + '>' + m + '</option>'
|
| 2834 |
+
).join('');
|
| 2835 |
+
currentModel = select.value || models[0] || '';
|
| 2836 |
}
|
| 2837 |
|
| 2838 |
+
async function loadBackendModels() {
|
| 2839 |
+
try {
|
| 2840 |
+
const resp = await fetch('/api/backend-models');
|
| 2841 |
+
backendModels = await resp.json();
|
| 2842 |
+
updateModelSelect();
|
| 2843 |
+
} catch (e) {
|
| 2844 |
+
console.warn('Failed to load backend models', e);
|
| 2845 |
+
}
|
| 2846 |
+
}
|
| 2847 |
+
|
| 2848 |
+
document.getElementById('model-select').addEventListener('change', function() {
|
| 2849 |
+
currentModel = this.value;
|
| 2850 |
+
});
|
| 2851 |
+
|
| 2852 |
// ── CHAT PANEL TOGGLE ─────────────────────────────────
|
| 2853 |
|
| 2854 |
function toggleChat() {
|
|
|
|
| 2906 |
history: chatHistory,
|
| 2907 |
mentions: mentions,
|
| 2908 |
backend: currentBackend,
|
| 2909 |
+
model: currentModel,
|
| 2910 |
design_state: designState,
|
| 2911 |
plan_context: !!options.planContext,
|
| 2912 |
}),
|
|
|
|
| 3522 |
|
| 3523 |
loadState();
|
| 3524 |
loadServerModels();
|
| 3525 |
+
loadBackendModels();
|
| 3526 |
// Apply saved language
|
| 3527 |
setLang(currentLang);
|
| 3528 |
// Re-render restored messages
|