Spaces:
Sleeping
Sleeping
Cyprien Claude Opus 5 (1M context) commited on
Commit ·
759bf41
1
Parent(s): d27824a
Model and revision pickers, test-set evaluation tab, app/ package
Browse filesCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- Dockerfile +3 -2
- README.md +34 -0
- app.py +0 -107
- app/__init__.py +0 -0
- app/cmd_enter.js +9 -0
- app/config.py +13 -0
- app/evaluation.py +70 -0
- examples.json → app/examples.json +0 -0
- app/handlers.py +52 -0
- app/hub.py +31 -0
- app/predictors.py +48 -0
- app/text.py +22 -0
- app/turns.py +10 -0
- app/ui.py +101 -0
- main.py +4 -0
- pyproject.toml +2 -0
- uv.lock +322 -0
Dockerfile
CHANGED
|
@@ -16,7 +16,8 @@ WORKDIR $HOME/app
|
|
| 16 |
COPY --chown=user pyproject.toml uv.lock ./
|
| 17 |
RUN uv sync --locked
|
| 18 |
|
| 19 |
-
COPY --chown=user
|
|
|
|
| 20 |
|
| 21 |
EXPOSE 7860
|
| 22 |
-
CMD ["python", "
|
|
|
|
| 16 |
COPY --chown=user pyproject.toml uv.lock ./
|
| 17 |
RUN uv sync --locked
|
| 18 |
|
| 19 |
+
COPY --chown=user main.py ./
|
| 20 |
+
COPY --chown=user app ./app
|
| 21 |
|
| 22 |
EXPOSE 7860
|
| 23 |
+
CMD ["python", "main.py"]
|
README.md
CHANGED
|
@@ -48,6 +48,40 @@ Le dépôt du modèle est privé. Le Space le lit via un secret `HF_TOKEN`
|
|
| 48 |
(Settings → Secrets), qui doit avoir un accès en lecture à ce dépôt. Les secrets
|
| 49 |
ne sont pas visibles par les visiteurs du Space.
|
| 50 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 51 |
## Dépendances
|
| 52 |
|
| 53 |
SDK Docker plutôt que Gradio, pour que les versions viennent d'un `uv.lock` :
|
|
|
|
| 48 |
(Settings → Secrets), qui doit avoir un accès en lecture à ce dépôt. Les secrets
|
| 49 |
ne sont pas visibles par les visiteurs du Space.
|
| 50 |
|
| 51 |
+
## Choix du modèle et de la révision
|
| 52 |
+
|
| 53 |
+
Les dépôts de l'organisation dont le nom commence par `breakdown-risk-` sont
|
| 54 |
+
listés au démarrage, et chaque commit du dépôt choisi est proposé comme
|
| 55 |
+
révision — de quoi comparer deux entraînements successifs sans redéployer. `↻`
|
| 56 |
+
recharge la liste après un nouveau push de `train.py`.
|
| 57 |
+
|
| 58 |
+
Les deux sorties de `train.py` sont acceptées : la présence de `model_head.pkl`
|
| 59 |
+
sélectionne le chemin SetFit, sinon le modèle est chargé comme un
|
| 60 |
+
`AutoModelForSequenceClassification`.
|
| 61 |
+
|
| 62 |
+
L'onglet **Évaluation** rejoue le split de test et affiche la matrice de
|
| 63 |
+
confusion puis les cas un par un, erreurs d'abord.
|
| 64 |
+
|
| 65 |
+
## Structure
|
| 66 |
+
|
| 67 |
+
```
|
| 68 |
+
main.py lancement
|
| 69 |
+
app/config.py constantes, noms affichés
|
| 70 |
+
app/turns.py fenêtre des derniers tours
|
| 71 |
+
app/hub.py dépôts, révisions, téléchargements
|
| 72 |
+
app/predictors.py SetFit ou AutoModel selon les fichiers du dépôt
|
| 73 |
+
app/evaluation.py split de test, exactitude, tableaux
|
| 74 |
+
app/handlers.py fonctions appelées par l'interface
|
| 75 |
+
app/ui.py Blocks Gradio
|
| 76 |
+
app/cmd_enter.js ⌘/Ctrl + Entrée
|
| 77 |
+
```
|
| 78 |
+
|
| 79 |
+
## Raccourcis
|
| 80 |
+
|
| 81 |
+
⇧ Entrée déclenche `submit` nativement sur un `Textbox` multiligne. ⌘/Ctrl +
|
| 82 |
+
Entrée n'existe pas dans Gradio et passe par `app/cmd_enter.js`, chargé via
|
| 83 |
+
`launch(js=...)` — la méthode décrite dans le guide *Custom CSS and JS*.
|
| 84 |
+
|
| 85 |
## Dépendances
|
| 86 |
|
| 87 |
SDK Docker plutôt que Gradio, pour que les versions viennent d'un `uv.lock` :
|
app.py
DELETED
|
@@ -1,107 +0,0 @@
|
|
| 1 |
-
import json
|
| 2 |
-
import os
|
| 3 |
-
import time
|
| 4 |
-
from pathlib import Path
|
| 5 |
-
|
| 6 |
-
import gradio as gr
|
| 7 |
-
import joblib
|
| 8 |
-
from huggingface_hub import hf_hub_download
|
| 9 |
-
from sentence_transformers import SentenceTransformer
|
| 10 |
-
|
| 11 |
-
MODEL_REPO = "bee2link/breakdown-risk-paraphrase-multilingual-MiniLM-L12-v2"
|
| 12 |
-
DATASET_REPO = "bee2link/breakdown-risk"
|
| 13 |
-
CALLER_TURNS = 3
|
| 14 |
-
TOKEN = os.environ.get("HF_TOKEN")
|
| 15 |
-
|
| 16 |
-
LABEL_NAMES = {"risk": "Risque de panne", "no_risk": "Pas de risque"}
|
| 17 |
-
|
| 18 |
-
HEADER = f"""
|
| 19 |
-
# Risque d'immobilisation
|
| 20 |
-
|
| 21 |
-
Classe les **tours de parole de l'appelant** d'un appel entrant en `risk` — le
|
| 22 |
-
véhicule est probablement immobilisé, il faut un dépannage ou un créneau urgent
|
| 23 |
-
— ou `no_risk` — le client peut rouler, un rendez-vous normal suffit.
|
| 24 |
-
|
| 25 |
-
<sub>SetFit · encodeur `paraphrase-multilingual-MiniLM-L12-v2` + tête logistique
|
| 26 |
-
· entraîné sur [`{DATASET_REPO}`](https://huggingface.co/datasets/{DATASET_REPO})
|
| 27 |
-
· 45/46 sur le split de test · seuls les {CALLER_TURNS} derniers tours sont
|
| 28 |
-
lus</sub>
|
| 29 |
-
"""
|
| 30 |
-
|
| 31 |
-
PLACEHOLDER = "Oui bonjour.\nMa voiture ne démarre plus depuis ce matin."
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
def from_hub(filename: str) -> Path:
|
| 35 |
-
return Path(hf_hub_download(MODEL_REPO, filename, token=TOKEN))
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
encoder = SentenceTransformer(MODEL_REPO, token=TOKEN)
|
| 39 |
-
head = joblib.load(from_hub("model_head.pkl"))
|
| 40 |
-
LABELS = json.loads(from_hub("config_setfit.json").read_text())["labels"]
|
| 41 |
-
EXAMPLES = json.loads(Path("examples.json").read_text(encoding="utf-8"))
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
def last_turns(transcript: str) -> list[str]:
|
| 45 |
-
lines = [line.strip() for line in transcript.splitlines() if line.strip()]
|
| 46 |
-
return lines[-CALLER_TURNS:]
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
def score(text: str) -> dict[str, float]:
|
| 50 |
-
probabilities = head.predict_proba(encoder.encode([text]))[0]
|
| 51 |
-
return {LABEL_NAMES[name]: float(p) for name, p in zip(LABELS, probabilities)}
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
def classify(transcript: str) -> tuple[dict[str, float], str, str]:
|
| 55 |
-
"""Score a caller's turns for breakdown risk."""
|
| 56 |
-
turns = last_turns(transcript)
|
| 57 |
-
if not turns:
|
| 58 |
-
return {}, "", ""
|
| 59 |
-
|
| 60 |
-
text = "\n".join(turns)
|
| 61 |
-
started = time.perf_counter()
|
| 62 |
-
scores = score(text)
|
| 63 |
-
return scores, text, f"`{(time.perf_counter() - started) * 1000:.0f} ms`"
|
| 64 |
-
|
| 65 |
-
|
| 66 |
-
with gr.Blocks(title="Risque d'immobilisation") as demo:
|
| 67 |
-
gr.Markdown(HEADER)
|
| 68 |
-
|
| 69 |
-
with gr.Row():
|
| 70 |
-
with gr.Column(scale=3):
|
| 71 |
-
transcript = gr.Textbox(
|
| 72 |
-
label="Tours de parole de l'appelant",
|
| 73 |
-
info=f"Un tour par ligne. Seuls les {CALLER_TURNS} derniers sont classés.",
|
| 74 |
-
placeholder=PLACEHOLDER,
|
| 75 |
-
lines=7,
|
| 76 |
-
max_lines=14,
|
| 77 |
-
)
|
| 78 |
-
run = gr.Button("Classer", variant="primary")
|
| 79 |
-
|
| 80 |
-
with gr.Column(scale=2):
|
| 81 |
-
prediction = gr.Label(label="Prédiction", num_top_classes=2)
|
| 82 |
-
window = gr.Textbox(
|
| 83 |
-
label="Ce que le modèle lit",
|
| 84 |
-
lines=3,
|
| 85 |
-
interactive=False,
|
| 86 |
-
buttons=["copy"],
|
| 87 |
-
)
|
| 88 |
-
latency = gr.Markdown()
|
| 89 |
-
|
| 90 |
-
outputs = [prediction, window, latency]
|
| 91 |
-
|
| 92 |
-
gr.Examples(
|
| 93 |
-
examples=[[row["text"]] for row in EXAMPLES],
|
| 94 |
-
example_labels=[f"{LABEL_NAMES[row['gold']]} — {row['id']}" for row in EXAMPLES],
|
| 95 |
-
label="Exemples du split de test",
|
| 96 |
-
inputs=transcript,
|
| 97 |
-
outputs=outputs,
|
| 98 |
-
fn=classify,
|
| 99 |
-
cache_examples=True,
|
| 100 |
-
cache_mode="lazy",
|
| 101 |
-
)
|
| 102 |
-
|
| 103 |
-
gr.on([run.click, transcript.submit], classify, transcript, outputs, api_name="classify")
|
| 104 |
-
|
| 105 |
-
|
| 106 |
-
if __name__ == "__main__":
|
| 107 |
-
demo.launch(server_name="0.0.0.0", server_port=7860)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/__init__.py
ADDED
|
File without changes
|
app/cmd_enter.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
() => {
|
| 2 |
+
document.addEventListener('keydown', (event) => {
|
| 3 |
+
if (event.key !== 'Enter' || !(event.metaKey || event.ctrlKey)) return;
|
| 4 |
+
const button = document.querySelector('#run-classify button, button#run-classify');
|
| 5 |
+
if (!button) return;
|
| 6 |
+
event.preventDefault();
|
| 7 |
+
button.click();
|
| 8 |
+
});
|
| 9 |
+
}
|
app/config.py
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
|
| 3 |
+
ORG = "bee2link"
|
| 4 |
+
MODEL_SEARCH = "breakdown-risk-"
|
| 5 |
+
DATASET_REPO = "bee2link/breakdown-risk"
|
| 6 |
+
CALLER_TURNS = 3
|
| 7 |
+
TOKEN = os.environ.get("HF_TOKEN")
|
| 8 |
+
|
| 9 |
+
LABEL_NAMES = {"risk": "Risque de panne", "no_risk": "Pas de risque"}
|
| 10 |
+
|
| 11 |
+
|
| 12 |
+
def display(label: str) -> str:
|
| 13 |
+
return LABEL_NAMES.get(label, label)
|
app/evaluation.py
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import time
|
| 2 |
+
from functools import lru_cache
|
| 3 |
+
from typing import NamedTuple
|
| 4 |
+
|
| 5 |
+
import numpy as np
|
| 6 |
+
from datasets import load_dataset
|
| 7 |
+
|
| 8 |
+
from .config import DATASET_REPO, TOKEN, display
|
| 9 |
+
from .predictors import Predictor, load
|
| 10 |
+
|
| 11 |
+
|
| 12 |
+
class Report(NamedTuple):
|
| 13 |
+
repo: str
|
| 14 |
+
revision: str
|
| 15 |
+
hits: int
|
| 16 |
+
total: int
|
| 17 |
+
ms_per_case: float
|
| 18 |
+
confusion: list[list]
|
| 19 |
+
cases: list[list]
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
@lru_cache(maxsize=1)
|
| 23 |
+
def test_split() -> tuple[list[str], list[str], list[str]]:
|
| 24 |
+
data = load_dataset(DATASET_REPO, split="test", token=TOKEN)
|
| 25 |
+
names = data.features["label"].names
|
| 26 |
+
return list(data["id"]), list(data["text"]), [names[i] for i in data["label"]]
|
| 27 |
+
|
| 28 |
+
|
| 29 |
+
def confusion(labels: list[str], gold: list[str], predicted: list[str]) -> list[list]:
|
| 30 |
+
counts = dict.fromkeys(((want, got) for want in labels for got in labels), 0)
|
| 31 |
+
for pair in zip(gold, predicted):
|
| 32 |
+
counts[pair] += 1
|
| 33 |
+
return [[f"réel {display(want)}", *(counts[want, got] for got in labels)] for want in labels]
|
| 34 |
+
|
| 35 |
+
|
| 36 |
+
def cases(ids, texts, gold, predicted, probabilities: np.ndarray) -> list[list]:
|
| 37 |
+
rows = [
|
| 38 |
+
[
|
| 39 |
+
"✓" if want == got else "✗",
|
| 40 |
+
row_id,
|
| 41 |
+
display(want),
|
| 42 |
+
display(got),
|
| 43 |
+
round(float(confidence), 3),
|
| 44 |
+
text.replace("\n", " / "),
|
| 45 |
+
]
|
| 46 |
+
for row_id, text, want, got, confidence in zip(
|
| 47 |
+
ids, texts, gold, predicted, probabilities.max(axis=1)
|
| 48 |
+
)
|
| 49 |
+
]
|
| 50 |
+
return sorted(rows, key=lambda row: (row[0] == "✓", row[4]))
|
| 51 |
+
|
| 52 |
+
|
| 53 |
+
def run(repo: str, revision: str, predict: Predictor | None = None) -> Report:
|
| 54 |
+
predictor = predict if predict is not None else load(repo, revision)
|
| 55 |
+
ids, texts, gold = test_split()
|
| 56 |
+
|
| 57 |
+
started = time.perf_counter()
|
| 58 |
+
labels, probabilities = predictor(texts)
|
| 59 |
+
elapsed = time.perf_counter() - started
|
| 60 |
+
|
| 61 |
+
predicted = [labels[int(row.argmax())] for row in probabilities]
|
| 62 |
+
return Report(
|
| 63 |
+
repo=repo,
|
| 64 |
+
revision=revision,
|
| 65 |
+
hits=sum(want == got for want, got in zip(gold, predicted)),
|
| 66 |
+
total=len(gold),
|
| 67 |
+
ms_per_case=elapsed * 1000 / len(texts),
|
| 68 |
+
confusion=confusion(labels, gold, predicted),
|
| 69 |
+
cases=cases(ids, texts, gold, predicted, probabilities),
|
| 70 |
+
)
|
examples.json → app/examples.json
RENAMED
|
File without changes
|
app/handlers.py
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import json
|
| 2 |
+
import time
|
| 3 |
+
from pathlib import Path
|
| 4 |
+
|
| 5 |
+
import gradio as gr
|
| 6 |
+
|
| 7 |
+
from . import evaluation
|
| 8 |
+
from .config import display
|
| 9 |
+
from .hub import model_repos, revisions
|
| 10 |
+
from .predictors import load
|
| 11 |
+
from .text import NO_MODEL
|
| 12 |
+
from .turns import window
|
| 13 |
+
|
| 14 |
+
EXAMPLES = json.loads((Path(__file__).parent / "examples.json").read_text(encoding="utf-8"))
|
| 15 |
+
|
| 16 |
+
|
| 17 |
+
def classify(repo: str, revision: str, transcript: str) -> tuple[dict[str, float], str, str]:
|
| 18 |
+
"""Score a caller's turns for breakdown risk."""
|
| 19 |
+
text = window(transcript)
|
| 20 |
+
if not repo or not text:
|
| 21 |
+
return {}, "", ""
|
| 22 |
+
|
| 23 |
+
started = time.perf_counter()
|
| 24 |
+
labels, probabilities = load(repo, revision)([text])
|
| 25 |
+
scores = {display(name): float(p) for name, p in zip(labels, probabilities[0])}
|
| 26 |
+
return scores, text, f"`{(time.perf_counter() - started) * 1000:.0f} ms`"
|
| 27 |
+
|
| 28 |
+
|
| 29 |
+
def summary(report: evaluation.Report) -> str:
|
| 30 |
+
return (
|
| 31 |
+
f"### {report.hits}/{report.total} — exactitude {report.hits / report.total:.1%}\n"
|
| 32 |
+
f"`{report.repo}` · `{report.revision}` · {report.ms_per_case:.0f} ms par cas"
|
| 33 |
+
)
|
| 34 |
+
|
| 35 |
+
|
| 36 |
+
def evaluate(repo: str, revision: str, progress=gr.Progress()):
|
| 37 |
+
if not repo:
|
| 38 |
+
return NO_MODEL, [], []
|
| 39 |
+
|
| 40 |
+
progress(0, desc="Chargement du modèle")
|
| 41 |
+
report = evaluation.run(repo, revision)
|
| 42 |
+
return summary(report), report.confusion, report.cases
|
| 43 |
+
|
| 44 |
+
|
| 45 |
+
def pick_revision(repo: str) -> gr.Dropdown:
|
| 46 |
+
choices = revisions(repo)
|
| 47 |
+
return gr.Dropdown(choices=choices, value=choices[0][1] if choices else None)
|
| 48 |
+
|
| 49 |
+
|
| 50 |
+
def pick_model() -> gr.Dropdown:
|
| 51 |
+
choices = model_repos()
|
| 52 |
+
return gr.Dropdown(choices=choices, value=choices[0] if choices else None)
|
app/hub.py
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from pathlib import Path
|
| 2 |
+
|
| 3 |
+
from huggingface_hub import HfApi, hf_hub_download
|
| 4 |
+
|
| 5 |
+
from .config import MODEL_SEARCH, ORG, TOKEN
|
| 6 |
+
|
| 7 |
+
api = HfApi(token=TOKEN)
|
| 8 |
+
|
| 9 |
+
|
| 10 |
+
def model_repos() -> list[str]:
|
| 11 |
+
return sorted(model.id for model in api.list_models(author=ORG, search=MODEL_SEARCH))
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
def revisions(repo: str) -> list[tuple[str, str]]:
|
| 15 |
+
if not repo:
|
| 16 |
+
return []
|
| 17 |
+
commits = api.list_repo_commits(repo, token=TOKEN)
|
| 18 |
+
return [("main (dernier)", "main"), *(_commit_choice(c) for c in commits)]
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
def _commit_choice(commit) -> tuple[str, str]:
|
| 22 |
+
label = f"{commit.commit_id[:7]} · {commit.title[:44]} · {commit.created_at:%Y-%m-%d}"
|
| 23 |
+
return label, commit.commit_id
|
| 24 |
+
|
| 25 |
+
|
| 26 |
+
def download(repo: str, filename: str, revision: str) -> Path:
|
| 27 |
+
return Path(hf_hub_download(repo, filename, revision=revision, token=TOKEN))
|
| 28 |
+
|
| 29 |
+
|
| 30 |
+
def has_file(repo: str, filename: str, revision: str) -> bool:
|
| 31 |
+
return filename in api.list_repo_files(repo, revision=revision, token=TOKEN)
|
app/predictors.py
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import json
|
| 2 |
+
from collections.abc import Callable
|
| 3 |
+
from functools import lru_cache
|
| 4 |
+
|
| 5 |
+
import joblib
|
| 6 |
+
import numpy as np
|
| 7 |
+
import torch
|
| 8 |
+
from sentence_transformers import SentenceTransformer
|
| 9 |
+
from transformers import AutoModelForSequenceClassification, AutoTokenizer
|
| 10 |
+
|
| 11 |
+
from .config import TOKEN
|
| 12 |
+
from .hub import download, has_file
|
| 13 |
+
|
| 14 |
+
Predictor = Callable[[list[str]], tuple[list[str], np.ndarray]]
|
| 15 |
+
|
| 16 |
+
|
| 17 |
+
def setfit(repo: str, revision: str) -> Predictor:
|
| 18 |
+
encoder = SentenceTransformer(repo, revision=revision, token=TOKEN)
|
| 19 |
+
head = joblib.load(download(repo, "model_head.pkl", revision))
|
| 20 |
+
labels = json.loads(download(repo, "config_setfit.json", revision).read_text())["labels"]
|
| 21 |
+
|
| 22 |
+
def predict(texts: list[str]):
|
| 23 |
+
return labels, head.predict_proba(encoder.encode(texts))
|
| 24 |
+
|
| 25 |
+
return predict
|
| 26 |
+
|
| 27 |
+
|
| 28 |
+
def automodel(repo: str, revision: str) -> Predictor:
|
| 29 |
+
tokenizer = AutoTokenizer.from_pretrained(repo, revision=revision, token=TOKEN)
|
| 30 |
+
model = AutoModelForSequenceClassification.from_pretrained(
|
| 31 |
+
repo, revision=revision, token=TOKEN
|
| 32 |
+
).eval()
|
| 33 |
+
labels = [model.config.id2label[i] for i in range(model.config.num_labels)]
|
| 34 |
+
|
| 35 |
+
def predict(texts: list[str]):
|
| 36 |
+
batch = tokenizer(texts, truncation=True, padding=True, return_tensors="pt")
|
| 37 |
+
with torch.no_grad():
|
| 38 |
+
logits = model(**batch).logits
|
| 39 |
+
return labels, torch.softmax(logits, dim=-1).numpy()
|
| 40 |
+
|
| 41 |
+
return predict
|
| 42 |
+
|
| 43 |
+
|
| 44 |
+
@lru_cache(maxsize=4)
|
| 45 |
+
def load(repo: str, revision: str) -> Predictor:
|
| 46 |
+
if has_file(repo, "model_head.pkl", revision):
|
| 47 |
+
return setfit(repo, revision)
|
| 48 |
+
return automodel(repo, revision)
|
app/text.py
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from .config import CALLER_TURNS, DATASET_REPO, ORG
|
| 2 |
+
|
| 3 |
+
HEADER = f"""
|
| 4 |
+
# Risque d'immobilisation
|
| 5 |
+
|
| 6 |
+
Classe les **tours de parole de l'appelant** d'un appel entrant en `risk` — le
|
| 7 |
+
véhicule est probablement immobilisé, il faut un dépannage ou un créneau urgent
|
| 8 |
+
— ou `no_risk` — le client peut rouler, un rendez-vous normal suffit.
|
| 9 |
+
|
| 10 |
+
<sub>Modèles publiés par `train.py` dans l'organisation `{ORG}` · évalués sur le
|
| 11 |
+
split de test de [`{DATASET_REPO}`](https://huggingface.co/datasets/{DATASET_REPO})
|
| 12 |
+
· seuls les {CALLER_TURNS} derniers tours sont lus</sub>
|
| 13 |
+
"""
|
| 14 |
+
|
| 15 |
+
PLACEHOLDER = "Oui bonjour.\nMa voiture ne démarre plus depuis ce matin."
|
| 16 |
+
|
| 17 |
+
TRANSCRIPT_INFO = (
|
| 18 |
+
f"Un tour par ligne. Seuls les {CALLER_TURNS} derniers sont classés. "
|
| 19 |
+
"⇧ Entrée ou ⌘/Ctrl + Entrée pour classer."
|
| 20 |
+
)
|
| 21 |
+
|
| 22 |
+
NO_MODEL = "Aucun modèle sélectionné."
|
app/turns.py
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from .config import CALLER_TURNS
|
| 2 |
+
|
| 3 |
+
|
| 4 |
+
def last_turns(transcript: str, count: int = CALLER_TURNS) -> list[str]:
|
| 5 |
+
lines = [line.strip() for line in transcript.splitlines() if line.strip()]
|
| 6 |
+
return lines[-count:]
|
| 7 |
+
|
| 8 |
+
|
| 9 |
+
def window(transcript: str) -> str:
|
| 10 |
+
return "\n".join(last_turns(transcript))
|
app/ui.py
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from pathlib import Path
|
| 2 |
+
|
| 3 |
+
import gradio as gr
|
| 4 |
+
|
| 5 |
+
from .config import display
|
| 6 |
+
from .handlers import EXAMPLES, classify, evaluate, pick_model, pick_revision
|
| 7 |
+
from .hub import model_repos, revisions
|
| 8 |
+
from .text import HEADER, PLACEHOLDER, TRANSCRIPT_INFO
|
| 9 |
+
|
| 10 |
+
CMD_ENTER_JS = (Path(__file__).parent / "cmd_enter.js").read_text(encoding="utf-8")
|
| 11 |
+
|
| 12 |
+
|
| 13 |
+
def selectors() -> tuple[gr.Dropdown, gr.Dropdown, gr.Button]:
|
| 14 |
+
repos = model_repos()
|
| 15 |
+
repo = repos[0] if repos else None
|
| 16 |
+
revs = revisions(repo) if repo else []
|
| 17 |
+
model = gr.Dropdown(label="Modèle", choices=repos, value=repo, scale=3)
|
| 18 |
+
revision = gr.Dropdown(
|
| 19 |
+
label="Révision",
|
| 20 |
+
choices=revs,
|
| 21 |
+
value=revs[0][1] if revs else None,
|
| 22 |
+
scale=4,
|
| 23 |
+
)
|
| 24 |
+
return model, revision, gr.Button("↻", scale=0, min_width=48)
|
| 25 |
+
|
| 26 |
+
|
| 27 |
+
def classify_tab() -> tuple[gr.Textbox, gr.Button, list]:
|
| 28 |
+
with gr.Row():
|
| 29 |
+
with gr.Column(scale=3):
|
| 30 |
+
transcript = gr.Textbox(
|
| 31 |
+
label="Tours de parole de l'appelant",
|
| 32 |
+
info=TRANSCRIPT_INFO,
|
| 33 |
+
placeholder=PLACEHOLDER,
|
| 34 |
+
lines=7,
|
| 35 |
+
max_lines=14,
|
| 36 |
+
)
|
| 37 |
+
run = gr.Button("Classer", variant="primary", elem_id="run-classify")
|
| 38 |
+
gr.Examples(
|
| 39 |
+
examples=[[row["text"]] for row in EXAMPLES],
|
| 40 |
+
example_labels=[f"{display(row['gold'])} — {row['id']}" for row in EXAMPLES],
|
| 41 |
+
label="Exemples du split de test",
|
| 42 |
+
inputs=transcript,
|
| 43 |
+
)
|
| 44 |
+
|
| 45 |
+
with gr.Column(scale=2):
|
| 46 |
+
prediction = gr.Label(label="Prédiction", num_top_classes=2)
|
| 47 |
+
reads = gr.Textbox(
|
| 48 |
+
label="Ce que le modèle lit",
|
| 49 |
+
lines=3,
|
| 50 |
+
interactive=False,
|
| 51 |
+
buttons=["copy"],
|
| 52 |
+
)
|
| 53 |
+
latency = gr.Markdown()
|
| 54 |
+
|
| 55 |
+
return transcript, run, [prediction, reads, latency]
|
| 56 |
+
|
| 57 |
+
|
| 58 |
+
def evaluation_tab() -> tuple[gr.Button, list]:
|
| 59 |
+
run = gr.Button("Évaluer sur le split de test", variant="primary")
|
| 60 |
+
score = gr.Markdown()
|
| 61 |
+
matrix = gr.Dataframe(
|
| 62 |
+
label="Matrice de confusion",
|
| 63 |
+
headers=["", "prédit risque", "prédit pas de risque"],
|
| 64 |
+
interactive=False,
|
| 65 |
+
)
|
| 66 |
+
cases = gr.Dataframe(
|
| 67 |
+
label="Cas (erreurs d'abord)",
|
| 68 |
+
headers=["", "id", "attendu", "prédit", "confiance", "texte"],
|
| 69 |
+
datatype=["str", "str", "str", "str", "number", "str"],
|
| 70 |
+
wrap=True,
|
| 71 |
+
interactive=False,
|
| 72 |
+
)
|
| 73 |
+
return run, [score, matrix, cases]
|
| 74 |
+
|
| 75 |
+
|
| 76 |
+
def build() -> gr.Blocks:
|
| 77 |
+
with gr.Blocks(title="Risque d'immobilisation") as demo:
|
| 78 |
+
gr.Markdown(HEADER)
|
| 79 |
+
|
| 80 |
+
with gr.Row():
|
| 81 |
+
model, revision, refresh = selectors()
|
| 82 |
+
selection = [model, revision]
|
| 83 |
+
|
| 84 |
+
with gr.Tab("Classer"):
|
| 85 |
+
transcript, run, results = classify_tab()
|
| 86 |
+
|
| 87 |
+
with gr.Tab("Évaluation"):
|
| 88 |
+
evaluate_button, report = evaluation_tab()
|
| 89 |
+
|
| 90 |
+
model.change(pick_revision, model, revision)
|
| 91 |
+
refresh.click(pick_model, None, model)
|
| 92 |
+
gr.on(
|
| 93 |
+
[run.click, transcript.submit],
|
| 94 |
+
classify,
|
| 95 |
+
[*selection, transcript],
|
| 96 |
+
results,
|
| 97 |
+
api_name="classify",
|
| 98 |
+
)
|
| 99 |
+
evaluate_button.click(evaluate, selection, report, api_name="evaluate")
|
| 100 |
+
|
| 101 |
+
return demo
|
main.py
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from app.ui import CMD_ENTER_JS, build
|
| 2 |
+
|
| 3 |
+
if __name__ == "__main__":
|
| 4 |
+
build().launch(server_name="0.0.0.0", server_port=7860, js=CMD_ENTER_JS)
|
pyproject.toml
CHANGED
|
@@ -7,6 +7,8 @@ requires-python = "==3.12.*"
|
|
| 7 |
dependencies = [
|
| 8 |
"gradio==6.20.0",
|
| 9 |
"sentence-transformers>=5.6.1",
|
|
|
|
|
|
|
| 10 |
"scikit-learn>=1.5",
|
| 11 |
"joblib>=1.4",
|
| 12 |
"huggingface-hub>=0.30",
|
|
|
|
| 7 |
dependencies = [
|
| 8 |
"gradio==6.20.0",
|
| 9 |
"sentence-transformers>=5.6.1",
|
| 10 |
+
"transformers>=5",
|
| 11 |
+
"datasets>=3",
|
| 12 |
"scikit-learn>=1.5",
|
| 13 |
"joblib>=1.4",
|
| 14 |
"huggingface-hub>=0.30",
|
uv.lock
CHANGED
|
@@ -8,6 +8,64 @@ resolution-markers = [
|
|
| 8 |
"sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32'",
|
| 9 |
]
|
| 10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 11 |
[[package]]
|
| 12 |
name = "annotated-doc"
|
| 13 |
version = "0.0.4"
|
|
@@ -39,11 +97,21 @@ wheels = [
|
|
| 39 |
{ url = "https://files.pythonhosted.org/packages/da/35/f2287558c17e29fafc8ef3daf819bb9834061cfa43bff8014f7df7f63bdc/anyio-4.14.2-py3-none-any.whl", hash = "sha256:9f505dda5ac9f0c8309b5e8bd445a8c2bf7246f3ce950121e45ea15bc41d1494", size = 125813, upload-time = "2026-07-12T20:29:05.763Z" },
|
| 40 |
]
|
| 41 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 42 |
[[package]]
|
| 43 |
name = "breakdown-risk-demo"
|
| 44 |
version = "0.1.0"
|
| 45 |
source = { virtual = "." }
|
| 46 |
dependencies = [
|
|
|
|
| 47 |
{ name = "gradio" },
|
| 48 |
{ name = "huggingface-hub" },
|
| 49 |
{ name = "joblib" },
|
|
@@ -52,10 +120,12 @@ dependencies = [
|
|
| 52 |
{ name = "sentence-transformers" },
|
| 53 |
{ name = "torch", version = "2.13.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'linux'" },
|
| 54 |
{ name = "torch", version = "2.13.0+cpu", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "sys_platform == 'linux'" },
|
|
|
|
| 55 |
]
|
| 56 |
|
| 57 |
[package.metadata]
|
| 58 |
requires-dist = [
|
|
|
|
| 59 |
{ name = "gradio", specifier = "==6.20.0" },
|
| 60 |
{ name = "huggingface-hub", specifier = ">=0.30" },
|
| 61 |
{ name = "joblib", specifier = ">=1.4" },
|
|
@@ -64,6 +134,7 @@ requires-dist = [
|
|
| 64 |
{ name = "sentence-transformers", specifier = ">=5.6.1" },
|
| 65 |
{ name = "torch", marker = "sys_platform != 'linux'", specifier = ">=2.2" },
|
| 66 |
{ name = "torch", marker = "sys_platform == 'linux'", specifier = ">=2.2", index = "https://download.pytorch.org/whl/cpu" },
|
|
|
|
| 67 |
]
|
| 68 |
|
| 69 |
[[package]]
|
|
@@ -93,6 +164,28 @@ wheels = [
|
|
| 93 |
{ url = "https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775", size = 136983, upload-time = "2026-07-22T03:35:11.276Z" },
|
| 94 |
]
|
| 95 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 96 |
[[package]]
|
| 97 |
name = "click"
|
| 98 |
version = "8.4.2"
|
|
@@ -114,6 +207,40 @@ wheels = [
|
|
| 114 |
{ url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
|
| 115 |
]
|
| 116 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 117 |
[[package]]
|
| 118 |
name = "fastapi"
|
| 119 |
version = "0.140.7"
|
|
@@ -139,6 +266,31 @@ wheels = [
|
|
| 139 |
{ url = "https://files.pythonhosted.org/packages/06/79/b4c714bef36bc4ec2beeae1e0c124f0223888cd8c6feb1cdc56038116920/filelock-3.32.0-py3-none-any.whl", hash = "sha256:d396bea984af47333ef05e50eae7eff88c84256de6112aea0ec48a233c064fe3", size = 97732, upload-time = "2026-07-21T13:17:41.55Z" },
|
| 140 |
]
|
| 141 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 142 |
[[package]]
|
| 143 |
name = "fsspec"
|
| 144 |
version = "2026.4.0"
|
|
@@ -148,6 +300,11 @@ wheels = [
|
|
| 148 |
{ url = "https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl", hash = "sha256:11ef7bb35dab8a394fde6e608221d5cf3e8499401c249bebaeaad760a1a8dec2", size = 203402, upload-time = "2026-04-29T20:42:36.842Z" },
|
| 149 |
]
|
| 150 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 151 |
[[package]]
|
| 152 |
name = "gradio"
|
| 153 |
version = "6.20.0"
|
|
@@ -376,6 +533,48 @@ wheels = [
|
|
| 376 |
{ 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" },
|
| 377 |
]
|
| 378 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 379 |
[[package]]
|
| 380 |
name = "narwhals"
|
| 381 |
version = "2.24.0"
|
|
@@ -484,6 +683,47 @@ wheels = [
|
|
| 484 |
{ url = "https://files.pythonhosted.org/packages/de/47/4845a0a6c0dbf1db8456bd9fc791f13c5ced7ced20606d08a0aacfd25b49/pillow-12.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:331b624368d4f1d069149002f25f44bc61c8919ce8ddb3c45bdad8f6e2d89510", size = 2568267, upload-time = "2026-07-01T11:54:24.051Z" },
|
| 485 |
]
|
| 486 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 487 |
[[package]]
|
| 488 |
name = "pydantic"
|
| 489 |
version = "2.13.4"
|
|
@@ -619,6 +859,21 @@ wheels = [
|
|
| 619 |
{ url = "https://files.pythonhosted.org/packages/3e/4c/e4d7e086449bdf379d89774bf1f89dc4a41943f3c5a6125a03905b34b5fb/regex-2026.7.19-cp312-cp312-win_arm64.whl", hash = "sha256:de9208bb427130c82a5dbfd104f92c8876fc9559278c880b3002755bbbe9c83d", size = 277136, upload-time = "2026-07-19T00:17:34.803Z" },
|
| 620 |
]
|
| 621 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 622 |
[[package]]
|
| 623 |
name = "rich"
|
| 624 |
version = "15.0.0"
|
|
@@ -957,6 +1212,15 @@ wheels = [
|
|
| 957 |
{ url = "https://files.pythonhosted.org/packages/e5/6d/b53b99a9f2766d095985947a5782f1702cabb129a34f7a802d7197af832f/tzdata-2026.3-py2.py3-none-any.whl", hash = "sha256:dc096730c87af6cab1b171c9d532be840741ff5d459015e7f6947bd7d7e54931", size = 348168, upload-time = "2026-07-10T08:50:36.46Z" },
|
| 958 |
]
|
| 959 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 960 |
[[package]]
|
| 961 |
name = "uvicorn"
|
| 962 |
version = "0.51.0"
|
|
@@ -969,3 +1233,61 @@ sdist = { url = "https://files.pythonhosted.org/packages/a2/65/b7c6c443ccc58678c
|
|
| 969 |
wheels = [
|
| 970 |
{ url = "https://files.pythonhosted.org/packages/45/ec/dbb7e5a6b91f86bfb9eb7d2988a2730907b6a729875b949c7f022e8b88fa/uvicorn-0.51.0-py3-none-any.whl", hash = "sha256:5d38af6cd620f2ae3849fb44fd4879e0890aa1febe8d47eb355fb45d93fe6a5b", size = 73219, upload-time = "2026-07-08T10:59:04.44Z" },
|
| 971 |
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 8 |
"sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32'",
|
| 9 |
]
|
| 10 |
|
| 11 |
+
[[package]]
|
| 12 |
+
name = "aiohappyeyeballs"
|
| 13 |
+
version = "2.7.1"
|
| 14 |
+
source = { registry = "https://pypi.org/simple" }
|
| 15 |
+
sdist = { url = "https://files.pythonhosted.org/packages/ce/f4/eec0465c2f67b2664688d0240b3212d5196fd89e741df67ddb81f8d35658/aiohappyeyeballs-2.7.1.tar.gz", hash = "sha256:065665c041c42a5938ed220bdcd7230f22527fbec085e1853d2402c8a3615d9d", size = 24757, upload-time = "2026-07-01T17:11:55.501Z" }
|
| 16 |
+
wheels = [
|
| 17 |
+
{ url = "https://files.pythonhosted.org/packages/71/43/1947f06babed6b3f1d7f38b0c767f52df66bfb2bc10b468c4a7de9eceff2/aiohappyeyeballs-2.7.1-py3-none-any.whl", hash = "sha256:9243213661e29250eb41368e5daa826fc017156c3b8a11440826b2e3ed376472", size = 15038, upload-time = "2026-07-01T17:11:54.055Z" },
|
| 18 |
+
]
|
| 19 |
+
|
| 20 |
+
[[package]]
|
| 21 |
+
name = "aiohttp"
|
| 22 |
+
version = "3.14.3"
|
| 23 |
+
source = { registry = "https://pypi.org/simple" }
|
| 24 |
+
dependencies = [
|
| 25 |
+
{ name = "aiohappyeyeballs" },
|
| 26 |
+
{ name = "aiosignal" },
|
| 27 |
+
{ name = "attrs" },
|
| 28 |
+
{ name = "frozenlist" },
|
| 29 |
+
{ name = "multidict" },
|
| 30 |
+
{ name = "propcache" },
|
| 31 |
+
{ name = "typing-extensions" },
|
| 32 |
+
{ name = "yarl" },
|
| 33 |
+
]
|
| 34 |
+
sdist = { url = "https://files.pythonhosted.org/packages/58/d9/22ce5786ac0c1653ae8b6c23bded02c1686d11f0dbb45b31ce128e0df985/aiohttp-3.14.3.tar.gz", hash = "sha256:9491196535a88924a60afd5b5f434b5b203b6cc616250878dbdb223a8f7844bc", size = 7971213, upload-time = "2026-07-23T01:57:27.037Z" }
|
| 35 |
+
wheels = [
|
| 36 |
+
{ url = "https://files.pythonhosted.org/packages/18/d4/eb96299230e20acf2efae207cb8d69051f1f68e357e5ea5e479bf6fb097a/aiohttp-3.14.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:39aded8c7f3b935b54aab1d8d73c70ec0ee2d3ec3b943e0e86611bc150ba47f5", size = 754690, upload-time = "2026-07-23T01:53:47.332Z" },
|
| 37 |
+
{ url = "https://files.pythonhosted.org/packages/88/11/e7a70a209eb9a067c0d3212b518a0134e3484f5178c7533878b6b514d469/aiohttp-3.14.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5bcb6ff3fdab1258a192679ff1a05d44f59626430aa05cd1a9d2447423599228", size = 509484, upload-time = "2026-07-23T01:53:51.159Z" },
|
| 38 |
+
{ url = "https://files.pythonhosted.org/packages/30/07/4bbc222cc8dbe31d4c3e8a5baad2286e4d42026ac0c570027b89afce6344/aiohttp-3.14.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:617105e2c3018ee38d0c8ce5ee3c84f621a6d8b9f723202aacaff28449ca91ee", size = 511949, upload-time = "2026-07-23T01:53:55.083Z" },
|
| 39 |
+
{ url = "https://files.pythonhosted.org/packages/54/b9/42e74c46b7b7c794b995bbc1f573fb48950c38b19d8600c62a6804ee2d67/aiohttp-3.14.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f631fe87a6f30df5fbe6d79640b25e4cffb38c31c7fb6f10871517b84b0f8c1a", size = 1765282, upload-time = "2026-07-23T01:53:59.662Z" },
|
| 40 |
+
{ url = "https://files.pythonhosted.org/packages/6b/ed/62bc4d74363ad346d518e0720363a949f63e2e23439a79eb5813d4d29bb3/aiohttp-3.14.3-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a94dbaae5ae27bd849c93570669bff91e0510f33a80805738e3de72a7be0447b", size = 1741511, upload-time = "2026-07-23T01:54:04.063Z" },
|
| 41 |
+
{ url = "https://files.pythonhosted.org/packages/d0/9f/181e8a8bc79e47d13c7fc4540bd7a3b729d9505609c61f392a8dd2fbfe55/aiohttp-3.14.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8f2f1c4c032c7cedd7d8da6f54c97b70266c6570c3108d3fdffee7188bb70529", size = 1810680, upload-time = "2026-07-23T01:54:09.882Z" },
|
| 42 |
+
{ url = "https://files.pythonhosted.org/packages/5c/9a/dec94d6ad694552fe3424e3f1928d7a606a5d9d9433a04e7ecdd9d38ae7f/aiohttp-3.14.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ea05e1f97ceea523942d9b2a7d7c0359d781d683d6b043f5943a602b14da4787", size = 1905646, upload-time = "2026-07-23T01:54:13.475Z" },
|
| 43 |
+
{ url = "https://files.pythonhosted.org/packages/52/b7/7cd31f29d6055bd711ae6e669367fba6f5ae9de463910a793e30556a8db7/aiohttp-3.14.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:543906c127fb1d929b95076db19b83fa2d46751006ff1e23b093aa5ac4d8db42", size = 1792122, upload-time = "2026-07-23T01:54:15.752Z" },
|
| 44 |
+
{ url = "https://files.pythonhosted.org/packages/66/73/10b1ef93afa61f4963c746257b70ced619cf31a4798671de5fdb2608501d/aiohttp-3.14.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0a5ff2dfbb9ce645fa5b8ef3e02c6c0b9cc3f6030ff863d0c51fffc50cb5541b", size = 1591127, upload-time = "2026-07-23T01:54:19.489Z" },
|
| 45 |
+
{ url = "https://files.pythonhosted.org/packages/49/ed/3b203fa6de1b338c14acdc06bf6ca9b043b7944f005966958c2ced932cde/aiohttp-3.14.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:041badb8f84396357c4d3ad26de6afd7a32b112f43d3c63045c0c8278cfd2043", size = 1725210, upload-time = "2026-07-23T01:54:24.129Z" },
|
| 46 |
+
{ url = "https://files.pythonhosted.org/packages/28/b7/1c2aab8c706436dcc28598452488ac9cd7c409da815237c28c27d58993e6/aiohttp-3.14.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:530125ee1163c4219af35dc3aa1206e541e7b31b6efc1a3f93b70a136f65d427", size = 1764848, upload-time = "2026-07-23T01:54:27.973Z" },
|
| 47 |
+
{ url = "https://files.pythonhosted.org/packages/54/50/94c28f08b131c4bf10984ea2c7a536c9920608bb2d6e7f95642c30cc87b7/aiohttp-3.14.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c8653fd547c93a61aadc612007790f5555cdd18946fa48cf45e26d8ea4ea473d", size = 1777102, upload-time = "2026-07-23T01:54:31.775Z" },
|
| 48 |
+
{ url = "https://files.pythonhosted.org/packages/13/d4/e7d09ba7d345fb2d74440fd2fa033c5e079fac05552927705986f41a364f/aiohttp-3.14.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:89176250f686cb9853c0fb7ead90e639e915b84a6f43eedc2a4e7ec21f1037f0", size = 1580205, upload-time = "2026-07-23T01:54:34.518Z" },
|
| 49 |
+
{ url = "https://files.pythonhosted.org/packages/a3/84/072a91d68e1e1eb587985b54baab94221277f877e8ef274fc213a0ceae28/aiohttp-3.14.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3a26434dafe408229ff3403458ca58de24fb51936504decac49ce6755f77e59d", size = 1797219, upload-time = "2026-07-23T01:54:36.995Z" },
|
| 50 |
+
{ url = "https://files.pythonhosted.org/packages/e0/eb/aad34e897e668424d6e995da5dff8a4a09af93363d3392488772957a63aa/aiohttp-3.14.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d1558173930a5a8d3069cee5c92fc91c87c4dbcb099debbb3622053717145a19", size = 1768629, upload-time = "2026-07-23T01:54:40.103Z" },
|
| 51 |
+
{ url = "https://files.pythonhosted.org/packages/b6/2b/6bb88ddba0fecd9122aa3ebcad25996cf6c083a4a7040dbb3a4f97972af6/aiohttp-3.14.3-cp312-cp312-win32.whl", hash = "sha256:16100ad3ab8d649fdfbee87602d9d2dcdca9df0b9eda8a1b5fdc0d41f96da559", size = 451481, upload-time = "2026-07-23T01:54:42.547Z" },
|
| 52 |
+
{ url = "https://files.pythonhosted.org/packages/76/9b/f2f8f108da17ecef2cc3efc424e8b7ad3782b1a8360f7b8eae8ced84f6ea/aiohttp-3.14.3-cp312-cp312-win_amd64.whl", hash = "sha256:33a2d7c28d33797a2e99923dffa63f83d908a19b6bf26cfe80fa790aa5e1a75a", size = 476845, upload-time = "2026-07-23T01:54:44.853Z" },
|
| 53 |
+
{ url = "https://files.pythonhosted.org/packages/3e/44/28dac80a8941b604f4da10ce21097614ca1bf905ce93dca28d8d7de9c1e7/aiohttp-3.14.3-cp312-cp312-win_arm64.whl", hash = "sha256:362a3fd481769cac1a824514bcd86fda51c65e8fe6e051099e008fddde6db17c", size = 448050, upload-time = "2026-07-23T01:54:47.087Z" },
|
| 54 |
+
]
|
| 55 |
+
|
| 56 |
+
[[package]]
|
| 57 |
+
name = "aiosignal"
|
| 58 |
+
version = "1.4.0"
|
| 59 |
+
source = { registry = "https://pypi.org/simple" }
|
| 60 |
+
dependencies = [
|
| 61 |
+
{ name = "frozenlist" },
|
| 62 |
+
{ name = "typing-extensions" },
|
| 63 |
+
]
|
| 64 |
+
sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007, upload-time = "2025-07-03T22:54:43.528Z" }
|
| 65 |
+
wheels = [
|
| 66 |
+
{ url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" },
|
| 67 |
+
]
|
| 68 |
+
|
| 69 |
[[package]]
|
| 70 |
name = "annotated-doc"
|
| 71 |
version = "0.0.4"
|
|
|
|
| 97 |
{ url = "https://files.pythonhosted.org/packages/da/35/f2287558c17e29fafc8ef3daf819bb9834061cfa43bff8014f7df7f63bdc/anyio-4.14.2-py3-none-any.whl", hash = "sha256:9f505dda5ac9f0c8309b5e8bd445a8c2bf7246f3ce950121e45ea15bc41d1494", size = 125813, upload-time = "2026-07-12T20:29:05.763Z" },
|
| 98 |
]
|
| 99 |
|
| 100 |
+
[[package]]
|
| 101 |
+
name = "attrs"
|
| 102 |
+
version = "26.1.0"
|
| 103 |
+
source = { registry = "https://pypi.org/simple" }
|
| 104 |
+
sdist = { url = "https://files.pythonhosted.org/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32", size = 952055, upload-time = "2026-03-19T14:22:25.026Z" }
|
| 105 |
+
wheels = [
|
| 106 |
+
{ url = "https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309", size = 67548, upload-time = "2026-03-19T14:22:23.645Z" },
|
| 107 |
+
]
|
| 108 |
+
|
| 109 |
[[package]]
|
| 110 |
name = "breakdown-risk-demo"
|
| 111 |
version = "0.1.0"
|
| 112 |
source = { virtual = "." }
|
| 113 |
dependencies = [
|
| 114 |
+
{ name = "datasets" },
|
| 115 |
{ name = "gradio" },
|
| 116 |
{ name = "huggingface-hub" },
|
| 117 |
{ name = "joblib" },
|
|
|
|
| 120 |
{ name = "sentence-transformers" },
|
| 121 |
{ name = "torch", version = "2.13.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'linux'" },
|
| 122 |
{ name = "torch", version = "2.13.0+cpu", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "sys_platform == 'linux'" },
|
| 123 |
+
{ name = "transformers" },
|
| 124 |
]
|
| 125 |
|
| 126 |
[package.metadata]
|
| 127 |
requires-dist = [
|
| 128 |
+
{ name = "datasets", specifier = ">=3" },
|
| 129 |
{ name = "gradio", specifier = "==6.20.0" },
|
| 130 |
{ name = "huggingface-hub", specifier = ">=0.30" },
|
| 131 |
{ name = "joblib", specifier = ">=1.4" },
|
|
|
|
| 134 |
{ name = "sentence-transformers", specifier = ">=5.6.1" },
|
| 135 |
{ name = "torch", marker = "sys_platform != 'linux'", specifier = ">=2.2" },
|
| 136 |
{ name = "torch", marker = "sys_platform == 'linux'", specifier = ">=2.2", index = "https://download.pytorch.org/whl/cpu" },
|
| 137 |
+
{ name = "transformers", specifier = ">=5" },
|
| 138 |
]
|
| 139 |
|
| 140 |
[[package]]
|
|
|
|
| 164 |
{ url = "https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775", size = 136983, upload-time = "2026-07-22T03:35:11.276Z" },
|
| 165 |
]
|
| 166 |
|
| 167 |
+
[[package]]
|
| 168 |
+
name = "charset-normalizer"
|
| 169 |
+
version = "3.4.9"
|
| 170 |
+
source = { registry = "https://pypi.org/simple" }
|
| 171 |
+
sdist = { url = "https://files.pythonhosted.org/packages/bd/2a/23f34ec9d04624958e137efdc394888716353190e75f25dd22c7a2c7a8aa/charset_normalizer-3.4.9.tar.gz", hash = "sha256:673611bbd43f0810bec0b0f028ddeaaa501190339cac411f347ac76917c3ae7b", size = 152439, upload-time = "2026-07-07T14:34:58.454Z" }
|
| 172 |
+
wheels = [
|
| 173 |
+
{ url = "https://files.pythonhosted.org/packages/70/4a/ecbd131485c07fcdfad54e28946d513e3da22ef3b4bd854dcafae54ec739/charset_normalizer-3.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:45b0cc4e3556cd875e09102988d1ab8356c998b596c9fced84547c8138b487a0", size = 319300, upload-time = "2026-07-07T14:33:15.666Z" },
|
| 174 |
+
{ url = "https://files.pythonhosted.org/packages/ec/96/5d9364e3342d69f3a045e1777bc47c85c383e6e9466d561b33fdb419d1f9/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9b2aff1c7b3884512b9512c3eaadd9bab39fb45042ffaaa1dd08ff2b9f8109d9", size = 215802, upload-time = "2026-07-07T14:33:17.031Z" },
|
| 175 |
+
{ url = "https://files.pythonhosted.org/packages/4b/4c/5361f9aa7f2cb58d94f2ab831b3d493f69efb1d239654b4744e3c09527cb/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9104ed0bd76a429d46f9ec0dbc9b08ad1d2dcdf2b00a5a0daa1c145329b35b44", size = 237171, upload-time = "2026-07-07T14:33:18.576Z" },
|
| 176 |
+
{ url = "https://files.pythonhosted.org/packages/50/78/ce342ca4ff30b2eb49fe6d9578df85974f90c67d294113e94efdd9664cbd/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7b86a2b16095d250c6f58b3d9b2eee6f4147754344f3dab0922f7c9bf7d226c9", size = 233075, upload-time = "2026-07-07T14:33:20.084Z" },
|
| 177 |
+
{ url = "https://files.pythonhosted.org/packages/01/c4/4fa4c8b3097a11f3c5f09a35b72ed6855fb1d332469504962ab7bafcc702/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e226f6218febc71f6c1fc2fafb91c226f75bdc1d8fb12d66823716e891608fd", size = 224256, upload-time = "2026-07-07T14:33:21.747Z" },
|
| 178 |
+
{ url = "https://files.pythonhosted.org/packages/87/3a/ad914516df7e358a81aae018caa5e0470ba827fa6d763b1d2e87d920a5f6/charset_normalizer-3.4.9-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:90c44bc373b7687f6948b693cceaea1348ae0975d7474746559494468e3c1d84", size = 208784, upload-time = "2026-07-07T14:33:23.313Z" },
|
| 179 |
+
{ url = "https://files.pythonhosted.org/packages/d7/74/3c12f9755717dfe5c5c87da63f35d765fa0c00382ec26bf23f7fae34f2ba/charset_normalizer-3.4.9-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cdef90ae47919cae358d8ab15797a800ed41da7aba5d72419fb510729e2ed4b", size = 219928, upload-time = "2026-07-07T14:33:24.814Z" },
|
| 180 |
+
{ url = "https://files.pythonhosted.org/packages/33/9a/895095b83e7907abd6d3d99aad3a38ad0d9686cc186cb0c94c24320fe63e/charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:60f44ade2cf573dad7a277e6f8ca9a51a21dda572b13bd7d8539bb3cd5dbedde", size = 218489, upload-time = "2026-07-07T14:33:26.42Z" },
|
| 181 |
+
{ url = "https://files.pythonhosted.org/packages/a1/34/ef5c05f412f42520d7709b7d3784d19640839eb7366ded1755511585429f/charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:a1786910334ed46ab1dd73222f2cd1e05c2c3bb39f6dddb4f8b36fc382058a39", size = 210267, upload-time = "2026-07-07T14:33:27.952Z" },
|
| 182 |
+
{ url = "https://files.pythonhosted.org/packages/83/dc/9b29fa4412b318bf3bfea985c35d67eb55e04b59a7c3f2237168b0e0be6f/charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:03d07803992c6c7bbc976327f34b18b6160327fc81cb82c9d504720ac0be3b62", size = 226030, upload-time = "2026-07-07T14:33:29.397Z" },
|
| 183 |
+
{ url = "https://files.pythonhosted.org/packages/0e/42/6dbc00b8cd16011691203e33570fa42ed5746599a2e878112d16eab403a3/charset_normalizer-3.4.9-cp312-cp312-win32.whl", hash = "sha256:78841cccf1af7b40f6f716338d50c0902dbe88d9f800b3c973b7a9a0a693a642", size = 151185, upload-time = "2026-07-07T14:33:30.781Z" },
|
| 184 |
+
{ url = "https://files.pythonhosted.org/packages/80/cc/f920afd1a23c58ccd53c1d36085a71893a4737ff5e66e0371efab6809850/charset_normalizer-3.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:4b3dac63058cc36820b0dd072f89898604e2d39686fe05321729d00d8ac185a0", size = 162557, upload-time = "2026-07-07T14:33:32.176Z" },
|
| 185 |
+
{ url = "https://files.pythonhosted.org/packages/f0/e6/0386d43a261ff4e4b30c5857af7df877254b46bec7b9d1b74b6bf969a90b/charset_normalizer-3.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:78fa18e436a1a0e58dbd7e02fc4473f3f32cceb12df9dfca542d075961c307d2", size = 152665, upload-time = "2026-07-07T14:33:33.711Z" },
|
| 186 |
+
{ url = "https://files.pythonhosted.org/packages/98/2b/f97f1c193fb855c345d678f5077d6926034db0722df74c8f057020e05a25/charset_normalizer-3.4.9-py3-none-any.whl", hash = "sha256:68e5f26a1ad57ded6d1cfb85331d1c1a195314756471d97758c48498bb4dcdf5", size = 64538, upload-time = "2026-07-07T14:34:56.993Z" },
|
| 187 |
+
]
|
| 188 |
+
|
| 189 |
[[package]]
|
| 190 |
name = "click"
|
| 191 |
version = "8.4.2"
|
|
|
|
| 207 |
{ url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
|
| 208 |
]
|
| 209 |
|
| 210 |
+
[[package]]
|
| 211 |
+
name = "datasets"
|
| 212 |
+
version = "5.0.0"
|
| 213 |
+
source = { registry = "https://pypi.org/simple" }
|
| 214 |
+
dependencies = [
|
| 215 |
+
{ name = "dill" },
|
| 216 |
+
{ name = "filelock" },
|
| 217 |
+
{ name = "fsspec", extra = ["http"] },
|
| 218 |
+
{ name = "httpx" },
|
| 219 |
+
{ name = "huggingface-hub" },
|
| 220 |
+
{ name = "multiprocess" },
|
| 221 |
+
{ name = "numpy" },
|
| 222 |
+
{ name = "packaging" },
|
| 223 |
+
{ name = "pandas" },
|
| 224 |
+
{ name = "pyarrow" },
|
| 225 |
+
{ name = "pyyaml" },
|
| 226 |
+
{ name = "requests" },
|
| 227 |
+
{ name = "tqdm" },
|
| 228 |
+
{ name = "xxhash" },
|
| 229 |
+
]
|
| 230 |
+
sdist = { url = "https://files.pythonhosted.org/packages/d9/85/ce4f780c32f7e36d71257f1c27e8ba898ebe379cb54f211f5f2013f2c219/datasets-5.0.0.tar.gz", hash = "sha256:83dbbbdb07a33b82192b8c419deb18739b138ee2ce1a322d55ce6b100954ec1a", size = 631708, upload-time = "2026-06-05T13:18:26.124Z" }
|
| 231 |
+
wheels = [
|
| 232 |
+
{ url = "https://files.pythonhosted.org/packages/05/66/73034ad30b59f13439b75e620989dacba4c047256e358ba7c2e9ec98ea22/datasets-5.0.0-py3-none-any.whl", hash = "sha256:7dd34927a0fd7046e98aad5cb9430e699c373238a15befa7b9bf22b991a7fee6", size = 555084, upload-time = "2026-06-05T13:18:24.435Z" },
|
| 233 |
+
]
|
| 234 |
+
|
| 235 |
+
[[package]]
|
| 236 |
+
name = "dill"
|
| 237 |
+
version = "0.4.1"
|
| 238 |
+
source = { registry = "https://pypi.org/simple" }
|
| 239 |
+
sdist = { url = "https://files.pythonhosted.org/packages/81/e1/56027a71e31b02ddc53c7d65b01e68edf64dea2932122fe7746a516f75d5/dill-0.4.1.tar.gz", hash = "sha256:423092df4182177d4d8ba8290c8a5b640c66ab35ec7da59ccfa00f6fa3eea5fa", size = 187315, upload-time = "2026-01-19T02:36:56.85Z" }
|
| 240 |
+
wheels = [
|
| 241 |
+
{ url = "https://files.pythonhosted.org/packages/1e/77/dc8c558f7593132cf8fefec57c4f60c83b16941c574ac5f619abb3ae7933/dill-0.4.1-py3-none-any.whl", hash = "sha256:1e1ce33e978ae97fcfcff5638477032b801c46c7c65cf717f95fbc2248f79a9d", size = 120019, upload-time = "2026-01-19T02:36:55.663Z" },
|
| 242 |
+
]
|
| 243 |
+
|
| 244 |
[[package]]
|
| 245 |
name = "fastapi"
|
| 246 |
version = "0.140.7"
|
|
|
|
| 266 |
{ url = "https://files.pythonhosted.org/packages/06/79/b4c714bef36bc4ec2beeae1e0c124f0223888cd8c6feb1cdc56038116920/filelock-3.32.0-py3-none-any.whl", hash = "sha256:d396bea984af47333ef05e50eae7eff88c84256de6112aea0ec48a233c064fe3", size = 97732, upload-time = "2026-07-21T13:17:41.55Z" },
|
| 267 |
]
|
| 268 |
|
| 269 |
+
[[package]]
|
| 270 |
+
name = "frozenlist"
|
| 271 |
+
version = "1.8.0"
|
| 272 |
+
source = { registry = "https://pypi.org/simple" }
|
| 273 |
+
sdist = { url = "https://files.pythonhosted.org/packages/2d/f5/c831fac6cc817d26fd54c7eaccd04ef7e0288806943f7cc5bbf69f3ac1f0/frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad", size = 45875, upload-time = "2025-10-06T05:38:17.865Z" }
|
| 274 |
+
wheels = [
|
| 275 |
+
{ url = "https://files.pythonhosted.org/packages/69/29/948b9aa87e75820a38650af445d2ef2b6b8a6fab1a23b6bb9e4ef0be2d59/frozenlist-1.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78f7b9e5d6f2fdb88cdde9440dc147259b62b9d3b019924def9f6478be254ac1", size = 87782, upload-time = "2025-10-06T05:36:06.649Z" },
|
| 276 |
+
{ url = "https://files.pythonhosted.org/packages/64/80/4f6e318ee2a7c0750ed724fa33a4bdf1eacdc5a39a7a24e818a773cd91af/frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:229bf37d2e4acdaf808fd3f06e854a4a7a3661e871b10dc1f8f1896a3b05f18b", size = 50594, upload-time = "2025-10-06T05:36:07.69Z" },
|
| 277 |
+
{ url = "https://files.pythonhosted.org/packages/2b/94/5c8a2b50a496b11dd519f4a24cb5496cf125681dd99e94c604ccdea9419a/frozenlist-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f833670942247a14eafbb675458b4e61c82e002a148f49e68257b79296e865c4", size = 50448, upload-time = "2025-10-06T05:36:08.78Z" },
|
| 278 |
+
{ url = "https://files.pythonhosted.org/packages/6a/bd/d91c5e39f490a49df14320f4e8c80161cfcce09f1e2cde1edd16a551abb3/frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:494a5952b1c597ba44e0e78113a7266e656b9794eec897b19ead706bd7074383", size = 242411, upload-time = "2025-10-06T05:36:09.801Z" },
|
| 279 |
+
{ url = "https://files.pythonhosted.org/packages/8f/83/f61505a05109ef3293dfb1ff594d13d64a2324ac3482be2cedc2be818256/frozenlist-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f423a119f4777a4a056b66ce11527366a8bb92f54e541ade21f2374433f6d4", size = 243014, upload-time = "2025-10-06T05:36:11.394Z" },
|
| 280 |
+
{ url = "https://files.pythonhosted.org/packages/d8/cb/cb6c7b0f7d4023ddda30cf56b8b17494eb3a79e3fda666bf735f63118b35/frozenlist-1.8.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3462dd9475af2025c31cc61be6652dfa25cbfb56cbbf52f4ccfe029f38decaf8", size = 234909, upload-time = "2025-10-06T05:36:12.598Z" },
|
| 281 |
+
{ url = "https://files.pythonhosted.org/packages/31/c5/cd7a1f3b8b34af009fb17d4123c5a778b44ae2804e3ad6b86204255f9ec5/frozenlist-1.8.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4c800524c9cd9bac5166cd6f55285957fcfc907db323e193f2afcd4d9abd69b", size = 250049, upload-time = "2025-10-06T05:36:14.065Z" },
|
| 282 |
+
{ url = "https://files.pythonhosted.org/packages/c0/01/2f95d3b416c584a1e7f0e1d6d31998c4a795f7544069ee2e0962a4b60740/frozenlist-1.8.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d6a5df73acd3399d893dafc71663ad22534b5aa4f94e8a2fabfe856c3c1b6a52", size = 256485, upload-time = "2025-10-06T05:36:15.39Z" },
|
| 283 |
+
{ url = "https://files.pythonhosted.org/packages/ce/03/024bf7720b3abaebcff6d0793d73c154237b85bdf67b7ed55e5e9596dc9a/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:405e8fe955c2280ce66428b3ca55e12b3c4e9c336fb2103a4937e891c69a4a29", size = 237619, upload-time = "2025-10-06T05:36:16.558Z" },
|
| 284 |
+
{ url = "https://files.pythonhosted.org/packages/69/fa/f8abdfe7d76b731f5d8bd217827cf6764d4f1d9763407e42717b4bed50a0/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:908bd3f6439f2fef9e85031b59fd4f1297af54415fb60e4254a95f75b3cab3f3", size = 250320, upload-time = "2025-10-06T05:36:17.821Z" },
|
| 285 |
+
{ url = "https://files.pythonhosted.org/packages/f5/3c/b051329f718b463b22613e269ad72138cc256c540f78a6de89452803a47d/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:294e487f9ec720bd8ffcebc99d575f7eff3568a08a253d1ee1a0378754b74143", size = 246820, upload-time = "2025-10-06T05:36:19.046Z" },
|
| 286 |
+
{ url = "https://files.pythonhosted.org/packages/0f/ae/58282e8f98e444b3f4dd42448ff36fa38bef29e40d40f330b22e7108f565/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:74c51543498289c0c43656701be6b077f4b265868fa7f8a8859c197006efb608", size = 250518, upload-time = "2025-10-06T05:36:20.763Z" },
|
| 287 |
+
{ url = "https://files.pythonhosted.org/packages/8f/96/007e5944694d66123183845a106547a15944fbbb7154788cbf7272789536/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:776f352e8329135506a1d6bf16ac3f87bc25b28e765949282dcc627af36123aa", size = 239096, upload-time = "2025-10-06T05:36:22.129Z" },
|
| 288 |
+
{ url = "https://files.pythonhosted.org/packages/66/bb/852b9d6db2fa40be96f29c0d1205c306288f0684df8fd26ca1951d461a56/frozenlist-1.8.0-cp312-cp312-win32.whl", hash = "sha256:433403ae80709741ce34038da08511d4a77062aa924baf411ef73d1146e74faf", size = 39985, upload-time = "2025-10-06T05:36:23.661Z" },
|
| 289 |
+
{ url = "https://files.pythonhosted.org/packages/b8/af/38e51a553dd66eb064cdf193841f16f077585d4d28394c2fa6235cb41765/frozenlist-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:34187385b08f866104f0c0617404c8eb08165ab1272e884abc89c112e9c00746", size = 44591, upload-time = "2025-10-06T05:36:24.958Z" },
|
| 290 |
+
{ url = "https://files.pythonhosted.org/packages/a7/06/1dc65480ab147339fecc70797e9c2f69d9cea9cf38934ce08df070fdb9cb/frozenlist-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:fe3c58d2f5db5fbd18c2987cba06d51b0529f52bc3a6cdc33d3f4eab725104bd", size = 40102, upload-time = "2025-10-06T05:36:26.333Z" },
|
| 291 |
+
{ url = "https://files.pythonhosted.org/packages/9a/9a/e35b4a917281c0b8419d4207f4334c8e8c5dbf4f3f5f9ada73958d937dcc/frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d", size = 13409, upload-time = "2025-10-06T05:38:16.721Z" },
|
| 292 |
+
]
|
| 293 |
+
|
| 294 |
[[package]]
|
| 295 |
name = "fsspec"
|
| 296 |
version = "2026.4.0"
|
|
|
|
| 300 |
{ url = "https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl", hash = "sha256:11ef7bb35dab8a394fde6e608221d5cf3e8499401c249bebaeaad760a1a8dec2", size = 203402, upload-time = "2026-04-29T20:42:36.842Z" },
|
| 301 |
]
|
| 302 |
|
| 303 |
+
[package.optional-dependencies]
|
| 304 |
+
http = [
|
| 305 |
+
{ name = "aiohttp" },
|
| 306 |
+
]
|
| 307 |
+
|
| 308 |
[[package]]
|
| 309 |
name = "gradio"
|
| 310 |
version = "6.20.0"
|
|
|
|
| 533 |
{ 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" },
|
| 534 |
]
|
| 535 |
|
| 536 |
+
[[package]]
|
| 537 |
+
name = "multidict"
|
| 538 |
+
version = "6.7.1"
|
| 539 |
+
source = { registry = "https://pypi.org/simple" }
|
| 540 |
+
sdist = { url = "https://files.pythonhosted.org/packages/1a/c2/c2d94cbe6ac1753f3fc980da97b3d930efe1da3af3c9f5125354436c073d/multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d", size = 102010, upload-time = "2026-01-26T02:46:45.979Z" }
|
| 541 |
+
wheels = [
|
| 542 |
+
{ url = "https://files.pythonhosted.org/packages/8d/9c/f20e0e2cf80e4b2e4b1c365bf5fe104ee633c751a724246262db8f1a0b13/multidict-6.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a90f75c956e32891a4eda3639ce6dd86e87105271f43d43442a3aedf3cddf172", size = 76893, upload-time = "2026-01-26T02:43:52.754Z" },
|
| 543 |
+
{ url = "https://files.pythonhosted.org/packages/fe/cf/18ef143a81610136d3da8193da9d80bfe1cb548a1e2d1c775f26b23d024a/multidict-6.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fccb473e87eaa1382689053e4a4618e7ba7b9b9b8d6adf2027ee474597128cd", size = 45456, upload-time = "2026-01-26T02:43:53.893Z" },
|
| 544 |
+
{ url = "https://files.pythonhosted.org/packages/a9/65/1caac9d4cd32e8433908683446eebc953e82d22b03d10d41a5f0fefe991b/multidict-6.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0fa96985700739c4c7853a43c0b3e169360d6855780021bfc6d0f1ce7c123e7", size = 43872, upload-time = "2026-01-26T02:43:55.041Z" },
|
| 545 |
+
{ url = "https://files.pythonhosted.org/packages/cf/3b/d6bd75dc4f3ff7c73766e04e705b00ed6dbbaccf670d9e05a12b006f5a21/multidict-6.7.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cb2a55f408c3043e42b40cc8eecd575afa27b7e0b956dfb190de0f8499a57a53", size = 251018, upload-time = "2026-01-26T02:43:56.198Z" },
|
| 546 |
+
{ url = "https://files.pythonhosted.org/packages/fd/80/c959c5933adedb9ac15152e4067c702a808ea183a8b64cf8f31af8ad3155/multidict-6.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb0ce7b2a32d09892b3dd6cc44877a0d02a33241fafca5f25c8b6b62374f8b75", size = 258883, upload-time = "2026-01-26T02:43:57.499Z" },
|
| 547 |
+
{ url = "https://files.pythonhosted.org/packages/86/85/7ed40adafea3d4f1c8b916e3b5cc3a8e07dfcdcb9cd72800f4ed3ca1b387/multidict-6.7.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c3a32d23520ee37bf327d1e1a656fec76a2edd5c038bf43eddfa0572ec49c60b", size = 242413, upload-time = "2026-01-26T02:43:58.755Z" },
|
| 548 |
+
{ url = "https://files.pythonhosted.org/packages/d2/57/b8565ff533e48595503c785f8361ff9a4fde4d67de25c207cd0ba3befd03/multidict-6.7.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9c90fed18bffc0189ba814749fdcc102b536e83a9f738a9003e569acd540a733", size = 268404, upload-time = "2026-01-26T02:44:00.216Z" },
|
| 549 |
+
{ url = "https://files.pythonhosted.org/packages/e0/50/9810c5c29350f7258180dfdcb2e52783a0632862eb334c4896ac717cebcb/multidict-6.7.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:da62917e6076f512daccfbbde27f46fed1c98fee202f0559adec8ee0de67f71a", size = 269456, upload-time = "2026-01-26T02:44:02.202Z" },
|
| 550 |
+
{ url = "https://files.pythonhosted.org/packages/f3/8d/5e5be3ced1d12966fefb5c4ea3b2a5b480afcea36406559442c6e31d4a48/multidict-6.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfde23ef6ed9db7eaee6c37dcec08524cb43903c60b285b172b6c094711b3961", size = 256322, upload-time = "2026-01-26T02:44:03.56Z" },
|
| 551 |
+
{ url = "https://files.pythonhosted.org/packages/31/6e/d8a26d81ac166a5592782d208dd90dfdc0a7a218adaa52b45a672b46c122/multidict-6.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3758692429e4e32f1ba0df23219cd0b4fc0a52f476726fff9337d1a57676a582", size = 253955, upload-time = "2026-01-26T02:44:04.845Z" },
|
| 552 |
+
{ url = "https://files.pythonhosted.org/packages/59/4c/7c672c8aad41534ba619bcd4ade7a0dc87ed6b8b5c06149b85d3dd03f0cd/multidict-6.7.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:398c1478926eca669f2fd6a5856b6de9c0acf23a2cb59a14c0ba5844fa38077e", size = 251254, upload-time = "2026-01-26T02:44:06.133Z" },
|
| 553 |
+
{ url = "https://files.pythonhosted.org/packages/7b/bd/84c24de512cbafbdbc39439f74e967f19570ce7924e3007174a29c348916/multidict-6.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c102791b1c4f3ab36ce4101154549105a53dc828f016356b3e3bcae2e3a039d3", size = 252059, upload-time = "2026-01-26T02:44:07.518Z" },
|
| 554 |
+
{ url = "https://files.pythonhosted.org/packages/fa/ba/f5449385510825b73d01c2d4087bf6d2fccc20a2d42ac34df93191d3dd03/multidict-6.7.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a088b62bd733e2ad12c50dad01b7d0166c30287c166e137433d3b410add807a6", size = 263588, upload-time = "2026-01-26T02:44:09.382Z" },
|
| 555 |
+
{ url = "https://files.pythonhosted.org/packages/d7/11/afc7c677f68f75c84a69fe37184f0f82fce13ce4b92f49f3db280b7e92b3/multidict-6.7.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3d51ff4785d58d3f6c91bdbffcb5e1f7ddfda557727043aa20d20ec4f65e324a", size = 259642, upload-time = "2026-01-26T02:44:10.73Z" },
|
| 556 |
+
{ url = "https://files.pythonhosted.org/packages/2b/17/ebb9644da78c4ab36403739e0e6e0e30ebb135b9caf3440825001a0bddcb/multidict-6.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc5907494fccf3e7d3f94f95c91d6336b092b5fc83811720fae5e2765890dfba", size = 251377, upload-time = "2026-01-26T02:44:12.042Z" },
|
| 557 |
+
{ url = "https://files.pythonhosted.org/packages/ca/a4/840f5b97339e27846c46307f2530a2805d9d537d8b8bd416af031cad7fa0/multidict-6.7.1-cp312-cp312-win32.whl", hash = "sha256:28ca5ce2fd9716631133d0e9a9b9a745ad7f60bac2bccafb56aa380fc0b6c511", size = 41887, upload-time = "2026-01-26T02:44:14.245Z" },
|
| 558 |
+
{ url = "https://files.pythonhosted.org/packages/80/31/0b2517913687895f5904325c2069d6a3b78f66cc641a86a2baf75a05dcbb/multidict-6.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcee94dfbd638784645b066074b338bc9cc155d4b4bffa4adce1615c5a426c19", size = 46053, upload-time = "2026-01-26T02:44:15.371Z" },
|
| 559 |
+
{ url = "https://files.pythonhosted.org/packages/0c/5b/aba28e4ee4006ae4c7df8d327d31025d760ffa992ea23812a601d226e682/multidict-6.7.1-cp312-cp312-win_arm64.whl", hash = "sha256:ba0a9fb644d0c1a2194cf7ffb043bd852cea63a57f66fbd33959f7dae18517bf", size = 43307, upload-time = "2026-01-26T02:44:16.852Z" },
|
| 560 |
+
{ url = "https://files.pythonhosted.org/packages/81/08/7036c080d7117f28a4af526d794aab6a84463126db031b007717c1a6676e/multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56", size = 12319, upload-time = "2026-01-26T02:46:44.004Z" },
|
| 561 |
+
]
|
| 562 |
+
|
| 563 |
+
[[package]]
|
| 564 |
+
name = "multiprocess"
|
| 565 |
+
version = "0.70.19"
|
| 566 |
+
source = { registry = "https://pypi.org/simple" }
|
| 567 |
+
dependencies = [
|
| 568 |
+
{ name = "dill" },
|
| 569 |
+
]
|
| 570 |
+
sdist = { url = "https://files.pythonhosted.org/packages/a2/f2/e783ac7f2aeeed14e9e12801f22529cc7e6b7ab80928d6dcce4e9f00922d/multiprocess-0.70.19.tar.gz", hash = "sha256:952021e0e6c55a4a9fe4cd787895b86e239a40e76802a789d6305398d3975897", size = 2079989, upload-time = "2026-01-19T06:47:39.744Z" }
|
| 571 |
+
wheels = [
|
| 572 |
+
{ url = "https://files.pythonhosted.org/packages/e3/45/8004d1e6b9185c1a444d6b55ac5682acf9d98035e54386d967366035a03a/multiprocess-0.70.19-py310-none-any.whl", hash = "sha256:97404393419dcb2a8385910864eedf47a3cadf82c66345b44f036420eb0b5d87", size = 134948, upload-time = "2026-01-19T06:47:32.325Z" },
|
| 573 |
+
{ url = "https://files.pythonhosted.org/packages/86/c2/dec9722dc3474c164a0b6bcd9a7ed7da542c98af8cabce05374abab35edd/multiprocess-0.70.19-py311-none-any.whl", hash = "sha256:928851ae7973aea4ce0eaf330bbdafb2e01398a91518d5c8818802845564f45c", size = 144457, upload-time = "2026-01-19T06:47:33.711Z" },
|
| 574 |
+
{ url = "https://files.pythonhosted.org/packages/71/70/38998b950a97ea279e6bd657575d22d1a2047256caf707d9a10fbce4f065/multiprocess-0.70.19-py312-none-any.whl", hash = "sha256:3a56c0e85dd5025161bac5ce138dcac1e49174c7d8e74596537e729fd5c53c28", size = 150281, upload-time = "2026-01-19T06:47:35.037Z" },
|
| 575 |
+
{ url = "https://files.pythonhosted.org/packages/7e/82/69e539c4c2027f1e1697e09aaa2449243085a0edf81ae2c6341e84d769b6/multiprocess-0.70.19-py39-none-any.whl", hash = "sha256:0d4b4397ed669d371c81dcd1ef33fd384a44d6c3de1bd0ca7ac06d837720d3c5", size = 133477, upload-time = "2026-01-19T06:47:38.619Z" },
|
| 576 |
+
]
|
| 577 |
+
|
| 578 |
[[package]]
|
| 579 |
name = "narwhals"
|
| 580 |
version = "2.24.0"
|
|
|
|
| 683 |
{ url = "https://files.pythonhosted.org/packages/de/47/4845a0a6c0dbf1db8456bd9fc791f13c5ced7ced20606d08a0aacfd25b49/pillow-12.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:331b624368d4f1d069149002f25f44bc61c8919ce8ddb3c45bdad8f6e2d89510", size = 2568267, upload-time = "2026-07-01T11:54:24.051Z" },
|
| 684 |
]
|
| 685 |
|
| 686 |
+
[[package]]
|
| 687 |
+
name = "propcache"
|
| 688 |
+
version = "0.5.2"
|
| 689 |
+
source = { registry = "https://pypi.org/simple" }
|
| 690 |
+
sdist = { url = "https://files.pythonhosted.org/packages/ec/44/c87281c333769159c50594f22610f77398a47ccbfbbf23074e744e86f87c/propcache-0.5.2.tar.gz", hash = "sha256:01c4fc7480cd0598bb4b57022df55b9ca296da7fc5a8760bd8451a7e63a7d427", size = 50208, upload-time = "2026-05-08T21:02:12.199Z" }
|
| 691 |
+
wheels = [
|
| 692 |
+
{ url = "https://files.pythonhosted.org/packages/4a/cb/e27bc2b2737a0bb49962b275efa051e8f1c35a936df7d5139b6b658b7dc9/propcache-0.5.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:806719138ecd720339a12410fb9614ac9b2b2d3a5fdf8235d56981c36f4039ba", size = 95887, upload-time = "2026-05-08T21:00:11.277Z" },
|
| 693 |
+
{ url = "https://files.pythonhosted.org/packages/e6/13/b8ae04c59392f8d11c6cd9fb4011d1dc7c86b81225c770280300e259ffe1/propcache-0.5.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:db2b80ea58eab4f86b2beec3cc8b39e8ff9276ac20e96b7cce43c8ae84cd6b5a", size = 54654, upload-time = "2026-05-08T21:00:12.604Z" },
|
| 694 |
+
{ url = "https://files.pythonhosted.org/packages/2c/7d/49777a3e20b55863d4794384a38acd460c04157b0a00f8602b0d508b8431/propcache-0.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e5cbfac9f61484f7e9f3597775500cd3ebe8274e9b050c38f9525c77c97520bf", size = 55190, upload-time = "2026-05-08T21:00:13.935Z" },
|
| 695 |
+
{ url = "https://files.pythonhosted.org/packages/44/c7/085d0cd63062e84044e3f05797749c3f8e3938ff3aeb0eb2f69d43fafc91/propcache-0.5.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5dbc581d2814337da56222fab8dc5f161cd798a434e49bac27930aaef798e144", size = 59995, upload-time = "2026-05-08T21:00:15.526Z" },
|
| 696 |
+
{ url = "https://files.pythonhosted.org/packages/9c/42/32cf8e3009e92b2645cf1e944f701e8ea4e924dffde1ee26db860bcbf7e4/propcache-0.5.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:857187f381f88c8e2fa2fe56ab94879d011b883d5a2ee5a1b60a8cd2a06846d9", size = 63422, upload-time = "2026-05-08T21:00:16.824Z" },
|
| 697 |
+
{ url = "https://files.pythonhosted.org/packages/9e/1b/f112433f99fc979431b87a39ef169e3f8df070d99a72792c56d6937ac48b/propcache-0.5.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:178b4a2cdaac1818e2bf1c5a99b94383fa73ea5382e032a48dec07dc5668dc42", size = 64342, upload-time = "2026-05-08T21:00:18.362Z" },
|
| 698 |
+
{ url = "https://files.pythonhosted.org/packages/14/15/5574111ae50dd6e879456888c0eadd4c5a869959775854e18e18a6b345f3/propcache-0.5.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f328175a2cde1f0ff2c4ed8ce968b9dcfb55f3a7153f39e2957ed994da13476", size = 61639, upload-time = "2026-05-08T21:00:19.692Z" },
|
| 699 |
+
{ url = "https://files.pythonhosted.org/packages/cc/da/4d775080b1490c0ae604acda868bd71aabe3a89ed16f2aa4339eb8a283e7/propcache-0.5.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5671d09a36b06d0fd4a3da0fccbcae360e9b1570924171a15e9e0997f0249fba", size = 61588, upload-time = "2026-05-08T21:00:21.155Z" },
|
| 700 |
+
{ url = "https://files.pythonhosted.org/packages/04/ac/f076982cbe2195ee9cf32de5a1e46951d9fb399fc207f390562dd0fd8fb2/propcache-0.5.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:80168e2ebe4d3ec6599d10ad8f520304ae1cad9b6c5a95372aef1b66b7bfb53a", size = 60029, upload-time = "2026-05-08T21:00:22.713Z" },
|
| 701 |
+
{ url = "https://files.pythonhosted.org/packages/70/60/189be62e0dd898dce3b331e1b8c7a543cd3a405ac0c81fe8ee8a9d5d77e1/propcache-0.5.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:45f11346f884bc47444f6e6647131055844134c3175b629f84952e2b5cd62b64", size = 56774, upload-time = "2026-05-08T21:00:24.001Z" },
|
| 702 |
+
{ url = "https://files.pythonhosted.org/packages/ea/9e/93377b9c7939c1ffae98f878dee955efadfd638078bc86dbc21f9d52f651/propcache-0.5.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8e778ebd44ef4f66ed60a0416b06b489687db264a9c0b3620362f26489492913", size = 63532, upload-time = "2026-05-08T21:00:25.545Z" },
|
| 703 |
+
{ url = "https://files.pythonhosted.org/packages/14/f9/590ef6cfb9b8028d516d287812ece32bb0bc5f11fbb9c8bf6b2e6313fec8/propcache-0.5.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:c0cb9ed24c8964e172768d455a38254c2dd8a552905729ce006cad3d3dda59b1", size = 61592, upload-time = "2026-05-08T21:00:27.186Z" },
|
| 704 |
+
{ url = "https://files.pythonhosted.org/packages/b4/5e/70958b3034c297a630bba2f17ca7abc2d5f39a803ad7e370ab79d1ecd022/propcache-0.5.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1d1ad32d9d4355e2be65574fd0bfd3677e7066b009cd5b9b2dee8aa6a6393b33", size = 64788, upload-time = "2026-05-08T21:00:28.8Z" },
|
| 705 |
+
{ url = "https://files.pythonhosted.org/packages/12/fd/77fe5936d8c3086ca9048f7f415f122ed82e53884a9ec193646b42deef06/propcache-0.5.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c80f4ba3e8f00189165999a742ee526ebeccedf6c3f7beb0c7df821e9772435a", size = 62514, upload-time = "2026-05-08T21:00:30.098Z" },
|
| 706 |
+
{ url = "https://files.pythonhosted.org/packages/cf/74/66bd798b5b3be70aa1b391f5cc9d6a0a5532d7fd3b19ec0b213e72e6ad9d/propcache-0.5.2-cp312-cp312-win32.whl", hash = "sha256:8c7972d8f193740d9175f0998ab38717e6cd322d5935c5b0fef8c0d323fd9031", size = 39018, upload-time = "2026-05-08T21:00:31.622Z" },
|
| 707 |
+
{ url = "https://files.pythonhosted.org/packages/61/7c/5c0d34aa3024694d6dcb9271cdbdd08c4e47c1c0ad95ec7e7bc74cdea145/propcache-0.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:d9ee8826a7d47863a08ac44e1a5f611a462eefc3a194b492da242128bec75b42", size = 42322, upload-time = "2026-05-08T21:00:32.918Z" },
|
| 708 |
+
{ url = "https://files.pythonhosted.org/packages/4d/91/875812f1a3feb20ceba818ef39fbe4d92f1081e04ac815c822496d0d038b/propcache-0.5.2-cp312-cp312-win_arm64.whl", hash = "sha256:2800a4a8ead6b28cccd1ec54b59346f0def7922ee1c7598e8499c733cfbb7c84", size = 38172, upload-time = "2026-05-08T21:00:35.124Z" },
|
| 709 |
+
{ url = "https://files.pythonhosted.org/packages/3a/ed/1cdcab6ba3d6ab7feca11fc14f0eeea80755bb53ef4e892079f31b10a25f/propcache-0.5.2-py3-none-any.whl", hash = "sha256:be1ddfcbb376e3de5d2e2db1d58d6d67463e6b4f9f040c000de8e300295465fe", size = 14036, upload-time = "2026-05-08T21:02:10.673Z" },
|
| 710 |
+
]
|
| 711 |
+
|
| 712 |
+
[[package]]
|
| 713 |
+
name = "pyarrow"
|
| 714 |
+
version = "25.0.0"
|
| 715 |
+
source = { registry = "https://pypi.org/simple" }
|
| 716 |
+
sdist = { url = "https://files.pythonhosted.org/packages/27/f3/95428098d1fa7d04432fb750eed06b41304c2f6a5d3319985e64db2d9d41/pyarrow-25.0.0.tar.gz", hash = "sha256:d2d697008b5ec06d75952ef260c2e9a8a0f6ccfce24266c04c9c8ade927cb3b4", size = 1199181, upload-time = "2026-07-10T08:29:50.116Z" }
|
| 717 |
+
wheels = [
|
| 718 |
+
{ url = "https://files.pythonhosted.org/packages/73/44/fdd3a4377807b7dcabe2d4b5aa99dbbc98e2e5df3f1ca4e7f0aec492d987/pyarrow-25.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:149730a3d1f0fb59d663a0b8aa210adfd9c17c27cd94a0d143e60daea8320d4e", size = 35850884, upload-time = "2026-07-10T08:26:47.357Z" },
|
| 719 |
+
{ url = "https://files.pythonhosted.org/packages/bf/71/9f053177a7709b8c90abb00a2375b916286f9f0d6cfb21a5cadd4ef811e8/pyarrow-25.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:0721332c30fdd453fdd1fc203b2ac1f4c9db5aea28fa38d41f2574c4b068b9ec", size = 37616197, upload-time = "2026-07-10T08:26:53.564Z" },
|
| 720 |
+
{ url = "https://files.pythonhosted.org/packages/95/1a/22bfb6597dcdc861fa83c39c06e1457cb56f698940eff42fbb25de30e8e5/pyarrow-25.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:fa1482b3da10cac2d4db6e26b81da543e237616af2ef6d466018b31ca586496f", size = 46841966, upload-time = "2026-07-10T08:27:07.685Z" },
|
| 721 |
+
{ url = "https://files.pythonhosted.org/packages/55/0e/cd705c042bc4fe7022478db577fcab4abdcfabb9bc37ab7a75556b3fcb2b/pyarrow-25.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:5d1dbf24e151042f2fa3c129563f65d66674128868496fb008c4272b16bdf778", size = 50088993, upload-time = "2026-07-10T08:27:14.268Z" },
|
| 722 |
+
{ url = "https://files.pythonhosted.org/packages/98/ee/d822e1ee31fe31ec5d057210e0605c950b975dcd8d9a332976cc859a9df8/pyarrow-25.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:20887a762dd61dcc530f93a140840ab1f6aa7836b33270e42d627ab3cf11e537", size = 49941005, upload-time = "2026-07-10T08:27:21.274Z" },
|
| 723 |
+
{ url = "https://files.pythonhosted.org/packages/33/1b/207a90cc64619a095eb75a263ae069735f2810056d43c667befd573ec083/pyarrow-25.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:58d1ab556b0cea1c93fdb799b24ad58adb2f2a2788dbce782a94f64ae1a5cc9b", size = 53112355, upload-time = "2026-07-10T08:27:27.911Z" },
|
| 724 |
+
{ url = "https://files.pythonhosted.org/packages/7e/fe/81d1e5f8beed15c01e98649d5c6e2167b67fd395884a2488f18bf1cf0dba/pyarrow-25.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:3f356afe61186395c861d5cd63dc21ff7d5fa335012a4668d979257df7fea0f5", size = 27945954, upload-time = "2026-07-10T08:27:32.903Z" },
|
| 725 |
+
]
|
| 726 |
+
|
| 727 |
[[package]]
|
| 728 |
name = "pydantic"
|
| 729 |
version = "2.13.4"
|
|
|
|
| 859 |
{ url = "https://files.pythonhosted.org/packages/3e/4c/e4d7e086449bdf379d89774bf1f89dc4a41943f3c5a6125a03905b34b5fb/regex-2026.7.19-cp312-cp312-win_arm64.whl", hash = "sha256:de9208bb427130c82a5dbfd104f92c8876fc9559278c880b3002755bbbe9c83d", size = 277136, upload-time = "2026-07-19T00:17:34.803Z" },
|
| 860 |
]
|
| 861 |
|
| 862 |
+
[[package]]
|
| 863 |
+
name = "requests"
|
| 864 |
+
version = "2.34.2"
|
| 865 |
+
source = { registry = "https://pypi.org/simple" }
|
| 866 |
+
dependencies = [
|
| 867 |
+
{ name = "certifi" },
|
| 868 |
+
{ name = "charset-normalizer" },
|
| 869 |
+
{ name = "idna" },
|
| 870 |
+
{ name = "urllib3" },
|
| 871 |
+
]
|
| 872 |
+
sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" }
|
| 873 |
+
wheels = [
|
| 874 |
+
{ url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" },
|
| 875 |
+
]
|
| 876 |
+
|
| 877 |
[[package]]
|
| 878 |
name = "rich"
|
| 879 |
version = "15.0.0"
|
|
|
|
| 1212 |
{ url = "https://files.pythonhosted.org/packages/e5/6d/b53b99a9f2766d095985947a5782f1702cabb129a34f7a802d7197af832f/tzdata-2026.3-py2.py3-none-any.whl", hash = "sha256:dc096730c87af6cab1b171c9d532be840741ff5d459015e7f6947bd7d7e54931", size = 348168, upload-time = "2026-07-10T08:50:36.46Z" },
|
| 1213 |
]
|
| 1214 |
|
| 1215 |
+
[[package]]
|
| 1216 |
+
name = "urllib3"
|
| 1217 |
+
version = "2.7.0"
|
| 1218 |
+
source = { registry = "https://pypi.org/simple" }
|
| 1219 |
+
sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" }
|
| 1220 |
+
wheels = [
|
| 1221 |
+
{ url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" },
|
| 1222 |
+
]
|
| 1223 |
+
|
| 1224 |
[[package]]
|
| 1225 |
name = "uvicorn"
|
| 1226 |
version = "0.51.0"
|
|
|
|
| 1233 |
wheels = [
|
| 1234 |
{ url = "https://files.pythonhosted.org/packages/45/ec/dbb7e5a6b91f86bfb9eb7d2988a2730907b6a729875b949c7f022e8b88fa/uvicorn-0.51.0-py3-none-any.whl", hash = "sha256:5d38af6cd620f2ae3849fb44fd4879e0890aa1febe8d47eb355fb45d93fe6a5b", size = 73219, upload-time = "2026-07-08T10:59:04.44Z" },
|
| 1235 |
]
|
| 1236 |
+
|
| 1237 |
+
[[package]]
|
| 1238 |
+
name = "xxhash"
|
| 1239 |
+
version = "3.8.1"
|
| 1240 |
+
source = { registry = "https://pypi.org/simple" }
|
| 1241 |
+
sdist = { url = "https://files.pythonhosted.org/packages/8e/63/71aa56b151a1b28770037a61bd4e461c2619cfc8866a4fcaf1548605e325/xxhash-3.8.1.tar.gz", hash = "sha256:b0de4bf3aa66363552d52c6a89003c479911f12098cd48a53d44a0f7a25f7c46", size = 86223, upload-time = "2026-07-06T10:49:58.937Z" }
|
| 1242 |
+
wheels = [
|
| 1243 |
+
{ url = "https://files.pythonhosted.org/packages/42/91/f65c34a7aa7b4e7cf4854f8e6ef3f7ee32ceac41d4f008da0780db0612f6/xxhash-3.8.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e6e49370822c1f4d8d90e678b06dbcb08b51a026a7c4b55479e7d467f2e813bc", size = 34680, upload-time = "2026-07-06T10:44:40.932Z" },
|
| 1244 |
+
{ url = "https://files.pythonhosted.org/packages/57/04/b10a245a4c09a9cfa88f8e9ae755029413ad1ac17047f9a61906e5ae0799/xxhash-3.8.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:220d68130f83f7cc86d6edfdeab176adc73d7200bf3a8ec10c629e8cf605c215", size = 32397, upload-time = "2026-07-06T10:44:42.196Z" },
|
| 1245 |
+
{ url = "https://files.pythonhosted.org/packages/3a/75/45ab795b5945b6388583bd75202106af505537935566c15a1577797a0e08/xxhash-3.8.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4d365ee1892c1fa803536f8c6ce21d24b29c9718ec75eb856095c07830f8c478", size = 220549, upload-time = "2026-07-06T10:44:43.603Z" },
|
| 1246 |
+
{ url = "https://files.pythonhosted.org/packages/13/44/5ba2bd0a14ddf4193fc7d8ec29625f659f22c06d60b28f04bf46305d8330/xxhash-3.8.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:852bfe059720632e2f16a6a4745e41d20937b2bf2a42a401e2412046bb6971cc", size = 241186, upload-time = "2026-07-06T10:44:45.534Z" },
|
| 1247 |
+
{ url = "https://files.pythonhosted.org/packages/23/32/c4147def4d1e4538b906f82731e0ba23424377fc50a7cddd03cd284c8f63/xxhash-3.8.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2f8c25a7061d952de589bd0ea0eaadee32378ff83dd6a677b267f9cd86f401f8", size = 264852, upload-time = "2026-07-06T10:44:47.199Z" },
|
| 1248 |
+
{ url = "https://files.pythonhosted.org/packages/6c/bd/71ed14f4f0318bb7fd7b2ec51999413487fa8da8d41208e84d50d1ef0f98/xxhash-3.8.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:868a8dcaff1a84ba78038e1cef14fc88ccf84d9b4d12ea604696e0693296aa56", size = 242663, upload-time = "2026-07-06T10:44:48.846Z" },
|
| 1249 |
+
{ url = "https://files.pythonhosted.org/packages/91/09/70af22c565a8473b3f2ae73f88e7721af281bc4a575236dbd1970c9f76f6/xxhash-3.8.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6536d8677d2fff7e64cd0b98b976df9de7aee0e69590044c2af5f51b76b7a170", size = 473510, upload-time = "2026-07-06T10:44:50.695Z" },
|
| 1250 |
+
{ url = "https://files.pythonhosted.org/packages/18/96/34db781c8f0cf99c544ca1f2bc2e5bf55426e1eb4ca6de8ea5da56a9f352/xxhash-3.8.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:82c0cedd280eab2e8291270e6c04894dbc096f8159a39dcf1807429f026ca3cc", size = 220469, upload-time = "2026-07-06T10:44:52.422Z" },
|
| 1251 |
+
{ url = "https://files.pythonhosted.org/packages/93/5f/9a184f615fa5a4dce30c01534f62946ce5a11ce40f73785cbd356ccabaa9/xxhash-3.8.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:daa86e4b68221d38e669bb236ba112d0335353829fb627c82e5909e4bbe8694c", size = 310290, upload-time = "2026-07-06T10:44:54.142Z" },
|
| 1252 |
+
{ url = "https://files.pythonhosted.org/packages/a9/dc/9b9a9789011ee153723a5eb9e7dd7fcbae2ba9b3fe7a729249ca7c252056/xxhash-3.8.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2bc7113e6f2b6b3922dd61796ca9f36af09da3773898e7003038dc992fc83b8d", size = 238173, upload-time = "2026-07-06T10:44:55.693Z" },
|
| 1253 |
+
{ url = "https://files.pythonhosted.org/packages/ec/4d/71c6005ada9dcb608a4e1902e8475ecadb5f3fbfa04e1e244d276a2d0c43/xxhash-3.8.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5eed32dad81d6ba8e62dc7b9ffa0500199385d7810a8dd9d4eafaceb8c6e20bb", size = 269026, upload-time = "2026-07-06T10:44:57.424Z" },
|
| 1254 |
+
{ url = "https://files.pythonhosted.org/packages/2f/87/d6c036ba25dfbd9c8633be5aa86fc9474bbb9e2c68212a841d090abe7344/xxhash-3.8.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:83697b0ea1f10e7f5d8b26a4906fa851393c61546c63839643a2b7fe2d868061", size = 224970, upload-time = "2026-07-06T10:44:59.085Z" },
|
| 1255 |
+
{ url = "https://files.pythonhosted.org/packages/48/62/4c1f035a41c5752aa05e195b6c904c07b94fe9061a16de61e72a6e6b135f/xxhash-3.8.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:36fc69160465ae75c6ec4ac9f781bb2aa16ae7ff869e73c26fee85fbb11b9887", size = 240820, upload-time = "2026-07-06T10:45:00.746Z" },
|
| 1256 |
+
{ url = "https://files.pythonhosted.org/packages/da/14/d39d565069b87e86d21a2af2a31d04db79249d25aa8d5b62959056a89857/xxhash-3.8.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:445e0f5a31f2f3546ae0895d4811e159518cdc9d824c11419898d40cfadb677e", size = 300619, upload-time = "2026-07-06T10:45:02.716Z" },
|
| 1257 |
+
{ url = "https://files.pythonhosted.org/packages/13/22/75467acc887edc8cf71c97ab1708feb3df7a88bda589b9f399765c6387d2/xxhash-3.8.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:dfe0580fbfd5e4af87d0cc52d2044f155d55ebd8c8a93568758a2ea7d8e15975", size = 443267, upload-time = "2026-07-06T10:45:04.653Z" },
|
| 1258 |
+
{ url = "https://files.pythonhosted.org/packages/a4/b6/1da3baa5fa6ef705e3425fddd382be7dfc4dfba2686df90a20f16e9c7b1b/xxhash-3.8.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:095e1323fa108be1292c54c86da3ef3c7a7dc015b105a52133973bc07a6ad11a", size = 217338, upload-time = "2026-07-06T10:45:06.304Z" },
|
| 1259 |
+
{ url = "https://files.pythonhosted.org/packages/78/dd/b5295a9f97484e7a1c2b283a742ca45e3104991c55a1ef670dde161829ba/xxhash-3.8.1-cp312-cp312-win32.whl", hash = "sha256:bf28f55e427e0483acb1f666bd0d869b6d5e5a716680c216ad7befe3d4cfba2e", size = 31970, upload-time = "2026-07-06T10:45:07.823Z" },
|
| 1260 |
+
{ url = "https://files.pythonhosted.org/packages/ec/31/3fa0b807d7e21515cd975e7fe5c039d52ac3e9401a96d6ad68dae6305215/xxhash-3.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:2256e80e4960ee282f63428adb349cb7f8bd8efe4db770d88eb815f4b9860724", size = 32741, upload-time = "2026-07-06T10:45:09.42Z" },
|
| 1261 |
+
{ url = "https://files.pythonhosted.org/packages/b8/05/86feada74e239600e6875aa507afb40482a89b92700aa74a92da83bdcb77/xxhash-3.8.1-cp312-cp312-win_arm64.whl", hash = "sha256:9df56e6df96a60590935e22373041cccc91fd55858763dcffb55bf63b3a2b396", size = 29234, upload-time = "2026-07-06T10:45:10.809Z" },
|
| 1262 |
+
]
|
| 1263 |
+
|
| 1264 |
+
[[package]]
|
| 1265 |
+
name = "yarl"
|
| 1266 |
+
version = "1.24.5"
|
| 1267 |
+
source = { registry = "https://pypi.org/simple" }
|
| 1268 |
+
dependencies = [
|
| 1269 |
+
{ name = "idna" },
|
| 1270 |
+
{ name = "multidict" },
|
| 1271 |
+
{ name = "propcache" },
|
| 1272 |
+
]
|
| 1273 |
+
sdist = { url = "https://files.pythonhosted.org/packages/31/33/ebe9e3d1f86c7a0b51094c0a146392045ca1631d2664889539dec8088a33/yarl-1.24.5.tar.gz", hash = "sha256:e81b83143bee16329c23db3c1b2d82b29892fcbcb849186d2f6e98a5abe9a57f", size = 228679, upload-time = "2026-07-20T02:07:45.435Z" }
|
| 1274 |
+
wheels = [
|
| 1275 |
+
{ url = "https://files.pythonhosted.org/packages/1b/84/71d051c850b5af41d168c679d9eb67eb7c55283ac4ee131673edf134bc4e/yarl-1.24.5-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d693396e5aea78db03decd60aec9ece16c9b40ba00a587f089615ff4e718a81d", size = 136035, upload-time = "2026-07-20T02:05:25.489Z" },
|
| 1276 |
+
{ url = "https://files.pythonhosted.org/packages/03/4d/8ad27f9a1b7e69313cca5d695b925b48efe51208d3490e0844bae97cabc0/yarl-1.24.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3363fcc96e665878946ad7a106b9a13eac0541766a690ef287c0232ac768b6ec", size = 97642, upload-time = "2026-07-20T02:05:27.429Z" },
|
| 1277 |
+
{ url = "https://files.pythonhosted.org/packages/ea/b4/05b4131c407006cd1e410e9c6539f16a0945724677e5364447313c15ea3e/yarl-1.24.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9d399bdcfb4a0f659b9b3788bbc89babe63d9a6a65aacdf4d4e7065ff2e6316c", size = 97323, upload-time = "2026-07-20T02:05:29.441Z" },
|
| 1278 |
+
{ url = "https://files.pythonhosted.org/packages/20/16/e618c875c73e0e39611f20a581b3d5e8d59b8857bf001bee3263044c6deb/yarl-1.24.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90333fd89b43c0d08ac85f3f1447593fc2c66de18c3d6378d7125ea118dc7a54", size = 107741, upload-time = "2026-07-20T02:05:31.367Z" },
|
| 1279 |
+
{ url = "https://files.pythonhosted.org/packages/d9/9a/c4defeaf3ed33fcb346aacf9c6e971a8d4e2bde04a0310e79abb208e7965/yarl-1.24.5-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:665b0a2c463cc9423dd647e0bfd9f4ccc9b50f768c55304d5e9f80b177c1de12", size = 103570, upload-time = "2026-07-20T02:05:33.303Z" },
|
| 1280 |
+
{ url = "https://files.pythonhosted.org/packages/5f/e7/0e0e0de5865ebd5914537ef486f36c727a59865c3ac0cf5ff1b32aececbf/yarl-1.24.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e006d3a974c4ee19512e5f058abedb6eef36a5e553c14812bdeba1758d812e6d", size = 115815, upload-time = "2026-07-20T02:05:35.292Z" },
|
| 1281 |
+
{ url = "https://files.pythonhosted.org/packages/2b/27/ca56b700cb170aba25a3893b75355b213935657dc5714d2383354a270e62/yarl-1.24.5-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e7d42c531243450ef0d4d9c172e7ed6ef052640f195629065041b5add4e058d1", size = 116025, upload-time = "2026-07-20T02:05:37.503Z" },
|
| 1282 |
+
{ url = "https://files.pythonhosted.org/packages/d6/d0/d56c859b8222116f5d68459199f48359e0bf121b6f65a69bf329b3602ba0/yarl-1.24.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f08c7513ecef5aad65687bfdf6bc601ae9fccd04a42904501f8f7141abad9eb9", size = 109835, upload-time = "2026-07-20T02:05:39.506Z" },
|
| 1283 |
+
{ url = "https://files.pythonhosted.org/packages/70/a2/3a35557e4d1a79425040eba202ccaf08bdc8717680fc77e2498a1ad2e0a5/yarl-1.24.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6c95b17fe34ed802f17e205112e6e10db92275c34fee290aa9bdc55a9c724027", size = 108884, upload-time = "2026-07-20T02:05:41.584Z" },
|
| 1284 |
+
{ url = "https://files.pythonhosted.org/packages/e4/35/ef4c26356b7913c68983bac2d72a4212b3347af551cb8d250b99b5ed7b7f/yarl-1.24.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:56b149b22de33b23b0c6077ab9518c6dcb538ad462e1830e68d06591ccf6e38b", size = 107308, upload-time = "2026-07-20T02:05:43.697Z" },
|
| 1285 |
+
{ url = "https://files.pythonhosted.org/packages/d5/91/ff0dc66c2ccf3e0153ab97ff61eabab4400e6a5264af427ab30cd69f1857/yarl-1.24.5-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:a8fe66b8f300da93798025a785a5b90b42f3810dc2b72283ff84a41aaaebc293", size = 103646, upload-time = "2026-07-20T02:05:45.895Z" },
|
| 1286 |
+
{ url = "https://files.pythonhosted.org/packages/74/f0/33b9271c7f881766359d58266fa0811d2e5210ed860e28da7dc6d7786344/yarl-1.24.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:377fe3732edbaf78ee74efdf2c9f49f6e99f20e7f9d2649fda3eb4badd77d76e", size = 115305, upload-time = "2026-07-20T02:05:47.832Z" },
|
| 1287 |
+
{ url = "https://files.pythonhosted.org/packages/ef/65/fd79fb1868c4a80db8661091de525bf430f63c3bea1b20e8b6a84fc7d359/yarl-1.24.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:e8ffa78582120024f476a611d7befc123cee59e47e8309d470cf667d806e613b", size = 108404, upload-time = "2026-07-20T02:05:49.604Z" },
|
| 1288 |
+
{ url = "https://files.pythonhosted.org/packages/ff/ba/dbabe6b262f17a816c70cfc09558dbf03ece3ec76684d02f911a3d3a189c/yarl-1.24.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:daba5e594f06114e37db186efd2dd916609071e59daca901a0a2e71f02b142ce", size = 115940, upload-time = "2026-07-20T02:05:51.741Z" },
|
| 1289 |
+
{ url = "https://files.pythonhosted.org/packages/a5/43/fab2d1dad9d340a268cdde63756a123d069723efff6a372d123fa74a9517/yarl-1.24.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:65be18ec59496c13908f02a2472751d9ef840b4f3fb5726f129306bf6a2a7bba", size = 110006, upload-time = "2026-07-20T02:05:53.554Z" },
|
| 1290 |
+
{ url = "https://files.pythonhosted.org/packages/c4/27/41eb51bbd1b8d89546b83897cfb0164f1e109304fd408dbb151b639eec0f/yarl-1.24.5-cp312-cp312-win_amd64.whl", hash = "sha256:a929d878fec099030c292803b31e5d5540a7b6a31e6a3cc76cb4685fc2a2f51b", size = 97618, upload-time = "2026-07-20T02:05:55.57Z" },
|
| 1291 |
+
{ url = "https://files.pythonhosted.org/packages/3c/25/b2553764b3d65db711d8f45416351ec4f420847558eb669edcbcaadf5780/yarl-1.24.5-cp312-cp312-win_arm64.whl", hash = "sha256:7ce27823052e2013b597e0c738b13e7e36b8ccb9400df8959417b052ab0fd92c", size = 93018, upload-time = "2026-07-20T02:05:57.554Z" },
|
| 1292 |
+
{ url = "https://files.pythonhosted.org/packages/61/02/962c1cbfc401a30c1d034dc67ff395f64b52302c6d62de556c1fca99acc0/yarl-1.24.5-py3-none-any.whl", hash = "sha256:a33700d13d9b7d84fd10947b09ff69fb9a792e519c8cb9764a3ca70baa6c23a7", size = 58612, upload-time = "2026-07-20T02:07:43.461Z" },
|
| 1293 |
+
]
|