visheshrathi commited on
Commit
bbf206f
·
verified ·
1 Parent(s): 5850885

Upload folder using huggingface_hub

Browse files
BLOG.md ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # SQL Under Drift: Why Static Benchmarks Miss the Point
2
+
3
+ Production databases do not hold still. Schemas get evolved, columns are renamed, enums split, formats change, and deploy changelogs record what humans already agreed on. Training agents only on fixed schemas rewards a skill that rarely matches the job: adapting while the workflow is still in flight.
4
+
5
+ **SQLDrift** is an [OpenEnv](https://github.com/meta-pytorch/OpenEnv)-style gym built for that harder setting. Each episode gives an agent a real DuckDB instance, a toolbox of read-only actions (`list_tables`, `describe_table`, `sample_rows`, `run_query`, `explain_query`, `read_changelog`, `submit_rewrite`, and optional DBA guidance), and a bounded step budget. Drift can arrive mid-episode: schema and business-rule changes are applied in the environment, not only described in prose. Rewards combine semantic correctness (canonical result checks), adaptation after drift, measured runtime improvement against a calibrated baseline, and sensible penalties for wasted steps and brittle patterns—so “correct but lazy” and “fast but wrong” both fail in predictable ways.
6
+
7
+ ## How this differs from recent SQL RL lines
8
+
9
+ The last year has seen strong momentum in SQL-focused RL: executable feedback, equivalence-aware rewrites, and efficiency signals are now familiar ingredients in lines such as BIRD-CRITIC / `six-gym-sqlite`, the BIRD-Talon and BIRD-Zeno–style models, and work like E3-Rewrite that optimizes for executability, equivalence, and speed. Those settings still largely treat the world as **stable for the episode**: the puzzle is to fix or improve a query against a schema that does not reorganize underneath you.
10
+
11
+ SQLDrift’s emphasis is different. The novelty is not “SQL plus RL” by itself—it is **live schema and business-rule drift during the rollout**, with changelog-grounded adaptation, long-horizon tool use, and deterministic validation in a stateful loop. Agents must read what changed, re-verify behavior, and submit a rewrite that is both faithful to the new rules and meaningfully faster than the baseline. That combination targets the gap between leaderboard SQL and the kind of maintenance engineers actually perform.
12
+
13
+ ## Why it matters
14
+
15
+ We are not claiming a world without prior art; we are pointing at a clear axis of generalization. When the environment can shift mid-episode, memorizing one layout stops being enough. SQLDrift offers a compact, reproducible setting to train and measure that skill: demanding for the policy, and closer to how deployments actually behave than a single frozen schema alone can provide.
README.md CHANGED
@@ -11,40 +11,125 @@ base_path: /web
11
 
12
  # SQLDrift
13
 
14
- > An OpenEnv gym that teaches an LLM agent to **repair and optimize SQL** when
15
- > the database schema and business rules shift out from under it.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
 
17
  SQLDrift is a production-grade [OpenEnv](https://github.com/meta-pytorch/OpenEnv)
18
- environment designed for RL fine-tuning with TRL's
19
- [`GRPOTrainer`](https://huggingface.co/docs/trl/openenv) (plus
20
- [Unsloth](https://github.com/unslothai/unsloth) LoRA on consumer GPUs).
21
- Each episode hands the agent a slow baseline SQL query, a lightly-populated
22
- DuckDB database, a toolbox of read-only introspection / execution tools, and a
23
- **25-step budget**. Midway through the episode a schema or business-rule
24
- **drift event** may fire; the agent must read the deploy changelog, re-diagnose,
25
- and submit a rewrite that is both (a) semantically correct and (b) ≥ 1.2× faster
26
- than the baseline. A hierarchical rubric turns that into six reward signals
27
  (correctness, drift-adapt, speedup, step-tax, gatekeepers, consult-dba).
28
 
29
  Highlights:
30
 
31
- - **10 hand-crafted scenarios** — 6 classic anti-patterns (correlated
32
- subqueries, `SELECT *` joins, Cartesian joins, `DISTINCT` groupbys, nested
33
- subqueries, `HAVING`-as-`WHERE`) and 4 drift events (column rename, date
34
- format flip, enum rule split, field deprecation).
35
  - **Deterministic fixtures** — 15–30-column schemas, 2–4 tables per scenario,
36
- regenerated in-process at `reset()` from a seed. No Parquet files, no
37
- pre-baked sqlite dumps.
38
- - **Sqlglot-canonicalised baseline-verbatim gate** — agents that rename
39
- whitespace and resubmit the baseline cannot farm the +1.0 correct bonus.
40
- - **Skill library** — 12 pre-seeded playbook/drift-card entries plus an
41
- on-disk, `fcntl.flock`-guarded JSON store that grows as the agent solves
42
- episodes, surfaced next `reset()` via Jaccard retrieval.
43
- - **Feature-flagged DBA Oracle** — 3-tier escalating hints per scenario,
44
- penalised by the `ConsultDBA` rubric. Off by default.
45
- - **Dockerised** — `server/Dockerfile` layers the env on
46
- `ghcr.io/meta-pytorch/openenv-base` and exposes `/health`, `/reset`,
47
- `/step`, `/ws` out-of-the-box.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
 
49
  ## Quick start
50
 
@@ -88,9 +173,8 @@ print(obs.reward, obs.reward_components)
88
  env.close()
89
  ```
90
 
91
- End-to-end over an HTTP+WS OpenEnv server, see `SqlDriftEnv` in
92
- `client.py` and the integration test suite in
93
- `tests/integration/test_client_server.py` /
94
  `tests/integration/test_state_no_leak.py`.
95
 
96
  ## Evaluation
@@ -103,19 +187,20 @@ uv run python -m training.eval \
103
  --out outputs/evals/my_run
104
  ```
105
 
106
- Emits `report.md`, `per_episode.csv`, and `summary.json`. A baseline random
107
- agent sweep is checked in at `outputs/evals/baseline_random_v1/report.md` as a
108
- floor: mean reward ≈ **-2.05**, pass rate **0 %**.
109
 
110
  ## Training (GPU)
111
 
112
- `training/grpo_train.py` contains the GRPO entrypoint used by the hackathon
113
- training notebook: it builds the curriculum dataset, loads
114
- `unsloth/Qwen3-1.7B-unsloth-bnb-4bit`, attaches PEFT LoRA adapters, and lets TRL's
115
- `GRPOTrainer` drive multi-turn OpenEnv rollouts through `SqlDriftToolEnv`.
116
- Run `training/sql_drift_grpo_training.ipynb` on a GPU runtime with
117
- `SQL_DRIFT_ENV_URL` pointed at the deployed SQLDrift Space; the notebook writes
118
- durable evidence plots to `training/evidence/`.
 
 
 
119
 
120
  ```bash
121
  uv sync --extra train # installs trl, transformers, accelerate, unsloth
@@ -132,7 +217,8 @@ sql_drift_env/
132
  │ ├── runtime.py # private RuntimeEpisodeState
133
  │ ├── drift.py # 4 DDL drift operators
134
  │ ├── reward.py # SqlDriftRubric (6 child rubrics)
135
- │ ├── verifier.py / profiler.py
 
136
  ├── scenarios/ # 10 hand-crafted scenario modules + registry
137
  ├── skill_library/ # pre-seeds + JSON store + Jaccard retrieval
138
  ├── actors/ # engineering_manager (changelog), dba_oracle
@@ -144,12 +230,7 @@ sql_drift_env/
144
  └── design/ # design docs (ignored by docker)
145
  ```
146
 
147
- ## Design references
148
-
149
- - `.cursor/plans/sqldrift_technical_spec_feb249d1.plan.md` — full 16-phase
150
- technical spec (Rev-3).
151
- - `design/CLAUDE.md` — agent coding guidelines.
152
-
153
- ## License
154
 
155
- BSD-3-Clause (matches the OpenEnv project template).
 
 
11
 
12
  # SQLDrift
13
 
14
+ > An OpenEnv gym that teaches an LLM agent to **repair and optimize SQL** when the
15
+ > database schema and business rules shift out from under it.
16
+
17
+ ## Why this problem exists
18
+
19
+ Production analytics breaks in familiar ways: a deploy renames a column, splits an enum
20
+ into two fields, or changes how dates are stored. The dashboard query that worked on
21
+ Monday may error or return wrong results on Tuesday. LLMs are a natural fit—they can
22
+ read changelogs, run diagnostics, and propose rewrites—but static SQL benchmarks assume
23
+ a **fixed** schema. They cannot reward an agent for noticing that the world changed
24
+ **during** a task or for trading correctness against latency under a tool budget.
25
+
26
+ **SQLDrift** closes that gap: each episode is a small DuckDB world, a slow baseline
27
+ `SELECT`, a fixed tool budget, and (for drift scenarios) a mid-episode schema or rule
28
+ change the agent must recover from before submitting a rewrite that is both semantically
29
+ correct and materially faster than the baseline.
30
+
31
+ ## Live environment (Hugging Face Space)
32
+
33
+ Run the OpenEnv server without cloning the repo:
34
+
35
+ **[SQLDrift on Hugging Face Spaces](https://huggingface.co/spaces/visheshrathi/sql-drift-env)**
36
+
37
+ For TRL / client rollouts, point `SQL_DRIFT_ENV_URL` (or your `SqlDriftEnv` /
38
+ `SqlDriftToolEnv` base URL) at the Space runtime, for example
39
+ `https://visheshrathi-sql-drift-env.hf.space` — same host the training notebook
40
+ health-checks by default. If you need many concurrent WebSocket sessions (e.g.
41
+ `num_generations` > 1 in GRPO), duplicate the Space to your own account per the
42
+ [TRL OpenEnv concurrency notes](https://huggingface.co/docs/trl/openenv#server-concurrency).
43
 
44
  SQLDrift is a production-grade [OpenEnv](https://github.com/meta-pytorch/OpenEnv)
45
+ environment for RL fine-tuning with TRLs
46
+ [`GRPOTrainer`](https://huggingface.co/docs/trl/openenv) (and
47
+ [Unsloth](https://github.com/unslothai/unsloth) LoRA on consumer GPUs). Each episode
48
+ gives the agent a slow baseline query, a lightly populated DuckDB database, read-only
49
+ introspection and execution tools, and a **25-step budget**. Mid-episode, a schema or
50
+ business-rule **drift event** may fire; the agent must read the deploy changelog,
51
+ re-diagnose, and submit a rewrite that is (a) semantically correct and (b) ≥ **1.2×**
52
+ faster than the baseline. A hierarchical rubric turns that into six reward signals
 
53
  (correctness, drift-adapt, speedup, step-tax, gatekeepers, consult-dba).
54
 
55
  Highlights:
56
 
57
+ - **10 hand-crafted scenarios** — 6 classic anti-patterns (correlated subqueries,
58
+ `SELECT *` joins, Cartesian joins, `DISTINCT` groupbys, nested subqueries,
59
+ `HAVING`-as-`WHERE`) and 4 drift events (column rename, date format flip, enum rule
60
+ split, field deprecation).
61
  - **Deterministic fixtures** — 15–30-column schemas, 2–4 tables per scenario,
62
+ regenerated in-process at `reset()` from a seed. No Parquet files, no pre-baked
63
+ sqlite dumps.
64
+ - **Sqlglot-canonicalised baseline-verbatim gate** — agents that rename whitespace and
65
+ resubmit the baseline cannot farm the +1.0 correct bonus.
66
+ - **Skill library** — 12 pre-seeded playbook/drift-card entries plus an on-disk,
67
+ `fcntl.flock`-guarded JSON store that grows as the agent solves episodes, surfaced
68
+ next `reset()` via Jaccard retrieval.
69
+ - **Feature-flagged DBA Oracle** — 3-tier escalating hints per scenario, penalised by
70
+ the `ConsultDBA` rubric. Off by default.
71
+ - **Dockerised** — `server/Dockerfile` layers the env on `ghcr.io/meta-pytorch/openenv-base`
72
+ and exposes `/health`, `/reset`, `/step`, `/ws` out-of-the-box.
73
+
74
+ ## How the environment works
75
+
76
+ 1. **`reset(scenario_id, seed, …)`** builds a fresh in-memory DuckDB instance, loads the
77
+ scenario’s tables and rows, and returns an observation with the baseline SQL, phase
78
+ (`DIAGNOSE` → …), step budget, and `learned_hints` from the skill library.
79
+ 2. **Tooling** — The agent acts via OpenEnv actions: list/describe tables, sample rows,
80
+ `EXPLAIN`, timed read-only `run_query`, `read_changelog`, optional `consult_dba`, and
81
+ terminal `submit_rewrite`. Each step consumes budget and accrues shaping reward (e.g.
82
+ step tax and gatekeeper penalties).
83
+ 3. **Drift** — On drift scenarios, an event fires in a configured step window: DDL / rule
84
+ operators run idempotently (`engine/drift.py`); the changelog updates; ground truth and
85
+ baseline behaviour may change; the observation signals `drift_recovery` so the agent can
86
+ adapt.
87
+ 4. **Verification** — Submissions are checked with an order-independent result hash
88
+ (`engine/verifier.py`) and median-of-3 timed execution against the baseline
89
+ (`engine/profiler.py`). Correctness and speedup components of the rubric enforce the
90
+ ≥ 1.2× speedup bar for the top correctness tier.
91
+ 5. **Reward** — `SqlDriftRubric` composes six child rubrics; every observation exposes
92
+ `reward_components` (e.g. `r_correct`, `r_drift`, `r_speedup`, `r_step_tax`,
93
+ `r_gatekeepers`, `r_consult_dba`) for analysis and logging.
94
+ 6. **Server** — `server/app.py` uses the OpenEnv FastAPI factory; `client.py` provides a
95
+ WebSocket `SqlDriftEnv` for remote episodes. See `openenv.yaml` for the Space-oriented
96
+ manifest.
97
+
98
+ ## Results
99
+
100
+ ### Random baseline (floor)
101
+
102
+ We ship a reproducible random-agent evaluation under
103
+ `outputs/evals/baseline_random_v1/` (50 episodes, 5 seeds × 10 scenarios). It establishes
104
+ a **floor** for any trained policy:
105
+
106
+ | Metric | Value |
107
+ | ------------------------ | --------------------- |
108
+ | Mean total reward | **−2.048** (σ ≈ 0.70) |
109
+ | Pass rate (reward ≥ 0.5) | **0%** |
110
+ | Submit rate | 80% |
111
+
112
+ Mean reward is roughly **−1.8 to −2.3** per scenario; drift scenarios trend slightly
113
+ harder than static anti-pattern scenarios. See
114
+ [`outputs/evals/baseline_random_v1/report.md`](outputs/evals/baseline_random_v1/report.md)
115
+ for the full per-scenario table and component bars.
116
+
117
+ ### Trained policies
118
+
119
+ GRPO training is driven by `training/grpo_train.py` and `sql_drift_grpo_training.ipynb`.
120
+ After a run, compare checkpoints with:
121
+
122
+ ```bash
123
+ uv run python -m training.eval \
124
+ --checkpoint path/to/adapter \
125
+ --scenarios 1-10 \
126
+ --seeds-per-scenario 5 \
127
+ --out outputs/evals/my_run
128
+ ```
129
+
130
+ Training logs and plots: `training/grpo_train.py` can emit step-wise JSONL;
131
+ `utilities/plot_curves.py` produces reward/loss figures under `training/evidence/` when
132
+ that log exists.
133
 
134
  ## Quick start
135
 
 
173
  env.close()
174
  ```
175
 
176
+ End-to-end over an HTTP+WS OpenEnv server, see `SqlDriftEnv` in `client.py` and the
177
+ integration test suite in `tests/integration/test_client_server.py` /
 
178
  `tests/integration/test_state_no_leak.py`.
179
 
180
  ## Evaluation
 
187
  --out outputs/evals/my_run
188
  ```
189
 
190
+ Emits `report.md`, `per_episode.csv`, and `summary.json`.
 
 
191
 
192
  ## Training (GPU)
193
 
194
+ `training/grpo_train.py` contains the GRPO entrypoint used by the hackathon training
195
+ notebook: it builds the curriculum dataset, loads **`Qwen/Qwen3-1.7B`** (or your
196
+ `SQL_DRIFT_MODEL_NAME`) via `transformers.AutoModelForCausalLM` + `BitsAndBytesConfig`
197
+ 4-bit nf4 (QLoRA), attaches a PEFT LoRA adapter, and lets TRL's `GRPOTrainer` drive
198
+ multi-turn OpenEnv rollouts through `SqlDriftToolEnv` via `environment_factory`. The
199
+ install/runtime stack mirrors Hugging Face TRL's reference notebooks
200
+ (`grpo_trl_lora_qlora.ipynb` + `openenv_wordle_grpo.ipynb`). Open
201
+ `sql_drift_grpo_training.ipynb` on a free Colab T4, set `SQL_DRIFT_ENV_URL` to your
202
+ deployed SQLDrift Space (see [Live environment](#live-environment-hugging-face-space)),
203
+ and run all cells.
204
 
205
  ```bash
206
  uv sync --extra train # installs trl, transformers, accelerate, unsloth
 
217
  │ ├── runtime.py # private RuntimeEpisodeState
218
  │ ├── drift.py # 4 DDL drift operators
219
  │ ├── reward.py # SqlDriftRubric (6 child rubrics)
220
+ │ ├── verifier.py
221
+ | |-- profiler.py
222
  ├── scenarios/ # 10 hand-crafted scenario modules + registry
223
  ├── skill_library/ # pre-seeds + JSON store + Jaccard retrieval
224
  ├── actors/ # engineering_manager (changelog), dba_oracle
 
230
  └── design/ # design docs (ignored by docker)
231
  ```
232
 
233
+ ## References
 
 
 
 
 
 
234
 
235
+ - **[SQLDrift Hugging Face Space](https://huggingface.co/spaces/visheshrathi/sql-drift-env)** —
236
+ deployed OpenEnv server (Docker SDK).
pyproject.toml CHANGED
@@ -15,7 +15,13 @@ description = "SQLDrift: OpenEnv gym for repairing and optimizing SQL under live
15
  requires-python = ">=3.12,<3.14"
16
  dependencies = [
17
  "duckdb>=1.5.2,<2.0",
18
- "huggingface-hub>=0.20,<1.0",
 
 
 
 
 
 
19
  "openenv-core[core]>=0.2.2,<0.4",
20
  "sqlglot>=30.6.0,<40.0",
21
  "pydantic>=2.8.0,<3.0",
@@ -37,13 +43,27 @@ dev = [
37
  "httpx>=0.28.0",
38
  ]
39
  train = [
40
- "trl>=0.25.0,<1.0",
41
- "datasets>=2.20.0,<4.0",
42
- "transformers>=4.46.0,<5.0",
43
- "accelerate>=1.0.0,<2.0",
44
- "peft>=0.13,<1.0",
45
- "bitsandbytes>=0.43,<1.0",
46
- "unsloth>=2024.9,<2027.0",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  ]
48
 
49
  [project.scripts]
 
15
  requires-python = ">=3.12,<3.14"
16
  dependencies = [
17
  "duckdb>=1.5.2,<2.0",
18
+ # huggingface-hub: floor must satisfy `transformers>=5.2.0` (which
19
+ # needs hub>=1.3.0) — and the highest transformers we allow
20
+ # (5.4.x–5.5.0) needs hub>=1.5.0. Pin the floor at 1.5.0 to match
21
+ # the worst case so the [train] extra resolves cleanly. Cap <2.0
22
+ # because the `run_job` / `fetch_job_logs` / `inspect_job` API we
23
+ # call in utilities/run_training_job.py landed in the 1.x line.
24
+ "huggingface-hub>=1.5.0,<2.0",
25
  "openenv-core[core]>=0.2.2,<0.4",
26
  "sqlglot>=30.6.0,<40.0",
27
  "pydantic>=2.8.0,<3.0",
 
43
  "httpx>=0.28.0",
44
  ]
45
  train = [
46
+ # TRL-only stack — mirrors Hugging Face's reference notebooks for
47
+ # GRPO with QLoRA (`grpo_trl_lora_qlora.ipynb`) and the OpenEnv
48
+ # multi-turn tool-calling examples (`openenv_wordle_grpo.ipynb`).
49
+ # No Unsloth: AutoModelForCausalLM + BitsAndBytesConfig is the
50
+ # canonical path the TRL examples use, and it resolves cleanly
51
+ # on a free Colab T4.
52
+ "trl[peft]>=1.2.0,<2.0",
53
+ "datasets>=3.0.0,<5.0",
54
+ # TRL 1.2 floors transformers at >=5.0. Keep the ceiling open so
55
+ # we follow the TRL release cadence.
56
+ "transformers>=5.5.0",
57
+ "accelerate>=1.13.0",
58
+ "peft>=0.19",
59
+ "bitsandbytes>=0.46.1,!=0.48.0",
60
+ # jmespath: required by TRL's GRPOTrainer whenever `tools` or
61
+ # `environment_factory` is used (parses tool-call responses from
62
+ # the model). TRL raises ImportError at GRPOTrainer.__init__
63
+ # otherwise. Pure-Python, no transitive deps.
64
+ # https://github.com/huggingface/trl/blob/main/trl/trainer/grpo_trainer.py
65
+ "jmespath>=1.0,<2.0",
66
+ "tensorboard>=2.20,<3.0",
67
  ]
68
 
69
  [project.scripts]
sql_drift_grpo_training.ipynb CHANGED
The diff for this file is too large to render. See raw diff
 
training/__init__.py CHANGED
@@ -5,7 +5,8 @@ Public surface:
5
  * :class:`training.config.GRPOConfig` / :class:`training.config.CurriculumConfig`
6
  * :func:`training.prompt.render_system_prompt`
7
  * :class:`training.random_agent.RandomAgent`
8
- * :func:`training.grpo_train.train` (requires GPU + ``[train]`` extra)
 
9
  """
10
 
11
  from __future__ import annotations
 
5
  * :class:`training.config.GRPOConfig` / :class:`training.config.CurriculumConfig`
6
  * :func:`training.prompt.render_system_prompt`
7
  * :class:`training.random_agent.RandomAgent`
8
+ * :func:`training.grpo_train.train` (requires GPU + ``[train]`` extra
9
+ plus the CUDA-specific Unsloth stack installed by ``utilities/run_training_job.py``)
10
  """
11
 
12
  from __future__ import annotations
training/config.py CHANGED
@@ -63,19 +63,24 @@ class CurriculumConfig:
63
  class GRPOConfig:
64
  """Top-level training config for the GRPO skeleton.
65
 
66
- Defaults: Qwen3-1.7B (Unsloth bnb-4bit) + LoRA r=16, group size 4,
67
- 500 max steps but every knob is override-able from the CLI or a
68
- JSON/YAML manifest. Model swap from Qwen2.5-1.5B → Qwen3-1.7B per
69
- design/RL_HACKATHON_AUDIT_AND_RUNBOOK.md (section 4: newer family with
70
- documented agentic tool-calling, comparable footprint).
 
 
71
  """
72
 
73
- model_name: str = "unsloth/Qwen3-1.7B-unsloth-bnb-4bit"
74
  max_seq_length: int = 4096
 
 
75
  load_in_4bit: bool = True
76
 
 
77
  lora_r: int = 16
78
- lora_alpha: int = 16
79
  lora_dropout: float = 0.0
80
  lora_target_modules: tuple[str, ...] = (
81
  "q_proj",
@@ -87,17 +92,31 @@ class GRPOConfig:
87
  "down_proj",
88
  )
89
 
90
- # GRPO knobs
91
- group_size: int = 4
 
 
92
  learning_rate: float = 5e-6
93
  max_steps: int = 500
94
- gradient_accumulation_steps: int = 1
95
  warmup_steps: int = 10
96
- max_prompt_length: int = 2048
97
- max_completion_length: int = 1024
98
- temperature: float = 0.8
99
- top_p: float = 0.95
 
 
 
 
 
 
 
 
100
  seed: int = 0
 
 
 
 
101
 
102
  # Env wiring
103
  env_base_url: str = env_str("SQL_DRIFT_ENV_URL", "http://localhost:8000")
@@ -120,6 +139,8 @@ class GRPOConfig:
120
  raise ValueError("seed must be >= 0")
121
  if self.lora_r < 1:
122
  raise ValueError("lora_r must be >= 1")
 
 
123
  if not 0.0 < self.temperature <= 2.0:
124
  raise ValueError("temperature must be in (0, 2]")
125
 
 
63
  class GRPOConfig:
64
  """Top-level training config for the GRPO skeleton.
65
 
66
+ Defaults pinned to ``Qwen/Qwen3-4B-Instruct-2507`` (Apache-2.0, July 2025
67
+ release, BFCL-v3 = 61.9 native tool-calling) loaded via
68
+ ``transformers.AutoModelForCausalLM`` + ``BitsAndBytesConfig`` 4-bit nf4
69
+ QLoRA + ``peft.LoraConfig`` the stack used by Hugging Face TRL's own
70
+ reference notebooks (``grpo_trl_lora_qlora.ipynb``, the OpenEnv
71
+ Wordle/Echo examples). Every knob is override-able from the CLI or a
72
+ JSON manifest.
73
  """
74
 
75
+ model_name: str = "Qwen/Qwen3-4B-Instruct-2507"
76
  max_seq_length: int = 4096
77
+ # 4-bit nf4 quantization (QLoRA) — fits a 4B model on a free Colab T4
78
+ # in ~6 GB peak. Flip to False on a >=24 GB GPU for plain LoRA.
79
  load_in_4bit: bool = True
80
 
81
+ # LoRA r=16 / alpha=32 mirrors the TRL grpo_trl_lora_qlora reference.
82
  lora_r: int = 16
83
+ lora_alpha: int = 32
84
  lora_dropout: float = 0.0
85
  lora_target_modules: tuple[str, ...] = (
86
  "q_proj",
 
92
  "down_proj",
93
  )
94
 
95
+ # GRPO knobs — sized for a free Colab T4 (16 GB) running multi-turn
96
+ # tool-using rollouts: per_device_train_batch_size=1 in TRL,
97
+ # num_generations=2, gradient_accumulation_steps=2.
98
+ group_size: int = 2
99
  learning_rate: float = 5e-6
100
  max_steps: int = 500
101
+ gradient_accumulation_steps: int = 2
102
  warmup_steps: int = 10
103
+ # NOTE: TRL >=0.25 removed `max_prompt_length` from GRPOConfig — prompt
104
+ # length is dataset-driven, not trainer-configurable. And
105
+ # `max_completion_length` is now the TOTAL token budget across the
106
+ # entire multi-turn conversation (all assistant generations + tool
107
+ # results combined), not a per-turn cap. Size it for the worst-case
108
+ # episode (25-step budget * ~80 tokens per turn ≈ 2k).
109
+ max_completion_length: int = 2048
110
+ # Qwen3-Instruct-2507 recommends temperature=0.7 / top_p=0.8 for
111
+ # non-thinking instruct mode. The 2507 line is non-thinking by default,
112
+ # so no `enable_thinking` toggle is needed.
113
+ temperature: float = 0.7
114
+ top_p: float = 0.8
115
  seed: int = 0
116
+ # TRL defaults bf16 to True when fp16 is not explicitly set, but Colab
117
+ # T4 supports fp16 only (no bf16 hardware). Keep fp16=True for T4.
118
+ fp16: bool = True
119
+ bf16: bool = False
120
 
121
  # Env wiring
122
  env_base_url: str = env_str("SQL_DRIFT_ENV_URL", "http://localhost:8000")
 
139
  raise ValueError("seed must be >= 0")
140
  if self.lora_r < 1:
141
  raise ValueError("lora_r must be >= 1")
142
+ if self.fp16 and self.bf16:
143
+ raise ValueError("fp16 and bf16 are mutually exclusive")
144
  if not 0.0 < self.temperature <= 2.0:
145
  raise ValueError("temperature must be in (0, 2]")
146
 
training/grpo_train.py CHANGED
@@ -1,8 +1,8 @@
1
  """GRPO training entrypoint wiring for SQLDrift.
2
 
3
- This module hosts the building blocks for training a Qwen2.5-class
4
- model against the SQLDrift OpenEnv environment with
5
- :class:`trl.GRPOTrainer`:
6
 
7
  * :func:`iter_curriculum` — pure, dependency-free scenario sampler
8
  used both by :func:`build_dataset` and by unit tests.
@@ -125,23 +125,61 @@ def build_dataset(config: GRPOConfig, *, num_rows: int, seed: int = 0) -> Any:
125
 
126
 
127
  def load_model_and_tokenizer(config: GRPOConfig) -> tuple[Any, Any]:
128
- """Import Unsloth + attach LoRA. Requires the ``[train]`` extra on GPU."""
129
- from unsloth import FastLanguageModel
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
130
 
131
- model, tokenizer = FastLanguageModel.from_pretrained(
132
- model_name=config.model_name,
133
- max_seq_length=config.max_seq_length,
134
- load_in_4bit=config.load_in_4bit,
 
 
135
  )
136
- model = FastLanguageModel.get_peft_model(
137
- model,
 
 
 
 
 
 
 
 
 
 
 
 
138
  r=config.lora_r,
139
- target_modules=list(config.lora_target_modules),
140
  lora_alpha=config.lora_alpha,
141
  lora_dropout=config.lora_dropout,
142
- use_gradient_checkpointing="unsloth",
 
 
143
  )
144
- return model, tokenizer
145
 
146
 
147
  def build_env_client(config: GRPOConfig) -> Any:
@@ -212,13 +250,15 @@ def train(config: GRPOConfig) -> Any:
212
  """Run the full GRPO training loop against SQLDrift.
213
 
214
  All heavy imports (``trl``, ``datasets``, ``transformers``,
215
- ``unsloth``) are deferred into this function body. A CPU-only
216
- checkout that only imports :mod:`training.grpo_train` for, say,
217
- :func:`iter_curriculum` never triggers them.
218
-
219
- The function is covered by the ``[train]`` extra (see
220
- ``pyproject.toml``) and is the path exercised in the Colab
221
- notebook bundled with the hackathon submission.
 
 
222
  """
223
  set_seed(config.seed)
224
  out = Path(config.output_dir)
@@ -236,18 +276,31 @@ def train(config: GRPOConfig) -> Any:
236
  seed=config.seed,
237
  )
238
 
 
 
 
 
 
 
 
 
 
 
 
 
239
  trl_args = TRLGRPOConfig(
240
  output_dir=str(out),
241
  learning_rate=config.learning_rate,
242
  max_steps=config.max_steps,
243
- per_device_train_batch_size=config.group_size,
244
  num_generations=config.group_size,
245
  gradient_accumulation_steps=config.gradient_accumulation_steps,
246
  warmup_steps=config.warmup_steps,
247
- max_prompt_length=config.max_prompt_length,
248
  max_completion_length=config.max_completion_length,
249
  temperature=config.temperature,
250
  top_p=config.top_p,
 
 
251
  logging_steps=config.logging_steps,
252
  save_steps=config.save_steps,
253
  log_completions=True,
@@ -256,6 +309,7 @@ def train(config: GRPOConfig) -> Any:
256
  )
257
 
258
  model, tokenizer = load_model_and_tokenizer(config)
 
259
 
260
  trainer = GRPOTrainer(
261
  model=model,
@@ -264,6 +318,7 @@ def train(config: GRPOConfig) -> Any:
264
  reward_funcs=reward_from_environments,
265
  args=trl_args,
266
  environment_factory=partial(SqlDriftToolEnv, env_url=config.env_base_url),
 
267
  )
268
  trainer.add_callback(_build_flush_log_history_callback(out / "log_history.jsonl"))
269
 
@@ -322,6 +377,7 @@ if __name__ == "__main__":
322
  __all__ = [
323
  "build_dataset",
324
  "build_env_client",
 
325
  "iter_curriculum",
326
  "load_model_and_tokenizer",
327
  "reward_from_environments",
 
1
  """GRPO training entrypoint wiring for SQLDrift.
2
 
3
+ This module hosts the building blocks for training a Qwen3-class
4
+ model (default: ``Qwen/Qwen3-4B-Instruct-2507``) against the SQLDrift
5
+ OpenEnv environment with :class:`trl.GRPOTrainer`:
6
 
7
  * :func:`iter_curriculum` — pure, dependency-free scenario sampler
8
  used both by :func:`build_dataset` and by unit tests.
 
125
 
126
 
127
  def load_model_and_tokenizer(config: GRPOConfig) -> tuple[Any, Any]:
128
+ """Load the base model with QLoRA-friendly quantization + tokenizer.
129
+
130
+ Mirrors the stack used by Hugging Face TRL's own reference notebooks
131
+ (``grpo_trl_lora_qlora.ipynb`` and the OpenEnv examples): plain
132
+ :class:`transformers.AutoModelForCausalLM` + :class:`BitsAndBytesConfig`
133
+ nf4 4-bit quantization. PEFT/LoRA is layered ON the model by the
134
+ GRPOTrainer itself when ``peft_config`` is passed to its constructor —
135
+ we do not call ``get_peft_model`` here.
136
+
137
+ Returning ``(model, tokenizer)`` keeps the function signature stable
138
+ for callers (notebooks, eval harness, etc.) that prepared LoRA
139
+ separately.
140
+ """
141
+ import torch
142
+ from transformers import AutoModelForCausalLM, AutoTokenizer
143
+
144
+ quantization_config = None
145
+ if config.load_in_4bit:
146
+ from transformers import BitsAndBytesConfig
147
+
148
+ quantization_config = BitsAndBytesConfig(
149
+ load_in_4bit=True,
150
+ bnb_4bit_quant_type="nf4",
151
+ bnb_4bit_use_double_quant=True,
152
+ bnb_4bit_compute_dtype=torch.float16 if config.fp16 else torch.bfloat16,
153
+ )
154
 
155
+ model = AutoModelForCausalLM.from_pretrained(
156
+ config.model_name,
157
+ attn_implementation="sdpa",
158
+ dtype="float32" if quantization_config is not None else "auto",
159
+ quantization_config=quantization_config,
160
+ device_map="auto",
161
  )
162
+ tokenizer = AutoTokenizer.from_pretrained(config.model_name)
163
+ return model, tokenizer
164
+
165
+
166
+ def build_peft_config(config: GRPOConfig) -> Any:
167
+ """Build the :class:`peft.LoraConfig` matching ``GRPOConfig`` knobs.
168
+
169
+ Returned separately so callers can pass it to
170
+ ``GRPOTrainer(peft_config=...)`` — the TRL-recommended path for
171
+ LoRA/QLoRA training.
172
+ """
173
+ from peft import LoraConfig
174
+
175
+ return LoraConfig(
176
  r=config.lora_r,
 
177
  lora_alpha=config.lora_alpha,
178
  lora_dropout=config.lora_dropout,
179
+ target_modules=list(config.lora_target_modules),
180
+ bias="none",
181
+ task_type="CAUSAL_LM",
182
  )
 
183
 
184
 
185
  def build_env_client(config: GRPOConfig) -> Any:
 
250
  """Run the full GRPO training loop against SQLDrift.
251
 
252
  All heavy imports (``trl``, ``datasets``, ``transformers``,
253
+ ``peft``, ``bitsandbytes``) are deferred into this function body so
254
+ a CPU-only checkout that only imports :mod:`training.grpo_train`
255
+ for, say, :func:`iter_curriculum` never triggers them.
256
+
257
+ Stack: :class:`transformers.AutoModelForCausalLM` (+ optional
258
+ ``BitsAndBytesConfig`` 4-bit nf4) :class:`trl.GRPOTrainer` with
259
+ ``environment_factory=SqlDriftToolEnv`` and ``peft_config`` for
260
+ LoRA. Mirrors Hugging Face TRL's official reference notebooks
261
+ (``grpo_trl_lora_qlora.ipynb``, ``openenv_wordle_grpo.ipynb``).
262
  """
263
  set_seed(config.seed)
264
  out = Path(config.output_dir)
 
276
  seed=config.seed,
277
  )
278
 
279
+ # TRL >=0.25 removed `max_prompt_length` (prompt length is now
280
+ # dataset-driven). `max_completion_length` is the TOTAL token budget
281
+ # across the entire multi-turn conversation, not a per-turn cap —
282
+ # see the OpenEnv integration doc:
283
+ # https://huggingface.co/docs/trl/openenv#max_completion_length-in-multi-turn-episodes
284
+ # Do NOT re-add `max_prompt_length` here; the kwarg no longer exists
285
+ # and its presence raises TypeError on construction.
286
+ # Gemma-4 has no <think> wrapper to suppress, so we don't pass
287
+ # chat_template_kwargs here. per_device_train_batch_size=1 +
288
+ # num_generations=group_size mirrors the Gemma-4 sudoku notebook
289
+ # (TRL requires the per-device batch * grad_accum to be divisible
290
+ # by num_generations; 1*2 % 2 == 0 satisfies that for group_size=2).
291
  trl_args = TRLGRPOConfig(
292
  output_dir=str(out),
293
  learning_rate=config.learning_rate,
294
  max_steps=config.max_steps,
295
+ per_device_train_batch_size=1,
296
  num_generations=config.group_size,
297
  gradient_accumulation_steps=config.gradient_accumulation_steps,
298
  warmup_steps=config.warmup_steps,
 
299
  max_completion_length=config.max_completion_length,
300
  temperature=config.temperature,
301
  top_p=config.top_p,
302
+ fp16=config.fp16,
303
+ bf16=config.bf16,
304
  logging_steps=config.logging_steps,
305
  save_steps=config.save_steps,
306
  log_completions=True,
 
309
  )
310
 
311
  model, tokenizer = load_model_and_tokenizer(config)
312
+ peft_config = build_peft_config(config)
313
 
314
  trainer = GRPOTrainer(
315
  model=model,
 
318
  reward_funcs=reward_from_environments,
319
  args=trl_args,
320
  environment_factory=partial(SqlDriftToolEnv, env_url=config.env_base_url),
321
+ peft_config=peft_config,
322
  )
323
  trainer.add_callback(_build_flush_log_history_callback(out / "log_history.jsonl"))
324
 
 
377
  __all__ = [
378
  "build_dataset",
379
  "build_env_client",
380
+ "build_peft_config",
381
  "iter_curriculum",
382
  "load_model_and_tokenizer",
383
  "reward_from_environments",
utilities/run_training_job.py CHANGED
@@ -1,109 +1,477 @@
1
- """Run SQLDrift GRPO on Hugging Face Jobs (T4 medium).
2
 
3
- Prerequisites (before running this script):
 
 
 
 
 
 
 
4
 
5
- 1. Deploy the environment as an HF Space. Set ``SQL_DRIFT_ENV_URL`` to the Space URL.
6
- 2. Push this repo to a remote the job can ``pip install`` from. Either: the Space git URL (``https://huggingface.co/spaces/USER/...``), or a GitHub clone URL. Set ``SQL_DRIFT_REPO_URL`` accordingly.
7
- 3. Export ``HF_TOKEN`` with write scope when you need to push artifacts.
8
 
9
- Default hyperparameters match the runbook: ``MAX_STEPS=80``, ``GROUP_SIZE=4``,
10
- ``SEED=7``. Adjust via env if the first minutes of a live run look wrong.
 
 
 
 
 
 
 
 
 
 
 
 
11
 
12
- The job uses ``timeout="20h"`` so billing stops if a run hangs past the
13
- planned wall time.
14
 
15
- Requires ``huggingface-hub`` (listed in the project root ``pyproject.toml``).
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  """
17
 
18
  from __future__ import annotations
19
 
 
20
  import os
 
 
 
21
 
22
- from huggingface_hub import fetch_job_logs, run_uv_job
 
23
 
24
- # Default hyperparameters
 
 
 
 
 
 
 
25
  MAX_STEPS = 80
26
- GROUP_SIZE = 4
27
  SEED = 7
28
- MODEL_ID = "unsloth/Qwen3-1.7B-unsloth-bnb-4bit"
29
- HF_JOB_FLAVOR = "t4-medium" # T4; L4 alternative is noted in the runbook.
30
- TIMEOUT = "20h" # hard cap: even a hanging job stops billing
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
 
32
 
33
  def _required_env(name: str) -> str:
34
  value = os.environ.get(name, "").strip()
35
  if not value:
36
- raise SystemExit(f"{name} is not set. See the docstring of {__file__} for prerequisites.")
37
  return value
38
 
39
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
  def main() -> None:
41
  repo_url = _required_env("SQL_DRIFT_REPO_URL")
42
- env_url = _required_env("SQL_DRIFT_ENV_URL")
43
  hf_token = _required_env("HF_TOKEN")
 
44
 
45
- # The UV inline-dependency block below is required by ``hf jobs uv run``
46
- # to know what to install before executing the script body.
47
- train_script = f'''# /// script
48
- # requires-python = ">=3.12,<3.14"
49
- # dependencies = [
50
- # "sql-drift-env[train] @ git+{repo_url}@main",
51
- # "peft>=0.19",
52
- # "bitsandbytes>=0.49",
53
- # "tensorboard",
54
- # ]
55
- # ///
56
- """GRPO training entry — runs inside an HF Job container (Linux, CUDA)."""
57
- import os
58
 
59
- os.environ.setdefault("SQL_DRIFT_ENV_URL", {env_url!r})
60
- os.environ.setdefault("SQL_DRIFT_GRPO_MAX_STEPS", "{MAX_STEPS}")
61
- os.environ.setdefault("SQL_DRIFT_GRPO_GROUP_SIZE", "{GROUP_SIZE}")
62
- os.environ.setdefault("SQL_DRIFT_GRPO_SEED", "{SEED}")
63
- os.environ.setdefault("SQL_DRIFT_MODEL_NAME", {MODEL_ID!r})
64
-
65
- from training.config import ALL_SCENARIOS, CurriculumConfig, GRPOConfig
66
- from training.grpo_train import train
67
-
68
- cfg = GRPOConfig(
69
- model_name=os.environ["SQL_DRIFT_MODEL_NAME"],
70
- env_base_url=os.environ["SQL_DRIFT_ENV_URL"],
71
- output_dir="/outputs/grpo_run",
72
- max_steps=int(os.environ["SQL_DRIFT_GRPO_MAX_STEPS"]),
73
- group_size=int(os.environ["SQL_DRIFT_GRPO_GROUP_SIZE"]),
74
- learning_rate=5e-6,
75
- warmup_steps=8,
76
- save_steps=20,
77
- logging_steps=1,
78
- max_seq_length=2048,
79
- max_prompt_length=1536,
80
- max_completion_length=256,
81
- seed=int(os.environ["SQL_DRIFT_GRPO_SEED"]),
82
- curriculum=CurriculumConfig(scenarios=ALL_SCENARIOS, mode="uniform"),
83
- )
84
- trainer = train(cfg)
85
- print("DONE", flush=True)
86
- '''
87
-
88
- script_path = "/tmp/sql_drift_train.py"
89
- with open(script_path, "w") as f:
90
- f.write(train_script)
91
-
92
- job = run_uv_job(
93
- script_path,
94
  flavor=HF_JOB_FLAVOR,
95
  timeout=TIMEOUT,
96
- secrets={"HF_TOKEN": hf_token, "SQL_DRIFT_ENV_URL": env_url},
97
- env={"WANDB_DISABLED": "true"},
 
 
 
 
98
  )
99
- print("Job URL:", job.url, flush=True)
100
- print("Job ID :", job.id, flush=True)
101
-
102
- # Stream logs to stdout. Watch the first minutes for failed health checks,
103
- # NaN loss, zero reward variance, or very low step/s; cancel with
104
- # ``hf jobs cancel <ID>`` if needed.
105
- for log in fetch_job_logs(job_id=job.id):
106
- print(log, flush=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
107
 
108
 
109
  if __name__ == "__main__":
 
1
+ """Run SQLDrift GRPO on Hugging Face Jobs (T4 medium) with Gemma-4 E2B.
2
 
3
+ The install + runtime stack is taken **verbatim** from Unsloth's
4
+ official Gemma-4 GRPO notebook
5
+ (``gemma4_(e2b)_reinforcement_learning_sudoku_game.py`` at the repo root,
6
+ which is the source of truth for "what actually resolves cleanly in
7
+ 2026-04 against the latest Unsloth/TRL/Transformers/Triton lines").
8
+ The notebook works on a free Colab T4; this script mirrors it inside a
9
+ CUDA 12.6 docker container on HF Jobs so we can train without a Colab
10
+ session.
11
 
12
+ What this gives you over the previous (Qwen3 / xformers-pinned) version:
 
 
13
 
14
+ * No more torch=2.7.0 xformers=0.0.30 ↔ unsloth_zoo pin tug-of-war.
15
+ We follow Unsloth's recipe (``torch>=2.8.0``, ``triton>=3.4.0``,
16
+ ``unsloth[base] @ git``, ``unsloth_zoo[base] @ git``, then a final
17
+ ``--no-deps`` upgrade of ``transformers>=5.5.0`` / ``tokenizers`` /
18
+ ``trl>=0.28.0``). Unsloth's git-extras pull a self-consistent set of
19
+ wheels; the ``--no-deps`` upgrade prevents transformers/TRL from
20
+ dragging anything else along.
21
+ * Gemma-4 E2B is multimodal, so we install ``timm`` with ``--no-deps``
22
+ for vision/audio support — exactly as the source-of-truth notebook
23
+ does — even though SQLDrift only feeds text.
24
+ * All CUDA-sensitive wheels (torch, torchvision) come from the
25
+ ``cu126`` PyTorch index so they land matching the docker image's
26
+ CUDA minor; a downstream ``--no-deps`` upgrade can't silently swap
27
+ them out.
28
 
29
+ Two operating modes:
 
30
 
31
+ * **HTTP env** (default): set ``SQL_DRIFT_ENV_URL`` to a deployed Space
32
+ URL. The trainer's ``SqlDriftToolEnv`` reaches it over HTTP/WS for
33
+ every tool call.
34
+ * **In-process env**: leave ``SQL_DRIFT_ENV_URL`` unset. The inline
35
+ training script overrides ``training.tool_env.set_client_factory`` so
36
+ each rollout instantiates ``SqlDriftEnvironment()`` inside the same
37
+ container — no Space deploy required.
38
+
39
+ Prerequisites:
40
+
41
+ 1. ``HF_TOKEN`` exported with write scope (job creation + log streaming).
42
+ 2. ``SQL_DRIFT_REPO_URL`` pointing at a git URL the container can
43
+ ``pip install git+<url>`` against. Either:
44
+ - a public GitHub clone URL, or
45
+ - an HF Space repo URL with the token embedded:
46
+ ``https://USER:HF_TOKEN@huggingface.co/spaces/USER/sql-drift-env``.
47
+ 3. (Optional) ``SQL_DRIFT_ENV_URL`` for HTTP-env mode.
48
+
49
+ Run it with::
50
+
51
+ python utilities/run_training_job.py
52
  """
53
 
54
  from __future__ import annotations
55
 
56
+ import itertools
57
  import os
58
+ import sys
59
+ import time
60
+ from textwrap import dedent
61
 
62
+ from dotenv import load_dotenv
63
+ from huggingface_hub import fetch_job_logs, inspect_job, run_job
64
 
65
+ # ---------------------------------------------------------------------------
66
+ # Locked hyperparameters
67
+ # ---------------------------------------------------------------------------
68
+ # Gemma-4 E2B-it. This is the model name baked into the source-of-truth
69
+ # notebook; do not switch back to a Qwen line without revisiting the
70
+ # install block (Qwen3 needs a TRL response-schema chat-template hack
71
+ # that the Gemma family does not).
72
+ MODEL_ID = "unsloth/gemma-4-E2B-it"
73
  MAX_STEPS = 80
74
+ GROUP_SIZE = 2 # num_generations per GRPO step (T4 16 GB sweet spot)
75
  SEED = 7
76
+ MAX_SEQ_LENGTH = 4096
77
+ # Multi-turn TOTAL token budget across the entire conversation
78
+ # (assistant generations + tool results combined) TRL >=0.25 redefined
79
+ # `max_completion_length` away from a per-turn cap.
80
+ # https://huggingface.co/docs/trl/openenv#max_completion_length-in-multi-turn-episodes
81
+ MAX_COMPLETION_LENGTH = 2048
82
+ SAVE_STEPS = 20
83
+ LEARNING_RATE = 5e-6
84
+ WARMUP_STEPS = 8
85
+ HF_JOB_FLAVOR = "t4-medium" # 1× T4 16 GB; matches the Colab tier the recipe targets
86
+ TIMEOUT = "20h" # hard cap; billing stops if a run hangs past wall time
87
+
88
+ # CUDA 12.6 + cuDNN 9 on Ubuntu 24.04 (Python 3.12). Torch 2.8 ships a
89
+ # cu126 wheel; keep the docker minor and the wheel tag in lockstep.
90
+ DOCKER_IMAGE = "nvidia/cuda:12.6.3-cudnn-devel-ubuntu24.04"
91
+ TORCH_CUDA_TAG = "cu126"
92
+
93
+ # Triton kernels commit pinned by the Unsloth Gemma-4 notebook. Keep
94
+ # this in sync with that notebook — it's part of the recipe, not a knob.
95
+ TRITON_KERNELS_REF = "0add68262ab0a2e33b84524346cb27cbb2787356"
96
+
97
+ load_dotenv()
98
 
99
 
100
  def _required_env(name: str) -> str:
101
  value = os.environ.get(name, "").strip()
102
  if not value:
103
+ raise SystemExit(f"{name} is not set in the environment. See the docstring of {__file__}.")
104
  return value
105
 
106
 
107
+ def _build_train_script(env_url: str | None) -> str:
108
+ """Render the in-container training script (stdin to ``python3``).
109
+
110
+ Pure stdlib + 3.12 syntax. Reads no CLI args; everything is baked in
111
+ at build time so the container has nothing to negotiate at runtime.
112
+ """
113
+ if env_url:
114
+ in_process_setup = ""
115
+ else:
116
+ # In-process mode: override SqlDriftToolEnv's HTTP client with a
117
+ # zero-overhead in-process SqlDriftEnvironment instance per
118
+ # rollout. Avoids the Space deploy + thousands of HTTP round-trips
119
+ # per training run.
120
+ in_process_setup = (
121
+ "from server import SqlDriftEnvironment\n"
122
+ "from training.tool_env import set_client_factory\n"
123
+ "set_client_factory(lambda: SqlDriftEnvironment())\n"
124
+ "print('[setup] in-process env mode enabled (no SQL_DRIFT_ENV_URL)', flush=True)\n"
125
+ )
126
+
127
+ # The wheel layout is site-packages/sql_drift_env/<sibling>; the
128
+ # codebase uses flat imports (``from training...``, ``from server...``).
129
+ # Putting the package directory on sys.path mirrors _cli.py and the
130
+ # PYTHONPATH=/app/env pattern from the Docker entrypoint.
131
+ parts: list[str] = [
132
+ "import sys",
133
+ "import sql_drift_env",
134
+ "",
135
+ "flat = sql_drift_env.__path__[0]",
136
+ "if flat not in sys.path:",
137
+ " sys.path.insert(0, flat)",
138
+ "",
139
+ "# Sanity-check CUDA before doing anything else.",
140
+ "import torch",
141
+ "if not torch.cuda.is_available():",
142
+ " raise SystemExit(",
143
+ ' "torch.cuda.is_available() is False. The job is running on CPU; "',
144
+ ' "aborting before wasting GPU minutes."',
145
+ " )",
146
+ "print(",
147
+ ' f"[setup] torch={torch.__version__} cuda={torch.version.cuda} "',
148
+ ' f"device={torch.cuda.get_device_name(0)}",',
149
+ " flush=True,",
150
+ ")",
151
+ "",
152
+ in_process_setup,
153
+ "from training.config import ALL_SCENARIOS, CurriculumConfig, GRPOConfig",
154
+ "from training.grpo_train import train",
155
+ "",
156
+ "cfg = GRPOConfig(",
157
+ f" model_name={MODEL_ID!r},",
158
+ f" env_base_url={(env_url or 'http://localhost:8000')!r},",
159
+ ' output_dir="/outputs/grpo_run",',
160
+ f" max_steps={MAX_STEPS},",
161
+ f" group_size={GROUP_SIZE},",
162
+ f" learning_rate={LEARNING_RATE},",
163
+ f" warmup_steps={WARMUP_STEPS},",
164
+ f" save_steps={SAVE_STEPS},",
165
+ " logging_steps=1,",
166
+ f" max_seq_length={MAX_SEQ_LENGTH},",
167
+ f" max_completion_length={MAX_COMPLETION_LENGTH},",
168
+ f" seed={SEED},",
169
+ " fp16=True,",
170
+ " bf16=False,",
171
+ " curriculum=CurriculumConfig(",
172
+ " scenarios=ALL_SCENARIOS,",
173
+ ' mode="weighted",',
174
+ " weights=(1, 1, 1, 1, 1, 1, 2, 2, 2, 2),",
175
+ " ),",
176
+ ")",
177
+ 'print("[setup] starting train(cfg)", flush=True)',
178
+ "trainer = train(cfg)",
179
+ 'print("DONE", flush=True)',
180
+ ]
181
+ return "\n".join(parts)
182
+
183
+
184
+ def _build_preflight_script() -> str:
185
+ """Post-install preflight: catch dep mismatches in the first ~30s.
186
+
187
+ Asserts that:
188
+
189
+ * torch is the cu126 wheel we asked for (no downstream package
190
+ sneaked a different CUDA tag in)
191
+ * ``torch.cuda.is_available()`` (the image actually has the CUDA stack)
192
+ * ``bitsandbytes`` imports cleanly (its native lib's ``dlopen`` of
193
+ ``libnvJitLink`` succeeds)
194
+ * ``unsloth`` and ``unsloth.FastVisionModel`` import cleanly (the
195
+ Gemma-4 multimodal loader is what we use in
196
+ ``training/grpo_train.py``)
197
+ """
198
+ return dedent(
199
+ f"""
200
+ import torch
201
+
202
+ assert torch.cuda.is_available(), (
203
+ f"torch.cuda.is_available() is False (torch={{torch.__version__}}); "
204
+ "image lacks CUDA libs or the wheel is CPU-only."
205
+ )
206
+ assert "+{TORCH_CUDA_TAG}" in torch.__version__, (
207
+ f"torch wheel is {{torch.__version__}} but expected +{TORCH_CUDA_TAG}; "
208
+ "a downstream install bumped torch despite the pip constraint."
209
+ )
210
+
211
+ import bitsandbytes # noqa: F401 triggers native dlopen
212
+ import unsloth # noqa: F401 triggers triton + unsloth_zoo imports
213
+ from unsloth import FastVisionModel # noqa: F401 Gemma-4 loader path
214
+
215
+ print(
216
+ f"[setup] preflight OK torch={{torch.__version__}} "
217
+ f"cuda={{torch.version.cuda}} device={{torch.cuda.get_device_name(0)}}",
218
+ flush=True,
219
+ )
220
+ """
221
+ ).strip()
222
+
223
+
224
+ def _build_command(repo_url: str, env_url: str | None) -> list[str]:
225
+ """Build the ``["bash", "-c", <script>]`` command for ``run_job``.
226
+
227
+ The bash script mirrors Unsloth's official Gemma-4 GRPO install:
228
+
229
+ 1. apt install python3-pip, python3-venv, python3-dev,
230
+ build-essential, git (build-essential + python3-dev are needed
231
+ at runtime for triton's first-use JIT compile of cuda_utils.so).
232
+ 2. Create a venv (avoids PEP 668 externally-managed-environment
233
+ lock on Ubuntu 24.04) and bootstrap pip / wheel / setuptools.
234
+ 3. Install torch + torchvision from the ``cu126`` index, version
235
+ capture them into a constraints file, and force every subsequent
236
+ install to honor that pin. This stops a downstream ``--no-deps``
237
+ upgrade from silently swapping CUDA minors under us.
238
+ 4. Install ``triton``, ``numpy``, ``pillow``, ``bitsandbytes``, then
239
+ ``unsloth_zoo[base] @ git`` and ``unsloth[base] @ git`` (the
240
+ ``[base]`` extras pull the rest of the Unsloth runtime —
241
+ xformers, etc. — pinned to versions that resolve against torch
242
+ 2.8). Then the triton-kernels git pin from the recipe.
243
+ 5. ``pip install --upgrade --no-deps`` ``transformers>=5.5.0``,
244
+ ``tokenizers``, ``trl>=0.28.0``, ``unsloth``, ``unsloth_zoo``.
245
+ The ``--no-deps`` is load-bearing: without it the upgrade would
246
+ drag transformers/trl deps that can downgrade torch.
247
+ 6. ``pip install --no-deps timm`` (Gemma-4 vision/audio).
248
+ 7. Install the SQLDrift repo and its trainer-side companions
249
+ (``datasets``, ``accelerate``, ``peft``, ``jmespath``,
250
+ ``tensorboard``) under the torch constraint.
251
+ 8. Run a preflight Python script asserting torch/cuda/bitsandbytes/
252
+ unsloth all import cleanly, then run the training script.
253
+ """
254
+ train_py = _build_train_script(env_url)
255
+ preflight_py = _build_preflight_script()
256
+
257
+ bash = dedent(
258
+ f"""
259
+ set -euo pipefail
260
+ echo "[setup] ACCELERATOR=${{ACCELERATOR:-unknown}} CPU=${{CPU_CORES:-?}} MEMORY=${{MEMORY:-?}}"
261
+
262
+ export DEBIAN_FRONTEND=noninteractive
263
+ apt-get update -qq
264
+ apt-get install -y --no-install-recommends \\
265
+ python3-pip python3-venv python3-dev \\
266
+ build-essential \\
267
+ git ca-certificates
268
+
269
+ python3 -m venv /opt/sqldrift
270
+ # shellcheck disable=SC1091
271
+ . /opt/sqldrift/bin/activate
272
+ python -m pip install --no-cache-dir --upgrade pip wheel setuptools
273
+
274
+ # cu126 wheels publish as `2.8.0+cu126` (PEP 440 local segment),
275
+ # which sorts higher than vanilla PyPI 2.8.0 — pip prefers the
276
+ # cu126 wheel automatically when this index is on the path.
277
+ export PIP_EXTRA_INDEX_URL=https://download.pytorch.org/whl/{TORCH_CUDA_TAG}
278
+
279
+ # ---------------------------------------------------------------
280
+ # Step 1 (Gemma-4 recipe line 1): torch + triton + numpy/pillow
281
+ # + torchvision + bitsandbytes, pulled with the cu126 index.
282
+ # We don't pin torch to a specific 2.8 patch — the recipe just
283
+ # asks for ">=2.8.0" and we trust unsloth-zoo[base]'s metadata
284
+ # to keep things self-consistent.
285
+ # ---------------------------------------------------------------
286
+ python -m pip install --no-cache-dir \\
287
+ --index-url https://download.pytorch.org/whl/{TORCH_CUDA_TAG} \\
288
+ --extra-index-url https://pypi.org/simple \\
289
+ "torch>=2.8.0" \\
290
+ torchvision \\
291
+ "triton>=3.4.0" \\
292
+ numpy pillow bitsandbytes
293
+
294
+ # Capture the EXACT installed torch/torchvision versions (incl.
295
+ # the +cu126 local segment) into a pip constraints file so every
296
+ # subsequent install is forced to honor the pin. unsloth's
297
+ # resolver, --no-deps upgrades, and the [train]-extra metadata
298
+ # cannot resolve a different wheel without violating the
299
+ # constraint — pip will error rather than silently swap.
300
+ TORCH_PINNED="$(python -c 'import torch; print(torch.__version__)')"
301
+ TORCHVISION_PINNED="$(python -c 'import torchvision; print(torchvision.__version__)')"
302
+ echo "[setup] pinned torch=${{TORCH_PINNED}} torchvision=${{TORCHVISION_PINNED}}"
303
+ case "${{TORCH_PINNED}}" in
304
+ *+{TORCH_CUDA_TAG}) ;;
305
+ *)
306
+ echo "[setup] FATAL: torch wheel is ${{TORCH_PINNED}} but expected +{TORCH_CUDA_TAG}." >&2
307
+ exit 1
308
+ ;;
309
+ esac
310
+ {{
311
+ printf 'torch==%s\\n' "${{TORCH_PINNED}}"
312
+ printf 'torchvision==%s\\n' "${{TORCHVISION_PINNED}}"
313
+ }} > /tmp/constraints.txt
314
+
315
+ # ---------------------------------------------------------------
316
+ # Step 2 (Gemma-4 recipe line 1, cont.): unsloth + unsloth-zoo
317
+ # from git with [base] extras. The [base] extras pull the rest
318
+ # of the Unsloth runtime (xformers etc.) at versions that match
319
+ # torch 2.8 — letting Unsloth own this resolution avoids the
320
+ # torch/xformers tug-of-war we hit on the prior pin.
321
+ # ---------------------------------------------------------------
322
+ python -m pip install --no-cache-dir \\
323
+ --constraint /tmp/constraints.txt \\
324
+ "unsloth_zoo[base] @ git+https://github.com/unslothai/unsloth-zoo" \\
325
+ "unsloth[base] @ git+https://github.com/unslothai/unsloth"
326
+
327
+ # ---------------------------------------------------------------
328
+ # Step 3 (Gemma-4 recipe line 1, end): triton-kernels at the
329
+ # commit the recipe pins.
330
+ # ---------------------------------------------------------------
331
+ python -m pip install --no-cache-dir \\
332
+ --constraint /tmp/constraints.txt \\
333
+ "git+https://github.com/triton-lang/triton.git@{TRITON_KERNELS_REF}#subdirectory=python/triton_kernels"
334
+
335
+ # ---------------------------------------------------------------
336
+ # Step 4 (Gemma-4 recipe line 2): upgrade transformers, tokenizers,
337
+ # trl, unsloth, unsloth_zoo with --no-deps. The --no-deps is
338
+ # load-bearing: without it the resolver would drag in deps that
339
+ # can knock torch off the cu126 pin.
340
+ # ---------------------------------------------------------------
341
+ python -m pip install --no-cache-dir --upgrade --no-deps \\
342
+ "transformers>=5.5.0" \\
343
+ tokenizers \\
344
+ "trl>=0.28.0" \\
345
+ unsloth \\
346
+ unsloth_zoo
347
+
348
+ # ---------------------------------------------------------------
349
+ # Step 5 (Gemma-4 recipe line 3): timm with --no-deps. Gemma-4 is
350
+ # multimodal; FastVisionModel imports timm even for text-only
351
+ # workloads.
352
+ # ---------------------------------------------------------------
353
+ python -m pip install --no-cache-dir --no-deps --upgrade timm
354
+
355
+ # ---------------------------------------------------------------
356
+ # Step 6: trainer-side helpers. Installed under the constraint so
357
+ # transformers/torch versions stay where steps 1-5 left them.
358
+ # jmespath is required by TRL's GRPOTrainer when `tools` /
359
+ # `environment_factory` is set; tensorboard is the report_to
360
+ # backend our run uses.
361
+ # ---------------------------------------------------------------
362
+ python -m pip install --no-cache-dir \\
363
+ --constraint /tmp/constraints.txt \\
364
+ "datasets>=2.20.0,<4.0" \\
365
+ "accelerate>=1.13.0,<2.0" \\
366
+ "peft>=0.19,<1.0" \\
367
+ "jmespath>=1.0,<2.0" \\
368
+ "tensorboard>=2.20,<3.0"
369
+
370
+ # ---------------------------------------------------------------
371
+ # Step 7: install the SQLDrift repo. The [train] extra is
372
+ # intentionally omitted: it's a CPU-side floor for static checks,
373
+ # while the real trainer stack is everything we just installed.
374
+ # ---------------------------------------------------------------
375
+ python -m pip install --no-cache-dir --no-deps \\
376
+ "sql-drift-env @ git+{repo_url}@main"
377
+ # Pull SQLDrift's runtime (non-train) deps explicitly so --no-deps
378
+ # above doesn't strand us without duckdb/openenv-core/etc.
379
+ python -m pip install --no-cache-dir \\
380
+ --constraint /tmp/constraints.txt \\
381
+ "duckdb>=1.5.2,<2.0" \\
382
+ "huggingface-hub>=1.5.0,<2.0" \\
383
+ "openenv-core[core]>=0.2.2,<0.4" \\
384
+ "sqlglot>=30.6.0,<40.0" \\
385
+ "pydantic>=2.8.0,<3.0" \\
386
+ "python-dotenv>=1.2.2,<2.0" \\
387
+ "openai>=2.32.0,<3.0"
388
+
389
+ # ---------------------------------------------------------------
390
+ # Step 8: preflight — fail fast on a CUDA mismatch BEFORE we
391
+ # touch the GPU. Heredoc terminator MUST be at column 0.
392
+ # ---------------------------------------------------------------
393
+ cat > /tmp/preflight.py <<'PYCHECK'
394
+ {preflight_py}
395
+ PYCHECK
396
+ python /tmp/preflight.py
397
+
398
+ # ---------------------------------------------------------------
399
+ # Step 9: run training under the venv's Python.
400
+ # ---------------------------------------------------------------
401
+ cat > /tmp/run.py <<'PYEOF'
402
+ {train_py}
403
+ PYEOF
404
+ python /tmp/run.py
405
+ """
406
+ ).strip()
407
+ return ["bash", "-c", bash]
408
+
409
+
410
  def main() -> None:
411
  repo_url = _required_env("SQL_DRIFT_REPO_URL")
 
412
  hf_token = _required_env("HF_TOKEN")
413
+ env_url = os.environ.get("SQL_DRIFT_ENV_URL", "").strip() or None
414
 
415
+ secrets = {"HF_TOKEN": hf_token}
416
+ if env_url:
417
+ secrets["SQL_DRIFT_ENV_URL"] = env_url
 
 
 
 
 
 
 
 
 
 
418
 
419
+ command = _build_command(repo_url, env_url)
420
+ job = run_job(
421
+ image=DOCKER_IMAGE,
422
+ command=command,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
423
  flavor=HF_JOB_FLAVOR,
424
  timeout=TIMEOUT,
425
+ secrets=secrets,
426
+ env={
427
+ "WANDB_DISABLED": "true",
428
+ "TRL_EXPERIMENTAL_SILENCE": "1",
429
+ "HF_HUB_DISABLE_EXPERIMENTAL_WARNING": "1",
430
+ },
431
  )
432
+
433
+ print(f"Job URL : {job.url}", flush=True)
434
+ print(f"Job ID : {job.id}", flush=True)
435
+ print(
436
+ "Mode : " + (f"HTTP env ({env_url})" if env_url else "in-process env (no Space)"),
437
+ flush=True,
438
+ )
439
+ print(f"Image : {DOCKER_IMAGE}", flush=True)
440
+ print(f"Flavor : {HF_JOB_FLAVOR} (timeout={TIMEOUT})", flush=True)
441
+ print(f"Model : {MODEL_ID}", flush=True)
442
+
443
+ # Exponential backoff while the job is queued/scheduling so we don't
444
+ # rate-limit the HF API. Sleep grows 5s -> 10s -> 20s -> 40s -> 60s.
445
+ _PRE_RUN_STAGES = {"SCHEDULING", "QUEUED", "PENDING", "INITIALIZING"}
446
+ print("--- waiting for job to start ---", flush=True)
447
+ sleep_times = (5, 10, 20, 40, 60)
448
+ sleeper = itertools.chain(sleep_times, itertools.repeat(sleep_times[-1]))
449
+ while True:
450
+ info = inspect_job(job_id=job.id)
451
+ stage = getattr(info.status, "stage", "?")
452
+ if stage not in _PRE_RUN_STAGES:
453
+ print(f"--- job stage={stage}, opening log stream ---", flush=True)
454
+ break
455
+ print(f" stage={stage} (polling)", flush=True)
456
+ time.sleep(next(sleeper))
457
+
458
+ try:
459
+ for line in fetch_job_logs(job_id=job.id):
460
+ print(line, flush=True)
461
+ except KeyboardInterrupt:
462
+ print(
463
+ "\nlocal stream interrupted; the job continues. "
464
+ f"Cancel billing with: hf jobs cancel {job.id}",
465
+ flush=True,
466
+ )
467
+ return
468
+
469
+ info = inspect_job(job_id=job.id)
470
+ stage = getattr(info.status, "stage", "?")
471
+ msg = getattr(info.status, "message", None)
472
+ print(f"--- job stage={stage} message={msg} ---", flush=True)
473
+ if stage == "ERROR":
474
+ sys.exit(1)
475
 
476
 
477
  if __name__ == "__main__":
uv.lock CHANGED
@@ -10,6 +10,15 @@ resolution-markers = [
10
  "python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32'",
11
  ]
12
 
 
 
 
 
 
 
 
 
 
13
  [[package]]
14
  name = "accelerate"
15
  version = "1.13.0"
@@ -530,15 +539,16 @@ wheels = [
530
 
531
  [[package]]
532
  name = "cuda-bindings"
533
- version = "12.9.4"
534
  source = { registry = "https://pypi.org/simple" }
535
  dependencies = [
536
  { name = "cuda-pathfinder", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
537
  ]
538
  wheels = [
539
- { url = "https://files.pythonhosted.org/packages/a9/c1/dabe88f52c3e3760d861401bb994df08f672ec893b8f7592dc91626adcf3/cuda_bindings-12.9.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fda147a344e8eaeca0c6ff113d2851ffca8f7dfc0a6c932374ee5c47caa649c8", size = 12151019, upload-time = "2025-10-21T14:51:43.167Z" },
540
- { url = "https://files.pythonhosted.org/packages/63/56/e465c31dc9111be3441a9ba7df1941fe98f4aa6e71e8788a3fb4534ce24d/cuda_bindings-12.9.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:32bdc5a76906be4c61eb98f546a6786c5773a881f3b166486449b5d141e4a39f", size = 11906628, upload-time = "2025-10-21T14:51:49.905Z" },
541
- { url = "https://files.pythonhosted.org/packages/a3/84/1e6be415e37478070aeeee5884c2022713c1ecc735e6d82d744de0252eee/cuda_bindings-12.9.4-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:56e0043c457a99ac473ddc926fe0dc4046694d99caef633e92601ab52cbe17eb", size = 11925991, upload-time = "2025-10-21T14:51:56.535Z" },
 
542
  ]
543
 
544
  [[package]]
@@ -550,16 +560,46 @@ wheels = [
550
  ]
551
 
552
  [[package]]
553
- name = "cut-cross-entropy"
554
- version = "25.1.1"
555
  source = { registry = "https://pypi.org/simple" }
556
- dependencies = [
557
- { name = "torch" },
558
- { name = "triton", marker = "sys_platform == 'linux'" },
559
- ]
560
- sdist = { url = "https://files.pythonhosted.org/packages/7e/97/45ff09cfcda7b200389204daa0125168e6544fba257adbbcdf728501d4f9/cut_cross_entropy-25.1.1.tar.gz", hash = "sha256:5fe5924509248b1aea5c890f8887c6a7759f7c8b1ebc0490e42c247c4f7c1e34", size = 22972, upload-time = "2025-01-07T12:21:53.896Z" }
561
  wheels = [
562
- { url = "https://files.pythonhosted.org/packages/df/5f/62fdb048f84d19e2123b6bbd722fe09c8c79b4964c50094d1e979db808e2/cut_cross_entropy-25.1.1-py3-none-any.whl", hash = "sha256:e46f26d348f6a67927d17e65c5a212e795be13dcad5b10a77a200d6b8102d9d1", size = 22672, upload-time = "2025-01-07T12:21:51.678Z" },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
563
  ]
564
 
565
  [[package]]
@@ -588,12 +628,13 @@ wheels = [
588
 
589
  [[package]]
590
  name = "datasets"
591
- version = "3.6.0"
592
  source = { registry = "https://pypi.org/simple" }
593
  dependencies = [
594
  { name = "dill" },
595
  { name = "filelock" },
596
  { name = "fsspec", extra = ["http"] },
 
597
  { name = "huggingface-hub" },
598
  { name = "multiprocess" },
599
  { name = "numpy" },
@@ -605,29 +646,9 @@ dependencies = [
605
  { name = "tqdm" },
606
  { name = "xxhash" },
607
  ]
608
- sdist = { url = "https://files.pythonhosted.org/packages/1a/89/d3d6fef58a488f8569c82fd293ab7cbd4250244d67f425dcae64c63800ea/datasets-3.6.0.tar.gz", hash = "sha256:1b2bf43b19776e2787e181cfd329cb0ca1a358ea014780c3581e0f276375e041", size = 569336, upload-time = "2025-05-07T15:15:02.659Z" }
609
  wheels = [
610
- { url = "https://files.pythonhosted.org/packages/20/34/a08b0ee99715eaba118cbe19a71f7b5e2425c2718ef96007c325944a1152/datasets-3.6.0-py3-none-any.whl", hash = "sha256:25000c4a2c0873a710df127d08a202a06eab7bf42441a6bc278b499c2f72cd1b", size = 491546, upload-time = "2025-05-07T15:14:59.742Z" },
611
- ]
612
-
613
- [[package]]
614
- name = "diffusers"
615
- version = "0.37.1"
616
- source = { registry = "https://pypi.org/simple" }
617
- dependencies = [
618
- { name = "filelock" },
619
- { name = "httpx" },
620
- { name = "huggingface-hub" },
621
- { name = "importlib-metadata" },
622
- { name = "numpy" },
623
- { name = "pillow" },
624
- { name = "regex" },
625
- { name = "requests" },
626
- { name = "safetensors" },
627
- ]
628
- sdist = { url = "https://files.pythonhosted.org/packages/46/5c/f4c2eb8d481fe8784a7e2331fbaab820079c06676185fa6d2177b386d590/diffusers-0.37.1.tar.gz", hash = "sha256:2346c21f77f835f273b7aacbaada1c34a596a3a2cc6ddc99d149efcd0ec298fa", size = 4135139, upload-time = "2026-03-25T08:04:04.515Z" }
629
- wheels = [
630
- { url = "https://files.pythonhosted.org/packages/9c/dd/51c38785ce5e1c287b5ad17ba550edaaaffce0deb0da4857019c6700fbaf/diffusers-0.37.1-py3-none-any.whl", hash = "sha256:0537c0b28cb53cf39d6195489bcf8f833986df556c10f5e28ab7427b86fc8b90", size = 5001536, upload-time = "2026-03-25T08:04:02.385Z" },
631
  ]
632
 
633
  [[package]]
@@ -949,6 +970,37 @@ wheels = [
949
  { url = "https://files.pythonhosted.org/packages/28/27/3d6dcadc8a3214d8522c1e7f6a19554e33659be44546d44a2f7572ac7d2a/groovy-0.1.2-py3-none-any.whl", hash = "sha256:7f7975bab18c729a257a8b1ae9dcd70b7cafb1720481beae47719af57c35fa64", size = 14090, upload-time = "2025-02-28T20:24:55.152Z" },
950
  ]
951
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
952
  [[package]]
953
  name = "h11"
954
  version = "0.16.0"
@@ -971,38 +1023,6 @@ wheels = [
971
  { url = "https://files.pythonhosted.org/packages/30/2d/afff2ee87e75d8eb85c92bb8cf0e15b05c23c2ebd8fd8dec781d8601ed7f/hf_gradio-0.4.1-py3-none-any.whl", hash = "sha256:76b8cb8be6abe62d74c1ad2d35b42f0629db89aa9e1a8d033cecfe7c856eeab3", size = 4482, upload-time = "2026-04-17T19:53:31.827Z" },
972
  ]
973
 
974
- [[package]]
975
- name = "hf-transfer"
976
- version = "0.1.9"
977
- source = { registry = "https://pypi.org/simple" }
978
- sdist = { url = "https://files.pythonhosted.org/packages/1a/eb/8fc64f40388c29ce8ce3b2b180a089d4d6b25b1d0d232d016704cb852104/hf_transfer-0.1.9.tar.gz", hash = "sha256:035572865dab29d17e783fbf1e84cf1cb24f3fcf8f1b17db1cfc7fdf139f02bf", size = 25201, upload-time = "2025-01-07T10:05:12.947Z" }
979
- wheels = [
980
- { url = "https://files.pythonhosted.org/packages/a4/78/0dce00208f585fae675f40033ef9a30dedfa83665d5ac79f16beb4a0a6c2/hf_transfer-0.1.9-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:6e94e8822da79573c9b6ae4d6b2f847c59a7a06c5327d7db20751b68538dc4f6", size = 1386084, upload-time = "2025-01-07T10:04:47.874Z" },
981
- { url = "https://files.pythonhosted.org/packages/ea/2e/3d60b1a9e9f29a2152aa66c823bf5e399ae7be3fef310ff0de86779c5d2d/hf_transfer-0.1.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3ebc4ab9023414880c8b1d3c38174d1c9989eb5022d37e814fa91a3060123eb0", size = 1343558, upload-time = "2025-01-07T10:04:42.313Z" },
982
- { url = "https://files.pythonhosted.org/packages/fb/38/130a5ac3747f104033591bcac1c961cb1faadfdc91704f59b09c0b465ff2/hf_transfer-0.1.9-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8674026f21ed369aa2a0a4b46000aca850fc44cd2b54af33a172ce5325b4fc82", size = 3726676, upload-time = "2025-01-07T10:04:11.539Z" },
983
- { url = "https://files.pythonhosted.org/packages/15/a1/f4e27c5ad17aac616ae0849e2aede5aae31db8267a948c6b3eeb9fd96446/hf_transfer-0.1.9-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a736dfbb2c84f5a2c975478ad200c0c8bfcb58a25a35db402678fb87ce17fa4", size = 3062920, upload-time = "2025-01-07T10:04:16.297Z" },
984
- { url = "https://files.pythonhosted.org/packages/8d/0d/727abdfba39bc3f1132cfa4c970588c2c0bb0d82fe2d645cc10f4e2f8e0b/hf_transfer-0.1.9-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:504b8427fd785dd8546d53b9fafe6e436bd7a3adf76b9dce556507650a7b4567", size = 3578681, upload-time = "2025-01-07T10:04:29.702Z" },
985
- { url = "https://files.pythonhosted.org/packages/50/d0/2b213eb1ea8b1252ccaf1a6c804d0aba03fea38aae4124df6a3acb70511a/hf_transfer-0.1.9-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c7fc1b85f4d0f76e452765d7648c9f4bfd0aedb9ced2ae1ebfece2d8cfaf8e2", size = 3398837, upload-time = "2025-01-07T10:04:22.778Z" },
986
- { url = "https://files.pythonhosted.org/packages/8c/8a/79dbce9006e0bd6b74516f97451a7b7c64dbbb426df15d901dd438cfeee3/hf_transfer-0.1.9-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d991376f0eac70a60f0cbc95602aa708a6f7c8617f28b4945c1431d67b8e3c8", size = 3546986, upload-time = "2025-01-07T10:04:36.415Z" },
987
- { url = "https://files.pythonhosted.org/packages/a9/f7/9ac239b6ee6fe0bad130325d987a93ea58c4118e50479f0786f1733b37e8/hf_transfer-0.1.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e6ac4eddcd99575ed3735ed911ddf9d1697e2bd13aa3f0ad7e3904dd4863842e", size = 4071715, upload-time = "2025-01-07T10:04:53.224Z" },
988
- { url = "https://files.pythonhosted.org/packages/d8/a3/0ed697279f5eeb7a40f279bd783cf50e6d0b91f24120dcf66ef2cf8822b4/hf_transfer-0.1.9-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:57fd9880da1ee0f47250f735f791fab788f0aa1ee36afc49f761349869c8b4d9", size = 3388081, upload-time = "2025-01-07T10:04:57.818Z" },
989
- { url = "https://files.pythonhosted.org/packages/dc/eb/47e477bdf1d784f31c7540db6cc8c354b777e51a186897a7abda34517f36/hf_transfer-0.1.9-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:5d561f0520f493c66b016d99ceabe69c23289aa90be38dd802d2aef279f15751", size = 3658654, upload-time = "2025-01-07T10:05:03.168Z" },
990
- { url = "https://files.pythonhosted.org/packages/45/07/6661e43fbee09594a8a5e9bb778107d95fe38dac4c653982afe03d32bd4d/hf_transfer-0.1.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a5b366d34cd449fe9b20ef25941e6eef0460a2f74e7389f02e673e1f88ebd538", size = 3690551, upload-time = "2025-01-07T10:05:09.238Z" },
991
- { url = "https://files.pythonhosted.org/packages/81/f5/461d2e5f307e5048289b1168d5c642ae3bb2504e88dff1a38b92ed990a21/hf_transfer-0.1.9-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:e66acf91df4a8b72f60223059df3003062a5ae111757187ed1a06750a30e911b", size = 1393046, upload-time = "2025-01-07T10:04:51.003Z" },
992
- { url = "https://files.pythonhosted.org/packages/41/ba/8d9fd9f1083525edfcb389c93738c802f3559cb749324090d7109c8bf4c2/hf_transfer-0.1.9-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:8669dbcc7a3e2e8d61d42cd24da9c50d57770bd74b445c65123291ca842a7e7a", size = 1348126, upload-time = "2025-01-07T10:04:45.712Z" },
993
- { url = "https://files.pythonhosted.org/packages/8e/a2/cd7885bc9959421065a6fae0fe67b6c55becdeda4e69b873e52976f9a9f0/hf_transfer-0.1.9-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8fd0167c4407a3bc4cdd0307e65ada2294ec04f1813d8a69a5243e379b22e9d8", size = 3728604, upload-time = "2025-01-07T10:04:14.173Z" },
994
- { url = "https://files.pythonhosted.org/packages/f6/2e/a072cf196edfeda3310c9a5ade0a0fdd785e6154b3ce24fc738c818da2a7/hf_transfer-0.1.9-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ee8b10afedcb75f71091bcc197c526a6ebf5c58bbbadb34fdeee6160f55f619f", size = 3064995, upload-time = "2025-01-07T10:04:18.663Z" },
995
- { url = "https://files.pythonhosted.org/packages/c2/84/aec9ef4c0fab93c1ea2b1badff38c78b4b2f86f0555b26d2051dbc920cde/hf_transfer-0.1.9-cp38-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5828057e313de59300dd1abb489444bc452efe3f479d3c55b31a8f680936ba42", size = 3580908, upload-time = "2025-01-07T10:04:32.834Z" },
996
- { url = "https://files.pythonhosted.org/packages/29/63/b560d39651a56603d64f1a0212d0472a44cbd965db2fa62b99d99cb981bf/hf_transfer-0.1.9-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc6bd19e1cc177c66bdef15ef8636ad3bde79d5a4f608c158021153b4573509d", size = 3400839, upload-time = "2025-01-07T10:04:26.122Z" },
997
- { url = "https://files.pythonhosted.org/packages/d6/d8/f87ea6f42456254b48915970ed98e993110521e9263472840174d32c880d/hf_transfer-0.1.9-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdca9bfb89e6f8f281890cc61a8aff2d3cecaff7e1a4d275574d96ca70098557", size = 3552664, upload-time = "2025-01-07T10:04:40.123Z" },
998
- { url = "https://files.pythonhosted.org/packages/d6/56/1267c39b65fc8f4e2113b36297320f102718bf5799b544a6cbe22013aa1d/hf_transfer-0.1.9-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:89a23f58b7b7effbc047b8ca286f131b17728c99a9f972723323003ffd1bb916", size = 4073732, upload-time = "2025-01-07T10:04:55.624Z" },
999
- { url = "https://files.pythonhosted.org/packages/82/1a/9c748befbe3decf7cb415e34f8a0c3789a0a9c55910dea73d581e48c0ce5/hf_transfer-0.1.9-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:dc7fff1345980d6c0ebb92c811d24afa4b98b3e07ed070c8e38cc91fd80478c5", size = 3390096, upload-time = "2025-01-07T10:04:59.98Z" },
1000
- { url = "https://files.pythonhosted.org/packages/72/85/4c03da147b6b4b7cb12e074d3d44eee28604a387ed0eaf7eaaead5069c57/hf_transfer-0.1.9-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:1a6bd16c667ebe89a069ca163060127a794fa3a3525292c900b8c8cc47985b0d", size = 3664743, upload-time = "2025-01-07T10:05:05.416Z" },
1001
- { url = "https://files.pythonhosted.org/packages/e7/6e/e597b04f753f1b09e6893075d53a82a30c13855cbaa791402695b01e369f/hf_transfer-0.1.9-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d2fde99d502093ade3ab1b53f80da18480e9902aa960dab7f74fb1b9e5bc5746", size = 3695243, upload-time = "2025-01-07T10:05:11.411Z" },
1002
- { url = "https://files.pythonhosted.org/packages/09/89/d4e234727a26b2546c8fb70a276cd924260d60135f2165bf8b9ed67bb9a4/hf_transfer-0.1.9-cp38-abi3-win32.whl", hash = "sha256:435cc3cdc8524ce57b074032b8fd76eed70a4224d2091232fa6a8cef8fd6803e", size = 1086605, upload-time = "2025-01-07T10:05:18.873Z" },
1003
- { url = "https://files.pythonhosted.org/packages/a1/14/f1e15b851d1c2af5b0b1a82bf8eb10bda2da62d98180220ba6fd8879bb5b/hf_transfer-0.1.9-cp38-abi3-win_amd64.whl", hash = "sha256:16f208fc678911c37e11aa7b586bc66a37d02e636208f18b6bc53d29b5df40ad", size = 1160240, upload-time = "2025-01-07T10:05:14.324Z" },
1004
- ]
1005
-
1006
  [[package]]
1007
  name = "hf-xet"
1008
  version = "1.4.3"
@@ -1066,21 +1086,22 @@ wheels = [
1066
 
1067
  [[package]]
1068
  name = "huggingface-hub"
1069
- version = "0.36.2"
1070
  source = { registry = "https://pypi.org/simple" }
1071
  dependencies = [
1072
  { name = "filelock" },
1073
  { name = "fsspec" },
1074
- { name = "hf-xet", marker = "platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'" },
 
1075
  { name = "packaging" },
1076
  { name = "pyyaml" },
1077
- { name = "requests" },
1078
  { name = "tqdm" },
 
1079
  { name = "typing-extensions" },
1080
  ]
1081
- sdist = { url = "https://files.pythonhosted.org/packages/7c/b7/8cb61d2eece5fb05a83271da168186721c450eb74e3c31f7ef3169fa475b/huggingface_hub-0.36.2.tar.gz", hash = "sha256:1934304d2fb224f8afa3b87007d58501acfda9215b334eed53072dd5e815ff7a", size = 649782, upload-time = "2026-02-06T09:24:13.098Z" }
1082
  wheels = [
1083
- { url = "https://files.pythonhosted.org/packages/a8/af/48ac8483240de756d2438c380746e7130d1c6f75802ef22f3c6d49982787/huggingface_hub-0.36.2-py3-none-any.whl", hash = "sha256:48f0c8eac16145dfce371e9d2d7772854a4f591bcb56c9cf548accf531d54270", size = 566395, upload-time = "2026-02-06T09:24:11.133Z" },
1084
  ]
1085
 
1086
  [[package]]
@@ -1212,6 +1233,15 @@ wheels = [
1212
  { url = "https://files.pythonhosted.org/packages/da/e9/1f9ada30cef7b05e74bb06f52127e7a724976c225f46adb65c37b1dadfb6/jiter-0.14.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67f00d94b281174144d6532a04b66a12cb866cbdc47c3af3bfe2973677f9861a", size = 349613, upload-time = "2026-04-10T14:28:40.066Z" },
1213
  ]
1214
 
 
 
 
 
 
 
 
 
 
1215
  [[package]]
1216
  name = "joserfc"
1217
  version = "1.6.4"
@@ -1381,6 +1411,15 @@ wheels = [
1381
  { url = "https://files.pythonhosted.org/packages/a4/0a/92c244309b774e290ddb15e93363846ae7aa753d9586b8aad511c5e6145b/librt-0.9.0-cp313-cp313-win_arm64.whl", hash = "sha256:4c4d0440a3a8e31d962340c3e1cc3fc9ee7febd34c8d8f770d06adb947779ea5", size = 53728, upload-time = "2026-04-09T16:05:33.31Z" },
1382
  ]
1383
 
 
 
 
 
 
 
 
 
 
1384
  [[package]]
1385
  name = "markdown-it-py"
1386
  version = "4.0.0"
@@ -1526,30 +1565,6 @@ wheels = [
1526
  { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198, upload-time = "2023-03-07T16:47:09.197Z" },
1527
  ]
1528
 
1529
- [[package]]
1530
- name = "msgspec"
1531
- version = "0.21.1"
1532
- source = { registry = "https://pypi.org/simple" }
1533
- sdist = { url = "https://files.pythonhosted.org/packages/e3/60/f79b9b013a16fa3a58350c9295ddc6789f2e335f36ea61ed10a21b215364/msgspec-0.21.1.tar.gz", hash = "sha256:2313508e394b0d208f8f56892ca9b2799e2561329de9763b19619595a6c0f72c", size = 319193, upload-time = "2026-04-12T21:44:50.394Z" }
1534
- wheels = [
1535
- { url = "https://files.pythonhosted.org/packages/6e/cf/317224852c00248c620a9bcf4b26e2e4ab8afd752f18d2a6ef73ebd423b6/msgspec-0.21.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d4248cf0b6129b7d230eacd493c17cc2d4f3989f3bb7f633a928a85b7dcfa251", size = 196188, upload-time = "2026-04-12T21:44:07.181Z" },
1536
- { url = "https://files.pythonhosted.org/packages/6d/81/074612945c0666078f7366f40000013de9f6ba687491d450df699bceebc9/msgspec-0.21.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5102c7e9b3acff82178449b85006d96310e690291bb1ea0142f1b24bcb8aabcb", size = 188473, upload-time = "2026-04-12T21:44:08.736Z" },
1537
- { url = "https://files.pythonhosted.org/packages/8a/37/655101799590bcc5fddb2bd3fe0e6194e816c2d1da7c361725f5eb89a910/msgspec-0.21.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:846758412e9518252b2ac9bffd6f0e54d9ff614f5f9488df7749f81ff5c80920", size = 218871, upload-time = "2026-04-12T21:44:09.917Z" },
1538
- { url = "https://files.pythonhosted.org/packages/b5/d1/d4cd9fe89c7d400d7a18f86ccc94daa3f0927f53558846fcb60791dce5d6/msgspec-0.21.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:21995e74b5c598c2e004110ad66ec7f1b8c20bf2bcf3b2de8fd9a3094422d3ff", size = 225025, upload-time = "2026-04-12T21:44:11.191Z" },
1539
- { url = "https://files.pythonhosted.org/packages/24/bf/e20549e602b9edccadeeff98760345a416f9cce846a657e8b18e3396b212/msgspec-0.21.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6129f0cca52992e898fd5344187f7c8127b63d810b2fd73e36fca73b4c6475ee", size = 222672, upload-time = "2026-04-12T21:44:12.481Z" },
1540
- { url = "https://files.pythonhosted.org/packages/b4/68/04d7a8f0f786545cf9b8c280c57aa6befb5977af6e884b8b54191cbe44b3/msgspec-0.21.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ef3ec2296248d1f8b9231acb051b6d471dfde8f21819e86c9adaaa9f42918521", size = 227303, upload-time = "2026-04-12T21:44:13.709Z" },
1541
- { url = "https://files.pythonhosted.org/packages/cc/4d/619866af2840875be408047bf9e70ceafbae6ab50660de7134ed1b25eb86/msgspec-0.21.1-cp312-cp312-win_amd64.whl", hash = "sha256:d4ab834a054c6f0cbeef6df9e7e1b33d5f1bc7b86dea1d2fd7cad003873e783d", size = 190017, upload-time = "2026-04-12T21:44:14.977Z" },
1542
- { url = "https://files.pythonhosted.org/packages/5e/2e/a8f9eca8fd00e097d7a9e99ba8a4685db994494448e3d4f0b7f6e9a3c0f7/msgspec-0.21.1-cp312-cp312-win_arm64.whl", hash = "sha256:628aaa35c74950a8c59da330d7e98917e1c7188f983745782027748ee4ca573e", size = 175345, upload-time = "2026-04-12T21:44:16.431Z" },
1543
- { url = "https://files.pythonhosted.org/packages/7e/74/f11ede02839b19ff459f88e3145df5d711626ca84da4e23520cebf819367/msgspec-0.21.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:764173717a01743f007e9f74520ed281f24672c604514f7d76c1c3a10e8edb66", size = 196176, upload-time = "2026-04-12T21:44:17.613Z" },
1544
- { url = "https://files.pythonhosted.org/packages/bb/40/4476c1bd341418a046c4955aff632ec769315d1e3cb94e6acf86d461f9ed/msgspec-0.21.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:344c7cd0eaed1fb81d7959f99100ef71ec9b536881a376f11b9a6c4803365697", size = 188524, upload-time = "2026-04-12T21:44:18.815Z" },
1545
- { url = "https://files.pythonhosted.org/packages/ca/d9/9e9d7d7e5061b47540d03d640fab9b3965ba7ae49c1b2154861c8f007518/msgspec-0.21.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:48943e278b3854c2f89f955ddc6f9f430d3f0784b16e47d10604ee0463cd21f5", size = 218880, upload-time = "2026-04-12T21:44:20.028Z" },
1546
- { url = "https://files.pythonhosted.org/packages/74/66/2bb344f34abb4b57e60c7c9c761994e0417b9718ec1460bf00c296f2a7ea/msgspec-0.21.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a9aa659ebb0101b1cbc31461212b87e341d961f0ab0772aaf068a99e001ec4aa", size = 225050, upload-time = "2026-04-12T21:44:21.577Z" },
1547
- { url = "https://files.pythonhosted.org/packages/1a/84/7c1e412f76092277bf760cef12b7979d03314d259ab5b5cafde5d0c1722d/msgspec-0.21.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7b27d1a8ead2b6f5b0c4f2d07b8be1ccfcc041c8a0e704781edebe3ae13c484", size = 222713, upload-time = "2026-04-12T21:44:22.83Z" },
1548
- { url = "https://files.pythonhosted.org/packages/4e/27/0bba04b2b4ef05f3d068429410bc71d2cea925f1596a8f41152cccd5edb8/msgspec-0.21.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:38fe93e86b61328fe544cb7fd871fad5a27c8734bfda90f65e5dbe288ae50f61", size = 227259, upload-time = "2026-04-12T21:44:24.11Z" },
1549
- { url = "https://files.pythonhosted.org/packages/b0/2d/09574b0eea02fed2c2c1383dbaae2c7f79dc16dcd6487a886000afb5d7c4/msgspec-0.21.1-cp313-cp313-win_amd64.whl", hash = "sha256:8bc666331c35fcce05a7cd2d6221adbe0f6058f8e750711413d22793c080ac6a", size = 189857, upload-time = "2026-04-12T21:44:25.359Z" },
1550
- { url = "https://files.pythonhosted.org/packages/46/34/105b1576ad182879914f0c821f17ee1d13abb165cb060448f96fe2aff078/msgspec-0.21.1-cp313-cp313-win_arm64.whl", hash = "sha256:42bb1241e0750c1a4346f2aa84db26c5ffd99a4eb3a954927d9f149ff2f42898", size = 175403, upload-time = "2026-04-12T21:44:26.608Z" },
1551
- ]
1552
-
1553
  [[package]]
1554
  name = "multidict"
1555
  version = "6.7.1"
@@ -1717,137 +1732,152 @@ wheels = [
1717
  ]
1718
 
1719
  [[package]]
1720
- name = "nvidia-cublas-cu12"
1721
- version = "12.8.4.1"
1722
  source = { registry = "https://pypi.org/simple" }
1723
  wheels = [
1724
- { url = "https://files.pythonhosted.org/packages/dc/61/e24b560ab2e2eaeb3c839129175fb330dfcfc29e5203196e5541a4c44682/nvidia_cublas_cu12-12.8.4.1-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:8ac4e771d5a348c551b2a426eda6193c19aa630236b418086020df5ba9667142", size = 594346921, upload-time = "2025-03-07T01:44:31.254Z" },
 
1725
  ]
1726
 
1727
  [[package]]
1728
- name = "nvidia-cuda-cupti-cu12"
1729
- version = "12.8.90"
1730
  source = { registry = "https://pypi.org/simple" }
1731
  wheels = [
1732
- { url = "https://files.pythonhosted.org/packages/f8/02/2adcaa145158bf1a8295d83591d22e4103dbfd821bcaf6f3f53151ca4ffa/nvidia_cuda_cupti_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ea0cb07ebda26bb9b29ba82cda34849e73c166c18162d3913575b0c9db9a6182", size = 10248621, upload-time = "2025-03-07T01:40:21.213Z" },
 
1733
  ]
1734
 
1735
  [[package]]
1736
- name = "nvidia-cuda-nvrtc-cu12"
1737
- version = "12.8.93"
1738
  source = { registry = "https://pypi.org/simple" }
1739
  wheels = [
1740
- { url = "https://files.pythonhosted.org/packages/05/6b/32f747947df2da6994e999492ab306a903659555dddc0fbdeb9d71f75e52/nvidia_cuda_nvrtc_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:a7756528852ef889772a84c6cd89d41dfa74667e24cca16bb31f8f061e3e9994", size = 88040029, upload-time = "2025-03-07T01:42:13.562Z" },
 
1741
  ]
1742
 
1743
  [[package]]
1744
- name = "nvidia-cuda-runtime-cu12"
1745
- version = "12.8.90"
1746
  source = { registry = "https://pypi.org/simple" }
1747
  wheels = [
1748
- { url = "https://files.pythonhosted.org/packages/0d/9b/a997b638fcd068ad6e4d53b8551a7d30fe8b404d6f1804abf1df69838932/nvidia_cuda_runtime_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:adade8dcbd0edf427b7204d480d6066d33902cab2a4707dcfc48a2d0fd44ab90", size = 954765, upload-time = "2025-03-07T01:40:01.615Z" },
 
1749
  ]
1750
 
1751
  [[package]]
1752
- name = "nvidia-cudnn-cu12"
1753
- version = "9.10.2.21"
1754
  source = { registry = "https://pypi.org/simple" }
1755
  dependencies = [
1756
- { name = "nvidia-cublas-cu12", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
1757
  ]
1758
  wheels = [
1759
- { url = "https://files.pythonhosted.org/packages/ba/51/e123d997aa098c61d029f76663dedbfb9bc8dcf8c60cbd6adbe42f76d049/nvidia_cudnn_cu12-9.10.2.21-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:949452be657fa16687d0930933f032835951ef0892b37d2d53824d1a84dc97a8", size = 706758467, upload-time = "2025-06-06T21:54:08.597Z" },
 
1760
  ]
1761
 
1762
  [[package]]
1763
- name = "nvidia-cufft-cu12"
1764
- version = "11.3.3.83"
1765
  source = { registry = "https://pypi.org/simple" }
1766
  dependencies = [
1767
- { name = "nvidia-nvjitlink-cu12", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
1768
  ]
1769
  wheels = [
1770
- { url = "https://files.pythonhosted.org/packages/1f/13/ee4e00f30e676b66ae65b4f08cb5bcbb8392c03f54f2d5413ea99a5d1c80/nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d2dd21ec0b88cf61b62e6b43564355e5222e4a3fb394cac0db101f2dd0d4f74", size = 193118695, upload-time = "2025-03-07T01:45:27.821Z" },
 
1771
  ]
1772
 
1773
  [[package]]
1774
- name = "nvidia-cufile-cu12"
1775
- version = "1.13.1.3"
1776
  source = { registry = "https://pypi.org/simple" }
1777
  wheels = [
1778
- { url = "https://files.pythonhosted.org/packages/bb/fe/1bcba1dfbfb8d01be8d93f07bfc502c93fa23afa6fd5ab3fc7c1df71038a/nvidia_cufile_cu12-1.13.1.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1d069003be650e131b21c932ec3d8969c1715379251f8d23a1860554b1cb24fc", size = 1197834, upload-time = "2025-03-07T01:45:50.723Z" },
 
1779
  ]
1780
 
1781
  [[package]]
1782
- name = "nvidia-curand-cu12"
1783
- version = "10.3.9.90"
1784
  source = { registry = "https://pypi.org/simple" }
1785
  wheels = [
1786
- { url = "https://files.pythonhosted.org/packages/fb/aa/6584b56dc84ebe9cf93226a5cde4d99080c8e90ab40f0c27bda7a0f29aa1/nvidia_curand_cu12-10.3.9.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:b32331d4f4df5d6eefa0554c565b626c7216f87a06a4f56fab27c3b68a830ec9", size = 63619976, upload-time = "2025-03-07T01:46:23.323Z" },
 
1787
  ]
1788
 
1789
  [[package]]
1790
- name = "nvidia-cusolver-cu12"
1791
- version = "11.7.3.90"
1792
  source = { registry = "https://pypi.org/simple" }
1793
  dependencies = [
1794
- { name = "nvidia-cublas-cu12", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
1795
- { name = "nvidia-cusparse-cu12", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
1796
- { name = "nvidia-nvjitlink-cu12", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
1797
  ]
1798
  wheels = [
1799
- { url = "https://files.pythonhosted.org/packages/85/48/9a13d2975803e8cf2777d5ed57b87a0b6ca2cc795f9a4f59796a910bfb80/nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:4376c11ad263152bd50ea295c05370360776f8c3427b30991df774f9fb26c450", size = 267506905, upload-time = "2025-03-07T01:47:16.273Z" },
 
1800
  ]
1801
 
1802
  [[package]]
1803
- name = "nvidia-cusparse-cu12"
1804
- version = "12.5.8.93"
1805
  source = { registry = "https://pypi.org/simple" }
1806
  dependencies = [
1807
- { name = "nvidia-nvjitlink-cu12", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
1808
  ]
1809
  wheels = [
1810
- { url = "https://files.pythonhosted.org/packages/c2/f5/e1854cb2f2bcd4280c44736c93550cc300ff4b8c95ebe370d0aa7d2b473d/nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ec05d76bbbd8b61b06a80e1eaf8cf4959c3d4ce8e711b65ebd0443bb0ebb13b", size = 288216466, upload-time = "2025-03-07T01:48:13.779Z" },
 
1811
  ]
1812
 
1813
  [[package]]
1814
- name = "nvidia-cusparselt-cu12"
1815
- version = "0.7.1"
1816
  source = { registry = "https://pypi.org/simple" }
1817
  wheels = [
1818
- { url = "https://files.pythonhosted.org/packages/56/79/12978b96bd44274fe38b5dde5cfb660b1d114f70a65ef962bcbbed99b549/nvidia_cusparselt_cu12-0.7.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f1bb701d6b930d5a7cea44c19ceb973311500847f81b634d802b7b539dc55623", size = 287193691, upload-time = "2025-02-26T00:15:44.104Z" },
 
1819
  ]
1820
 
1821
  [[package]]
1822
- name = "nvidia-nccl-cu12"
1823
- version = "2.27.5"
1824
  source = { registry = "https://pypi.org/simple" }
1825
  wheels = [
1826
- { url = "https://files.pythonhosted.org/packages/6e/89/f7a07dc961b60645dbbf42e80f2bc85ade7feb9a491b11a1e973aa00071f/nvidia_nccl_cu12-2.27.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ad730cf15cb5d25fe849c6e6ca9eb5b76db16a80f13f425ac68d8e2e55624457", size = 322348229, upload-time = "2025-06-26T04:11:28.385Z" },
 
1827
  ]
1828
 
1829
  [[package]]
1830
- name = "nvidia-nvjitlink-cu12"
1831
- version = "12.8.93"
1832
  source = { registry = "https://pypi.org/simple" }
1833
  wheels = [
1834
- { url = "https://files.pythonhosted.org/packages/f6/74/86a07f1d0f42998ca31312f998bd3b9a7eff7f52378f4f270c8679c77fb9/nvidia_nvjitlink_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:81ff63371a7ebd6e6451970684f916be2eab07321b73c9d244dc2b4da7f73b88", size = 39254836, upload-time = "2025-03-07T01:49:55.661Z" },
 
1835
  ]
1836
 
1837
  [[package]]
1838
- name = "nvidia-nvshmem-cu12"
1839
  version = "3.4.5"
1840
  source = { registry = "https://pypi.org/simple" }
1841
  wheels = [
1842
- { url = "https://files.pythonhosted.org/packages/b5/09/6ea3ea725f82e1e76684f0708bbedd871fc96da89945adeba65c3835a64c/nvidia_nvshmem_cu12-3.4.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:042f2500f24c021db8a06c5eec2539027d57460e1c1a762055a6554f72c369bd", size = 139103095, upload-time = "2025-09-06T00:32:31.266Z" },
 
1843
  ]
1844
 
1845
  [[package]]
1846
- name = "nvidia-nvtx-cu12"
1847
- version = "12.8.90"
1848
  source = { registry = "https://pypi.org/simple" }
1849
  wheels = [
1850
- { url = "https://files.pythonhosted.org/packages/a2/eb/86626c1bbc2edb86323022371c39aa48df6fd8b0a1647bc274577f72e90b/nvidia_nvtx_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5b17e2001cc0d751a5bc2c6ec6d26ad95913324a4adb86788c944f8ce9ba441f", size = 89954, upload-time = "2025-03-07T01:42:44.131Z" },
 
1851
  ]
1852
 
1853
  [[package]]
@@ -2770,38 +2800,6 @@ wheels = [
2770
  { url = "https://files.pythonhosted.org/packages/6a/23/8146aad7d88f4fcb3a6218f41a60f6c2d4e3a72de72da1825dc7c8f7877c/semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177", size = 15552, upload-time = "2022-05-26T13:35:21.206Z" },
2771
  ]
2772
 
2773
- [[package]]
2774
- name = "sentencepiece"
2775
- version = "0.2.1"
2776
- source = { registry = "https://pypi.org/simple" }
2777
- sdist = { url = "https://files.pythonhosted.org/packages/15/15/2e7a025fc62d764b151ae6d0f2a92f8081755ebe8d4a64099accc6f77ba6/sentencepiece-0.2.1.tar.gz", hash = "sha256:8138cec27c2f2282f4a34d9a016e3374cd40e5c6e9cb335063db66a0a3b71fad", size = 3228515, upload-time = "2025-08-12T07:00:51.718Z" }
2778
- wheels = [
2779
- { url = "https://files.pythonhosted.org/packages/4a/be/32ce495aa1d0e0c323dcb1ba87096037358edee539cac5baf8755a6bd396/sentencepiece-0.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:57cae326c8727de58c85977b175af132a7138d84c764635d7e71bbee7e774133", size = 1943152, upload-time = "2025-08-12T06:59:40.048Z" },
2780
- { url = "https://files.pythonhosted.org/packages/88/7e/ff23008899a58678e98c6ff592bf4d368eee5a71af96d0df6b38a039dd4f/sentencepiece-0.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:56dd39a3c4d6493db3cdca7e8cc68c6b633f0d4195495cbadfcf5af8a22d05a6", size = 1325651, upload-time = "2025-08-12T06:59:41.536Z" },
2781
- { url = "https://files.pythonhosted.org/packages/19/84/42eb3ce4796777a1b5d3699dfd4dca85113e68b637f194a6c8d786f16a04/sentencepiece-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d9381351182ff9888cc80e41c632e7e274b106f450de33d67a9e8f6043da6f76", size = 1253645, upload-time = "2025-08-12T06:59:42.903Z" },
2782
- { url = "https://files.pythonhosted.org/packages/89/fa/d3d5ebcba3cb9e6d3775a096251860c41a6bc53a1b9461151df83fe93255/sentencepiece-0.2.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99f955df238021bf11f0fc37cdb54fd5e5b5f7fd30ecc3d93fb48b6815437167", size = 1316273, upload-time = "2025-08-12T06:59:44.476Z" },
2783
- { url = "https://files.pythonhosted.org/packages/04/88/14f2f4a2b922d8b39be45bf63d79e6cd3a9b2f248b2fcb98a69b12af12f5/sentencepiece-0.2.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0cdfecef430d985f1c2bcbfff3defd1d95dae876fbd0173376012d2d7d24044b", size = 1387881, upload-time = "2025-08-12T06:59:46.09Z" },
2784
- { url = "https://files.pythonhosted.org/packages/fd/b8/903e5ccb77b4ef140605d5d71b4f9e0ad95d456d6184688073ed11712809/sentencepiece-0.2.1-cp312-cp312-win32.whl", hash = "sha256:a483fd29a34c3e34c39ac5556b0a90942bec253d260235729e50976f5dba1068", size = 999540, upload-time = "2025-08-12T06:59:48.023Z" },
2785
- { url = "https://files.pythonhosted.org/packages/2d/81/92df5673c067148c2545b1bfe49adfd775bcc3a169a047f5a0e6575ddaca/sentencepiece-0.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:4cdc7c36234fda305e85c32949c5211faaf8dd886096c7cea289ddc12a2d02de", size = 1054671, upload-time = "2025-08-12T06:59:49.895Z" },
2786
- { url = "https://files.pythonhosted.org/packages/fe/02/c5e3bc518655d714622bec87d83db9cdba1cd0619a4a04e2109751c4f47f/sentencepiece-0.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:daeb5e9e9fcad012324807856113708614d534f596d5008638eb9b40112cd9e4", size = 1033923, upload-time = "2025-08-12T06:59:51.952Z" },
2787
- { url = "https://files.pythonhosted.org/packages/ba/4a/85fbe1706d4d04a7e826b53f327c4b80f849cf1c7b7c5e31a20a97d8f28b/sentencepiece-0.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dcd8161eee7b41aae57ded06272905dbd680a0a04b91edd0f64790c796b2f706", size = 1943150, upload-time = "2025-08-12T06:59:53.588Z" },
2788
- { url = "https://files.pythonhosted.org/packages/c2/83/4cfb393e287509fc2155480b9d184706ef8d9fa8cbf5505d02a5792bf220/sentencepiece-0.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c6c8f42949f419ff8c7e9960dbadcfbc982d7b5efc2f6748210d3dd53a7de062", size = 1325651, upload-time = "2025-08-12T06:59:55.073Z" },
2789
- { url = "https://files.pythonhosted.org/packages/8d/de/5a007fb53b1ab0aafc69d11a5a3dd72a289d5a3e78dcf2c3a3d9b14ffe93/sentencepiece-0.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:097f3394e99456e9e4efba1737c3749d7e23563dd1588ce71a3d007f25475fff", size = 1253641, upload-time = "2025-08-12T06:59:56.562Z" },
2790
- { url = "https://files.pythonhosted.org/packages/2c/d2/f552be5928105588f4f4d66ee37dd4c61460d8097e62d0e2e0eec41bc61d/sentencepiece-0.2.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d7b670879c370d350557edabadbad1f6561a9e6968126e6debca4029e5547820", size = 1316271, upload-time = "2025-08-12T06:59:58.109Z" },
2791
- { url = "https://files.pythonhosted.org/packages/96/df/0cfe748ace5485be740fed9476dee7877f109da32ed0d280312c94ec259f/sentencepiece-0.2.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7f0fd2f2693309e6628aeeb2e2faf6edd221134dfccac3308ca0de01f8dab47", size = 1387882, upload-time = "2025-08-12T07:00:00.701Z" },
2792
- { url = "https://files.pythonhosted.org/packages/ac/dd/f7774d42a881ced8e1739f393ab1e82ece39fc9abd4779e28050c2e975b5/sentencepiece-0.2.1-cp313-cp313-win32.whl", hash = "sha256:92b3816aa2339355fda2c8c4e021a5de92180b00aaccaf5e2808972e77a4b22f", size = 999541, upload-time = "2025-08-12T07:00:02.709Z" },
2793
- { url = "https://files.pythonhosted.org/packages/dd/e9/932b9eae6fd7019548321eee1ab8d5e3b3d1294df9d9a0c9ac517c7b636d/sentencepiece-0.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:10ed3dab2044c47f7a2e7b4969b0c430420cdd45735d78c8f853191fa0e3148b", size = 1054669, upload-time = "2025-08-12T07:00:04.915Z" },
2794
- { url = "https://files.pythonhosted.org/packages/c9/3a/76488a00ea7d6931689cda28726a1447d66bf1a4837943489314593d5596/sentencepiece-0.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:ac650534e2251083c5f75dde4ff28896ce7c8904133dc8fef42780f4d5588fcd", size = 1033922, upload-time = "2025-08-12T07:00:06.496Z" },
2795
- { url = "https://files.pythonhosted.org/packages/4a/b6/08fe2ce819e02ccb0296f4843e3f195764ce9829cbda61b7513f29b95718/sentencepiece-0.2.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:8dd4b477a7b069648d19363aad0cab9bad2f4e83b2d179be668efa672500dc94", size = 1946052, upload-time = "2025-08-12T07:00:08.136Z" },
2796
- { url = "https://files.pythonhosted.org/packages/ab/d9/1ea0e740591ff4c6fc2b6eb1d7510d02f3fb885093f19b2f3abd1363b402/sentencepiece-0.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0c0f672da370cc490e4c59d89e12289778310a0e71d176c541e4834759e1ae07", size = 1327408, upload-time = "2025-08-12T07:00:09.572Z" },
2797
- { url = "https://files.pythonhosted.org/packages/99/7e/1fb26e8a21613f6200e1ab88824d5d203714162cf2883248b517deb500b7/sentencepiece-0.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ad8493bea8432dae8d6830365352350f3b4144415a1d09c4c8cb8d30cf3b6c3c", size = 1254857, upload-time = "2025-08-12T07:00:11.021Z" },
2798
- { url = "https://files.pythonhosted.org/packages/bc/85/c72fd1f3c7a6010544d6ae07f8ddb38b5e2a7e33bd4318f87266c0bbafbf/sentencepiece-0.2.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b81a24733726e3678d2db63619acc5a8dccd074f7aa7a54ecd5ca33ca6d2d596", size = 1315722, upload-time = "2025-08-12T07:00:12.989Z" },
2799
- { url = "https://files.pythonhosted.org/packages/4a/e8/661e5bd82a8aa641fd6c1020bd0e890ef73230a2b7215ddf9c8cd8e941c2/sentencepiece-0.2.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0a81799d0a68d618e89063fb423c3001a034c893069135ffe51fee439ae474d6", size = 1387452, upload-time = "2025-08-12T07:00:15.088Z" },
2800
- { url = "https://files.pythonhosted.org/packages/99/5e/ae66c361023a470afcbc1fbb8da722c72ea678a2fcd9a18f1a12598c7501/sentencepiece-0.2.1-cp313-cp313t-win32.whl", hash = "sha256:89a3ea015517c42c0341d0d962f3e6aaf2cf10d71b1932d475c44ba48d00aa2b", size = 1002501, upload-time = "2025-08-12T07:00:16.966Z" },
2801
- { url = "https://files.pythonhosted.org/packages/c1/03/d332828c4ff764e16c1b56c2c8f9a33488bbe796b53fb6b9c4205ddbf167/sentencepiece-0.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:33f068c9382dc2e7c228eedfd8163b52baa86bb92f50d0488bf2b7da7032e484", size = 1057555, upload-time = "2025-08-12T07:00:18.573Z" },
2802
- { url = "https://files.pythonhosted.org/packages/88/14/5aee0bf0864df9bd82bd59e7711362908e4935e3f9cdc1f57246b5d5c9b9/sentencepiece-0.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:b3616ad246f360e52c85781e47682d31abfb6554c779e42b65333d4b5f44ecc0", size = 1036042, upload-time = "2025-08-12T07:00:20.209Z" },
2803
- ]
2804
-
2805
  [[package]]
2806
  name = "setuptools"
2807
  version = "81.0.0"
@@ -2869,26 +2867,28 @@ train = [
2869
  { name = "accelerate" },
2870
  { name = "bitsandbytes" },
2871
  { name = "datasets" },
 
2872
  { name = "peft" },
 
2873
  { name = "transformers" },
2874
- { name = "trl" },
2875
- { name = "unsloth" },
2876
  ]
2877
 
2878
  [package.metadata]
2879
  requires-dist = [
2880
- { name = "accelerate", marker = "extra == 'train'", specifier = ">=1.0.0,<2.0" },
2881
- { name = "bitsandbytes", marker = "extra == 'train'", specifier = ">=0.43,<1.0" },
2882
- { name = "datasets", marker = "extra == 'train'", specifier = ">=2.20.0,<4.0" },
2883
  { name = "duckdb", specifier = ">=1.5.2,<2.0" },
2884
  { name = "httpx", marker = "extra == 'dev'", specifier = ">=0.28.0" },
2885
- { name = "huggingface-hub", specifier = ">=0.20,<1.0" },
 
2886
  { name = "matplotlib", marker = "extra == 'evidence'", specifier = ">=3.8.0,<4.0" },
2887
  { name = "mypy", marker = "extra == 'dev'", specifier = ">=1.20.1" },
2888
  { name = "openai", specifier = ">=2.32.0,<3.0" },
2889
  { name = "openenv-core", extras = ["core"], specifier = ">=0.2.2,<0.4" },
2890
  { name = "pandas", marker = "extra == 'evidence'", specifier = ">=2.0.0,<3.0" },
2891
- { name = "peft", marker = "extra == 'train'", specifier = ">=0.13,<1.0" },
2892
  { name = "pydantic", specifier = ">=2.8.0,<3.0" },
2893
  { name = "pytest", marker = "extra == 'dev'", specifier = ">=9.0.3" },
2894
  { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=1.3.0" },
@@ -2896,9 +2896,9 @@ requires-dist = [
2896
  { name = "python-dotenv", specifier = ">=1.2.2,<2.0" },
2897
  { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.15.11" },
2898
  { name = "sqlglot", specifier = ">=30.6.0,<40.0" },
2899
- { name = "transformers", marker = "extra == 'train'", specifier = ">=4.46.0,<5.0" },
2900
- { name = "trl", marker = "extra == 'train'", specifier = ">=0.25.0,<1.0" },
2901
- { name = "unsloth", marker = "extra == 'train'", specifier = ">=2024.9,<2027.0" },
2902
  ]
2903
  provides-extras = ["evidence", "dev", "train"]
2904
 
@@ -2949,6 +2949,36 @@ wheels = [
2949
  { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353, upload-time = "2025-04-27T18:04:59.103Z" },
2950
  ]
2951
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2952
  [[package]]
2953
  name = "tokenizers"
2954
  version = "0.22.2"
@@ -3022,85 +3052,37 @@ wheels = [
3022
 
3023
  [[package]]
3024
  name = "torch"
3025
- version = "2.10.0"
3026
  source = { registry = "https://pypi.org/simple" }
3027
  dependencies = [
3028
- { name = "cuda-bindings", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
 
3029
  { name = "filelock" },
3030
  { name = "fsspec" },
3031
  { name = "jinja2" },
3032
  { name = "networkx" },
3033
- { name = "nvidia-cublas-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
3034
- { name = "nvidia-cuda-cupti-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
3035
- { name = "nvidia-cuda-nvrtc-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
3036
- { name = "nvidia-cuda-runtime-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
3037
- { name = "nvidia-cudnn-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
3038
- { name = "nvidia-cufft-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
3039
- { name = "nvidia-cufile-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
3040
- { name = "nvidia-curand-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
3041
- { name = "nvidia-cusolver-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
3042
- { name = "nvidia-cusparse-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
3043
- { name = "nvidia-cusparselt-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
3044
- { name = "nvidia-nccl-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
3045
- { name = "nvidia-nvjitlink-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
3046
- { name = "nvidia-nvshmem-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
3047
- { name = "nvidia-nvtx-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
3048
  { name = "setuptools" },
3049
  { name = "sympy" },
3050
- { name = "triton", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
3051
  { name = "typing-extensions" },
3052
  ]
3053
  wheels = [
3054
- { url = "https://files.pythonhosted.org/packages/d3/54/a2ba279afcca44bbd320d4e73675b282fcee3d81400ea1b53934efca6462/torch-2.10.0-2-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:13ec4add8c3faaed8d13e0574f5cd4a323c11655546f91fbe6afa77b57423574", size = 79498202, upload-time = "2026-02-10T21:44:52.603Z" },
3055
- { url = "https://files.pythonhosted.org/packages/ec/23/2c9fe0c9c27f7f6cb865abcea8a4568f29f00acaeadfc6a37f6801f84cb4/torch-2.10.0-2-cp313-none-macosx_11_0_arm64.whl", hash = "sha256:e521c9f030a3774ed770a9c011751fb47c4d12029a3d6522116e48431f2ff89e", size = 79498254, upload-time = "2026-02-10T21:44:44.095Z" },
3056
- { url = "https://files.pythonhosted.org/packages/b3/7a/abada41517ce0011775f0f4eacc79659bc9bc6c361e6bfe6f7052a6b9363/torch-2.10.0-3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:98c01b8bb5e3240426dcde1446eed6f40c778091c8544767ef1168fc663a05a6", size = 915622781, upload-time = "2026-03-11T14:17:11.354Z" },
3057
- { url = "https://files.pythonhosted.org/packages/ab/c6/4dfe238342ffdcec5aef1c96c457548762d33c40b45a1ab7033bb26d2ff2/torch-2.10.0-3-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:80b1b5bfe38eb0e9f5ff09f206dcac0a87aadd084230d4a36eea5ec5232c115b", size = 915627275, upload-time = "2026-03-11T14:16:11.325Z" },
3058
- { url = "https://files.pythonhosted.org/packages/d8/f0/72bf18847f58f877a6a8acf60614b14935e2f156d942483af1ffc081aea0/torch-2.10.0-3-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:46b3574d93a2a8134b3f5475cfb98e2eb46771794c57015f6ad1fb795ec25e49", size = 915523474, upload-time = "2026-03-11T14:17:44.422Z" },
3059
- { url = "https://files.pythonhosted.org/packages/cc/af/758e242e9102e9988969b5e621d41f36b8f258bb4a099109b7a4b4b50ea4/torch-2.10.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:5fd4117d89ffd47e3dcc71e71a22efac24828ad781c7e46aaaf56bf7f2796acf", size = 145996088, upload-time = "2026-01-21T16:24:44.171Z" },
3060
- { url = "https://files.pythonhosted.org/packages/23/8e/3c74db5e53bff7ed9e34c8123e6a8bfef718b2450c35eefab85bb4a7e270/torch-2.10.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:787124e7db3b379d4f1ed54dd12ae7c741c16a4d29b49c0226a89bea50923ffb", size = 915711952, upload-time = "2026-01-21T16:23:53.503Z" },
3061
- { url = "https://files.pythonhosted.org/packages/6e/01/624c4324ca01f66ae4c7cd1b74eb16fb52596dce66dbe51eff95ef9e7a4c/torch-2.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:2c66c61f44c5f903046cc696d088e21062644cbe541c7f1c4eaae88b2ad23547", size = 113757972, upload-time = "2026-01-21T16:24:39.516Z" },
3062
- { url = "https://files.pythonhosted.org/packages/c9/5c/dee910b87c4d5c0fcb41b50839ae04df87c1cfc663cf1b5fca7ea565eeaa/torch-2.10.0-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:6d3707a61863d1c4d6ebba7be4ca320f42b869ee657e9b2c21c736bf17000294", size = 79498198, upload-time = "2026-01-21T16:24:34.704Z" },
3063
- { url = "https://files.pythonhosted.org/packages/c9/6f/f2e91e34e3fcba2e3fc8d8f74e7d6c22e74e480bbd1db7bc8900fdf3e95c/torch-2.10.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:5c4d217b14741e40776dd7074d9006fd28b8a97ef5654db959d8635b2fe5f29b", size = 146004247, upload-time = "2026-01-21T16:24:29.335Z" },
3064
- { url = "https://files.pythonhosted.org/packages/98/fb/5160261aeb5e1ee12ee95fe599d0541f7c976c3701d607d8fc29e623229f/torch-2.10.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:6b71486353fce0f9714ca0c9ef1c850a2ae766b409808acd58e9678a3edb7738", size = 915716445, upload-time = "2026-01-21T16:22:45.353Z" },
3065
- { url = "https://files.pythonhosted.org/packages/6a/16/502fb1b41e6d868e8deb5b0e3ae926bbb36dab8ceb0d1b769b266ad7b0c3/torch-2.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:c2ee399c644dc92ef7bc0d4f7e74b5360c37cdbe7c5ba11318dda49ffac2bc57", size = 113757050, upload-time = "2026-01-21T16:24:19.204Z" },
3066
- { url = "https://files.pythonhosted.org/packages/1a/0b/39929b148f4824bc3ad6f9f72a29d4ad865bcf7ebfc2fa67584773e083d2/torch-2.10.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:3202429f58309b9fa96a614885eace4b7995729f44beb54d3e4a47773649d382", size = 79851305, upload-time = "2026-01-21T16:24:09.209Z" },
3067
- { url = "https://files.pythonhosted.org/packages/d8/14/21fbce63bc452381ba5f74a2c0a959fdf5ad5803ccc0c654e752e0dbe91a/torch-2.10.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:aae1b29cd68e50a9397f5ee897b9c24742e9e306f88a807a27d617f07adb3bd8", size = 146005472, upload-time = "2026-01-21T16:22:29.022Z" },
3068
- { url = "https://files.pythonhosted.org/packages/54/fd/b207d1c525cb570ef47f3e9f836b154685011fce11a2f444ba8a4084d042/torch-2.10.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:6021db85958db2f07ec94e1bc77212721ba4920c12a18dc552d2ae36a3eb163f", size = 915612644, upload-time = "2026-01-21T16:21:47.019Z" },
3069
- { url = "https://files.pythonhosted.org/packages/36/53/0197f868c75f1050b199fe58f9bf3bf3aecac9b4e85cc9c964383d745403/torch-2.10.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff43db38af76fda183156153983c9a096fc4c78d0cd1e07b14a2314c7f01c2c8", size = 113997015, upload-time = "2026-01-21T16:23:00.767Z" },
3070
- { url = "https://files.pythonhosted.org/packages/0e/13/e76b4d9c160e89fff48bf16b449ea324bda84745d2ab30294c37c2434c0d/torch-2.10.0-cp313-none-macosx_11_0_arm64.whl", hash = "sha256:cdf2a523d699b70d613243211ecaac14fe9c5df8a0b0a9c02add60fb2a413e0f", size = 79498248, upload-time = "2026-01-21T16:23:09.315Z" },
3071
- ]
3072
-
3073
- [[package]]
3074
- name = "torchao"
3075
- version = "0.17.0"
3076
- source = { registry = "https://pypi.org/simple" }
3077
- wheels = [
3078
- { url = "https://files.pythonhosted.org/packages/32/fe/a4036a8e80fa800c92dbcbf75f541cd4c106248b6b579db6dab1800f616a/torchao-0.17.0-cp310-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:87a418ce0ec064a821ceab83c921b501acef0ce9a6ccd1be358fcd16c3ae8c58", size = 3206172, upload-time = "2026-03-30T22:25:52.974Z" },
3079
- { url = "https://files.pythonhosted.org/packages/c9/37/ef37ca885265e5f79a168616767dd416a3cea1cc3b28bb6b503ce4a5b652/torchao-0.17.0-py3-none-any.whl", hash = "sha256:02eba449036715b9ae784fbaa1a6f97994bb7b0421ce92d1d5d1c08e5bd6d349", size = 1200680, upload-time = "2026-03-30T22:25:54.457Z" },
3080
- ]
3081
-
3082
- [[package]]
3083
- name = "torchvision"
3084
- version = "0.25.0"
3085
- source = { registry = "https://pypi.org/simple" }
3086
- dependencies = [
3087
- { name = "numpy" },
3088
- { name = "pillow" },
3089
- { name = "torch" },
3090
- ]
3091
- wheels = [
3092
- { url = "https://files.pythonhosted.org/packages/56/3a/6ea0d73f49a9bef38a1b3a92e8dd455cea58470985d25635beab93841748/torchvision-0.25.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c2abe430c90b1d5e552680037d68da4eb80a5852ebb1c811b2b89d299b10573b", size = 1874920, upload-time = "2026-01-21T16:27:45.348Z" },
3093
- { url = "https://files.pythonhosted.org/packages/51/f8/c0e1ef27c66e15406fece94930e7d6feee4cb6374bbc02d945a630d6426e/torchvision-0.25.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:b75deafa2dfea3e2c2a525559b04783515e3463f6e830cb71de0fb7ea36fe233", size = 2344556, upload-time = "2026-01-21T16:27:40.125Z" },
3094
- { url = "https://files.pythonhosted.org/packages/68/2f/f24b039169db474e8688f649377de082a965fbf85daf4e46c44412f1d15a/torchvision-0.25.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:f25aa9e380865b11ea6e9d99d84df86b9cc959f1a007cd966fc6f1ab2ed0e248", size = 8072351, upload-time = "2026-01-21T16:27:21.074Z" },
3095
- { url = "https://files.pythonhosted.org/packages/ad/16/8f650c2e288977cf0f8f85184b90ee56ed170a4919347fc74ee99286ed6f/torchvision-0.25.0-cp312-cp312-win_amd64.whl", hash = "sha256:f9c55ae8d673ab493325d1267cbd285bb94d56f99626c00ac4644de32a59ede3", size = 4303059, upload-time = "2026-01-21T16:27:11.08Z" },
3096
- { url = "https://files.pythonhosted.org/packages/f5/5b/1562a04a6a5a4cf8cf40016a0cdeda91ede75d6962cff7f809a85ae966a5/torchvision-0.25.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:24e11199e4d84ba9c5ee7825ebdf1cd37ce8deec225117f10243cae984ced3ec", size = 1874918, upload-time = "2026-01-21T16:27:39.02Z" },
3097
- { url = "https://files.pythonhosted.org/packages/36/b1/3d6c42f62c272ce34fcce609bb8939bdf873dab5f1b798fd4e880255f129/torchvision-0.25.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:5f271136d2d2c0b7a24c5671795c6e4fd8da4e0ea98aeb1041f62bc04c4370ef", size = 2309106, upload-time = "2026-01-21T16:27:30.624Z" },
3098
- { url = "https://files.pythonhosted.org/packages/c7/60/59bb9c8b67cce356daeed4cb96a717caa4f69c9822f72e223a0eae7a9bd9/torchvision-0.25.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:855c0dc6d37f462482da7531c6788518baedca1e0847f3df42a911713acdfe52", size = 8071522, upload-time = "2026-01-21T16:27:29.392Z" },
3099
- { url = "https://files.pythonhosted.org/packages/32/a5/9a9b1de0720f884ea50dbf9acb22cbe5312e51d7b8c4ac6ba9b51efd9bba/torchvision-0.25.0-cp313-cp313-win_amd64.whl", hash = "sha256:cef0196be31be421f6f462d1e9da1101be7332d91984caa6f8022e6c78a5877f", size = 4321911, upload-time = "2026-01-21T16:27:35.195Z" },
3100
- { url = "https://files.pythonhosted.org/packages/52/99/dca81ed21ebaeff2b67cc9f815a20fdaa418b69f5f9ea4c6ed71721470db/torchvision-0.25.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a8f8061284395ce31bcd460f2169013382ccf411148ceb2ee38e718e9860f5a7", size = 1896209, upload-time = "2026-01-21T16:27:32.159Z" },
3101
- { url = "https://files.pythonhosted.org/packages/28/cc/2103149761fdb4eaed58a53e8437b2d716d48f05174fab1d9fcf1e2a2244/torchvision-0.25.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:146d02c9876858420adf41f3189fe90e3d6a409cbfa65454c09f25fb33bf7266", size = 2310735, upload-time = "2026-01-21T16:27:22.327Z" },
3102
- { url = "https://files.pythonhosted.org/packages/76/ad/f4c985ad52ddd3b22711c588501be1b330adaeaf6850317f66751711b78c/torchvision-0.25.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:c4d395cb2c4a2712f6eb93a34476cdf7aae74bb6ea2ea1917f858e96344b00aa", size = 8089557, upload-time = "2026-01-21T16:27:27.666Z" },
3103
- { url = "https://files.pythonhosted.org/packages/63/cc/0ea68b5802e5e3c31f44b307e74947bad5a38cc655231d845534ed50ddb8/torchvision-0.25.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5e6b449e9fa7d642142c0e27c41e5a43b508d57ed8e79b7c0a0c28652da8678c", size = 4344260, upload-time = "2026-01-21T16:27:17.018Z" },
3104
  ]
3105
 
3106
  [[package]]
@@ -3117,23 +3099,22 @@ wheels = [
3117
 
3118
  [[package]]
3119
  name = "transformers"
3120
- version = "4.56.2"
3121
  source = { registry = "https://pypi.org/simple" }
3122
  dependencies = [
3123
- { name = "filelock" },
3124
  { name = "huggingface-hub" },
3125
  { name = "numpy" },
3126
  { name = "packaging" },
3127
  { name = "pyyaml" },
3128
  { name = "regex" },
3129
- { name = "requests" },
3130
  { name = "safetensors" },
3131
  { name = "tokenizers" },
3132
  { name = "tqdm" },
 
3133
  ]
3134
- sdist = { url = "https://files.pythonhosted.org/packages/e5/82/0bcfddd134cdf53440becb5e738257cc3cf34cf229d63b57bfd288e6579f/transformers-4.56.2.tar.gz", hash = "sha256:5e7c623e2d7494105c726dd10f6f90c2c99a55ebe86eef7233765abd0cb1c529", size = 9844296, upload-time = "2025-09-19T15:16:26.778Z" }
3135
  wheels = [
3136
- { url = "https://files.pythonhosted.org/packages/70/26/2591b48412bde75e33bfd292034103ffe41743cacd03120e3242516cd143/transformers-4.56.2-py3-none-any.whl", hash = "sha256:79c03d0e85b26cb573c109ff9eafa96f3c8d4febfd8a0774e8bba32702dd6dde", size = 11608055, upload-time = "2025-09-19T15:16:23.736Z" },
3137
  ]
3138
 
3139
  [[package]]
@@ -3149,40 +3130,25 @@ wheels = [
3149
  { url = "https://files.pythonhosted.org/packages/35/f8/9c66bfc55361ec6d0e4040a0337fb5924ceb23de4648b8a81ae9d33b2b38/triton-3.6.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d002e07d7180fd65e622134fbd980c9a3d4211fb85224b56a0a0efbd422ab72f", size = 188400296, upload-time = "2026-01-20T16:00:56.042Z" },
3150
  ]
3151
 
3152
- [[package]]
3153
- name = "triton-windows"
3154
- version = "3.6.0.post26"
3155
- source = { registry = "https://pypi.org/simple" }
3156
- wheels = [
3157
- { url = "https://files.pythonhosted.org/packages/62/1e/8d9814e67ba3f20094cf3c69e7815a491f20beb86469a647550ba86728b0/triton_windows-3.6.0.post26-cp312-cp312-win_amd64.whl", hash = "sha256:189d8c57911aa9d2ff983a715e5c967b325f576307db60924cab22b501a36515", size = 47402104, upload-time = "2026-03-10T02:51:40.997Z" },
3158
- { url = "https://files.pythonhosted.org/packages/2e/69/7579a5da5d8c5372711bb4b99a185ad35eae6c7549d85b9f75171e06832b/triton_windows-3.6.0.post26-cp313-cp313-win_amd64.whl", hash = "sha256:033f3d50c6a0e4539a3ccfa042304dbf76bf79155f382f9c09d010323d5a9a32", size = 47402101, upload-time = "2026-03-10T02:51:47.669Z" },
3159
- ]
3160
-
3161
  [[package]]
3162
  name = "trl"
3163
- version = "0.29.1"
3164
  source = { registry = "https://pypi.org/simple" }
3165
  dependencies = [
3166
  { name = "accelerate" },
3167
  { name = "datasets" },
 
3168
  { name = "packaging" },
3169
  { name = "transformers" },
3170
  ]
3171
- sdist = { url = "https://files.pythonhosted.org/packages/3f/01/87b09019a9be4c73f8fb07ac9db1dccbeb78743fc17b6f3175ebe0a31a70/trl-0.29.1.tar.gz", hash = "sha256:12df5aa22d1deb26942cafdf4cfd75f53d7141942e70c4dc0966687a3617813b", size = 453604, upload-time = "2026-03-20T03:43:34.578Z" }
3172
  wheels = [
3173
- { url = "https://files.pythonhosted.org/packages/c7/3b/33226ae50a36f718e1107ece0c91b016457bb4b956d1cb5bd7078c04de9c/trl-0.29.1-py3-none-any.whl", hash = "sha256:f9490cd1af93f3dce1cfdfe0fa1de108dbc46a2f6c2f90485cc2b4021c43eef3", size = 530959, upload-time = "2026-03-20T03:43:33.02Z" },
3174
  ]
3175
 
3176
- [[package]]
3177
- name = "typeguard"
3178
- version = "4.5.1"
3179
- source = { registry = "https://pypi.org/simple" }
3180
- dependencies = [
3181
- { name = "typing-extensions" },
3182
- ]
3183
- sdist = { url = "https://files.pythonhosted.org/packages/2b/e8/66e25efcc18542d58706ce4e50415710593721aae26e794ab1dec34fb66f/typeguard-4.5.1.tar.gz", hash = "sha256:f6f8ecbbc819c9bc749983cc67c02391e16a9b43b8b27f15dc70ed7c4a007274", size = 80121, upload-time = "2026-02-19T16:09:03.392Z" }
3184
- wheels = [
3185
- { url = "https://files.pythonhosted.org/packages/91/88/b55b3117287a8540b76dbdd87733808d4d01c8067a3b339408c250bb3600/typeguard-4.5.1-py3-none-any.whl", hash = "sha256:44d2bf329d49a244110a090b55f5f91aa82d9a9834ebfd30bcc73651e4a8cc40", size = 36745, upload-time = "2026-02-19T16:09:01.6Z" },
3186
  ]
3187
 
3188
  [[package]]
@@ -3221,20 +3187,6 @@ wheels = [
3221
  { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" },
3222
  ]
3223
 
3224
- [[package]]
3225
- name = "tyro"
3226
- version = "1.0.13"
3227
- source = { registry = "https://pypi.org/simple" }
3228
- dependencies = [
3229
- { name = "docstring-parser" },
3230
- { name = "typeguard" },
3231
- { name = "typing-extensions" },
3232
- ]
3233
- sdist = { url = "https://files.pythonhosted.org/packages/24/d6/7126f9e7de139632134d59b5d1972e93c610ee2cb13829e8f4f48f6613cb/tyro-1.0.13.tar.gz", hash = "sha256:731a90c9836b77fffe7c3fa0477ef2d3b6fa91252ddc0bb4d32dadd4fcc143d4", size = 489479, upload-time = "2026-04-14T18:21:52.888Z" }
3234
- wheels = [
3235
- { url = "https://files.pythonhosted.org/packages/93/4f/c43a0a8f0c66fd40a1d6cc47332a5a1d1043e9b331f7070ea701b91a7598/tyro-1.0.13-py3-none-any.whl", hash = "sha256:a0bdb8462c551dd84fc00a76916ce4d37e879c84eefaf34e2165312407cc6c09", size = 185221, upload-time = "2026-04-14T18:21:54.328Z" },
3236
- ]
3237
-
3238
  [[package]]
3239
  name = "tzdata"
3240
  version = "2026.1"
@@ -3253,75 +3205,6 @@ wheels = [
3253
  { url = "https://files.pythonhosted.org/packages/11/e1/7ec67882ad8fc9f86384bef6421fa252c9cbe5744f8df6ce77afc9eca1f5/uncalled_for-0.3.1-py3-none-any.whl", hash = "sha256:074cdc92da8356278f93d0ded6f2a66dd883dbecaf9bc89437646ee2289cc200", size = 11361, upload-time = "2026-04-07T13:05:05.341Z" },
3254
  ]
3255
 
3256
- [[package]]
3257
- name = "unsloth"
3258
- version = "2025.9.9"
3259
- source = { registry = "https://pypi.org/simple" }
3260
- dependencies = [
3261
- { name = "accelerate" },
3262
- { name = "bitsandbytes" },
3263
- { name = "datasets" },
3264
- { name = "diffusers" },
3265
- { name = "hf-transfer" },
3266
- { name = "huggingface-hub" },
3267
- { name = "numpy" },
3268
- { name = "packaging" },
3269
- { name = "peft" },
3270
- { name = "protobuf" },
3271
- { name = "psutil" },
3272
- { name = "sentencepiece" },
3273
- { name = "torch" },
3274
- { name = "torchvision" },
3275
- { name = "tqdm" },
3276
- { name = "transformers" },
3277
- { name = "triton", marker = "sys_platform == 'linux'" },
3278
- { name = "triton-windows", marker = "sys_platform == 'win32'" },
3279
- { name = "trl" },
3280
- { name = "tyro" },
3281
- { name = "unsloth-zoo" },
3282
- { name = "wheel" },
3283
- { name = "xformers" },
3284
- ]
3285
- sdist = { url = "https://files.pythonhosted.org/packages/52/22/f68af71437b0856c3e854c4a663e7735020237aff1b23aec15ebb7146681/unsloth-2025.9.9.tar.gz", hash = "sha256:f1bc5181ca315808f9de0ff08396121d094df2383b29d294c5555f9e81486ca1", size = 277610, upload-time = "2025-09-26T14:14:25.455Z" }
3286
- wheels = [
3287
- { url = "https://files.pythonhosted.org/packages/78/58/0d8b39e8d49912fcc329931403103a963ad4ea92e9332d7b91361f625f0c/unsloth-2025.9.9-py3-none-any.whl", hash = "sha256:01ac19c852ff4684d06c3754c0694a2158e3f0d57b1daa69571e9c9cc4b043f8", size = 317157, upload-time = "2025-09-26T14:14:21.758Z" },
3288
- ]
3289
-
3290
- [[package]]
3291
- name = "unsloth-zoo"
3292
- version = "2025.9.12"
3293
- source = { registry = "https://pypi.org/simple" }
3294
- dependencies = [
3295
- { name = "accelerate" },
3296
- { name = "cut-cross-entropy" },
3297
- { name = "datasets" },
3298
- { name = "hf-transfer" },
3299
- { name = "huggingface-hub" },
3300
- { name = "msgspec" },
3301
- { name = "numpy" },
3302
- { name = "packaging" },
3303
- { name = "peft" },
3304
- { name = "pillow" },
3305
- { name = "protobuf" },
3306
- { name = "psutil" },
3307
- { name = "regex" },
3308
- { name = "sentencepiece" },
3309
- { name = "torch" },
3310
- { name = "torchao" },
3311
- { name = "tqdm" },
3312
- { name = "transformers" },
3313
- { name = "triton", marker = "sys_platform == 'linux'" },
3314
- { name = "triton-windows", marker = "sys_platform == 'win32'" },
3315
- { name = "trl" },
3316
- { name = "typing-extensions" },
3317
- { name = "tyro" },
3318
- { name = "wheel" },
3319
- ]
3320
- sdist = { url = "https://files.pythonhosted.org/packages/9a/a5/3c2f8cd8ade5d6c1ad3c686bf0be109904e45e701e0ab7561c20ac713826/unsloth_zoo-2025.9.12.tar.gz", hash = "sha256:9a9ca709c739d998cb2b79a2dee92b169375ee232ab0cfe5ed47c8d531e04d9a", size = 227231, upload-time = "2025-09-26T15:24:04.67Z" }
3321
- wheels = [
3322
- { url = "https://files.pythonhosted.org/packages/a2/37/ca3503aa67effb62f4ab85c7b5574f3414a6909d5b8bc1ff31b1d3801f1a/unsloth_zoo-2025.9.12-py3-none-any.whl", hash = "sha256:cc611b20bb29ea81312dd45e07a537fa2099b0b18a20492d9666641d60833fab", size = 247744, upload-time = "2025-09-26T15:24:02.52Z" },
3323
- ]
3324
-
3325
  [[package]]
3326
  name = "urllib3"
3327
  version = "2.6.3"
@@ -3419,29 +3302,15 @@ wheels = [
3419
  ]
3420
 
3421
  [[package]]
3422
- name = "wheel"
3423
- version = "0.46.3"
3424
  source = { registry = "https://pypi.org/simple" }
3425
  dependencies = [
3426
- { name = "packaging" },
3427
- ]
3428
- sdist = { url = "https://files.pythonhosted.org/packages/89/24/a2eb353a6edac9a0303977c4cb048134959dd2a51b48a269dfc9dde00c8a/wheel-0.46.3.tar.gz", hash = "sha256:e3e79874b07d776c40bd6033f8ddf76a7dad46a7b8aa1b2787a83083519a1803", size = 60605, upload-time = "2026-01-22T12:39:49.136Z" }
3429
- wheels = [
3430
- { url = "https://files.pythonhosted.org/packages/87/22/b76d483683216dde3d67cba61fb2444be8d5be289bf628c13fc0fd90e5f9/wheel-0.46.3-py3-none-any.whl", hash = "sha256:4b399d56c9d9338230118d705d9737a2a468ccca63d5e813e2a4fc7815d8bc4d", size = 30557, upload-time = "2026-01-22T12:39:48.099Z" },
3431
- ]
3432
-
3433
- [[package]]
3434
- name = "xformers"
3435
- version = "0.0.35"
3436
- source = { registry = "https://pypi.org/simple" }
3437
- dependencies = [
3438
- { name = "numpy" },
3439
- { name = "torch" },
3440
  ]
3441
- sdist = { url = "https://files.pythonhosted.org/packages/de/5a/6e27734bd793adc44d0b8d294e67cfacf4ec590572c1aef51d683fc7a791/xformers-0.0.35.tar.gz", hash = "sha256:f7fc183a58e4bf0e2ae339a18fb1b1d4a37854c0f2545b4f360fef001646ab76", size = 4258182, upload-time = "2026-02-20T20:33:05.417Z" }
3442
  wheels = [
3443
- { url = "https://files.pythonhosted.org/packages/a4/85/6d71f9b16f2ac647877e66ed4af723b3fbd477806ab8b8a89d39a362b85f/xformers-0.0.35-py39-none-manylinux_2_28_x86_64.whl", hash = "sha256:ccc73c7db9890224ab05f5fb60e2034f9e6c8672a10be0cf00e95cbbae3eda7c", size = 3264751, upload-time = "2026-02-20T20:33:02.444Z" },
3444
- { url = "https://files.pythonhosted.org/packages/49/0b/88c39c128a05d5b553a67cb9c4c3fc32eefb91f836f838befab9e78f8364/xformers-0.0.35-py39-none-win_amd64.whl", hash = "sha256:57381ce3cbb79b593e6b62cb20a937885345fad2796de2aa6fbb66c033601179", size = 2638618, upload-time = "2026-02-20T20:33:04.104Z" },
3445
  ]
3446
 
3447
  [[package]]
 
10
  "python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32'",
11
  ]
12
 
13
+ [[package]]
14
+ name = "absl-py"
15
+ version = "2.4.0"
16
+ source = { registry = "https://pypi.org/simple" }
17
+ sdist = { url = "https://files.pythonhosted.org/packages/64/c7/8de93764ad66968d19329a7e0c147a2bb3c7054c554d4a119111b8f9440f/absl_py-2.4.0.tar.gz", hash = "sha256:8c6af82722b35cf71e0f4d1d47dcaebfff286e27110a99fc359349b247dfb5d4", size = 116543, upload-time = "2026-01-28T10:17:05.322Z" }
18
+ wheels = [
19
+ { url = "https://files.pythonhosted.org/packages/18/a6/907a406bb7d359e6a63f99c313846d9eec4f7e6f7437809e03aa00fa3074/absl_py-2.4.0-py3-none-any.whl", hash = "sha256:88476fd881ca8aab94ffa78b7b6c632a782ab3ba1cd19c9bd423abc4fb4cd28d", size = 135750, upload-time = "2026-01-28T10:17:04.19Z" },
20
+ ]
21
+
22
  [[package]]
23
  name = "accelerate"
24
  version = "1.13.0"
 
539
 
540
  [[package]]
541
  name = "cuda-bindings"
542
+ version = "13.2.0"
543
  source = { registry = "https://pypi.org/simple" }
544
  dependencies = [
545
  { name = "cuda-pathfinder", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
546
  ]
547
  wheels = [
548
+ { url = "https://files.pythonhosted.org/packages/52/c8/b2589d68acf7e3d63e2be330b84bc25712e97ed799affbca7edd7eae25d6/cuda_bindings-13.2.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e865447abfb83d6a98ad5130ed3c70b1fc295ae3eeee39fd07b4ddb0671b6788", size = 5722404, upload-time = "2026-03-11T00:12:44.041Z" },
549
+ { url = "https://files.pythonhosted.org/packages/1f/92/f899f7bbb5617bb65ec52a6eac1e9a1447a86b916c4194f8a5001b8cde0c/cuda_bindings-13.2.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:46d8776a55d6d5da9dd6e9858fba2efcda2abe6743871dee47dd06eb8cb6d955", size = 6320619, upload-time = "2026-03-11T00:12:45.939Z" },
550
+ { url = "https://files.pythonhosted.org/packages/df/93/eef988860a3ca985f82c4f3174fc0cdd94e07331ba9a92e8e064c260337f/cuda_bindings-13.2.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6629ca2df6f795b784752409bcaedbd22a7a651b74b56a165ebc0c9dcbd504d0", size = 5614610, upload-time = "2026-03-11T00:12:50.337Z" },
551
+ { url = "https://files.pythonhosted.org/packages/18/23/6db3aba46864aee357ab2415135b3fe3da7e9f1fa0221fa2a86a5968099c/cuda_bindings-13.2.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7dca0da053d3b4cc4869eff49c61c03f3c5dbaa0bcd712317a358d5b8f3f385d", size = 6149914, upload-time = "2026-03-11T00:12:52.374Z" },
552
  ]
553
 
554
  [[package]]
 
560
  ]
561
 
562
  [[package]]
563
+ name = "cuda-toolkit"
564
+ version = "13.0.2"
565
  source = { registry = "https://pypi.org/simple" }
 
 
 
 
 
566
  wheels = [
567
+ { url = "https://files.pythonhosted.org/packages/57/b2/453099f5f3b698d7d0eab38916aac44c7f76229f451709e2eb9db6615dcd/cuda_toolkit-13.0.2-py2.py3-none-any.whl", hash = "sha256:b198824cf2f54003f50d64ada3a0f184b42ca0846c1c94192fa269ecd97a66eb", size = 2364, upload-time = "2025-12-19T23:24:07.328Z" },
568
+ ]
569
+
570
+ [package.optional-dependencies]
571
+ cublas = [
572
+ { name = "nvidia-cublas", marker = "sys_platform == 'linux'" },
573
+ ]
574
+ cudart = [
575
+ { name = "nvidia-cuda-runtime", marker = "sys_platform == 'linux'" },
576
+ ]
577
+ cufft = [
578
+ { name = "nvidia-cufft", marker = "sys_platform == 'linux'" },
579
+ ]
580
+ cufile = [
581
+ { name = "nvidia-cufile", marker = "sys_platform == 'linux'" },
582
+ ]
583
+ cupti = [
584
+ { name = "nvidia-cuda-cupti", marker = "sys_platform == 'linux'" },
585
+ ]
586
+ curand = [
587
+ { name = "nvidia-curand", marker = "sys_platform == 'linux'" },
588
+ ]
589
+ cusolver = [
590
+ { name = "nvidia-cusolver", marker = "sys_platform == 'linux'" },
591
+ ]
592
+ cusparse = [
593
+ { name = "nvidia-cusparse", marker = "sys_platform == 'linux'" },
594
+ ]
595
+ nvjitlink = [
596
+ { name = "nvidia-nvjitlink", marker = "sys_platform == 'linux'" },
597
+ ]
598
+ nvrtc = [
599
+ { name = "nvidia-cuda-nvrtc", marker = "sys_platform == 'linux'" },
600
+ ]
601
+ nvtx = [
602
+ { name = "nvidia-nvtx", marker = "sys_platform == 'linux'" },
603
  ]
604
 
605
  [[package]]
 
628
 
629
  [[package]]
630
  name = "datasets"
631
+ version = "4.8.4"
632
  source = { registry = "https://pypi.org/simple" }
633
  dependencies = [
634
  { name = "dill" },
635
  { name = "filelock" },
636
  { name = "fsspec", extra = ["http"] },
637
+ { name = "httpx" },
638
  { name = "huggingface-hub" },
639
  { name = "multiprocess" },
640
  { name = "numpy" },
 
646
  { name = "tqdm" },
647
  { name = "xxhash" },
648
  ]
649
+ sdist = { url = "https://files.pythonhosted.org/packages/22/22/73e46ac7a8c25e7ef0b3bd6f10da3465021d90219a32eb0b4d2afea4c56e/datasets-4.8.4.tar.gz", hash = "sha256:a1429ed853275ce7943a01c6d2e25475b4501eb758934362106a280470df3a52", size = 604382, upload-time = "2026-03-23T14:21:17.987Z" }
650
  wheels = [
651
+ { url = "https://files.pythonhosted.org/packages/b0/e5/247d094108e42ac26363ab8dc57f168840cf7c05774b40ffeb0d78868fcc/datasets-4.8.4-py3-none-any.whl", hash = "sha256:cdc8bee4698e549d78bf1fed6aea2eebc760b22b084f07e6fc020c6577a6ce6d", size = 526991, upload-time = "2026-03-23T14:21:15.89Z" },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
652
  ]
653
 
654
  [[package]]
 
970
  { url = "https://files.pythonhosted.org/packages/28/27/3d6dcadc8a3214d8522c1e7f6a19554e33659be44546d44a2f7572ac7d2a/groovy-0.1.2-py3-none-any.whl", hash = "sha256:7f7975bab18c729a257a8b1ae9dcd70b7cafb1720481beae47719af57c35fa64", size = 14090, upload-time = "2025-02-28T20:24:55.152Z" },
971
  ]
972
 
973
+ [[package]]
974
+ name = "grpcio"
975
+ version = "1.80.0"
976
+ source = { registry = "https://pypi.org/simple" }
977
+ dependencies = [
978
+ { name = "typing-extensions" },
979
+ ]
980
+ sdist = { url = "https://files.pythonhosted.org/packages/b7/48/af6173dbca4454f4637a4678b67f52ca7e0c1ed7d5894d89d434fecede05/grpcio-1.80.0.tar.gz", hash = "sha256:29aca15edd0688c22ba01d7cc01cb000d72b2033f4a3c72a81a19b56fd143257", size = 12978905, upload-time = "2026-03-30T08:49:10.502Z" }
981
+ wheels = [
982
+ { url = "https://files.pythonhosted.org/packages/5c/e8/a2b749265eb3415abc94f2e619bbd9e9707bebdda787e61c593004ec927a/grpcio-1.80.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:c624cc9f1008361014378c9d776de7182b11fe8b2e5a81bc69f23a295f2a1ad0", size = 6015616, upload-time = "2026-03-30T08:47:13.428Z" },
983
+ { url = "https://files.pythonhosted.org/packages/3e/97/b1282161a15d699d1e90c360df18d19165a045ce1c343c7f313f5e8a0b77/grpcio-1.80.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:f49eddcac43c3bf350c0385366a58f36bed8cc2c0ec35ef7b74b49e56552c0c2", size = 12014204, upload-time = "2026-03-30T08:47:15.873Z" },
984
+ { url = "https://files.pythonhosted.org/packages/6e/5e/d319c6e997b50c155ac5a8cb12f5173d5b42677510e886d250d50264949d/grpcio-1.80.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d334591df610ab94714048e0d5b4f3dd5ad1bee74dfec11eee344220077a79de", size = 6563866, upload-time = "2026-03-30T08:47:18.588Z" },
985
+ { url = "https://files.pythonhosted.org/packages/ae/f6/fdd975a2cb4d78eb67769a7b3b3830970bfa2e919f1decf724ae4445f42c/grpcio-1.80.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:0cb517eb1d0d0aaf1d87af7cc5b801d686557c1d88b2619f5e31fab3c2315921", size = 7273060, upload-time = "2026-03-30T08:47:21.113Z" },
986
+ { url = "https://files.pythonhosted.org/packages/db/f0/a3deb5feba60d9538a962913e37bd2e69a195f1c3376a3dd44fe0427e996/grpcio-1.80.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4e78c4ac0d97dc2e569b2f4bcbbb447491167cb358d1a389fc4af71ab6f70411", size = 6782121, upload-time = "2026-03-30T08:47:23.827Z" },
987
+ { url = "https://files.pythonhosted.org/packages/ca/84/36c6dcfddc093e108141f757c407902a05085e0c328007cb090d56646cdf/grpcio-1.80.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2ed770b4c06984f3b47eb0517b1c69ad0b84ef3f40128f51448433be904634cd", size = 7383811, upload-time = "2026-03-30T08:47:26.517Z" },
988
+ { url = "https://files.pythonhosted.org/packages/7c/ef/f3a77e3dc5b471a0ec86c564c98d6adfa3510d38f8ee99010410858d591e/grpcio-1.80.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:256507e2f524092f1473071a05e65a5b10d84b82e3ff24c5b571513cfaa61e2f", size = 8393860, upload-time = "2026-03-30T08:47:29.439Z" },
989
+ { url = "https://files.pythonhosted.org/packages/9b/8d/9d4d27ed7f33d109c50d6b5ce578a9914aa68edab75d65869a17e630a8d1/grpcio-1.80.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9a6284a5d907c37db53350645567c522be314bac859a64a7a5ca63b77bb7958f", size = 7830132, upload-time = "2026-03-30T08:47:33.254Z" },
990
+ { url = "https://files.pythonhosted.org/packages/14/e4/9990b41c6d7a44e1e9dee8ac11d7a9802ba1378b40d77468a7761d1ad288/grpcio-1.80.0-cp312-cp312-win32.whl", hash = "sha256:c71309cfce2f22be26aa4a847357c502db6c621f1a49825ae98aa0907595b193", size = 4140904, upload-time = "2026-03-30T08:47:35.319Z" },
991
+ { url = "https://files.pythonhosted.org/packages/2f/2c/296f6138caca1f4b92a31ace4ae1b87dab692fc16a7a3417af3bb3c805bf/grpcio-1.80.0-cp312-cp312-win_amd64.whl", hash = "sha256:9fe648599c0e37594c4809d81a9e77bd138cc82eb8baa71b6a86af65426723ff", size = 4880944, upload-time = "2026-03-30T08:47:37.831Z" },
992
+ { url = "https://files.pythonhosted.org/packages/2f/3a/7c3c25789e3f069e581dc342e03613c5b1cb012c4e8c7d9d5cf960a75856/grpcio-1.80.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:e9e408fc016dffd20661f0126c53d8a31c2821b5c13c5d67a0f5ed5de93319ad", size = 6017243, upload-time = "2026-03-30T08:47:40.075Z" },
993
+ { url = "https://files.pythonhosted.org/packages/04/19/21a9806eb8240e174fd1ab0cd5b9aa948bb0e05c2f2f55f9d5d7405e6d08/grpcio-1.80.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:92d787312e613754d4d8b9ca6d3297e69994a7912a32fa38c4c4e01c272974b0", size = 12010840, upload-time = "2026-03-30T08:47:43.11Z" },
994
+ { url = "https://files.pythonhosted.org/packages/18/3a/23347d35f76f639e807fb7a36fad3068aed100996849a33809591f26eca6/grpcio-1.80.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8ac393b58aa16991a2f1144ec578084d544038c12242da3a215966b512904d0f", size = 6567644, upload-time = "2026-03-30T08:47:46.806Z" },
995
+ { url = "https://files.pythonhosted.org/packages/ff/40/96e07ecb604a6a67ae6ab151e3e35b132875d98bc68ec65f3e5ab3e781d7/grpcio-1.80.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:68e5851ac4b9afe07e7f84483803ad167852570d65326b34d54ca560bfa53fb6", size = 7277830, upload-time = "2026-03-30T08:47:49.643Z" },
996
+ { url = "https://files.pythonhosted.org/packages/9b/e2/da1506ecea1f34a5e365964644b35edef53803052b763ca214ba3870c856/grpcio-1.80.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:873ff5d17d68992ef6605330127425d2fc4e77e612fa3c3e0ed4e668685e3140", size = 6783216, upload-time = "2026-03-30T08:47:52.817Z" },
997
+ { url = "https://files.pythonhosted.org/packages/44/83/3b20ff58d0c3b7f6caaa3af9a4174d4023701df40a3f39f7f1c8e7c48f9d/grpcio-1.80.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2bea16af2750fd0a899bf1abd9022244418b55d1f37da2202249ba4ba673838d", size = 7385866, upload-time = "2026-03-30T08:47:55.687Z" },
998
+ { url = "https://files.pythonhosted.org/packages/47/45/55c507599c5520416de5eefecc927d6a0d7af55e91cfffb2e410607e5744/grpcio-1.80.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba0db34f7e1d803a878284cd70e4c63cb6ae2510ba51937bf8f45ba997cefcf7", size = 8391602, upload-time = "2026-03-30T08:47:58.303Z" },
999
+ { url = "https://files.pythonhosted.org/packages/10/bb/dd06f4c24c01db9cf11341b547d0a016b2c90ed7dbbb086a5710df7dd1d7/grpcio-1.80.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8eb613f02d34721f1acf3626dfdb3545bd3c8505b0e52bf8b5710a28d02e8aa7", size = 7826752, upload-time = "2026-03-30T08:48:01.311Z" },
1000
+ { url = "https://files.pythonhosted.org/packages/f9/1e/9d67992ba23371fd63d4527096eb8c6b76d74d52b500df992a3343fd7251/grpcio-1.80.0-cp313-cp313-win32.whl", hash = "sha256:93b6f823810720912fd131f561f91f5fed0fda372b6b7028a2681b8194d5d294", size = 4142310, upload-time = "2026-03-30T08:48:04.594Z" },
1001
+ { url = "https://files.pythonhosted.org/packages/cf/e6/283326a27da9e2c3038bc93eeea36fb118ce0b2d03922a9cda6688f53c5b/grpcio-1.80.0-cp313-cp313-win_amd64.whl", hash = "sha256:e172cf795a3ba5246d3529e4d34c53db70e888fa582a8ffebd2e6e48bc0cba50", size = 4882833, upload-time = "2026-03-30T08:48:07.363Z" },
1002
+ ]
1003
+
1004
  [[package]]
1005
  name = "h11"
1006
  version = "0.16.0"
 
1023
  { url = "https://files.pythonhosted.org/packages/30/2d/afff2ee87e75d8eb85c92bb8cf0e15b05c23c2ebd8fd8dec781d8601ed7f/hf_gradio-0.4.1-py3-none-any.whl", hash = "sha256:76b8cb8be6abe62d74c1ad2d35b42f0629db89aa9e1a8d033cecfe7c856eeab3", size = 4482, upload-time = "2026-04-17T19:53:31.827Z" },
1024
  ]
1025
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1026
  [[package]]
1027
  name = "hf-xet"
1028
  version = "1.4.3"
 
1086
 
1087
  [[package]]
1088
  name = "huggingface-hub"
1089
+ version = "1.12.0"
1090
  source = { registry = "https://pypi.org/simple" }
1091
  dependencies = [
1092
  { name = "filelock" },
1093
  { name = "fsspec" },
1094
+ { name = "hf-xet", marker = "platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'" },
1095
+ { name = "httpx" },
1096
  { name = "packaging" },
1097
  { name = "pyyaml" },
 
1098
  { name = "tqdm" },
1099
+ { name = "typer" },
1100
  { name = "typing-extensions" },
1101
  ]
1102
+ sdist = { url = "https://files.pythonhosted.org/packages/56/52/1b54cb569509c725a32c1315261ac9fd0e6b91bbbf74d86fca10d3376164/huggingface_hub-1.12.0.tar.gz", hash = "sha256:7c3fe85e24b652334e5d456d7a812cd9a071e75630fac4365d9165ab5e4a34b6", size = 763091, upload-time = "2026-04-24T13:32:08.674Z" }
1103
  wheels = [
1104
+ { url = "https://files.pythonhosted.org/packages/7e/2b/ef03ddb96bd1123503c2bd6932001020292deea649e9bf4caa2cb65a85bf/huggingface_hub-1.12.0-py3-none-any.whl", hash = "sha256:d74939969585ee35748bd66de09baf84099d461bda7287cd9043bfb99b0e424d", size = 646806, upload-time = "2026-04-24T13:32:06.717Z" },
1105
  ]
1106
 
1107
  [[package]]
 
1233
  { url = "https://files.pythonhosted.org/packages/da/e9/1f9ada30cef7b05e74bb06f52127e7a724976c225f46adb65c37b1dadfb6/jiter-0.14.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67f00d94b281174144d6532a04b66a12cb866cbdc47c3af3bfe2973677f9861a", size = 349613, upload-time = "2026-04-10T14:28:40.066Z" },
1234
  ]
1235
 
1236
+ [[package]]
1237
+ name = "jmespath"
1238
+ version = "1.1.0"
1239
+ source = { registry = "https://pypi.org/simple" }
1240
+ sdist = { url = "https://files.pythonhosted.org/packages/d3/59/322338183ecda247fb5d1763a6cbe46eff7222eaeebafd9fa65d4bf5cb11/jmespath-1.1.0.tar.gz", hash = "sha256:472c87d80f36026ae83c6ddd0f1d05d4e510134ed462851fd5f754c8c3cbb88d", size = 27377, upload-time = "2026-01-22T16:35:26.279Z" }
1241
+ wheels = [
1242
+ { url = "https://files.pythonhosted.org/packages/14/2f/967ba146e6d58cf6a652da73885f52fc68001525b4197effc174321d70b4/jmespath-1.1.0-py3-none-any.whl", hash = "sha256:a5663118de4908c91729bea0acadca56526eb2698e83de10cd116ae0f4e97c64", size = 20419, upload-time = "2026-01-22T16:35:24.919Z" },
1243
+ ]
1244
+
1245
  [[package]]
1246
  name = "joserfc"
1247
  version = "1.6.4"
 
1411
  { url = "https://files.pythonhosted.org/packages/a4/0a/92c244309b774e290ddb15e93363846ae7aa753d9586b8aad511c5e6145b/librt-0.9.0-cp313-cp313-win_arm64.whl", hash = "sha256:4c4d0440a3a8e31d962340c3e1cc3fc9ee7febd34c8d8f770d06adb947779ea5", size = 53728, upload-time = "2026-04-09T16:05:33.31Z" },
1412
  ]
1413
 
1414
+ [[package]]
1415
+ name = "markdown"
1416
+ version = "3.10.2"
1417
+ source = { registry = "https://pypi.org/simple" }
1418
+ sdist = { url = "https://files.pythonhosted.org/packages/2b/f4/69fa6ed85ae003c2378ffa8f6d2e3234662abd02c10d216c0ba96081a238/markdown-3.10.2.tar.gz", hash = "sha256:994d51325d25ad8aa7ce4ebaec003febcce822c3f8c911e3b17c52f7f589f950", size = 368805, upload-time = "2026-02-09T14:57:26.942Z" }
1419
+ wheels = [
1420
+ { url = "https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl", hash = "sha256:e91464b71ae3ee7afd3017d9f358ef0baf158fd9a298db92f1d4761133824c36", size = 108180, upload-time = "2026-02-09T14:57:25.787Z" },
1421
+ ]
1422
+
1423
  [[package]]
1424
  name = "markdown-it-py"
1425
  version = "4.0.0"
 
1565
  { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198, upload-time = "2023-03-07T16:47:09.197Z" },
1566
  ]
1567
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1568
  [[package]]
1569
  name = "multidict"
1570
  version = "6.7.1"
 
1732
  ]
1733
 
1734
  [[package]]
1735
+ name = "nvidia-cublas"
1736
+ version = "13.1.0.3"
1737
  source = { registry = "https://pypi.org/simple" }
1738
  wheels = [
1739
+ { url = "https://files.pythonhosted.org/packages/e1/a5/fce49e2ae977e0ccc084e5adafceb4f0ac0c8333cb6863501618a7277f67/nvidia_cublas-13.1.0.3-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:c86fc7f7ae36d7528288c5d88098edcb7b02c633d262e7ddbb86b0ad91be5df2", size = 542851226, upload-time = "2025-10-09T08:59:04.818Z" },
1740
+ { url = "https://files.pythonhosted.org/packages/e7/44/423ac00af4dd95a5aeb27207e2c0d9b7118702149bf4704c3ddb55bb7429/nvidia_cublas-13.1.0.3-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:ee8722c1f0145ab246bccb9e452153b5e0515fd094c3678df50b2a0888b8b171", size = 423133236, upload-time = "2025-10-09T08:59:32.536Z" },
1741
  ]
1742
 
1743
  [[package]]
1744
+ name = "nvidia-cuda-cupti"
1745
+ version = "13.0.85"
1746
  source = { registry = "https://pypi.org/simple" }
1747
  wheels = [
1748
+ { url = "https://files.pythonhosted.org/packages/2a/2a/80353b103fc20ce05ef51e928daed4b6015db4aaa9162ed0997090fe2250/nvidia_cuda_cupti-13.0.85-py3-none-manylinux_2_25_aarch64.whl", hash = "sha256:796bd679890ee55fb14a94629b698b6db54bcfd833d391d5e94017dd9d7d3151", size = 10310827, upload-time = "2025-09-04T08:26:42.012Z" },
1749
+ { url = "https://files.pythonhosted.org/packages/33/6d/737d164b4837a9bbd202f5ae3078975f0525a55730fe871d8ed4e3b952b0/nvidia_cuda_cupti-13.0.85-py3-none-manylinux_2_25_x86_64.whl", hash = "sha256:4eb01c08e859bf924d222250d2e8f8b8ff6d3db4721288cf35d14252a4d933c8", size = 10715597, upload-time = "2025-09-04T08:26:51.312Z" },
1750
  ]
1751
 
1752
  [[package]]
1753
+ name = "nvidia-cuda-nvrtc"
1754
+ version = "13.0.88"
1755
  source = { registry = "https://pypi.org/simple" }
1756
  wheels = [
1757
+ { url = "https://files.pythonhosted.org/packages/c3/68/483a78f5e8f31b08fb1bb671559968c0ca3a065ac7acabfc7cee55214fd6/nvidia_cuda_nvrtc-13.0.88-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:ad9b6d2ead2435f11cbb6868809d2adeeee302e9bb94bcf0539c7a40d80e8575", size = 90215200, upload-time = "2025-09-04T08:28:44.204Z" },
1758
+ { url = "https://files.pythonhosted.org/packages/b7/dc/6bb80850e0b7edd6588d560758f17e0550893a1feaf436807d64d2da040f/nvidia_cuda_nvrtc-13.0.88-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d27f20a0ca67a4bb34268a5e951033496c5b74870b868bacd046b1b8e0c3267b", size = 43015449, upload-time = "2025-09-04T08:28:20.239Z" },
1759
  ]
1760
 
1761
  [[package]]
1762
+ name = "nvidia-cuda-runtime"
1763
+ version = "13.0.96"
1764
  source = { registry = "https://pypi.org/simple" }
1765
  wheels = [
1766
+ { url = "https://files.pythonhosted.org/packages/87/4f/17d7b9b8e285199c58ce28e31b5c5bbaa4d8271af06a89b6405258245de2/nvidia_cuda_runtime-13.0.96-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ef9bcbe90493a2b9d810e43d249adb3d02e98dd30200d86607d8d02687c43f55", size = 2261060, upload-time = "2025-10-09T08:55:15.78Z" },
1767
+ { url = "https://files.pythonhosted.org/packages/2e/24/d1558f3b68b1d26e706813b1d10aa1d785e4698c425af8db8edc3dced472/nvidia_cuda_runtime-13.0.96-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7f82250d7782aa23b6cfe765ecc7db554bd3c2870c43f3d1821f1d18aebf0548", size = 2243632, upload-time = "2025-10-09T08:55:36.117Z" },
1768
  ]
1769
 
1770
  [[package]]
1771
+ name = "nvidia-cudnn-cu13"
1772
+ version = "9.19.0.56"
1773
  source = { registry = "https://pypi.org/simple" }
1774
  dependencies = [
1775
+ { name = "nvidia-cublas", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
1776
  ]
1777
  wheels = [
1778
+ { url = "https://files.pythonhosted.org/packages/f1/84/26025437c1e6b61a707442184fa0c03d083b661adf3a3eecfd6d21677740/nvidia_cudnn_cu13-9.19.0.56-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:6ed29ffaee1176c612daf442e4dd6cfeb6a0caa43ddcbeb59da94953030b1be4", size = 433781201, upload-time = "2026-02-03T20:40:53.805Z" },
1779
+ { url = "https://files.pythonhosted.org/packages/a3/22/0b4b932655d17a6da1b92fa92ab12844b053bb2ac2475e179ba6f043da1e/nvidia_cudnn_cu13-9.19.0.56-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:d20e1734305e9d68889a96e3f35094d733ff1f83932ebe462753973e53a572bf", size = 366066321, upload-time = "2026-02-03T20:44:52.837Z" },
1780
  ]
1781
 
1782
  [[package]]
1783
+ name = "nvidia-cufft"
1784
+ version = "12.0.0.61"
1785
  source = { registry = "https://pypi.org/simple" }
1786
  dependencies = [
1787
+ { name = "nvidia-nvjitlink", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
1788
  ]
1789
  wheels = [
1790
+ { url = "https://files.pythonhosted.org/packages/8b/ae/f417a75c0259e85c1d2f83ca4e960289a5f814ed0cea74d18c353d3e989d/nvidia_cufft-12.0.0.61-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2708c852ef8cd89d1d2068bdbece0aa188813a0c934db3779b9b1faa8442e5f5", size = 214053554, upload-time = "2025-09-04T08:31:38.196Z" },
1791
+ { url = "https://files.pythonhosted.org/packages/a8/2f/7b57e29836ea8714f81e9898409196f47d772d5ddedddf1592eadb8ab743/nvidia_cufft-12.0.0.61-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6c44f692dce8fd5ffd3e3df134b6cdb9c2f72d99cf40b62c32dde45eea9ddad3", size = 214085489, upload-time = "2025-09-04T08:31:56.044Z" },
1792
  ]
1793
 
1794
  [[package]]
1795
+ name = "nvidia-cufile"
1796
+ version = "1.15.1.6"
1797
  source = { registry = "https://pypi.org/simple" }
1798
  wheels = [
1799
+ { url = "https://files.pythonhosted.org/packages/3f/70/4f193de89a48b71714e74602ee14d04e4019ad36a5a9f20c425776e72cd6/nvidia_cufile-1.15.1.6-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:08a3ecefae5a01c7f5117351c64f17c7c62efa5fffdbe24fc7d298da19cd0b44", size = 1223672, upload-time = "2025-09-04T08:32:22.779Z" },
1800
+ { url = "https://files.pythonhosted.org/packages/ab/73/cc4a14c9813a8a0d509417cf5f4bdaba76e924d58beb9864f5a7baceefbf/nvidia_cufile-1.15.1.6-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:bdc0deedc61f548bddf7733bdc216456c2fdb101d020e1ab4b88d232d5e2f6d1", size = 1136992, upload-time = "2025-09-04T08:32:14.119Z" },
1801
  ]
1802
 
1803
  [[package]]
1804
+ name = "nvidia-curand"
1805
+ version = "10.4.0.35"
1806
  source = { registry = "https://pypi.org/simple" }
1807
  wheels = [
1808
+ { url = "https://files.pythonhosted.org/packages/1e/72/7c2ae24fb6b63a32e6ae5d241cc65263ea18d08802aaae087d9f013335a2/nvidia_curand-10.4.0.35-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:133df5a7509c3e292aaa2b477afd0194f06ce4ea24d714d616ff36439cee349a", size = 61962106, upload-time = "2025-08-04T10:21:41.128Z" },
1809
+ { url = "https://files.pythonhosted.org/packages/a5/9f/be0a41ca4a4917abf5cb9ae0daff1a6060cc5de950aec0396de9f3b52bc5/nvidia_curand-10.4.0.35-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:1aee33a5da6e1db083fe2b90082def8915f30f3248d5896bcec36a579d941bfc", size = 59544258, upload-time = "2025-08-04T10:22:03.992Z" },
1810
  ]
1811
 
1812
  [[package]]
1813
+ name = "nvidia-cusolver"
1814
+ version = "12.0.4.66"
1815
  source = { registry = "https://pypi.org/simple" }
1816
  dependencies = [
1817
+ { name = "nvidia-cublas", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
1818
+ { name = "nvidia-cusparse", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
1819
+ { name = "nvidia-nvjitlink", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
1820
  ]
1821
  wheels = [
1822
+ { url = "https://files.pythonhosted.org/packages/c8/c3/b30c9e935fc01e3da443ec0116ed1b2a009bb867f5324d3f2d7e533e776b/nvidia_cusolver-12.0.4.66-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:02c2457eaa9e39de20f880f4bd8820e6a1cfb9f9a34f820eb12a155aa5bc92d2", size = 223467760, upload-time = "2025-09-04T08:33:04.222Z" },
1823
+ { url = "https://files.pythonhosted.org/packages/5f/67/cba3777620cdacb99102da4042883709c41c709f4b6323c10781a9c3aa34/nvidia_cusolver-12.0.4.66-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:0a759da5dea5c0ea10fd307de75cdeb59e7ea4fcb8add0924859b944babf1112", size = 200941980, upload-time = "2025-09-04T08:33:22.767Z" },
1824
  ]
1825
 
1826
  [[package]]
1827
+ name = "nvidia-cusparse"
1828
+ version = "12.6.3.3"
1829
  source = { registry = "https://pypi.org/simple" }
1830
  dependencies = [
1831
+ { name = "nvidia-nvjitlink", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
1832
  ]
1833
  wheels = [
1834
+ { url = "https://files.pythonhosted.org/packages/f8/94/5c26f33738ae35276672f12615a64bd008ed5be6d1ebcb23579285d960a9/nvidia_cusparse-12.6.3.3-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:80bcc4662f23f1054ee334a15c72b8940402975e0eab63178fc7e670aa59472c", size = 162155568, upload-time = "2025-09-04T08:33:42.864Z" },
1835
+ { url = "https://files.pythonhosted.org/packages/fa/18/623c77619c31d62efd55302939756966f3ecc8d724a14dab2b75f1508850/nvidia_cusparse-12.6.3.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2b3c89c88d01ee0e477cb7f82ef60a11a4bcd57b6b87c33f789350b59759360b", size = 145942937, upload-time = "2025-09-04T08:33:58.029Z" },
1836
  ]
1837
 
1838
  [[package]]
1839
+ name = "nvidia-cusparselt-cu13"
1840
+ version = "0.8.0"
1841
  source = { registry = "https://pypi.org/simple" }
1842
  wheels = [
1843
+ { url = "https://files.pythonhosted.org/packages/46/10/8dcd1175260706a2fc92a16a52e306b71d4c1ea0b0cc4a9484183399818a/nvidia_cusparselt_cu13-0.8.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:400c6ed1cf6780fc6efedd64ec9f1345871767e6a1a0a552a1ea0578117ea77c", size = 220791277, upload-time = "2025-08-13T19:22:40.982Z" },
1844
+ { url = "https://files.pythonhosted.org/packages/fd/53/43b0d71f4e702fa9733f8b4571fdca50a8813f1e450b656c239beff12315/nvidia_cusparselt_cu13-0.8.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:25e30a8a7323935d4ad0340b95a0b69926eee755767e8e0b1cf8dd85b197d3fd", size = 169884119, upload-time = "2025-08-13T19:23:41.967Z" },
1845
  ]
1846
 
1847
  [[package]]
1848
+ name = "nvidia-nccl-cu13"
1849
+ version = "2.28.9"
1850
  source = { registry = "https://pypi.org/simple" }
1851
  wheels = [
1852
+ { url = "https://files.pythonhosted.org/packages/39/55/1920646a2e43ffd4fc958536b276197ed740e9e0c54105b4bb3521591fc7/nvidia_nccl_cu13-2.28.9-py3-none-manylinux_2_18_aarch64.whl", hash = "sha256:01c873ba1626b54caa12272ed228dc5b2781545e0ae8ba3f432a8ef1c6d78643", size = 196561677, upload-time = "2025-11-18T05:49:03.45Z" },
1853
+ { url = "https://files.pythonhosted.org/packages/b0/b4/878fefaad5b2bcc6fcf8d474a25e3e3774bc5133e4b58adff4d0bca238bc/nvidia_nccl_cu13-2.28.9-py3-none-manylinux_2_18_x86_64.whl", hash = "sha256:e4553a30f34195f3fa1da02a6da3d6337d28f2003943aa0a3d247bbc25fefc42", size = 196493177, upload-time = "2025-11-18T05:49:17.677Z" },
1854
  ]
1855
 
1856
  [[package]]
1857
+ name = "nvidia-nvjitlink"
1858
+ version = "13.0.88"
1859
  source = { registry = "https://pypi.org/simple" }
1860
  wheels = [
1861
+ { url = "https://files.pythonhosted.org/packages/56/7a/123e033aaff487c77107195fa5a2b8686795ca537935a24efae476c41f05/nvidia_nvjitlink-13.0.88-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:13a74f429e23b921c1109976abefacc69835f2f433ebd323d3946e11d804e47b", size = 40713933, upload-time = "2025-09-04T08:35:43.553Z" },
1862
+ { url = "https://files.pythonhosted.org/packages/ab/2c/93c5250e64df4f894f1cbb397c6fd71f79813f9fd79d7cd61de3f97b3c2d/nvidia_nvjitlink-13.0.88-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e931536ccc7d467a98ba1d8b89ff7fa7f1fa3b13f2b0069118cd7f47bff07d0c", size = 38768748, upload-time = "2025-09-04T08:35:20.008Z" },
1863
  ]
1864
 
1865
  [[package]]
1866
+ name = "nvidia-nvshmem-cu13"
1867
  version = "3.4.5"
1868
  source = { registry = "https://pypi.org/simple" }
1869
  wheels = [
1870
+ { url = "https://files.pythonhosted.org/packages/dc/0f/05cc9c720236dcd2db9c1ab97fff629e96821be2e63103569da0c9b72f19/nvidia_nvshmem_cu13-3.4.5-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6dc2a197f38e5d0376ad52cd1a2a3617d3cdc150fd5966f4aee9bcebb1d68fe9", size = 60215947, upload-time = "2025-09-06T00:32:20.022Z" },
1871
+ { url = "https://files.pythonhosted.org/packages/3c/35/a9bf80a609e74e3b000fef598933235c908fcefcef9026042b8e6dfde2a9/nvidia_nvshmem_cu13-3.4.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:290f0a2ee94c9f3687a02502f3b9299a9f9fe826e6d0287ee18482e78d495b80", size = 60412546, upload-time = "2025-09-06T00:32:41.564Z" },
1872
  ]
1873
 
1874
  [[package]]
1875
+ name = "nvidia-nvtx"
1876
+ version = "13.0.85"
1877
  source = { registry = "https://pypi.org/simple" }
1878
  wheels = [
1879
+ { url = "https://files.pythonhosted.org/packages/c2/f3/d86c845465a2723ad7e1e5c36dcd75ddb82898b3f53be47ebd429fb2fa5d/nvidia_nvtx-13.0.85-py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4936d1d6780fbe68db454f5e72a42ff64d1fd6397df9f363ae786930fd5c1cd4", size = 148047, upload-time = "2025-09-04T08:29:01.761Z" },
1880
+ { url = "https://files.pythonhosted.org/packages/a8/64/3708a90d1ebe202ffdeb7185f878a3c84d15c2b2c31858da2ce0583e2def/nvidia_nvtx-13.0.85-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cb7780edb6b14107373c835bf8b72e7a178bac7367e23da7acb108f973f157a6", size = 148878, upload-time = "2025-09-04T08:28:53.627Z" },
1881
  ]
1882
 
1883
  [[package]]
 
2800
  { url = "https://files.pythonhosted.org/packages/6a/23/8146aad7d88f4fcb3a6218f41a60f6c2d4e3a72de72da1825dc7c8f7877c/semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177", size = 15552, upload-time = "2022-05-26T13:35:21.206Z" },
2801
  ]
2802
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2803
  [[package]]
2804
  name = "setuptools"
2805
  version = "81.0.0"
 
2867
  { name = "accelerate" },
2868
  { name = "bitsandbytes" },
2869
  { name = "datasets" },
2870
+ { name = "jmespath" },
2871
  { name = "peft" },
2872
+ { name = "tensorboard" },
2873
  { name = "transformers" },
2874
+ { name = "trl", extra = ["peft"] },
 
2875
  ]
2876
 
2877
  [package.metadata]
2878
  requires-dist = [
2879
+ { name = "accelerate", marker = "extra == 'train'", specifier = ">=1.13.0" },
2880
+ { name = "bitsandbytes", marker = "extra == 'train'", specifier = ">=0.46.1,!=0.48.0" },
2881
+ { name = "datasets", marker = "extra == 'train'", specifier = ">=3.0.0,<5.0" },
2882
  { name = "duckdb", specifier = ">=1.5.2,<2.0" },
2883
  { name = "httpx", marker = "extra == 'dev'", specifier = ">=0.28.0" },
2884
+ { name = "huggingface-hub", specifier = ">=1.5.0,<2.0" },
2885
+ { name = "jmespath", marker = "extra == 'train'", specifier = ">=1.0,<2.0" },
2886
  { name = "matplotlib", marker = "extra == 'evidence'", specifier = ">=3.8.0,<4.0" },
2887
  { name = "mypy", marker = "extra == 'dev'", specifier = ">=1.20.1" },
2888
  { name = "openai", specifier = ">=2.32.0,<3.0" },
2889
  { name = "openenv-core", extras = ["core"], specifier = ">=0.2.2,<0.4" },
2890
  { name = "pandas", marker = "extra == 'evidence'", specifier = ">=2.0.0,<3.0" },
2891
+ { name = "peft", marker = "extra == 'train'", specifier = ">=0.19" },
2892
  { name = "pydantic", specifier = ">=2.8.0,<3.0" },
2893
  { name = "pytest", marker = "extra == 'dev'", specifier = ">=9.0.3" },
2894
  { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=1.3.0" },
 
2896
  { name = "python-dotenv", specifier = ">=1.2.2,<2.0" },
2897
  { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.15.11" },
2898
  { name = "sqlglot", specifier = ">=30.6.0,<40.0" },
2899
+ { name = "tensorboard", marker = "extra == 'train'", specifier = ">=2.20,<3.0" },
2900
+ { name = "transformers", marker = "extra == 'train'", specifier = ">=5.5.0" },
2901
+ { name = "trl", extras = ["peft"], marker = "extra == 'train'", specifier = ">=1.2.0,<2.0" },
2902
  ]
2903
  provides-extras = ["evidence", "dev", "train"]
2904
 
 
2949
  { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353, upload-time = "2025-04-27T18:04:59.103Z" },
2950
  ]
2951
 
2952
+ [[package]]
2953
+ name = "tensorboard"
2954
+ version = "2.20.0"
2955
+ source = { registry = "https://pypi.org/simple" }
2956
+ dependencies = [
2957
+ { name = "absl-py" },
2958
+ { name = "grpcio" },
2959
+ { name = "markdown" },
2960
+ { name = "numpy" },
2961
+ { name = "packaging" },
2962
+ { name = "pillow" },
2963
+ { name = "protobuf" },
2964
+ { name = "setuptools" },
2965
+ { name = "tensorboard-data-server" },
2966
+ { name = "werkzeug" },
2967
+ ]
2968
+ wheels = [
2969
+ { url = "https://files.pythonhosted.org/packages/9c/d9/a5db55f88f258ac669a92858b70a714bbbd5acd993820b41ec4a96a4d77f/tensorboard-2.20.0-py3-none-any.whl", hash = "sha256:9dc9f978cb84c0723acf9a345d96c184f0293d18f166bb8d59ee098e6cfaaba6", size = 5525680, upload-time = "2025-07-17T19:20:49.638Z" },
2970
+ ]
2971
+
2972
+ [[package]]
2973
+ name = "tensorboard-data-server"
2974
+ version = "0.7.2"
2975
+ source = { registry = "https://pypi.org/simple" }
2976
+ wheels = [
2977
+ { url = "https://files.pythonhosted.org/packages/7a/13/e503968fefabd4c6b2650af21e110aa8466fe21432cd7c43a84577a89438/tensorboard_data_server-0.7.2-py3-none-any.whl", hash = "sha256:7e0610d205889588983836ec05dc098e80f97b7e7bbff7e994ebb78f578d0ddb", size = 2356, upload-time = "2023-10-23T21:23:32.16Z" },
2978
+ { url = "https://files.pythonhosted.org/packages/b7/85/dabeaf902892922777492e1d253bb7e1264cadce3cea932f7ff599e53fea/tensorboard_data_server-0.7.2-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:9fe5d24221b29625dbc7328b0436ca7fc1c23de4acf4d272f1180856e32f9f60", size = 4823598, upload-time = "2023-10-23T21:23:33.714Z" },
2979
+ { url = "https://files.pythonhosted.org/packages/73/c6/825dab04195756cf8ff2e12698f22513b3db2f64925bdd41671bfb33aaa5/tensorboard_data_server-0.7.2-py3-none-manylinux_2_31_x86_64.whl", hash = "sha256:ef687163c24185ae9754ed5650eb5bc4d84ff257aabdc33f0cc6f74d8ba54530", size = 6590363, upload-time = "2023-10-23T21:23:35.583Z" },
2980
+ ]
2981
+
2982
  [[package]]
2983
  name = "tokenizers"
2984
  version = "0.22.2"
 
3052
 
3053
  [[package]]
3054
  name = "torch"
3055
+ version = "2.11.0"
3056
  source = { registry = "https://pypi.org/simple" }
3057
  dependencies = [
3058
+ { name = "cuda-bindings", marker = "sys_platform == 'linux'" },
3059
+ { name = "cuda-toolkit", extra = ["cublas", "cudart", "cufft", "cufile", "cupti", "curand", "cusolver", "cusparse", "nvjitlink", "nvrtc", "nvtx"], marker = "sys_platform == 'linux'" },
3060
  { name = "filelock" },
3061
  { name = "fsspec" },
3062
  { name = "jinja2" },
3063
  { name = "networkx" },
3064
+ { name = "nvidia-cudnn-cu13", marker = "sys_platform == 'linux'" },
3065
+ { name = "nvidia-cusparselt-cu13", marker = "sys_platform == 'linux'" },
3066
+ { name = "nvidia-nccl-cu13", marker = "sys_platform == 'linux'" },
3067
+ { name = "nvidia-nvshmem-cu13", marker = "sys_platform == 'linux'" },
 
 
 
 
 
 
 
 
 
 
 
3068
  { name = "setuptools" },
3069
  { name = "sympy" },
3070
+ { name = "triton", marker = "sys_platform == 'linux'" },
3071
  { name = "typing-extensions" },
3072
  ]
3073
  wheels = [
3074
+ { url = "https://files.pythonhosted.org/packages/6f/8b/69e3008d78e5cee2b30183340cc425081b78afc5eff3d080daab0adda9aa/torch-2.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4b5866312ee6e52ea625cd211dcb97d6a2cdc1131a5f15cc0d87eec948f6dd34", size = 80606338, upload-time = "2026-03-23T18:11:34.781Z" },
3075
+ { url = "https://files.pythonhosted.org/packages/13/16/42e5915ebe4868caa6bac83a8ed59db57f12e9a61b7d749d584776ed53d5/torch-2.11.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f99924682ef0aa6a4ab3b1b76f40dc6e273fca09f367d15a524266db100a723f", size = 419731115, upload-time = "2026-03-23T18:11:06.944Z" },
3076
+ { url = "https://files.pythonhosted.org/packages/1a/c9/82638ef24d7877510f83baf821f5619a61b45568ce21c0a87a91576510aa/torch-2.11.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:0f68f4ac6d95d12e896c3b7a912b5871619542ec54d3649cf48cc1edd4dd2756", size = 530712279, upload-time = "2026-03-23T18:10:31.481Z" },
3077
+ { url = "https://files.pythonhosted.org/packages/1c/ff/6756f1c7ee302f6d202120e0f4f05b432b839908f9071157302cedfc5232/torch-2.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:fbf39280699d1b869f55eac536deceaa1b60bd6788ba74f399cc67e60a5fab10", size = 114556047, upload-time = "2026-03-23T18:10:55.931Z" },
3078
+ { url = "https://files.pythonhosted.org/packages/87/89/5ea6722763acee56b045435fb84258db7375c48165ec8be7880ab2b281c5/torch-2.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e6debd97ccd3205bbb37eb806a9d8219e1139d15419982c09e23ef7d4369d18", size = 80606801, upload-time = "2026-03-23T18:10:18.649Z" },
3079
+ { url = "https://files.pythonhosted.org/packages/32/d1/8ed2173589cbfe744ed54e5a73efc107c0085ba5777ee93a5f4c1ab90553/torch-2.11.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:63a68fa59de8f87acc7e85a5478bb2dddbb3392b7593ec3e78827c793c4b73fd", size = 419732382, upload-time = "2026-03-23T18:08:30.835Z" },
3080
+ { url = "https://files.pythonhosted.org/packages/3d/e1/b73f7c575a4b8f87a5928f50a1e35416b5e27295d8be9397d5293e7e8d4c/torch-2.11.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:cc89b9b173d9adfab59fd227f0ab5e5516d9a52b658ae41d64e59d2e55a418db", size = 530711509, upload-time = "2026-03-23T18:08:47.213Z" },
3081
+ { url = "https://files.pythonhosted.org/packages/66/82/3e3fcdd388fbe54e29fd3f991f36846ff4ac90b0d0181e9c8f7236565f82/torch-2.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:4dda3b3f52d121063a731ddb835f010dc137b920d7fec2778e52f60d8e4bf0cd", size = 114555842, upload-time = "2026-03-23T18:09:52.111Z" },
3082
+ { url = "https://files.pythonhosted.org/packages/db/38/8ac78069621b8c2b4979c2f96dc8409ef5e9c4189f6aac629189a78677ca/torch-2.11.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8b394322f49af4362d4f80e424bcaca7efcd049619af03a4cf4501520bdf0fb4", size = 80959574, upload-time = "2026-03-23T18:10:14.214Z" },
3083
+ { url = "https://files.pythonhosted.org/packages/6d/6c/56bfb37073e7136e6dd86bfc6af7339946dd684e0ecf2155ac0eee687ae1/torch-2.11.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:2658f34ce7e2dabf4ec73b45e2ca68aedad7a5be87ea756ad656eaf32bf1e1ea", size = 419732324, upload-time = "2026-03-23T18:09:36.604Z" },
3084
+ { url = "https://files.pythonhosted.org/packages/07/f4/1b666b6d61d3394cca306ea543ed03a64aad0a201b6cd159f1d41010aeb1/torch-2.11.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:98bb213c3084cfe176302949bdc360074b18a9da7ab59ef2edc9d9f742504778", size = 530596026, upload-time = "2026-03-23T18:09:20.842Z" },
3085
+ { url = "https://files.pythonhosted.org/packages/48/6b/30d1459fa7e4b67e9e3fe1685ca1d8bb4ce7c62ef436c3a615963c6c866c/torch-2.11.0-cp313-cp313t-win_amd64.whl", hash = "sha256:a97b94bbf62992949b4730c6cd2cc9aee7b335921ee8dc207d930f2ed09ae2db", size = 114793702, upload-time = "2026-03-23T18:09:47.304Z" },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3086
  ]
3087
 
3088
  [[package]]
 
3099
 
3100
  [[package]]
3101
  name = "transformers"
3102
+ version = "5.5.0"
3103
  source = { registry = "https://pypi.org/simple" }
3104
  dependencies = [
 
3105
  { name = "huggingface-hub" },
3106
  { name = "numpy" },
3107
  { name = "packaging" },
3108
  { name = "pyyaml" },
3109
  { name = "regex" },
 
3110
  { name = "safetensors" },
3111
  { name = "tokenizers" },
3112
  { name = "tqdm" },
3113
+ { name = "typer" },
3114
  ]
3115
+ sdist = { url = "https://files.pythonhosted.org/packages/ff/9d/fb46e729b461985f41a5740167688b924a4019141e5c164bea77548d3d9e/transformers-5.5.0.tar.gz", hash = "sha256:c8db656cf51c600cd8c75f06b20ef85c72e8b8ff9abc880c5d3e8bc70e0ddcbd", size = 8237745, upload-time = "2026-04-02T16:13:08.113Z" }
3116
  wheels = [
3117
+ { url = "https://files.pythonhosted.org/packages/e7/28/35f7411ff80a3640c1f4fc907dcbb6a65061ebb82f66950e38bfc9f7f740/transformers-5.5.0-py3-none-any.whl", hash = "sha256:821a9ff0961abbb29eb1eb686d78df1c85929fdf213a3fe49dc6bd94f9efa944", size = 10245591, upload-time = "2026-04-02T16:13:03.462Z" },
3118
  ]
3119
 
3120
  [[package]]
 
3130
  { url = "https://files.pythonhosted.org/packages/35/f8/9c66bfc55361ec6d0e4040a0337fb5924ceb23de4648b8a81ae9d33b2b38/triton-3.6.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d002e07d7180fd65e622134fbd980c9a3d4211fb85224b56a0a0efbd422ab72f", size = 188400296, upload-time = "2026-01-20T16:00:56.042Z" },
3131
  ]
3132
 
 
 
 
 
 
 
 
 
 
3133
  [[package]]
3134
  name = "trl"
3135
+ version = "1.2.0"
3136
  source = { registry = "https://pypi.org/simple" }
3137
  dependencies = [
3138
  { name = "accelerate" },
3139
  { name = "datasets" },
3140
+ { name = "jinja2" },
3141
  { name = "packaging" },
3142
  { name = "transformers" },
3143
  ]
3144
+ sdist = { url = "https://files.pythonhosted.org/packages/0d/d6/2d3d876917d43537afea7b502abb318ae071295e4accac222741b548399e/trl-1.2.0.tar.gz", hash = "sha256:f5038b21295d2559992a087ea8d9ca10f74cde23e6760861def209811ab45d00", size = 583112, upload-time = "2026-04-17T01:04:17.706Z" }
3145
  wheels = [
3146
+ { url = "https://files.pythonhosted.org/packages/02/82/bad1a22ff4b21d8080f7a64d8313c1ac0e791b455b98f2efca1ef3e14b8f/trl-1.2.0-py3-none-any.whl", hash = "sha256:f6ddfa162ac92d25973070d9e3f6cff71b32c52edc34539e4294722f9dc0a6d6", size = 697449, upload-time = "2026-04-17T01:04:16.007Z" },
3147
  ]
3148
 
3149
+ [package.optional-dependencies]
3150
+ peft = [
3151
+ { name = "peft" },
 
 
 
 
 
 
 
3152
  ]
3153
 
3154
  [[package]]
 
3187
  { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" },
3188
  ]
3189
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3190
  [[package]]
3191
  name = "tzdata"
3192
  version = "2026.1"
 
3205
  { url = "https://files.pythonhosted.org/packages/11/e1/7ec67882ad8fc9f86384bef6421fa252c9cbe5744f8df6ce77afc9eca1f5/uncalled_for-0.3.1-py3-none-any.whl", hash = "sha256:074cdc92da8356278f93d0ded6f2a66dd883dbecaf9bc89437646ee2289cc200", size = 11361, upload-time = "2026-04-07T13:05:05.341Z" },
3206
  ]
3207
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3208
  [[package]]
3209
  name = "urllib3"
3210
  version = "2.6.3"
 
3302
  ]
3303
 
3304
  [[package]]
3305
+ name = "werkzeug"
3306
+ version = "3.1.8"
3307
  source = { registry = "https://pypi.org/simple" }
3308
  dependencies = [
3309
+ { name = "markupsafe" },
 
 
 
 
 
 
 
 
 
 
 
 
 
3310
  ]
3311
+ sdist = { url = "https://files.pythonhosted.org/packages/dd/b2/381be8cfdee792dd117872481b6e378f85c957dd7c5bca38897b08f765fd/werkzeug-3.1.8.tar.gz", hash = "sha256:9bad61a4268dac112f1c5cd4630a56ede601b6ed420300677a869083d70a4c44", size = 875852, upload-time = "2026-04-02T18:49:14.268Z" }
3312
  wheels = [
3313
+ { url = "https://files.pythonhosted.org/packages/93/8c/2e650f2afeb7ee576912636c23ddb621c91ac6a98e66dc8d29c3c69446e1/werkzeug-3.1.8-py3-none-any.whl", hash = "sha256:63a77fb8892bf28ebc3178683445222aa500e48ebad5ec77b0ad80f8726b1f50", size = 226459, upload-time = "2026-04-02T18:49:12.72Z" },
 
3314
  ]
3315
 
3316
  [[package]]