From 317cd1fb5654c8be1f6291b7df10497da6c3e4fc Mon Sep 17 00:00:00 2001 From: hao <97079365+tanhaow@users.noreply.github.com> Date: Wed, 1 Apr 2026 13:03:18 -0400 Subject: [PATCH 01/10] Update metrics.py --- src/muse/evaluation/metrics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/muse/evaluation/metrics.py b/src/muse/evaluation/metrics.py index 0d7f773..43cda3a 100644 --- a/src/muse/evaluation/metrics.py +++ b/src/muse/evaluation/metrics.py @@ -139,6 +139,6 @@ def compute_cometkiwi( # Predict returns a Prediction object; access the first score model_output = model.predict(data, batch_size=1, gpus=gpus) # The Prediction object can be indexed to get individual scores - score = model_output[0] + score = model_output[0][0] return score From 4d4c6effbdef58a051ecbe71cc65b6112f47c77d Mon Sep 17 00:00:00 2001 From: hao <97079365+tanhaow@users.noreply.github.com> Date: Wed, 1 Apr 2026 13:06:21 -0400 Subject: [PATCH 02/10] ruff format --- src/muse/evaluation/metrics.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/muse/evaluation/metrics.py b/src/muse/evaluation/metrics.py index 43cda3a..2c07ef7 100644 --- a/src/muse/evaluation/metrics.py +++ b/src/muse/evaluation/metrics.py @@ -120,7 +120,9 @@ def compute_cometkiwi( try: model_path = download_model("Unbabel/wmt22-cometkiwi-da") LOADED_METRICS["cometkiwi"] = load_from_checkpoint(model_path) - except KeyError as e: # download_model catches all exceptions and re-raises as KeyError + except ( + KeyError + ) as e: # download_model catches all exceptions and re-raises as KeyError msg = ( "Authentication required for CometKiwi model. " "Please:\n" From dfcd2193f31728f8e86e7f7d2c756eb93185cb10 Mon Sep 17 00:00:00 2001 From: hao <97079365+tanhaow@users.noreply.github.com> Date: Mon, 6 Apr 2026 09:32:45 -0400 Subject: [PATCH 03/10] Add qualitative analysis marimo notebook --- notebooks/mt_eval_analysis.py | 658 ++++++++++++++++++++++++++++++++++ 1 file changed, 658 insertions(+) create mode 100644 notebooks/mt_eval_analysis.py diff --git a/notebooks/mt_eval_analysis.py b/notebooks/mt_eval_analysis.py new file mode 100644 index 0000000..3e1d54d --- /dev/null +++ b/notebooks/mt_eval_analysis.py @@ -0,0 +1,658 @@ +import marimo + +__generated_with = "0.22.0" +app = marimo.App(width="medium") + + +@app.cell +def _(): + import marimo as mo + + return (mo,) + + +@app.cell +def _(mo): + mo.md(""" + # MT Evaluation Score Analysis + + chrF, COMET, CometKiwi across three models (google_tllm, hymt, gemma) + and two corpora (sentences: 427 pairs, paragraphs: 526 pairs). + """) + return + + +@app.cell +def _(): + import pathlib + + import altair as alt + import pandas as pd + import polars as pl + from scipy import stats + + ROOT = pathlib.Path(__file__).parent.parent + return ROOT, alt, pd, pl, stats + + +@app.cell +def _(ROOT, pl): + # Load sentence eval CSVs and join with metadata from notion-concept-tasks.jsonl + sents_meta = pl.read_ndjson(ROOT / "notion-concept-tasks.jsonl").select( + ["tr_id", "model", "src_lang", "tr_lang", "pair_id"] + ) + + + def load_sents_csv(model: str) -> pl.DataFrame: + return pl.read_csv(ROOT / f"eval-sents-{model}.csv").join( + sents_meta.filter(pl.col("model") == model), on="tr_id" + ) + + + sents_df = pl.concat( + [ + load_sents_csv("google_tllm"), + load_sents_csv("hymt"), + load_sents_csv("gemma"), + ] + ) + + sents_df.head(3) + return (sents_df,) + + +@app.cell +def _(ROOT, pl): + # Load paragraph eval CSVs and join with metadata from tr-pars-*.jsonl + def load_pars_csv(model: str) -> pl.DataFrame: + meta = pl.read_ndjson(ROOT / f"tr-pars-{model}.jsonl").select( + ["tr_id", "model", "src_lang", "tr_lang", "pair_id"] + ) + return pl.read_csv(ROOT / f"eval-pars-{model}.csv").join(meta, on="tr_id") + + + pars_df = pl.concat( + [ + load_pars_csv("google_tllm"), + load_pars_csv("hymt"), + load_pars_csv("gemma"), + ] + ) + + pars_df.head(3) + return (pars_df,) + + +@app.cell +def _(mo): + mo.md(""" + ## 1. Score distributions by model + """) + return + + +@app.cell +def _(alt, mo, pars_df, sents_df): + def score_dist_chart(df, title: str): + melted = ( + df.select(["model", "chrf", "comet", "cometkiwi"]) + .unpivot(index="model", variable_name="metric", value_name="score") + .to_pandas() + ) + return ( + alt.Chart(melted, title=title) + .mark_boxplot(extent="min-max") + .encode( + x=alt.X("model:N", title="Model"), + y=alt.Y("score:Q", title="Score", scale=alt.Scale(zero=False)), + color="model:N", + column=alt.Column("metric:N", title="Metric"), + ) + .properties(width=160, height=220) + ) + + + mo.vstack( + [ + mo.md("**Sentences**"), + mo.ui.altair_chart(score_dist_chart(sents_df, "Sentences")), + mo.md("**Paragraphs**"), + mo.ui.altair_chart(score_dist_chart(pars_df, "Paragraphs")), + ] + ) + return + + +@app.cell +def _(mo): + mo.md(""" + ## 2. Model ranking + """) + return + + +@app.cell +def _(alt, mo, pars_df, pl, sents_df): + def model_ranking_chart(df, title: str): + melted = ( + df.group_by("model") + .agg( + pl.col("chrf").mean().alias("chrf"), + pl.col("comet").mean().alias("comet"), + pl.col("cometkiwi").mean().alias("cometkiwi"), + ) + .unpivot(index="model", variable_name="metric", value_name="score") + .to_pandas() + ) + return ( + alt.Chart(melted, title=title) + .mark_bar() + .encode( + x=alt.X( + "score:Q", scale=alt.Scale(zero=False), title="Mean score" + ), + y=alt.Y("model:N", sort="-x", title=None), + color="model:N", + row=alt.Row("metric:N", title="Metric"), + ) + .properties(width=300, height=70) + ) + + + mo.vstack( + [ + mo.md("**Sentences**"), + mo.ui.altair_chart(model_ranking_chart(sents_df, "Sentences")), + mo.md("**Paragraphs**"), + mo.ui.altair_chart(model_ranking_chart(pars_df, "Paragraphs")), + ] + ) + return + + +@app.cell +def _(mo): + mo.md(""" + ## 3. Metric agreement + + Key finding: chrF vs CometKiwi correlation collapses on paragraphs (r ≈ −0.05), suggesting reference translations are paraphrastic rather than literal. Low paragraph COMET/CometKiwi correlation (r ≈ 0.28) means they diverge on longer texts — CometKiwi is arguably more honest since it doesn't penalise paraphrastic output. + """) + return + + +@app.cell +def _(mo, pars_df, sents_df, stats): + def correlation_table(df, label: str) -> str: + pairs = [("chrf", "comet"), ("chrf", "cometkiwi"), ("comet", "cometkiwi")] + rows = [] + for a, b in pairs: + x = df[a].to_numpy() + y = df[b].to_numpy() + r, p = stats.pearsonr(x, y) + rho, p_rho = stats.spearmanr(x, y) + rows.append( + f"| {a} vs {b} | {r:.3f} | {p:.2e} | {rho:.3f} | {p_rho:.2e} |" + ) + header = ( + f"**{label}**\n\n" + "| Pair | Pearson r | p | Spearman ρ | p |\n" + "|------|-----------|---|------------|---|" + ) + return header + "\n" + "\n".join(rows) + + + mo.vstack( + [ + mo.md(correlation_table(sents_df, "Sentences")), + mo.md(correlation_table(pars_df, "Paragraphs")), + ] + ) + return + + +@app.cell +def _(alt, mo, pars_df, sents_df): + def scatter_matrix(df, title: str): + pdf = df.select(["model", "chrf", "comet", "cometkiwi"]).to_pandas() + return ( + alt.Chart(pdf) + .mark_point(opacity=0.4, size=20) + .encode( + alt.X( + alt.repeat("column"), + type="quantitative", + scale=alt.Scale(zero=False), + ), + alt.Y( + alt.repeat("row"), + type="quantitative", + scale=alt.Scale(zero=False), + ), + color="model:N", + ) + .repeat( + row=["chrf", "comet", "cometkiwi"], + column=["chrf", "comet", "cometkiwi"], + ) + ) + + + mo.vstack( + [ + mo.md("**Sentences**"), + mo.ui.altair_chart(scatter_matrix(sents_df, "Sentences")), + mo.md("**Paragraphs**"), + mo.ui.altair_chart(scatter_matrix(pars_df, "Paragraphs")), + ] + ) + return + + +@app.cell +def _(alt, mo, pars_df, sents_df): + def kiwi_vs_comet(df, title: str): + pdf = df.select(["model", "comet", "cometkiwi"]).to_pandas() + base = alt.Chart(pdf, title=title).properties(width=300, height=260) + points = base.mark_point(opacity=0.5, size=25).encode( + x=alt.X("comet:Q", scale=alt.Scale(zero=False), title="COMET"), + y=alt.Y("cometkiwi:Q", scale=alt.Scale(zero=False), title="CometKiwi"), + color="model:N", + ) + regression = ( + base.transform_regression("comet", "cometkiwi") + .mark_line(color="gray", strokeDash=[4, 2]) + .encode( + x=alt.X("comet:Q"), + y=alt.Y("cometkiwi:Q"), + ) + ) + return alt.layer(points, regression) + + + mo.vstack( + [ + mo.md("**Sentences — COMET vs CometKiwi**"), + mo.ui.altair_chart(kiwi_vs_comet(sents_df, "Sentences")), + mo.md("**Paragraphs — COMET vs CometKiwi**"), + mo.ui.altair_chart(kiwi_vs_comet(pars_df, "Paragraphs")), + ] + ) + return + + +@app.cell +def _(alt, mo, pars_df, pd, pl, sents_df, stats): + def agreement_heatmap(df, title: str): + pairs = [("chrf", "comet"), ("chrf", "cometkiwi"), ("comet", "cometkiwi")] + rows = [ + { + "model": model, + "pair": f"{a} vs {b}", + "rho": round( + stats.spearmanr( + df.filter(pl.col("model") == model)[a].to_numpy(), + df.filter(pl.col("model") == model)[b].to_numpy(), + )[0], + 3, + ), + } + for model in sorted(df["model"].unique().to_list()) + for a, b in pairs + ] + pdf = pd.DataFrame(rows) + return ( + alt.Chart(pdf, title=title) + .mark_rect() + .encode( + x=alt.X("pair:N", title=None), + y=alt.Y("model:N", title=None), + color=alt.Color( + "rho:Q", + scale=alt.Scale(scheme="redblue", domain=[-1, 1]), + title="Spearman ρ", + ), + tooltip=["model", "pair", "rho"], + ) + .properties(width=280, height=100) + ) + + + mo.vstack( + [ + mo.md("**Sentences — instance-level metric agreement (Spearman ρ)**"), + mo.ui.altair_chart(agreement_heatmap(sents_df, "Sentences")), + mo.md("**Paragraphs — instance-level metric agreement (Spearman ρ)**"), + mo.ui.altair_chart(agreement_heatmap(pars_df, "Paragraphs")), + ] + ) + return + + +@app.cell +def _(mo): + mo.md(""" + ## 4. Language breakdown + + If only chrF drops for CJK languages, it's a script artefact. If COMET/CometKiwi also drop, it's a real quality signal. + """) + return + + +@app.cell +def _(alt, mo, pars_df, pl, sents_df): + def lang_dir_chart(df, title: str): + melted = ( + df.with_columns( + (pl.col("src_lang") + "→" + pl.col("tr_lang")).alias("direction") + ) + .select(["direction", "chrf", "comet", "cometkiwi"]) + .unpivot(index="direction", variable_name="metric", value_name="score") + .to_pandas() + ) + return ( + alt.Chart(melted, title=title) + .mark_boxplot(extent="min-max") + .encode( + x=alt.X("direction:N", title="Direction"), + y=alt.Y("score:Q", scale=alt.Scale(zero=False)), + color="direction:N", + column=alt.Column("metric:N"), + ) + .properties(width=160, height=220) + ) + + + mo.vstack( + [ + mo.md("**Sentences — score by direction**"), + mo.ui.altair_chart(lang_dir_chart(sents_df, "Sentences")), + mo.md("**Paragraphs — score by direction**"), + mo.ui.altair_chart(lang_dir_chart(pars_df, "Paragraphs")), + ] + ) + return + + +@app.cell +def _(alt, mo, pars_df, pl, sents_df): + def lang_breakdown_chart(df, title: str) -> alt.Chart: + melted = ( + df.with_columns( + (pl.col("src_lang") + "→" + pl.col("tr_lang")).alias("direction") + ) + .group_by(["direction", "model"]) + .agg( + pl.col("chrf").mean().round(4).alias("chrf"), + pl.col("comet").mean().round(4).alias("comet"), + pl.col("cometkiwi").mean().round(4).alias("cometkiwi"), + ) + .unpivot( + index=["direction", "model"], + variable_name="metric", + value_name="score", + ) + .to_pandas() + ) + return ( + alt.Chart(melted, title=title) + .mark_bar() + .encode( + x=alt.X("model:N", title=None), + y=alt.Y("score:Q", scale=alt.Scale(zero=False)), + color="model:N", + column=alt.Column("direction:N", title="Direction"), + row=alt.Row("metric:N", title="Metric"), + ) + .properties(width=80, height=100) + ) + + + mo.vstack( + [ + mo.md("**Sentences — mean score by direction and model**"), + mo.ui.altair_chart(lang_breakdown_chart(sents_df, "Sentences")), + mo.md("**Paragraphs — mean score by direction and model**"), + mo.ui.altair_chart(lang_breakdown_chart(pars_df, "Paragraphs")), + ] + ) + return + + +@app.cell +def _(alt, mo, pars_df, pd, pl, sents_df): + def direction_chart(df, title: str): + rows = [ + { + "direction": direction, + "metric": metric, + "score": group[metric].mean(), + } + for direction, group in [ + ("src→en", df.filter(pl.col("tr_lang") == "en")), + ("en→src", df.filter(pl.col("src_lang") == "en")), + ] + for metric in ["chrf", "comet", "cometkiwi"] + ] + pdf = pd.DataFrame(rows) + return ( + alt.Chart(pdf, title=title) + .mark_bar() + .encode( + x=alt.X("direction:N", title=None), + y=alt.Y( + "score:Q", scale=alt.Scale(zero=False), title="Mean score" + ), + color="direction:N", + column=alt.Column("metric:N", title="Metric"), + ) + .properties(width=120, height=180) + ) + + + mo.vstack( + [ + mo.md("**Sentences — src→en vs en→src**"), + mo.ui.altair_chart(direction_chart(sents_df, "Sentences")), + mo.md("**Paragraphs — src→en vs en→src**"), + mo.ui.altair_chart(direction_chart(pars_df, "Paragraphs")), + ] + ) + return + + +@app.cell +def _(ROOT, pars_df, pl, sents_df): + # Load full text corpora and join with scores for qualitative browser + _sents_full = ( + pl.read_ndjson(ROOT / "notion-concept-tasks.jsonl") + .rename({"text": "tr_text"}) + .select( + [ + "tr_id", + "pair_id", + "model", + "src_lang", + "tr_lang", + "src_text", + "ref_text", + "tr_text", + "term", + ] + ) + .with_columns(pl.lit("sentences").alias("corpus")) + ) + _pars_full = pl.concat( + [ + pl.read_ndjson(ROOT / f"tr-pars-{m}.jsonl").select( + [ + "tr_id", + "pair_id", + "model", + "src_lang", + "tr_lang", + "src_text", + "ref_text", + "tr_text", + ] + ) + for m in ["google_tllm", "hymt", "gemma"] + ] + ).with_columns( + pl.lit(None).cast(pl.String).alias("term"), + pl.lit("paragraphs").alias("corpus"), + ) + + _scores = pl.concat( + [ + sents_df.select(["tr_id", "chrf", "comet", "cometkiwi"]), + pars_df.select(["tr_id", "chrf", "comet", "cometkiwi"]), + ] + ) + + browser_data = ( + pl.concat([_sents_full, _pars_full]) + .join(_scores, on="tr_id", how="left") + .with_columns( + (pl.col("cometkiwi") - pl.col("chrf")).alias("kiwi_minus_chrf") + ) + ) + return (browser_data,) + + +@app.cell +def _(browser_data, mo, pl): + _corpora = ["sentences", "paragraphs"] + _models = sorted(browser_data["model"].unique().to_list()) + _directions = sorted( + browser_data.with_columns( + (pl.col("src_lang") + "→" + pl.col("tr_lang")).alias("dir") + )["dir"] + .unique() + .to_list() + ) + _terms = ["all", *sorted(browser_data["term"].drop_nulls().unique().to_list())] + _sort_opts = [ + "kiwi_minus_chrf ↓", # high CometKiwi but low chrF — paraphrase cases + "kiwi_minus_chrf ↑", + "cometkiwi ↓", + "cometkiwi ↑", + "comet ↓", + "comet ↑", + "chrf ↓", + "chrf ↑", + "pair_id", + ] + + corpus_sel = mo.ui.dropdown(_corpora, value="sentences", label="Corpus") + model_sel = mo.ui.dropdown(["all", *_models], value="all", label="Model") + dir_sel = mo.ui.dropdown(["all", *_directions], value="all", label="Direction") + term_sel = mo.ui.dropdown(_terms, value="all", label="Term") + sort_sel = mo.ui.dropdown( + _sort_opts, value="kiwi_minus_chrf ↓", label="Sort by" + ) + n_sel = mo.ui.slider(5, 50, step=5, value=10, label="Show N") + + mo.vstack( + [ + mo.md( + "## 5. Qualitative translation browser\n\nRead src / ref / translation side-by-side with scores. Sort by `kiwi_minus_chrf ↓` to surface cases where CometKiwi rates the translation highly but chrF doesn't — these are the paraphrase cases." + ), + mo.hstack( + [corpus_sel, model_sel, dir_sel, term_sel, sort_sel, n_sel], + justify="start", + ), + ] + ) + return corpus_sel, dir_sel, model_sel, n_sel, sort_sel, term_sel + + +@app.cell +def _( + browser_data, + corpus_sel, + dir_sel, + mo, + model_sel, + n_sel, + pl, + sort_sel, + term_sel, +): + _df = browser_data.filter(pl.col("corpus") == corpus_sel.value) + + if model_sel.value != "all": + _df = _df.filter(pl.col("model") == model_sel.value) + + if dir_sel.value != "all": + _src, _tgt = dir_sel.value.split("→") + _df = _df.filter( + (pl.col("src_lang") == _src) & (pl.col("tr_lang") == _tgt) + ) + + if term_sel.value != "all": + _df = _df.filter(pl.col("term") == term_sel.value) + + _sort_col, _sort_dir = ( + sort_sel.value.rsplit(" ", 1) + if " " in sort_sel.value + else (sort_sel.value, "↑") + ) + _df = _df.sort(_sort_col, descending=(_sort_dir == "↓")) + + _display = ( + _df.head(n_sel.value) + .select( + [ + "pair_id", + "model", + "src_lang", + "tr_lang", + "chrf", + "comet", + "cometkiwi", + "kiwi_minus_chrf", + "term", + "src_text", + "ref_text", + "tr_text", + ] + ) + .with_columns( + [ + pl.col("chrf").round(3), + pl.col("comet").round(3), + pl.col("cometkiwi").round(3), + pl.col("kiwi_minus_chrf").round(3), + ] + ) + ) + + mo.plain(_display) + return + + +@app.cell +def _(mo): + mo.md(""" + ## Summary + + **Models** + google_tllm is the clear winner on all metrics across both corpora, with statistically + significant margins. gemma and hymt are statistically indistinguishable from each other. + + **Metrics** + - **COMET** — It's trained on human judgements, robust to paraphrase, + and shows consistent model separation. The compressed range (0.77–0.81) is normal. + - **CometKiwi** — worth reporting alongside COMET, especially for paragraphs where + it diverges from COMET (r ≈ 0.28). Being reference-free makes it more honest when + the reference translations are paraphrastic, which is likely here. + - **chrF** — use with caution. It's the most discriminating metric numerically (high CV), + but for non-literal, domain-specific translations it mostly measures surface similarity + to the reference rather than actual quality. The near-zero correlation with CometKiwi + on paragraphs (r ≈ −0.05) is a red flag. + """) + return + + +if __name__ == "__main__": + app.run() From f674c78996ef3cda44969ba3a2410c7b5d384a10 Mon Sep 17 00:00:00 2001 From: hao <97079365+tanhaow@users.noreply.github.com> Date: Wed, 8 Apr 2026 08:22:50 -0400 Subject: [PATCH 04/10] Update notebook to use Phase 1 data paths and add missing dependencies - Add DATA_DIR variable pointing to Phase 1 data directory - Update all data paths to canonical Phase 1 structure - Add scipy and pandas to pyproject.toml dependencies - Exclude notebook from ruff linting --- notebooks/mt_eval_analysis.py | 50 +++- pyproject.toml | 14 +- uv.lock | 484 +++++++++++++++++++++++++++++++++- 3 files changed, 528 insertions(+), 20 deletions(-) diff --git a/notebooks/mt_eval_analysis.py b/notebooks/mt_eval_analysis.py index 3e1d54d..1c340df 100644 --- a/notebooks/mt_eval_analysis.py +++ b/notebooks/mt_eval_analysis.py @@ -31,20 +31,38 @@ def _(): import polars as pl from scipy import stats - ROOT = pathlib.Path(__file__).parent.parent - return ROOT, alt, pd, pl, stats + return alt, pathlib, pd, pl, stats @app.cell -def _(ROOT, pl): +def _(mo): + mo.md(""" + ## Configuration + + Set `DATA_DIR` to the phase-1 data directory (e.g. the project drive or TigerData mount). + All data files are resolved relative to this path. + """) + return + + +@app.cell +def _(pathlib): + # Set this to the phase-1 data directory on the project drive / TigerData mount. + # Defaults to the local data directory for local development. + DATA_DIR = pathlib.Path(__file__).parent.parent / "data" / "Phase 1" + return (DATA_DIR,) + + +@app.cell +def _(DATA_DIR, pl): # Load sentence eval CSVs and join with metadata from notion-concept-tasks.jsonl - sents_meta = pl.read_ndjson(ROOT / "notion-concept-tasks.jsonl").select( - ["tr_id", "model", "src_lang", "tr_lang", "pair_id"] - ) + sents_meta = pl.read_ndjson( + DATA_DIR / "prodigy/notion-concept/notion-concept-tasks.jsonl" + ).select(["tr_id", "model", "src_lang", "tr_lang", "pair_id"]) def load_sents_csv(model: str) -> pl.DataFrame: - return pl.read_csv(ROOT / f"eval-sents-{model}.csv").join( + return pl.read_csv(DATA_DIR / f"notion-sents/eval-sents-{model}.csv").join( sents_meta.filter(pl.col("model") == model), on="tr_id" ) @@ -62,13 +80,15 @@ def load_sents_csv(model: str) -> pl.DataFrame: @app.cell -def _(ROOT, pl): - # Load paragraph eval CSVs and join with metadata from tr-pars-*.jsonl +def _(DATA_DIR, pl): + # Load paragraph eval CSVs and join with metadata from mt-pars-*.jsonl def load_pars_csv(model: str) -> pl.DataFrame: - meta = pl.read_ndjson(ROOT / f"tr-pars-{model}.jsonl").select( + meta = pl.read_ndjson(DATA_DIR / f"mto-pars/mt-pars-{model}.jsonl").select( ["tr_id", "model", "src_lang", "tr_lang", "pair_id"] ) - return pl.read_csv(ROOT / f"eval-pars-{model}.csv").join(meta, on="tr_id") + return pl.read_csv(DATA_DIR / f"mto-pars/eval-pars-{model}.csv").join( + meta, on="tr_id" + ) pars_df = pl.concat( @@ -461,10 +481,12 @@ def direction_chart(df, title: str): @app.cell -def _(ROOT, pars_df, pl, sents_df): +def _(DATA_DIR, pars_df, pl, sents_df): # Load full text corpora and join with scores for qualitative browser _sents_full = ( - pl.read_ndjson(ROOT / "notion-concept-tasks.jsonl") + pl.read_ndjson( + DATA_DIR / "prodigy/notion-concept/notion-concept-tasks.jsonl" + ) .rename({"text": "tr_text"}) .select( [ @@ -483,7 +505,7 @@ def _(ROOT, pars_df, pl, sents_df): ) _pars_full = pl.concat( [ - pl.read_ndjson(ROOT / f"tr-pars-{m}.jsonl").select( + pl.read_ndjson(DATA_DIR / f"mto-pars/mt-pars-{m}.jsonl").select( [ "tr_id", "pair_id", diff --git a/pyproject.toml b/pyproject.toml index 9740195..5aca88d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,7 +23,7 @@ classifiers = [ ] dependencies = [ "pip", # required for downloading spaCy model in uv-created virtualenvs - "marimo>=0.13.11", + "marimo>=0.22.0", "polars>=0.20.4", "numpy", "ipython", # Required by transformers for trainer functionality @@ -36,6 +36,12 @@ dependencies = [ "datasets", "sacrebleu", "unbabel-comet", + "altair>=5", + "pandas", + "scipy", + "nbformat>=5.10.4", + "nbconvert>=7.17.0", + "playwright>=1.58.0", ] [project.optional-dependencies] @@ -56,6 +62,8 @@ path = "src/muse/__init__.py" target-version = "py312" # Configure src path so ruff import fixes can identify local imports src = [ "src" ] +# Ignore notebooks — marimo notebooks are not linted +extend-exclude = [ "notebooks/mt_eval_analysis.py" ] [tool.ruff.lint] # Include these rules in addition to ruff's defaults @@ -73,6 +81,10 @@ extend-select = [ # Can use to ignore specific rules within above selection ignore = [] +[tool.ruff.lint.per-file-ignores] +# Notebooks use typographic Unicode in markdown strings intentionally +"notebooks/*.py" = ["RUF001"] + [tool.marimo.display] cell_output = "below" theme = "system" # honor user preference, including in static html exports diff --git a/uv.lock b/uv.lock index a7ae4b6..8424a6e 100644 --- a/uv.lock +++ b/uv.lock @@ -138,6 +138,22 @@ wheels = [ { 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" }, ] +[[package]] +name = "altair" +version = "6.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jinja2" }, + { name = "jsonschema" }, + { name = "narwhals" }, + { name = "packaging" }, + { name = "typing-extensions", marker = "python_full_version < '3.15'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f7/c0/184a89bd5feba14ff3c41cfaf1dd8a82c05f5ceedbc92145e17042eb08a4/altair-6.0.0.tar.gz", hash = "sha256:614bf5ecbe2337347b590afb111929aa9c16c9527c4887d96c9bc7f6640756b4", size = 763834, upload-time = "2025-11-12T08:59:11.519Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/33/ef2f2409450ef6daa61459d5de5c08128e7d3edb773fefd0a324d1310238/altair-6.0.0-py3-none-any.whl", hash = "sha256:09ae95b53d5fe5b16987dccc785a7af8588f2dca50de1e7a156efa8a461515f8", size = 795410, upload-time = "2025-11-12T08:59:09.804Z" }, +] + [[package]] name = "anyio" version = "4.12.1" @@ -169,6 +185,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" }, ] +[[package]] +name = "beautifulsoup4" +version = "4.14.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "soupsieve" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c3/b0/1c6a16426d389813b48d95e26898aff79abbde42ad353958ad95cc8c9b21/beautifulsoup4-4.14.3.tar.gz", hash = "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86", size = 627737, upload-time = "2025-11-30T15:08:26.084Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb", size = 107721, upload-time = "2025-11-30T15:08:24.087Z" }, +] + [[package]] name = "black" version = "26.1.0" @@ -201,6 +230,23 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e4/3d/51bdb3ecbfadfaf825ec0c75e1de6077422b4afa2091c6c9ba34fbfc0c2d/black-26.1.0-py3-none-any.whl", hash = "sha256:1054e8e47ebd686e078c0bb0eaf31e6ce69c966058d122f2c0c950311f9f3ede", size = 204010, upload-time = "2026-01-18T04:50:09.978Z" }, ] +[[package]] +name = "bleach" +version = "6.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/07/18/3c8523962314be6bf4c8989c79ad9531c825210dd13a8669f6b84336e8bd/bleach-6.3.0.tar.gz", hash = "sha256:6f3b91b1c0a02bb9a78b5a454c92506aa0fdf197e1d5e114d2e00c6f64306d22", size = 203533, upload-time = "2025-10-27T17:57:39.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl", hash = "sha256:fe10ec77c93ddf3d13a73b035abaac7a9f5e436513864ccdad516693213c65d6", size = 164437, upload-time = "2025-10-27T17:57:37.538Z" }, +] + +[package.optional-dependencies] +css = [ + { name = "tinycss2" }, +] + [[package]] name = "blobfile" version = "3.1.0" @@ -470,6 +516,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" }, ] +[[package]] +name = "defusedxml" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload-time = "2021-03-08T10:59:26.269Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" }, +] + [[package]] name = "dill" version = "0.4.0" @@ -553,6 +608,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" }, ] +[[package]] +name = "fastjsonschema" +version = "2.21.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/b5/23b216d9d985a956623b6bd12d4086b60f0059b27799f23016af04a74ea1/fastjsonschema-2.21.2.tar.gz", hash = "sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de", size = 374130, upload-time = "2025-08-14T18:49:36.666Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463", size = 24024, upload-time = "2025-08-14T18:49:34.776Z" }, +] + [[package]] name = "filelock" version = "3.20.3" @@ -798,6 +862,49 @@ grpc = [ { name = "grpcio" }, ] +[[package]] +name = "greenlet" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/51/1664f6b78fc6ebbd98019a1fd730e83fa78f2db7058f72b1463d3612b8db/greenlet-3.3.2.tar.gz", hash = "sha256:2eaf067fc6d886931c7962e8c6bede15d2f01965560f3359b27c80bde2d151f2", size = 188267, upload-time = "2026-02-20T20:54:15.531Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/ab/1608e5a7578e62113506740b88066bf09888322a311cff602105e619bd87/greenlet-3.3.2-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:ac8d61d4343b799d1e526db579833d72f23759c71e07181c2d2944e429eb09cd", size = 280358, upload-time = "2026-02-20T20:17:43.971Z" }, + { url = "https://files.pythonhosted.org/packages/a5/23/0eae412a4ade4e6623ff7626e38998cb9b11e9ff1ebacaa021e4e108ec15/greenlet-3.3.2-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ceec72030dae6ac0c8ed7591b96b70410a8be370b6a477b1dbc072856ad02bd", size = 601217, upload-time = "2026-02-20T20:47:31.462Z" }, + { url = "https://files.pythonhosted.org/packages/f8/16/5b1678a9c07098ecb9ab2dd159fafaf12e963293e61ee8d10ecb55273e5e/greenlet-3.3.2-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a2a5be83a45ce6188c045bcc44b0ee037d6a518978de9a5d97438548b953a1ac", size = 611792, upload-time = "2026-02-20T20:55:58.423Z" }, + { url = "https://files.pythonhosted.org/packages/5c/c5/cc09412a29e43406eba18d61c70baa936e299bc27e074e2be3806ed29098/greenlet-3.3.2-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ae9e21c84035c490506c17002f5c8ab25f980205c3e61ddb3a2a2a2e6c411fcb", size = 626250, upload-time = "2026-02-20T21:02:46.596Z" }, + { url = "https://files.pythonhosted.org/packages/50/1f/5155f55bd71cabd03765a4aac9ac446be129895271f73872c36ebd4b04b6/greenlet-3.3.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43e99d1749147ac21dde49b99c9abffcbc1e2d55c67501465ef0930d6e78e070", size = 613875, upload-time = "2026-02-20T20:21:01.102Z" }, + { url = "https://files.pythonhosted.org/packages/fc/dd/845f249c3fcd69e32df80cdab059b4be8b766ef5830a3d0aa9d6cad55beb/greenlet-3.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4c956a19350e2c37f2c48b336a3afb4bff120b36076d9d7fb68cb44e05d95b79", size = 1571467, upload-time = "2026-02-20T20:49:33.495Z" }, + { url = "https://files.pythonhosted.org/packages/2a/50/2649fe21fcc2b56659a452868e695634722a6655ba245d9f77f5656010bf/greenlet-3.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6c6f8ba97d17a1e7d664151284cb3315fc5f8353e75221ed4324f84eb162b395", size = 1640001, upload-time = "2026-02-20T20:21:09.154Z" }, + { url = "https://files.pythonhosted.org/packages/9b/40/cc802e067d02af8b60b6771cea7d57e21ef5e6659912814babb42b864713/greenlet-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:34308836d8370bddadb41f5a7ce96879b72e2fdfb4e87729330c6ab52376409f", size = 231081, upload-time = "2026-02-20T20:17:28.121Z" }, + { url = "https://files.pythonhosted.org/packages/58/2e/fe7f36ff1982d6b10a60d5e0740c759259a7d6d2e1dc41da6d96de32fff6/greenlet-3.3.2-cp312-cp312-win_arm64.whl", hash = "sha256:d3a62fa76a32b462a97198e4c9e99afb9ab375115e74e9a83ce180e7a496f643", size = 230331, upload-time = "2026-02-20T20:17:23.34Z" }, + { url = "https://files.pythonhosted.org/packages/ac/48/f8b875fa7dea7dd9b33245e37f065af59df6a25af2f9561efa8d822fde51/greenlet-3.3.2-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:aa6ac98bdfd716a749b84d4034486863fd81c3abde9aa3cf8eff9127981a4ae4", size = 279120, upload-time = "2026-02-20T20:19:01.9Z" }, + { url = "https://files.pythonhosted.org/packages/49/8d/9771d03e7a8b1ee456511961e1b97a6d77ae1dea4a34a5b98eee706689d3/greenlet-3.3.2-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab0c7e7901a00bc0a7284907273dc165b32e0d109a6713babd04471327ff7986", size = 603238, upload-time = "2026-02-20T20:47:32.873Z" }, + { url = "https://files.pythonhosted.org/packages/59/0e/4223c2bbb63cd5c97f28ffb2a8aee71bdfb30b323c35d409450f51b91e3e/greenlet-3.3.2-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d248d8c23c67d2291ffd47af766e2a3aa9fa1c6703155c099feb11f526c63a92", size = 614219, upload-time = "2026-02-20T20:55:59.817Z" }, + { url = "https://files.pythonhosted.org/packages/94/2b/4d012a69759ac9d77210b8bfb128bc621125f5b20fc398bce3940d036b1c/greenlet-3.3.2-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ccd21bb86944ca9be6d967cf7691e658e43417782bce90b5d2faeda0ff78a7dd", size = 628268, upload-time = "2026-02-20T21:02:48.024Z" }, + { url = "https://files.pythonhosted.org/packages/7a/34/259b28ea7a2a0c904b11cd36c79b8cef8019b26ee5dbe24e73b469dea347/greenlet-3.3.2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b6997d360a4e6a4e936c0f9625b1c20416b8a0ea18a8e19cabbefc712e7397ab", size = 616774, upload-time = "2026-02-20T20:21:02.454Z" }, + { url = "https://files.pythonhosted.org/packages/0a/03/996c2d1689d486a6e199cb0f1cf9e4aa940c500e01bdf201299d7d61fa69/greenlet-3.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:64970c33a50551c7c50491671265d8954046cb6e8e2999aacdd60e439b70418a", size = 1571277, upload-time = "2026-02-20T20:49:34.795Z" }, + { url = "https://files.pythonhosted.org/packages/d9/c4/2570fc07f34a39f2caf0bf9f24b0a1a0a47bc2e8e465b2c2424821389dfc/greenlet-3.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1a9172f5bf6bd88e6ba5a84e0a68afeac9dc7b6b412b245dd64f52d83c81e55b", size = 1640455, upload-time = "2026-02-20T20:21:10.261Z" }, + { url = "https://files.pythonhosted.org/packages/91/39/5ef5aa23bc545aa0d31e1b9b55822b32c8da93ba657295840b6b34124009/greenlet-3.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:a7945dd0eab63ded0a48e4dcade82939783c172290a7903ebde9e184333ca124", size = 230961, upload-time = "2026-02-20T20:16:58.461Z" }, + { url = "https://files.pythonhosted.org/packages/62/6b/a89f8456dcb06becff288f563618e9f20deed8dd29beea14f9a168aef64b/greenlet-3.3.2-cp313-cp313-win_arm64.whl", hash = "sha256:394ead29063ee3515b4e775216cb756b2e3b4a7e55ae8fd884f17fa579e6b327", size = 230221, upload-time = "2026-02-20T20:17:37.152Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ae/8bffcbd373b57a5992cd077cbe8858fff39110480a9d50697091faea6f39/greenlet-3.3.2-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:8d1658d7291f9859beed69a776c10822a0a799bc4bfe1bd4272bb60e62507dab", size = 279650, upload-time = "2026-02-20T20:18:00.783Z" }, + { url = "https://files.pythonhosted.org/packages/d1/c0/45f93f348fa49abf32ac8439938726c480bd96b2a3c6f4d949ec0124b69f/greenlet-3.3.2-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:18cb1b7337bca281915b3c5d5ae19f4e76d35e1df80f4ad3c1a7be91fadf1082", size = 650295, upload-time = "2026-02-20T20:47:34.036Z" }, + { url = "https://files.pythonhosted.org/packages/b3/de/dd7589b3f2b8372069ab3e4763ea5329940fc7ad9dcd3e272a37516d7c9b/greenlet-3.3.2-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c2e47408e8ce1c6f1ceea0dffcdf6ebb85cc09e55c7af407c99f1112016e45e9", size = 662163, upload-time = "2026-02-20T20:56:01.295Z" }, + { url = "https://files.pythonhosted.org/packages/cd/ac/85804f74f1ccea31ba518dcc8ee6f14c79f73fe36fa1beba38930806df09/greenlet-3.3.2-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e3cb43ce200f59483eb82949bf1835a99cf43d7571e900d7c8d5c62cdf25d2f9", size = 675371, upload-time = "2026-02-20T21:02:49.664Z" }, + { url = "https://files.pythonhosted.org/packages/d2/d8/09bfa816572a4d83bccd6750df1926f79158b1c36c5f73786e26dbe4ee38/greenlet-3.3.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63d10328839d1973e5ba35e98cccbca71b232b14051fd957b6f8b6e8e80d0506", size = 664160, upload-time = "2026-02-20T20:21:04.015Z" }, + { url = "https://files.pythonhosted.org/packages/48/cf/56832f0c8255d27f6c35d41b5ec91168d74ec721d85f01a12131eec6b93c/greenlet-3.3.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8e4ab3cfb02993c8cc248ea73d7dae6cec0253e9afa311c9b37e603ca9fad2ce", size = 1619181, upload-time = "2026-02-20T20:49:36.052Z" }, + { url = "https://files.pythonhosted.org/packages/0a/23/b90b60a4aabb4cec0796e55f25ffbfb579a907c3898cd2905c8918acaa16/greenlet-3.3.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:94ad81f0fd3c0c0681a018a976e5c2bd2ca2d9d94895f23e7bb1af4e8af4e2d5", size = 1687713, upload-time = "2026-02-20T20:21:11.684Z" }, + { url = "https://files.pythonhosted.org/packages/f3/ca/2101ca3d9223a1dc125140dbc063644dca76df6ff356531eb27bc267b446/greenlet-3.3.2-cp314-cp314-win_amd64.whl", hash = "sha256:8c4dd0f3997cf2512f7601563cc90dfb8957c0cff1e3a1b23991d4ea1776c492", size = 232034, upload-time = "2026-02-20T20:20:08.186Z" }, + { url = "https://files.pythonhosted.org/packages/f6/4a/ecf894e962a59dea60f04877eea0fd5724618da89f1867b28ee8b91e811f/greenlet-3.3.2-cp314-cp314-win_arm64.whl", hash = "sha256:cd6f9e2bbd46321ba3bbb4c8a15794d32960e3b0ae2cc4d49a1a53d314805d71", size = 231437, upload-time = "2026-02-20T20:18:59.722Z" }, + { url = "https://files.pythonhosted.org/packages/98/6d/8f2ef704e614bcf58ed43cfb8d87afa1c285e98194ab2cfad351bf04f81e/greenlet-3.3.2-cp314-cp314t-macosx_11_0_universal2.whl", hash = "sha256:e26e72bec7ab387ac80caa7496e0f908ff954f31065b0ffc1f8ecb1338b11b54", size = 286617, upload-time = "2026-02-20T20:19:29.856Z" }, + { url = "https://files.pythonhosted.org/packages/5e/0d/93894161d307c6ea237a43988f27eba0947b360b99ac5239ad3fe09f0b47/greenlet-3.3.2-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b466dff7a4ffda6ca975979bab80bdadde979e29fc947ac3be4451428d8b0e4", size = 655189, upload-time = "2026-02-20T20:47:35.742Z" }, + { url = "https://files.pythonhosted.org/packages/f5/2c/d2d506ebd8abcb57386ec4f7ba20f4030cbe56eae541bc6fd6ef399c0b41/greenlet-3.3.2-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b8bddc5b73c9720bea487b3bffdb1840fe4e3656fba3bd40aa1489e9f37877ff", size = 658225, upload-time = "2026-02-20T20:56:02.527Z" }, + { url = "https://files.pythonhosted.org/packages/d1/67/8197b7e7e602150938049d8e7f30de1660cfb87e4c8ee349b42b67bdb2e1/greenlet-3.3.2-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:59b3e2c40f6706b05a9cd299c836c6aa2378cabe25d021acd80f13abf81181cf", size = 666581, upload-time = "2026-02-20T21:02:51.526Z" }, + { url = "https://files.pythonhosted.org/packages/8e/30/3a09155fbf728673a1dea713572d2d31159f824a37c22da82127056c44e4/greenlet-3.3.2-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b26b0f4428b871a751968285a1ac9648944cea09807177ac639b030bddebcea4", size = 657907, upload-time = "2026-02-20T20:21:05.259Z" }, + { url = "https://files.pythonhosted.org/packages/f3/fd/d05a4b7acd0154ed758797f0a43b4c0962a843bedfe980115e842c5b2d08/greenlet-3.3.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1fb39a11ee2e4d94be9a76671482be9398560955c9e568550de0224e41104727", size = 1618857, upload-time = "2026-02-20T20:49:37.309Z" }, + { url = "https://files.pythonhosted.org/packages/6f/e1/50ee92a5db521de8f35075b5eff060dd43d39ebd46c2181a2042f7070385/greenlet-3.3.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:20154044d9085151bc309e7689d6f7ba10027f8f5a8c0676ad398b951913d89e", size = 1680010, upload-time = "2026-02-20T20:21:13.427Z" }, + { url = "https://files.pythonhosted.org/packages/29/4b/45d90626aef8e65336bed690106d1382f7a43665e2249017e9527df8823b/greenlet-3.3.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c04c5e06ec3e022cbfe2cd4a846e1d4e50087444f875ff6d2c2ad8445495cf1a", size = 237086, upload-time = "2026-02-20T20:20:45.786Z" }, +] + [[package]] name = "grpc-google-iam-v1" version = "0.14.3" @@ -1096,6 +1203,71 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/04/cf/b8bdb5d6b631766a2332dca19cb2b214620a65c398636012dde69b71f36f/jsonargparse-3.13.1-py3-none-any.whl", hash = "sha256:b58188b98f2ac2b1f5007ece7ea821628883ce3f3ee448eb17c72d9d3b8ec893", size = 101364, upload-time = "2021-06-03T05:50:56.686Z" }, ] +[[package]] +name = "jsonschema" +version = "4.26.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "jsonschema-specifications" }, + { name = "referencing" }, + { name = "rpds-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", size = 90630, upload-time = "2026-01-07T13:41:05.306Z" }, +] + +[[package]] +name = "jsonschema-specifications" +version = "2025.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "referencing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, +] + +[[package]] +name = "jupyter-client" +version = "8.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-core" }, + { name = "python-dateutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/05/e4/ba649102a3bc3fbca54e7239fb924fd434c766f855693d86de0b1f2bec81/jupyter_client-8.8.0.tar.gz", hash = "sha256:d556811419a4f2d96c869af34e854e3f059b7cc2d6d01a9cd9c85c267691be3e", size = 348020, upload-time = "2026-01-08T13:55:47.938Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl", hash = "sha256:f93a5b99c5e23a507b773d3a1136bd6e16c67883ccdbd9a829b0bbdb98cd7d7a", size = 107371, upload-time = "2026-01-08T13:55:45.562Z" }, +] + +[[package]] +name = "jupyter-core" +version = "5.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "platformdirs" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/02/49/9d1284d0dc65e2c757b74c6687b6d319b02f822ad039e5c512df9194d9dd/jupyter_core-5.9.1.tar.gz", hash = "sha256:4d09aaff303b9566c3ce657f580bd089ff5c91f5f89cf7d8846c3cdf465b5508", size = 89814, upload-time = "2025-10-16T19:19:18.444Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl", hash = "sha256:ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407", size = 29032, upload-time = "2025-10-16T19:19:16.783Z" }, +] + +[[package]] +name = "jupyterlab-pygments" +version = "0.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/90/51/9187be60d989df97f5f0aba133fa54e7300f17616e065d1ada7d7646b6d6/jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", size = 512900, upload-time = "2023-11-23T09:26:37.44Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780", size = 15884, upload-time = "2023-11-23T09:26:34.325Z" }, +] + [[package]] name = "lightning-utilities" version = "0.15.3" @@ -1270,14 +1442,14 @@ wheels = [ [[package]] name = "marimo" -version = "0.19.4" +version = "0.22.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "docutils" }, { name = "itsdangerous" }, { name = "jedi" }, - { name = "loro", marker = "python_full_version < '3.14'" }, + { name = "loro" }, { name = "markdown" }, { name = "msgspec" }, { name = "narwhals" }, @@ -1286,14 +1458,14 @@ dependencies = [ { name = "pygments" }, { name = "pymdown-extensions" }, { name = "pyyaml" }, + { name = "pyzmq", marker = "python_full_version < '3.15'" }, { name = "starlette" }, { name = "tomlkit" }, { name = "uvicorn" }, { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d0/54/7bdaa557afb0fd64b465a4f84a2635e7c4c3f81fd5d6f77b6c4172ac79eb/marimo-0.19.4.tar.gz", hash = "sha256:eec3b765c3fd98d63e2017c56a024e779a6923cb56e7682e78876d4fe49409b7", size = 39395595, upload-time = "2026-01-15T22:13:47.018Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/a3/ec4989605e1f3681bc0b66ea7cba7767c1b7074c67462400364b90f43b2a/marimo-0.19.4-py3-none-any.whl", hash = "sha256:872f3427213047076e73147c41085b6932d83a03ac84040ba9a611a0fcecb729", size = 39936106, upload-time = "2026-01-15T22:13:42.104Z" }, + { url = "https://files.pythonhosted.org/packages/ec/38/d0fbc9e7d58434bc608cb769e819053daae3ba43f4b9d819011a89276eda/marimo-0.22.0-py3-none-any.whl", hash = "sha256:b5a194e4e4f731512b8c6d82801473c502a2befbe547518717077706eabb59ba", size = 38659118, upload-time = "2026-03-31T21:07:07.076Z" }, ] [package.optional-dependencies] @@ -1386,6 +1558,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl", hash = "sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76", size = 9516, upload-time = "2025-10-23T09:00:20.675Z" }, ] +[[package]] +name = "mistune" +version = "3.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/55/d01f0c4b45ade6536c51170b9043db8b2ec6ddf4a35c7ea3f5f559ac935b/mistune-3.2.0.tar.gz", hash = "sha256:708487c8a8cdd99c9d90eb3ed4c3ed961246ff78ac82f03418f5183ab70e398a", size = 95467, upload-time = "2025-12-23T11:36:34.994Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl", hash = "sha256:febdc629a3c78616b94393c6580551e0e34cc289987ec6c35ed3f4be42d0eee1", size = 53598, upload-time = "2025-12-23T11:36:33.211Z" }, +] + [[package]] name = "mpmath" version = "1.3.0" @@ -1555,6 +1736,7 @@ wheels = [ name = "muse" source = { editable = "." } dependencies = [ + { name = "altair" }, { name = "datasets" }, { name = "evaluate" }, { name = "ftfy" }, @@ -1562,11 +1744,17 @@ dependencies = [ { name = "google-cloud-translate" }, { name = "ipython" }, { name = "marimo" }, + { name = "nbconvert" }, + { name = "nbformat" }, { name = "numpy" }, { name = "orjsonl" }, + { name = "pandas", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" }, + { name = "pandas", version = "3.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" }, { name = "pip" }, + { name = "playwright" }, { name = "polars" }, { name = "sacrebleu" }, + { name = "scipy" }, { name = "transformers", extra = ["sentencepiece", "tiktoken", "torch"] }, { name = "unbabel-comet" }, ] @@ -1585,21 +1773,27 @@ dev = [ [package.metadata] requires-dist = [ + { name = "altair", specifier = ">=5" }, { name = "datasets" }, { name = "evaluate" }, { name = "ftfy" }, { name = "google-auth" }, { name = "google-cloud-translate" }, { name = "ipython" }, - { name = "marimo", specifier = ">=0.13.11" }, + { name = "marimo", specifier = ">=0.22.0" }, { name = "marimo", extras = ["lsp"], marker = "extra == 'dev'" }, + { name = "nbconvert", specifier = ">=7.17.0" }, + { name = "nbformat", specifier = ">=5.10.4" }, { name = "numpy" }, { name = "orjsonl" }, + { name = "pandas" }, { name = "pip" }, + { name = "playwright", specifier = ">=1.58.0" }, { name = "polars", specifier = ">=0.20.4" }, { name = "pre-commit", marker = "extra == 'dev'" }, { name = "ruff", marker = "extra == 'dev'" }, { name = "sacrebleu" }, + { name = "scipy" }, { name = "transformers", extras = ["sentencepiece", "tiktoken", "torch"] }, { name = "unbabel-comet" }, ] @@ -1626,6 +1820,61 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3d/2e/cf2ffeb386ac3763526151163ad7da9f1b586aac96d2b4f7de1eaebf0c61/narwhals-2.15.0-py3-none-any.whl", hash = "sha256:cbfe21ca19d260d9fd67f995ec75c44592d1f106933b03ddd375df7ac841f9d6", size = 432856, upload-time = "2026-01-06T08:10:11.511Z" }, ] +[[package]] +name = "nbclient" +version = "0.10.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "nbformat" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/56/91/1c1d5a4b9a9ebba2b4e32b8c852c2975c872aec1fe42ab5e516b2cecd193/nbclient-0.10.4.tar.gz", hash = "sha256:1e54091b16e6da39e297b0ece3e10f6f29f4ac4e8ee515d29f8a7099bd6553c9", size = 62554, upload-time = "2025-12-23T07:45:46.369Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl", hash = "sha256:9162df5a7373d70d606527300a95a975a47c137776cd942e52d9c7e29ff83440", size = 25465, upload-time = "2025-12-23T07:45:44.51Z" }, +] + +[[package]] +name = "nbconvert" +version = "7.17.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4" }, + { name = "bleach", extra = ["css"] }, + { name = "defusedxml" }, + { name = "jinja2" }, + { name = "jupyter-core" }, + { name = "jupyterlab-pygments" }, + { name = "markupsafe" }, + { name = "mistune" }, + { name = "nbclient" }, + { name = "nbformat" }, + { name = "packaging" }, + { name = "pandocfilters" }, + { name = "pygments" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/47/81f886b699450d0569f7bc551df2b1673d18df7ff25cc0c21ca36ed8a5ff/nbconvert-7.17.0.tar.gz", hash = "sha256:1b2696f1b5be12309f6c7d707c24af604b87dfaf6d950794c7b07acab96dda78", size = 862855, upload-time = "2026-01-29T16:37:48.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl", hash = "sha256:4f99a63b337b9a23504347afdab24a11faa7d86b405e5c8f9881cd313336d518", size = 261510, upload-time = "2026-01-29T16:37:46.322Z" }, +] + +[[package]] +name = "nbformat" +version = "5.10.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "fastjsonschema" }, + { name = "jsonschema" }, + { name = "jupyter-core" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749, upload-time = "2024-04-04T11:20:37.371Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454, upload-time = "2024-04-04T11:20:34.895Z" }, +] + [[package]] name = "networkx" version = "3.6.1" @@ -1981,6 +2230,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/68/b0/34937815889fa982613775e4b97fddd13250f11012d769949c5465af2150/pandas-3.0.1-cp314-cp314t-win_arm64.whl", hash = "sha256:108dd1790337a494aa80e38def654ca3f0968cf4f362c85f44c15e471667102d", size = 9452085, upload-time = "2026-02-17T22:20:14.331Z" }, ] +[[package]] +name = "pandocfilters" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/70/6f/3dd4940bbe001c06a65f88e36bad298bc7a0de5036115639926b0c5c0458/pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e", size = 8454, upload-time = "2024-01-18T20:08:13.726Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc", size = 8663, upload-time = "2024-01-18T20:08:11.28Z" }, +] + [[package]] name = "parso" version = "0.8.5" @@ -2029,6 +2287,25 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31", size = 18731, upload-time = "2025-12-05T13:52:56.823Z" }, ] +[[package]] +name = "playwright" +version = "1.58.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "greenlet" }, + { name = "pyee" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/c9/9c6061d5703267f1baae6a4647bfd1862e386fbfdb97d889f6f6ae9e3f64/playwright-1.58.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:96e3204aac292ee639edbfdef6298b4be2ea0a55a16b7068df91adac077cc606", size = 42251098, upload-time = "2026-01-30T15:09:24.028Z" }, + { url = "https://files.pythonhosted.org/packages/e0/40/59d34a756e02f8c670f0fee987d46f7ee53d05447d43cd114ca015cb168c/playwright-1.58.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:70c763694739d28df71ed578b9c8202bb83e8fe8fb9268c04dd13afe36301f71", size = 41039625, upload-time = "2026-01-30T15:09:27.558Z" }, + { url = "https://files.pythonhosted.org/packages/e1/ee/3ce6209c9c74a650aac9028c621f357a34ea5cd4d950700f8e2c4b7fe2c4/playwright-1.58.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:185e0132578733d02802dfddfbbc35f42be23a45ff49ccae5081f25952238117", size = 42251098, upload-time = "2026-01-30T15:09:30.461Z" }, + { url = "https://files.pythonhosted.org/packages/f1/af/009958cbf23fac551a940d34e3206e6c7eed2b8c940d0c3afd1feb0b0589/playwright-1.58.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:c95568ba1eda83812598c1dc9be60b4406dffd60b149bc1536180ad108723d6b", size = 46235268, upload-time = "2026-01-30T15:09:33.787Z" }, + { url = "https://files.pythonhosted.org/packages/d9/a6/0e66ad04b6d3440dae73efb39540c5685c5fc95b17c8b29340b62abbd952/playwright-1.58.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f9999948f1ab541d98812de25e3a8c410776aa516d948807140aff797b4bffa", size = 45964214, upload-time = "2026-01-30T15:09:36.751Z" }, + { url = "https://files.pythonhosted.org/packages/0e/4b/236e60ab9f6d62ed0fd32150d61f1f494cefbf02304c0061e78ed80c1c32/playwright-1.58.0-py3-none-win32.whl", hash = "sha256:1e03be090e75a0fabbdaeab65ce17c308c425d879fa48bb1d7986f96bfad0b99", size = 36815998, upload-time = "2026-01-30T15:09:39.627Z" }, + { url = "https://files.pythonhosted.org/packages/41/f8/5ec599c5e59d2f2f336a05b4f318e733077cd5044f24adb6f86900c3e6a7/playwright-1.58.0-py3-none-win_amd64.whl", hash = "sha256:a2bf639d0ce33b3ba38de777e08697b0d8f3dc07ab6802e4ac53fb65e3907af8", size = 36816005, upload-time = "2026-01-30T15:09:42.449Z" }, + { url = "https://files.pythonhosted.org/packages/c8/c4/cc0229fea55c87d6c9c67fe44a21e2cd28d1d558a5478ed4d617e9fb0c93/playwright-1.58.0-py3-none-win_arm64.whl", hash = "sha256:32ffe5c303901a13a0ecab91d1c3f74baf73b84f4bedbb6b935f5bc11cc98e1b", size = 33085919, upload-time = "2026-01-30T15:09:45.71Z" }, +] + [[package]] name = "pluggy" version = "1.6.0" @@ -2365,6 +2642,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f9/93/45c1cdcbeb182ccd2e144c693eaa097763b08b38cded279f0053ed53c553/pycryptodomex-3.23.0-cp37-abi3-win_arm64.whl", hash = "sha256:02d87b80778c171445d67e23d1caef279bf4b25c3597050ccd2e13970b57fd51", size = 1707161, upload-time = "2025-05-17T17:23:11.414Z" }, ] +[[package]] +name = "pyee" +version = "13.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8b/04/e7c1fe4dc78a6fdbfd6c337b1c3732ff543b8a397683ab38378447baa331/pyee-13.0.1.tar.gz", hash = "sha256:0b931f7c14535667ed4c7e0d531716368715e860b988770fc7eb8578d1f67fc8", size = 31655, upload-time = "2026-02-14T21:12:28.044Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/c4/b4d4827c93ef43c01f599ef31453ccc1c132b353284fc6c87d535c233129/pyee-13.0.1-py3-none-any.whl", hash = "sha256:af2f8fede4171ef667dfded53f96e2ed0d6e6bd7ee3bb46437f77e3b57689228", size = 15659, upload-time = "2026-02-14T21:12:26.263Z" }, +] + [[package]] name = "pygments" version = "2.19.2" @@ -2562,6 +2851,63 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, ] +[[package]] +name = "pyzmq" +version = "27.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "implementation_name == 'pypy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/0b/3c9baedbdf613ecaa7aa07027780b8867f57b6293b6ee50de316c9f3222b/pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540", size = 281750, upload-time = "2025-09-08T23:10:18.157Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc", size = 1306279, upload-time = "2025-09-08T23:08:03.807Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5e/c3c49fdd0f535ef45eefcc16934648e9e59dace4a37ee88fc53f6cd8e641/pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113", size = 895645, upload-time = "2025-09-08T23:08:05.301Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e5/b0b2504cb4e903a74dcf1ebae157f9e20ebb6ea76095f6cfffea28c42ecd/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233", size = 652574, upload-time = "2025-09-08T23:08:06.828Z" }, + { url = "https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31", size = 840995, upload-time = "2025-09-08T23:08:08.396Z" }, + { url = "https://files.pythonhosted.org/packages/c2/bb/b79798ca177b9eb0825b4c9998c6af8cd2a7f15a6a1a4272c1d1a21d382f/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28", size = 1642070, upload-time = "2025-09-08T23:08:09.989Z" }, + { url = "https://files.pythonhosted.org/packages/9c/80/2df2e7977c4ede24c79ae39dcef3899bfc5f34d1ca7a5b24f182c9b7a9ca/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856", size = 2021121, upload-time = "2025-09-08T23:08:11.907Z" }, + { url = "https://files.pythonhosted.org/packages/46/bd/2d45ad24f5f5ae7e8d01525eb76786fa7557136555cac7d929880519e33a/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496", size = 1878550, upload-time = "2025-09-08T23:08:13.513Z" }, + { url = "https://files.pythonhosted.org/packages/e6/2f/104c0a3c778d7c2ab8190e9db4f62f0b6957b53c9d87db77c284b69f33ea/pyzmq-27.1.0-cp312-abi3-win32.whl", hash = "sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd", size = 559184, upload-time = "2025-09-08T23:08:15.163Z" }, + { url = "https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl", hash = "sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf", size = 619480, upload-time = "2025-09-08T23:08:17.192Z" }, + { url = "https://files.pythonhosted.org/packages/78/c2/c012beae5f76b72f007a9e91ee9401cb88c51d0f83c6257a03e785c81cc2/pyzmq-27.1.0-cp312-abi3-win_arm64.whl", hash = "sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f", size = 552993, upload-time = "2025-09-08T23:08:18.926Z" }, + { url = "https://files.pythonhosted.org/packages/60/cb/84a13459c51da6cec1b7b1dc1a47e6db6da50b77ad7fd9c145842750a011/pyzmq-27.1.0-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:93ad4b0855a664229559e45c8d23797ceac03183c7b6f5b4428152a6b06684a5", size = 1122436, upload-time = "2025-09-08T23:08:20.801Z" }, + { url = "https://files.pythonhosted.org/packages/dc/b6/94414759a69a26c3dd674570a81813c46a078767d931a6c70ad29fc585cb/pyzmq-27.1.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:fbb4f2400bfda24f12f009cba62ad5734148569ff4949b1b6ec3b519444342e6", size = 1156301, upload-time = "2025-09-08T23:08:22.47Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ad/15906493fd40c316377fd8a8f6b1f93104f97a752667763c9b9c1b71d42d/pyzmq-27.1.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:e343d067f7b151cfe4eb3bb796a7752c9d369eed007b91231e817071d2c2fec7", size = 1341197, upload-time = "2025-09-08T23:08:24.286Z" }, + { url = "https://files.pythonhosted.org/packages/14/1d/d343f3ce13db53a54cb8946594e567410b2125394dafcc0268d8dda027e0/pyzmq-27.1.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:08363b2011dec81c354d694bdecaef4770e0ae96b9afea70b3f47b973655cc05", size = 897275, upload-time = "2025-09-08T23:08:26.063Z" }, + { url = "https://files.pythonhosted.org/packages/69/2d/d83dd6d7ca929a2fc67d2c3005415cdf322af7751d773524809f9e585129/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d54530c8c8b5b8ddb3318f481297441af102517602b569146185fa10b63f4fa9", size = 660469, upload-time = "2025-09-08T23:08:27.623Z" }, + { url = "https://files.pythonhosted.org/packages/3e/cd/9822a7af117f4bc0f1952dbe9ef8358eb50a24928efd5edf54210b850259/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f3afa12c392f0a44a2414056d730eebc33ec0926aae92b5ad5cf26ebb6cc128", size = 847961, upload-time = "2025-09-08T23:08:29.672Z" }, + { url = "https://files.pythonhosted.org/packages/9a/12/f003e824a19ed73be15542f172fd0ec4ad0b60cf37436652c93b9df7c585/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c65047adafe573ff023b3187bb93faa583151627bc9c51fc4fb2c561ed689d39", size = 1650282, upload-time = "2025-09-08T23:08:31.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/4a/e82d788ed58e9a23995cee70dbc20c9aded3d13a92d30d57ec2291f1e8a3/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:90e6e9441c946a8b0a667356f7078d96411391a3b8f80980315455574177ec97", size = 2024468, upload-time = "2025-09-08T23:08:33.543Z" }, + { url = "https://files.pythonhosted.org/packages/d9/94/2da0a60841f757481e402b34bf4c8bf57fa54a5466b965de791b1e6f747d/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:add071b2d25f84e8189aaf0882d39a285b42fa3853016ebab234a5e78c7a43db", size = 1885394, upload-time = "2025-09-08T23:08:35.51Z" }, + { url = "https://files.pythonhosted.org/packages/4f/6f/55c10e2e49ad52d080dc24e37adb215e5b0d64990b57598abc2e3f01725b/pyzmq-27.1.0-cp313-cp313t-win32.whl", hash = "sha256:7ccc0700cfdf7bd487bea8d850ec38f204478681ea02a582a8da8171b7f90a1c", size = 574964, upload-time = "2025-09-08T23:08:37.178Z" }, + { url = "https://files.pythonhosted.org/packages/87/4d/2534970ba63dd7c522d8ca80fb92777f362c0f321900667c615e2067cb29/pyzmq-27.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8085a9fba668216b9b4323be338ee5437a235fe275b9d1610e422ccc279733e2", size = 641029, upload-time = "2025-09-08T23:08:40.595Z" }, + { url = "https://files.pythonhosted.org/packages/f6/fa/f8aea7a28b0641f31d40dea42d7ef003fded31e184ef47db696bc74cd610/pyzmq-27.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6bb54ca21bcfe361e445256c15eedf083f153811c37be87e0514934d6913061e", size = 561541, upload-time = "2025-09-08T23:08:42.668Z" }, + { url = "https://files.pythonhosted.org/packages/87/45/19efbb3000956e82d0331bafca5d9ac19ea2857722fa2caacefb6042f39d/pyzmq-27.1.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ce980af330231615756acd5154f29813d553ea555485ae712c491cd483df6b7a", size = 1341197, upload-time = "2025-09-08T23:08:44.973Z" }, + { url = "https://files.pythonhosted.org/packages/48/43/d72ccdbf0d73d1343936296665826350cb1e825f92f2db9db3e61c2162a2/pyzmq-27.1.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea", size = 897175, upload-time = "2025-09-08T23:08:46.601Z" }, + { url = "https://files.pythonhosted.org/packages/2f/2e/a483f73a10b65a9ef0161e817321d39a770b2acf8bcf3004a28d90d14a94/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96", size = 660427, upload-time = "2025-09-08T23:08:48.187Z" }, + { url = "https://files.pythonhosted.org/packages/f5/d2/5f36552c2d3e5685abe60dfa56f91169f7a2d99bbaf67c5271022ab40863/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01c0e07d558b06a60773744ea6251f769cd79a41a97d11b8bf4ab8f034b0424d", size = 847929, upload-time = "2025-09-08T23:08:49.76Z" }, + { url = "https://files.pythonhosted.org/packages/c4/2a/404b331f2b7bf3198e9945f75c4c521f0c6a3a23b51f7a4a401b94a13833/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:80d834abee71f65253c91540445d37c4c561e293ba6e741b992f20a105d69146", size = 1650193, upload-time = "2025-09-08T23:08:51.7Z" }, + { url = "https://files.pythonhosted.org/packages/1c/0b/f4107e33f62a5acf60e3ded67ed33d79b4ce18de432625ce2fc5093d6388/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:544b4e3b7198dde4a62b8ff6685e9802a9a1ebf47e77478a5eb88eca2a82f2fd", size = 2024388, upload-time = "2025-09-08T23:08:53.393Z" }, + { url = "https://files.pythonhosted.org/packages/0d/01/add31fe76512642fd6e40e3a3bd21f4b47e242c8ba33efb6809e37076d9b/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cedc4c68178e59a4046f97eca31b148ddcf51e88677de1ef4e78cf06c5376c9a", size = 1885316, upload-time = "2025-09-08T23:08:55.702Z" }, + { url = "https://files.pythonhosted.org/packages/c4/59/a5f38970f9bf07cee96128de79590bb354917914a9be11272cfc7ff26af0/pyzmq-27.1.0-cp314-cp314t-win32.whl", hash = "sha256:1f0b2a577fd770aa6f053211a55d1c47901f4d537389a034c690291485e5fe92", size = 587472, upload-time = "2025-09-08T23:08:58.18Z" }, + { url = "https://files.pythonhosted.org/packages/70/d8/78b1bad170f93fcf5e3536e70e8fadac55030002275c9a29e8f5719185de/pyzmq-27.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:19c9468ae0437f8074af379e986c5d3d7d7bfe033506af442e8c879732bedbe0", size = 661401, upload-time = "2025-09-08T23:08:59.802Z" }, + { url = "https://files.pythonhosted.org/packages/81/d6/4bfbb40c9a0b42fc53c7cf442f6385db70b40f74a783130c5d0a5aa62228/pyzmq-27.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7", size = 575170, upload-time = "2025-09-08T23:09:01.418Z" }, +] + +[[package]] +name = "referencing" +version = "0.37.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "rpds-py" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" }, +] + [[package]] name = "regex" version = "2026.1.15" @@ -2665,6 +3011,87 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, ] +[[package]] +name = "rpds-py" +version = "0.30.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/af/3f2f423103f1113b36230496629986e0ef7e199d2aa8392452b484b38ced/rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84", size = 69469, upload-time = "2025-11-30T20:24:38.837Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/03/e7/98a2f4ac921d82f33e03f3835f5bf3a4a40aa1bfdc57975e74a97b2b4bdd/rpds_py-0.30.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a161f20d9a43006833cd7068375a94d035714d73a172b681d8881820600abfad", size = 375086, upload-time = "2025-11-30T20:22:17.93Z" }, + { url = "https://files.pythonhosted.org/packages/4d/a1/bca7fd3d452b272e13335db8d6b0b3ecde0f90ad6f16f3328c6fb150c889/rpds_py-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6abc8880d9d036ecaafe709079969f56e876fcf107f7a8e9920ba6d5a3878d05", size = 359053, upload-time = "2025-11-30T20:22:19.297Z" }, + { url = "https://files.pythonhosted.org/packages/65/1c/ae157e83a6357eceff62ba7e52113e3ec4834a84cfe07fa4b0757a7d105f/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca28829ae5f5d569bb62a79512c842a03a12576375d5ece7d2cadf8abe96ec28", size = 390763, upload-time = "2025-11-30T20:22:21.661Z" }, + { url = "https://files.pythonhosted.org/packages/d4/36/eb2eb8515e2ad24c0bd43c3ee9cd74c33f7ca6430755ccdb240fd3144c44/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1010ed9524c73b94d15919ca4d41d8780980e1765babf85f9a2f90d247153dd", size = 408951, upload-time = "2025-11-30T20:22:23.408Z" }, + { url = "https://files.pythonhosted.org/packages/d6/65/ad8dc1784a331fabbd740ef6f71ce2198c7ed0890dab595adb9ea2d775a1/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8d1736cfb49381ba528cd5baa46f82fdc65c06e843dab24dd70b63d09121b3f", size = 514622, upload-time = "2025-11-30T20:22:25.16Z" }, + { url = "https://files.pythonhosted.org/packages/63/8e/0cfa7ae158e15e143fe03993b5bcd743a59f541f5952e1546b1ac1b5fd45/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d948b135c4693daff7bc2dcfc4ec57237a29bd37e60c2fabf5aff2bbacf3e2f1", size = 414492, upload-time = "2025-11-30T20:22:26.505Z" }, + { url = "https://files.pythonhosted.org/packages/60/1b/6f8f29f3f995c7ffdde46a626ddccd7c63aefc0efae881dc13b6e5d5bb16/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47f236970bccb2233267d89173d3ad2703cd36a0e2a6e92d0560d333871a3d23", size = 394080, upload-time = "2025-11-30T20:22:27.934Z" }, + { url = "https://files.pythonhosted.org/packages/6d/d5/a266341051a7a3ca2f4b750a3aa4abc986378431fc2da508c5034d081b70/rpds_py-0.30.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:2e6ecb5a5bcacf59c3f912155044479af1d0b6681280048b338b28e364aca1f6", size = 408680, upload-time = "2025-11-30T20:22:29.341Z" }, + { url = "https://files.pythonhosted.org/packages/10/3b/71b725851df9ab7a7a4e33cf36d241933da66040d195a84781f49c50490c/rpds_py-0.30.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a8fa71a2e078c527c3e9dc9fc5a98c9db40bcc8a92b4e8858e36d329f8684b51", size = 423589, upload-time = "2025-11-30T20:22:31.469Z" }, + { url = "https://files.pythonhosted.org/packages/00/2b/e59e58c544dc9bd8bd8384ecdb8ea91f6727f0e37a7131baeff8d6f51661/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73c67f2db7bc334e518d097c6d1e6fed021bbc9b7d678d6cc433478365d1d5f5", size = 573289, upload-time = "2025-11-30T20:22:32.997Z" }, + { url = "https://files.pythonhosted.org/packages/da/3e/a18e6f5b460893172a7d6a680e86d3b6bc87a54c1f0b03446a3c8c7b588f/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5ba103fb455be00f3b1c2076c9d4264bfcb037c976167a6047ed82f23153f02e", size = 599737, upload-time = "2025-11-30T20:22:34.419Z" }, + { url = "https://files.pythonhosted.org/packages/5c/e2/714694e4b87b85a18e2c243614974413c60aa107fd815b8cbc42b873d1d7/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee9c752c0364588353e627da8a7e808a66873672bcb5f52890c33fd965b394", size = 563120, upload-time = "2025-11-30T20:22:35.903Z" }, + { url = "https://files.pythonhosted.org/packages/6f/ab/d5d5e3bcedb0a77f4f613706b750e50a5a3ba1c15ccd3665ecc636c968fd/rpds_py-0.30.0-cp312-cp312-win32.whl", hash = "sha256:1ab5b83dbcf55acc8b08fc62b796ef672c457b17dbd7820a11d6c52c06839bdf", size = 223782, upload-time = "2025-11-30T20:22:37.271Z" }, + { url = "https://files.pythonhosted.org/packages/39/3b/f786af9957306fdc38a74cef405b7b93180f481fb48453a114bb6465744a/rpds_py-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:a090322ca841abd453d43456ac34db46e8b05fd9b3b4ac0c78bcde8b089f959b", size = 240463, upload-time = "2025-11-30T20:22:39.021Z" }, + { url = "https://files.pythonhosted.org/packages/f3/d2/b91dc748126c1559042cfe41990deb92c4ee3e2b415f6b5234969ffaf0cc/rpds_py-0.30.0-cp312-cp312-win_arm64.whl", hash = "sha256:669b1805bd639dd2989b281be2cfd951c6121b65e729d9b843e9639ef1fd555e", size = 230868, upload-time = "2025-11-30T20:22:40.493Z" }, + { url = "https://files.pythonhosted.org/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2", size = 374887, upload-time = "2025-11-30T20:22:41.812Z" }, + { url = "https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8", size = 358904, upload-time = "2025-11-30T20:22:43.479Z" }, + { url = "https://files.pythonhosted.org/packages/58/70/faed8186300e3b9bdd138d0273109784eea2396c68458ed580f885dfe7ad/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4", size = 389945, upload-time = "2025-11-30T20:22:44.819Z" }, + { url = "https://files.pythonhosted.org/packages/bd/a8/073cac3ed2c6387df38f71296d002ab43496a96b92c823e76f46b8af0543/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0a59119fc6e3f460315fe9d08149f8102aa322299deaa5cab5b40092345c2136", size = 407783, upload-time = "2025-11-30T20:22:46.103Z" }, + { url = "https://files.pythonhosted.org/packages/77/57/5999eb8c58671f1c11eba084115e77a8899d6e694d2a18f69f0ba471ec8b/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76fec018282b4ead0364022e3c54b60bf368b9d926877957a8624b58419169b7", size = 515021, upload-time = "2025-11-30T20:22:47.458Z" }, + { url = "https://files.pythonhosted.org/packages/e0/af/5ab4833eadc36c0a8ed2bc5c0de0493c04f6c06de223170bd0798ff98ced/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:692bef75a5525db97318e8cd061542b5a79812d711ea03dbc1f6f8dbb0c5f0d2", size = 414589, upload-time = "2025-11-30T20:22:48.872Z" }, + { url = "https://files.pythonhosted.org/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6", size = 394025, upload-time = "2025-11-30T20:22:50.196Z" }, + { url = "https://files.pythonhosted.org/packages/91/c4/fc70cd0249496493500e7cc2de87504f5aa6509de1e88623431fec76d4b6/rpds_py-0.30.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:9cf69cdda1f5968a30a359aba2f7f9aa648a9ce4b580d6826437f2b291cfc86e", size = 408895, upload-time = "2025-11-30T20:22:51.87Z" }, + { url = "https://files.pythonhosted.org/packages/58/95/d9275b05ab96556fefff73a385813eb66032e4c99f411d0795372d9abcea/rpds_py-0.30.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4796a717bf12b9da9d3ad002519a86063dcac8988b030e405704ef7d74d2d9d", size = 422799, upload-time = "2025-11-30T20:22:53.341Z" }, + { url = "https://files.pythonhosted.org/packages/06/c1/3088fc04b6624eb12a57eb814f0d4997a44b0d208d6cace713033ff1a6ba/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d4c2aa7c50ad4728a094ebd5eb46c452e9cb7edbfdb18f9e1221f597a73e1e7", size = 572731, upload-time = "2025-11-30T20:22:54.778Z" }, + { url = "https://files.pythonhosted.org/packages/d8/42/c612a833183b39774e8ac8fecae81263a68b9583ee343db33ab571a7ce55/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba81a9203d07805435eb06f536d95a266c21e5b2dfbf6517748ca40c98d19e31", size = 599027, upload-time = "2025-11-30T20:22:56.212Z" }, + { url = "https://files.pythonhosted.org/packages/5f/60/525a50f45b01d70005403ae0e25f43c0384369ad24ffe46e8d9068b50086/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:945dccface01af02675628334f7cf49c2af4c1c904748efc5cf7bbdf0b579f95", size = 563020, upload-time = "2025-11-30T20:22:58.2Z" }, + { url = "https://files.pythonhosted.org/packages/0b/5d/47c4655e9bcd5ca907148535c10e7d489044243cc9941c16ed7cd53be91d/rpds_py-0.30.0-cp313-cp313-win32.whl", hash = "sha256:b40fb160a2db369a194cb27943582b38f79fc4887291417685f3ad693c5a1d5d", size = 223139, upload-time = "2025-11-30T20:23:00.209Z" }, + { url = "https://files.pythonhosted.org/packages/f2/e1/485132437d20aa4d3e1d8b3fb5a5e65aa8139f1e097080c2a8443201742c/rpds_py-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:806f36b1b605e2d6a72716f321f20036b9489d29c51c91f4dd29a3e3afb73b15", size = 240224, upload-time = "2025-11-30T20:23:02.008Z" }, + { url = "https://files.pythonhosted.org/packages/24/95/ffd128ed1146a153d928617b0ef673960130be0009c77d8fbf0abe306713/rpds_py-0.30.0-cp313-cp313-win_arm64.whl", hash = "sha256:d96c2086587c7c30d44f31f42eae4eac89b60dabbac18c7669be3700f13c3ce1", size = 230645, upload-time = "2025-11-30T20:23:03.43Z" }, + { url = "https://files.pythonhosted.org/packages/ff/1b/b10de890a0def2a319a2626334a7f0ae388215eb60914dbac8a3bae54435/rpds_py-0.30.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:eb0b93f2e5c2189ee831ee43f156ed34e2a89a78a66b98cadad955972548be5a", size = 364443, upload-time = "2025-11-30T20:23:04.878Z" }, + { url = "https://files.pythonhosted.org/packages/0d/bf/27e39f5971dc4f305a4fb9c672ca06f290f7c4e261c568f3dea16a410d47/rpds_py-0.30.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:922e10f31f303c7c920da8981051ff6d8c1a56207dbdf330d9047f6d30b70e5e", size = 353375, upload-time = "2025-11-30T20:23:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/40/58/442ada3bba6e8e6615fc00483135c14a7538d2ffac30e2d933ccf6852232/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdc62c8286ba9bf7f47befdcea13ea0e26bf294bda99758fd90535cbaf408000", size = 383850, upload-time = "2025-11-30T20:23:07.825Z" }, + { url = "https://files.pythonhosted.org/packages/14/14/f59b0127409a33c6ef6f5c1ebd5ad8e32d7861c9c7adfa9a624fc3889f6c/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47f9a91efc418b54fb8190a6b4aa7813a23fb79c51f4bb84e418f5476c38b8db", size = 392812, upload-time = "2025-11-30T20:23:09.228Z" }, + { url = "https://files.pythonhosted.org/packages/b3/66/e0be3e162ac299b3a22527e8913767d869e6cc75c46bd844aa43fb81ab62/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3587eb9b17f3789ad50824084fa6f81921bbf9a795826570bda82cb3ed91f2", size = 517841, upload-time = "2025-11-30T20:23:11.186Z" }, + { url = "https://files.pythonhosted.org/packages/3d/55/fa3b9cf31d0c963ecf1ba777f7cf4b2a2c976795ac430d24a1f43d25a6ba/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39c02563fc592411c2c61d26b6c5fe1e51eaa44a75aa2c8735ca88b0d9599daa", size = 408149, upload-time = "2025-11-30T20:23:12.864Z" }, + { url = "https://files.pythonhosted.org/packages/60/ca/780cf3b1a32b18c0f05c441958d3758f02544f1d613abf9488cd78876378/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a1234d8febafdfd33a42d97da7a43f5dcb120c1060e352a3fbc0c6d36e2083", size = 383843, upload-time = "2025-11-30T20:23:14.638Z" }, + { url = "https://files.pythonhosted.org/packages/82/86/d5f2e04f2aa6247c613da0c1dd87fcd08fa17107e858193566048a1e2f0a/rpds_py-0.30.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:eb2c4071ab598733724c08221091e8d80e89064cd472819285a9ab0f24bcedb9", size = 396507, upload-time = "2025-11-30T20:23:16.105Z" }, + { url = "https://files.pythonhosted.org/packages/4b/9a/453255d2f769fe44e07ea9785c8347edaf867f7026872e76c1ad9f7bed92/rpds_py-0.30.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bdfdb946967d816e6adf9a3d8201bfad269c67efe6cefd7093ef959683c8de0", size = 414949, upload-time = "2025-11-30T20:23:17.539Z" }, + { url = "https://files.pythonhosted.org/packages/a3/31/622a86cdc0c45d6df0e9ccb6becdba5074735e7033c20e401a6d9d0e2ca0/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c77afbd5f5250bf27bf516c7c4a016813eb2d3e116139aed0096940c5982da94", size = 565790, upload-time = "2025-11-30T20:23:19.029Z" }, + { url = "https://files.pythonhosted.org/packages/1c/5d/15bbf0fb4a3f58a3b1c67855ec1efcc4ceaef4e86644665fff03e1b66d8d/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:61046904275472a76c8c90c9ccee9013d70a6d0f73eecefd38c1ae7c39045a08", size = 590217, upload-time = "2025-11-30T20:23:20.885Z" }, + { url = "https://files.pythonhosted.org/packages/6d/61/21b8c41f68e60c8cc3b2e25644f0e3681926020f11d06ab0b78e3c6bbff1/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c5f36a861bc4b7da6516dbdf302c55313afa09b81931e8280361a4f6c9a2d27", size = 555806, upload-time = "2025-11-30T20:23:22.488Z" }, + { url = "https://files.pythonhosted.org/packages/f9/39/7e067bb06c31de48de3eb200f9fc7c58982a4d3db44b07e73963e10d3be9/rpds_py-0.30.0-cp313-cp313t-win32.whl", hash = "sha256:3d4a69de7a3e50ffc214ae16d79d8fbb0922972da0356dcf4d0fdca2878559c6", size = 211341, upload-time = "2025-11-30T20:23:24.449Z" }, + { url = "https://files.pythonhosted.org/packages/0a/4d/222ef0b46443cf4cf46764d9c630f3fe4abaa7245be9417e56e9f52b8f65/rpds_py-0.30.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f14fc5df50a716f7ece6a80b6c78bb35ea2ca47c499e422aa4463455dd96d56d", size = 225768, upload-time = "2025-11-30T20:23:25.908Z" }, + { url = "https://files.pythonhosted.org/packages/86/81/dad16382ebbd3d0e0328776d8fd7ca94220e4fa0798d1dc5e7da48cb3201/rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0", size = 362099, upload-time = "2025-11-30T20:23:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/2b/60/19f7884db5d5603edf3c6bce35408f45ad3e97e10007df0e17dd57af18f8/rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be", size = 353192, upload-time = "2025-11-30T20:23:29.151Z" }, + { url = "https://files.pythonhosted.org/packages/bf/c4/76eb0e1e72d1a9c4703c69607cec123c29028bff28ce41588792417098ac/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f251c812357a3fed308d684a5079ddfb9d933860fc6de89f2b7ab00da481e65f", size = 384080, upload-time = "2025-11-30T20:23:30.785Z" }, + { url = "https://files.pythonhosted.org/packages/72/87/87ea665e92f3298d1b26d78814721dc39ed8d2c74b86e83348d6b48a6f31/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac98b175585ecf4c0348fd7b29c3864bda53b805c773cbf7bfdaffc8070c976f", size = 394841, upload-time = "2025-11-30T20:23:32.209Z" }, + { url = "https://files.pythonhosted.org/packages/77/ad/7783a89ca0587c15dcbf139b4a8364a872a25f861bdb88ed99f9b0dec985/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e62880792319dbeb7eb866547f2e35973289e7d5696c6e295476448f5b63c87", size = 516670, upload-time = "2025-11-30T20:23:33.742Z" }, + { url = "https://files.pythonhosted.org/packages/5b/3c/2882bdac942bd2172f3da574eab16f309ae10a3925644e969536553cb4ee/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e7fc54e0900ab35d041b0601431b0a0eb495f0851a0639b6ef90f7741b39a18", size = 408005, upload-time = "2025-11-30T20:23:35.253Z" }, + { url = "https://files.pythonhosted.org/packages/ce/81/9a91c0111ce1758c92516a3e44776920b579d9a7c09b2b06b642d4de3f0f/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad", size = 382112, upload-time = "2025-11-30T20:23:36.842Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8e/1da49d4a107027e5fbc64daeab96a0706361a2918da10cb41769244b805d/rpds_py-0.30.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b4dc1a6ff022ff85ecafef7979a2c6eb423430e05f1165d6688234e62ba99a07", size = 399049, upload-time = "2025-11-30T20:23:38.343Z" }, + { url = "https://files.pythonhosted.org/packages/df/5a/7ee239b1aa48a127570ec03becbb29c9d5a9eb092febbd1699d567cae859/rpds_py-0.30.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4559c972db3a360808309e06a74628b95eaccbf961c335c8fe0d590cf587456f", size = 415661, upload-time = "2025-11-30T20:23:40.263Z" }, + { url = "https://files.pythonhosted.org/packages/70/ea/caa143cf6b772f823bc7929a45da1fa83569ee49b11d18d0ada7f5ee6fd6/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0ed177ed9bded28f8deb6ab40c183cd1192aa0de40c12f38be4d59cd33cb5c65", size = 565606, upload-time = "2025-11-30T20:23:42.186Z" }, + { url = "https://files.pythonhosted.org/packages/64/91/ac20ba2d69303f961ad8cf55bf7dbdb4763f627291ba3d0d7d67333cced9/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ad1fa8db769b76ea911cb4e10f049d80bf518c104f15b3edb2371cc65375c46f", size = 591126, upload-time = "2025-11-30T20:23:44.086Z" }, + { url = "https://files.pythonhosted.org/packages/21/20/7ff5f3c8b00c8a95f75985128c26ba44503fb35b8e0259d812766ea966c7/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:46e83c697b1f1c72b50e5ee5adb4353eef7406fb3f2043d64c33f20ad1c2fc53", size = 553371, upload-time = "2025-11-30T20:23:46.004Z" }, + { url = "https://files.pythonhosted.org/packages/72/c7/81dadd7b27c8ee391c132a6b192111ca58d866577ce2d9b0ca157552cce0/rpds_py-0.30.0-cp314-cp314-win32.whl", hash = "sha256:ee454b2a007d57363c2dfd5b6ca4a5d7e2c518938f8ed3b706e37e5d470801ed", size = 215298, upload-time = "2025-11-30T20:23:47.696Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d2/1aaac33287e8cfb07aab2e6b8ac1deca62f6f65411344f1433c55e6f3eb8/rpds_py-0.30.0-cp314-cp314-win_amd64.whl", hash = "sha256:95f0802447ac2d10bcc69f6dc28fe95fdf17940367b21d34e34c737870758950", size = 228604, upload-time = "2025-11-30T20:23:49.501Z" }, + { url = "https://files.pythonhosted.org/packages/e8/95/ab005315818cc519ad074cb7784dae60d939163108bd2b394e60dc7b5461/rpds_py-0.30.0-cp314-cp314-win_arm64.whl", hash = "sha256:613aa4771c99f03346e54c3f038e4cc574ac09a3ddfb0e8878487335e96dead6", size = 222391, upload-time = "2025-11-30T20:23:50.96Z" }, + { url = "https://files.pythonhosted.org/packages/9e/68/154fe0194d83b973cdedcdcc88947a2752411165930182ae41d983dcefa6/rpds_py-0.30.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:7e6ecfcb62edfd632e56983964e6884851786443739dbfe3582947e87274f7cb", size = 364868, upload-time = "2025-11-30T20:23:52.494Z" }, + { url = "https://files.pythonhosted.org/packages/83/69/8bbc8b07ec854d92a8b75668c24d2abcb1719ebf890f5604c61c9369a16f/rpds_py-0.30.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a1d0bc22a7cdc173fedebb73ef81e07faef93692b8c1ad3733b67e31e1b6e1b8", size = 353747, upload-time = "2025-11-30T20:23:54.036Z" }, + { url = "https://files.pythonhosted.org/packages/ab/00/ba2e50183dbd9abcce9497fa5149c62b4ff3e22d338a30d690f9af970561/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d08f00679177226c4cb8c5265012eea897c8ca3b93f429e546600c971bcbae7", size = 383795, upload-time = "2025-11-30T20:23:55.556Z" }, + { url = "https://files.pythonhosted.org/packages/05/6f/86f0272b84926bcb0e4c972262f54223e8ecc556b3224d281e6598fc9268/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5965af57d5848192c13534f90f9dd16464f3c37aaf166cc1da1cae1fd5a34898", size = 393330, upload-time = "2025-11-30T20:23:57.033Z" }, + { url = "https://files.pythonhosted.org/packages/cb/e9/0e02bb2e6dc63d212641da45df2b0bf29699d01715913e0d0f017ee29438/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a4e86e34e9ab6b667c27f3211ca48f73dba7cd3d90f8d5b11be56e5dbc3fb4e", size = 518194, upload-time = "2025-11-30T20:23:58.637Z" }, + { url = "https://files.pythonhosted.org/packages/ee/ca/be7bca14cf21513bdf9c0606aba17d1f389ea2b6987035eb4f62bd923f25/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d3e6b26f2c785d65cc25ef1e5267ccbe1b069c5c21b8cc724efee290554419", size = 408340, upload-time = "2025-11-30T20:24:00.2Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c7/736e00ebf39ed81d75544c0da6ef7b0998f8201b369acf842f9a90dc8fce/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:626a7433c34566535b6e56a1b39a7b17ba961e97ce3b80ec62e6f1312c025551", size = 383765, upload-time = "2025-11-30T20:24:01.759Z" }, + { url = "https://files.pythonhosted.org/packages/4a/3f/da50dfde9956aaf365c4adc9533b100008ed31aea635f2b8d7b627e25b49/rpds_py-0.30.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:acd7eb3f4471577b9b5a41baf02a978e8bdeb08b4b355273994f8b87032000a8", size = 396834, upload-time = "2025-11-30T20:24:03.687Z" }, + { url = "https://files.pythonhosted.org/packages/4e/00/34bcc2565b6020eab2623349efbdec810676ad571995911f1abdae62a3a0/rpds_py-0.30.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe5fa731a1fa8a0a56b0977413f8cacac1768dad38d16b3a296712709476fbd5", size = 415470, upload-time = "2025-11-30T20:24:05.232Z" }, + { url = "https://files.pythonhosted.org/packages/8c/28/882e72b5b3e6f718d5453bd4d0d9cf8df36fddeb4ddbbab17869d5868616/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:74a3243a411126362712ee1524dfc90c650a503502f135d54d1b352bd01f2404", size = 565630, upload-time = "2025-11-30T20:24:06.878Z" }, + { url = "https://files.pythonhosted.org/packages/3b/97/04a65539c17692de5b85c6e293520fd01317fd878ea1995f0367d4532fb1/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3e8eeb0544f2eb0d2581774be4c3410356eba189529a6b3e36bbbf9696175856", size = 591148, upload-time = "2025-11-30T20:24:08.445Z" }, + { url = "https://files.pythonhosted.org/packages/85/70/92482ccffb96f5441aab93e26c4d66489eb599efdcf96fad90c14bbfb976/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dbd936cde57abfee19ab3213cf9c26be06d60750e60a8e4dd85d1ab12c8b1f40", size = 556030, upload-time = "2025-11-30T20:24:10.956Z" }, + { url = "https://files.pythonhosted.org/packages/20/53/7c7e784abfa500a2b6b583b147ee4bb5a2b3747a9166bab52fec4b5b5e7d/rpds_py-0.30.0-cp314-cp314t-win32.whl", hash = "sha256:dc824125c72246d924f7f796b4f63c1e9dc810c7d9e2355864b3c3a73d59ade0", size = 211570, upload-time = "2025-11-30T20:24:12.735Z" }, + { url = "https://files.pythonhosted.org/packages/d0/02/fa464cdfbe6b26e0600b62c528b72d8608f5cc49f96b8d6e38c95d60c676/rpds_py-0.30.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27f4b0e92de5bfbc6f86e43959e6edd1425c33b5e69aab0984a72047f2bcf1e3", size = 226532, upload-time = "2025-11-30T20:24:14.634Z" }, +] + [[package]] name = "rsa" version = "4.9.1" @@ -2869,6 +3296,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, ] +[[package]] +name = "soupsieve" +version = "2.8.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/ae/2d9c981590ed9999a0d91755b47fc74f74de286b0f5cee14c9269041e6c4/soupsieve-2.8.3.tar.gz", hash = "sha256:3267f1eeea4251fb42728b6dfb746edc9acaffc4a45b27e19450b676586e8349", size = 118627, upload-time = "2026-01-20T04:27:02.457Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl", hash = "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95", size = 37016, upload-time = "2026-01-20T04:27:01.012Z" }, +] + [[package]] name = "stack-data" version = "0.6.3" @@ -2964,6 +3400,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/af/df/c7891ef9d2712ad774777271d39fdef63941ffba0a9d59b7ad1fd2765e57/tiktoken-0.12.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f61c0aea5565ac82e2ec50a05e02a6c44734e91b51c10510b084ea1b8e633a71", size = 920667, upload-time = "2025-10-06T20:22:34.444Z" }, ] +[[package]] +name = "tinycss2" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085, upload-time = "2024-10-24T14:58:29.895Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610, upload-time = "2024-10-24T14:58:28.029Z" }, +] + [[package]] name = "tokenizers" version = "0.22.2" @@ -3065,6 +3513,23 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/08/b7/f1e49be0e076c8ec981f1d4cea1f32da2bd754eaeaf6ed74d5add3f840b4/torchmetrics-0.10.3-py3-none-any.whl", hash = "sha256:b12cf92897545e24a825b0d168888c0f3052700c2901e2d4f7d90b252bc4a343", size = 529740, upload-time = "2022-11-16T18:15:16.597Z" }, ] +[[package]] +name = "tornado" +version = "6.5.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/f1/3173dfa4a18db4a9b03e5d55325559dab51ee653763bb8745a75af491286/tornado-6.5.5.tar.gz", hash = "sha256:192b8f3ea91bd7f1f50c06955416ed76c6b72f96779b962f07f911b91e8d30e9", size = 516006, upload-time = "2026-03-10T21:31:02.067Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/8c/77f5097695f4dd8255ecbd08b2a1ed8ba8b953d337804dd7080f199e12bf/tornado-6.5.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:487dc9cc380e29f58c7ab88f9e27cdeef04b2140862e5076a66fb6bb68bb1bfa", size = 445983, upload-time = "2026-03-10T21:30:44.28Z" }, + { url = "https://files.pythonhosted.org/packages/ab/5e/7625b76cd10f98f1516c36ce0346de62061156352353ef2da44e5c21523c/tornado-6.5.5-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:65a7f1d46d4bb41df1ac99f5fcb685fb25c7e61613742d5108b010975a9a6521", size = 444246, upload-time = "2026-03-10T21:30:46.571Z" }, + { url = "https://files.pythonhosted.org/packages/b2/04/7b5705d5b3c0fab088f434f9c83edac1573830ca49ccf29fb83bf7178eec/tornado-6.5.5-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e74c92e8e65086b338fd56333fb9a68b9f6f2fe7ad532645a290a464bcf46be5", size = 447229, upload-time = "2026-03-10T21:30:48.273Z" }, + { url = "https://files.pythonhosted.org/packages/34/01/74e034a30ef59afb4097ef8659515e96a39d910b712a89af76f5e4e1f93c/tornado-6.5.5-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:435319e9e340276428bbdb4e7fa732c2d399386d1de5686cb331ec8eee754f07", size = 448192, upload-time = "2026-03-10T21:30:51.22Z" }, + { url = "https://files.pythonhosted.org/packages/be/00/fe9e02c5a96429fce1a1d15a517f5d8444f9c412e0bb9eadfbe3b0fc55bf/tornado-6.5.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3f54aa540bdbfee7b9eb268ead60e7d199de5021facd276819c193c0fb28ea4e", size = 448039, upload-time = "2026-03-10T21:30:53.52Z" }, + { url = "https://files.pythonhosted.org/packages/82/9e/656ee4cec0398b1d18d0f1eb6372c41c6b889722641d84948351ae19556d/tornado-6.5.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:36abed1754faeb80fbd6e64db2758091e1320f6bba74a4cf8c09cd18ccce8aca", size = 447445, upload-time = "2026-03-10T21:30:55.541Z" }, + { url = "https://files.pythonhosted.org/packages/5a/76/4921c00511f88af86a33de770d64141170f1cfd9c00311aea689949e274e/tornado-6.5.5-cp39-abi3-win32.whl", hash = "sha256:dd3eafaaeec1c7f2f8fdcd5f964e8907ad788fe8a5a32c4426fbbdda621223b7", size = 448582, upload-time = "2026-03-10T21:30:57.142Z" }, + { url = "https://files.pythonhosted.org/packages/2c/23/f6c6112a04d28eed765e374435fb1a9198f73e1ec4b4024184f21faeb1ad/tornado-6.5.5-cp39-abi3-win_amd64.whl", hash = "sha256:6443a794ba961a9f619b1ae926a2e900ac20c34483eea67be4ed8f1e58d3ef7b", size = 448990, upload-time = "2026-03-10T21:30:58.857Z" }, + { url = "https://files.pythonhosted.org/packages/b7/c8/876602cbc96469911f0939f703453c1157b0c826ecb05bdd32e023397d4e/tornado-6.5.5-cp39-abi3-win_arm64.whl", hash = "sha256:2c9a876e094109333f888539ddb2de4361743e5d21eece20688e3e351e4990a6", size = 448016, upload-time = "2026-03-10T21:31:00.43Z" }, +] + [[package]] name = "tqdm" version = "4.67.1" @@ -3273,6 +3738,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, ] +[[package]] +name = "webencodings" +version = "0.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721, upload-time = "2017-04-05T20:21:34.189Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774, upload-time = "2017-04-05T20:21:32.581Z" }, +] + [[package]] name = "websockets" version = "16.0" From 59895b476dd87a59d61eb9c52589e03a04e2475c Mon Sep 17 00:00:00 2001 From: hao <97079365+tanhaow@users.noreply.github.com> Date: Mon, 13 Apr 2026 14:37:06 -0400 Subject: [PATCH 05/10] Add more notes and analysis --- notebooks/mt_eval_analysis.py | 99 +++++++++++++++++++++++++++++++++-- 1 file changed, 96 insertions(+), 3 deletions(-) diff --git a/notebooks/mt_eval_analysis.py b/notebooks/mt_eval_analysis.py index 1c340df..4757d23 100644 --- a/notebooks/mt_eval_analysis.py +++ b/notebooks/mt_eval_analysis.py @@ -107,6 +107,28 @@ def load_pars_csv(model: str) -> pl.DataFrame: def _(mo): mo.md(""" ## 1. Score distributions by model + + Box plots showing the full distribution of each metric score per model, across all translation + pairs in each corpus. Each box spans the interquartile range (Q1–Q3); whiskers extend to the + min/max. + + **Key finding:** + + Observation 1: chrF distributions are wide for all three models (whiskers spanning roughly + 0.2–1.0), pulled down at the low end by cross-script directions (CJK ↔ Latin). The median + is slightly higher for google_tllm (~0.55–0.58), but the large variance makes it hard to + draw firm conclusions from chrF alone. + + Observation 2: COMET distributions are much tighter (~0.6–0.9). google_tllm has the highest + median (~0.80–0.82); gemma and hymt are close to each other (~0.77–0.79). On paragraphs the + three models converge further and the boxes nearly overlap. + + Observation 3: CometKiwi follows the same pattern as COMET but with an even narrower spread. + google_tllm remains the top model; gemma and hymt are nearly indistinguishable. + + Conclusion: google_tllm consistently outperforms the other two models across both corpora and + all three metrics. gemma and hymt perform at a similar level. The wide chrF spread is driven + by the cross-script artefact (see section 4), not by genuine quality variation. """) return @@ -147,6 +169,25 @@ def score_dist_chart(df, title: str): def _(mo): mo.md(""" ## 2. Model ranking + + Bar charts showing the mean score per model for each metric, sorted highest to lowest. + Aggregated across all translation pairs in each corpus. + + **Key finding:** + + Observation 1: google_tllm ranks first on every metric and both corpora, with a consistent + lead. On sentences: chrF ~0.55, COMET ~0.81, CometKiwi ~0.84. On paragraphs the absolute + scores are similar but the gap over the other two models narrows slightly. + + Observation 2: gemma and hymt are very close to each other on all metrics — the bars are + nearly the same length. Neither consistently beats the other across all metrics and corpora. + + Observation 3: The ranking is stable across metrics (google_tllm > gemma ≈ hymt) even though + the absolute scale differs a lot between chrF and the two neural metrics. + + Conclusion: google_tllm is the clear winner. gemma and hymt are statistically hard to + separate — the mean score difference between them is smaller than the within-model variance + seen in section 1. """) return @@ -195,7 +236,37 @@ def _(mo): mo.md(""" ## 3. Metric agreement - Key finding: chrF vs CometKiwi correlation collapses on paragraphs (r ≈ −0.05), suggesting reference translations are paraphrastic rather than literal. Low paragraph COMET/CometKiwi correlation (r ≈ 0.28) means they diverge on longer texts — CometKiwi is arguably more honest since it doesn't penalise paraphrastic output. + How well do the three metrics agree with each other at the instance level? Computed using + Pearson r (linear correlation) and Spearman ρ (rank correlation) across all translation pairs + in each corpus, pooled across models. The scatter matrix plots every metric pair against each + other; the correlation tables give exact coefficients and p-values. The COMET vs CometKiwi + scatter adds a linear regression line to make the trend visible. + + **Key finding:** + + Observation 1: On sentences, all three metrics show positive correlation with each other + (all blue in the heatmap), with chrF vs COMET being the strongest pair. The scatter plots + show a positive trend but with considerable spread — the metrics broadly agree on direction + but not on exact rankings. + + Observation 2: On paragraphs, the scatter plots split into two visible clusters — one group + with low chrF (CJK directions) and one with higher chrF (Latin-script directions). This + distorts the chrF correlations. The heatmap shows chrF vs CometKiwi turning near-zero or + slightly negative on paragraphs (r ≈ −0.05), and chrF vs COMET also weakens substantially. + + Observation 3: COMET vs CometKiwi correlation is moderate on sentences but drops further on + paragraphs (r ≈ 0.28), meaning the two neural metrics diverge on longer texts — they are + measuring somewhat different things. + + Analysis: The chrF correlation collapse on paragraphs has two causes: (1) the cross-script + artefact described in section 4, and (2) reference translations that are paraphrastic rather + than literal — chrF penalises valid paraphrases, while CometKiwi (being reference-free) does + not. The COMET/CometKiwi divergence on paragraphs suggests CometKiwi is the more honest + signal for longer texts. + + Conclusion: On sentences, the three metrics broadly agree. On paragraphs, chrF becomes + unreliable and COMET and CometKiwi should be weighted more heavily — with CometKiwi + preferred where reference quality is uncertain. """) return @@ -353,7 +424,29 @@ def _(mo): mo.md(""" ## 4. Language breakdown - If only chrF drops for CJK languages, it's a script artefact. If COMET/CometKiwi also drop, it's a real quality signal. + Scores broken down by translation direction (e.g. `zh→en`, `en→zh`), derived from the + `src_lang` and `tr_lang` fields in the eval CSVs. The box plots show the full score + distribution per direction; the grouped bar charts show mean scores per direction × model; + the final chart collapses all directions into two groups — into English (`src→en`) vs. out + of English (`en→src`) — to test for a systematic directionality bias. + + **Key finding:** + + Observation 1: chrF scores vary dramatically by direction — `ja→en` and `zh→en` score around 0.4 on + sentences, while `pt→en` reaches ~0.7. On paragraphs, `en→zh` collapses to near zero + (median ~0.08) and `en→ja` is similarly low (~0.25). + + Analysis: This is not caused by quality difference. Because: + chrF works by counting shared characters between the translation and the reference, so when + the two are in completely different writing systems (e.g. CJK vs. Latin), they share no + characters at all and the score is near zero by construction — regardless of translation + quality. + + Observation 2: COMET and CometKiwi are unaffected — both stay flat across all directions (~0.75–0.85), + with no CJK gap. + + Conclusion: For cross-script directions, chrF is meaningless; COMET and CometKiwi + are the only reliable metrics. """) return @@ -577,7 +670,7 @@ def _(browser_data, mo, pl): mo.vstack( [ mo.md( - "## 5. Qualitative translation browser\n\nRead src / ref / translation side-by-side with scores. Sort by `kiwi_minus_chrf ↓` to surface cases where CometKiwi rates the translation highly but chrF doesn't — these are the paraphrase cases." + "## 5. Qualitative translation browser\n\nRead src / ref / translation side-by-side with scores. Data is joined from the full-text JSONL files (`notion-concept-tasks.jsonl` for sentences, `mt-pars-{model}.jsonl` for paragraphs) with the metric scores from the eval CSVs. The `kiwi_minus_chrf` column is computed as CometKiwi − chrF: a high value means the model produced a fluent translation that diverges from the reference wording. Sort by `kiwi_minus_chrf ↓` to surface the clearest paraphrase cases; sort by `cometkiwi ↓` or `comet ↓` to find the worst translations." ), mo.hstack( [corpus_sel, model_sel, dir_sel, term_sel, sort_sel, n_sel], From aa9bbd6ba5806335f554144328f8ad16da0fdb6c Mon Sep 17 00:00:00 2001 From: hao <97079365+tanhaow@users.noreply.github.com> Date: Thu, 16 Apr 2026 13:55:04 -0400 Subject: [PATCH 06/10] Revise notebook to address PR #64 review feedback - Replace quantitative analysis (sections 1-4) with a qualitative translation browser, aligning the notebook with issue #17 - Split browser into two sections: Translations and Backtranslations - Add DATA_DIR variable at top for configurable data path - Broaden ruff exclude to cover entire notebooks/ directory --- notebooks/mt_eval_analysis.py | 704 +++++----------------------------- pyproject.toml | 2 +- 2 files changed, 101 insertions(+), 605 deletions(-) diff --git a/notebooks/mt_eval_analysis.py b/notebooks/mt_eval_analysis.py index 4757d23..0f247c3 100644 --- a/notebooks/mt_eval_analysis.py +++ b/notebooks/mt_eval_analysis.py @@ -14,10 +14,15 @@ def _(): @app.cell def _(mo): mo.md(""" - # MT Evaluation Score Analysis + # Phase 1 Machine Translation Browser - chrF, COMET, CometKiwi across three models (google_tllm, hymt, gemma) - and two corpora (sentences: 427 pairs, paragraphs: 526 pairs). + Browse Phase 1 machine translations side-by-side with source, reference, and evaluation + scores (chrF, COMET, CometKiwi). Translations and backtranslations are shown in separate + sections. + + **Metrics:** chrF measures character n-gram overlap with the reference (unreliable for + cross-script directions such as `en→zh`). COMET and CometKiwi are neural metrics trained + on human judgements; CometKiwi is reference-free and does not penalise paraphrastic output. """) return @@ -26,12 +31,9 @@ def _(mo): def _(): import pathlib - import altair as alt - import pandas as pd import polars as pl - from scipy import stats - return alt, pathlib, pd, pl, stats + return pathlib, pl @app.cell @@ -60,13 +62,11 @@ def _(DATA_DIR, pl): DATA_DIR / "prodigy/notion-concept/notion-concept-tasks.jsonl" ).select(["tr_id", "model", "src_lang", "tr_lang", "pair_id"]) - def load_sents_csv(model: str) -> pl.DataFrame: return pl.read_csv(DATA_DIR / f"notion-sents/eval-sents-{model}.csv").join( sents_meta.filter(pl.col("model") == model), on="tr_id" ) - sents_df = pl.concat( [ load_sents_csv("google_tllm"), @@ -74,8 +74,6 @@ def load_sents_csv(model: str) -> pl.DataFrame: load_sents_csv("gemma"), ] ) - - sents_df.head(3) return (sents_df,) @@ -90,7 +88,6 @@ def load_pars_csv(model: str) -> pl.DataFrame: meta, on="tr_id" ) - pars_df = pl.concat( [ load_pars_csv("google_tllm"), @@ -98,484 +95,12 @@ def load_pars_csv(model: str) -> pl.DataFrame: load_pars_csv("gemma"), ] ) - - pars_df.head(3) return (pars_df,) -@app.cell -def _(mo): - mo.md(""" - ## 1. Score distributions by model - - Box plots showing the full distribution of each metric score per model, across all translation - pairs in each corpus. Each box spans the interquartile range (Q1–Q3); whiskers extend to the - min/max. - - **Key finding:** - - Observation 1: chrF distributions are wide for all three models (whiskers spanning roughly - 0.2–1.0), pulled down at the low end by cross-script directions (CJK ↔ Latin). The median - is slightly higher for google_tllm (~0.55–0.58), but the large variance makes it hard to - draw firm conclusions from chrF alone. - - Observation 2: COMET distributions are much tighter (~0.6–0.9). google_tllm has the highest - median (~0.80–0.82); gemma and hymt are close to each other (~0.77–0.79). On paragraphs the - three models converge further and the boxes nearly overlap. - - Observation 3: CometKiwi follows the same pattern as COMET but with an even narrower spread. - google_tllm remains the top model; gemma and hymt are nearly indistinguishable. - - Conclusion: google_tllm consistently outperforms the other two models across both corpora and - all three metrics. gemma and hymt perform at a similar level. The wide chrF spread is driven - by the cross-script artefact (see section 4), not by genuine quality variation. - """) - return - - -@app.cell -def _(alt, mo, pars_df, sents_df): - def score_dist_chart(df, title: str): - melted = ( - df.select(["model", "chrf", "comet", "cometkiwi"]) - .unpivot(index="model", variable_name="metric", value_name="score") - .to_pandas() - ) - return ( - alt.Chart(melted, title=title) - .mark_boxplot(extent="min-max") - .encode( - x=alt.X("model:N", title="Model"), - y=alt.Y("score:Q", title="Score", scale=alt.Scale(zero=False)), - color="model:N", - column=alt.Column("metric:N", title="Metric"), - ) - .properties(width=160, height=220) - ) - - - mo.vstack( - [ - mo.md("**Sentences**"), - mo.ui.altair_chart(score_dist_chart(sents_df, "Sentences")), - mo.md("**Paragraphs**"), - mo.ui.altair_chart(score_dist_chart(pars_df, "Paragraphs")), - ] - ) - return - - -@app.cell -def _(mo): - mo.md(""" - ## 2. Model ranking - - Bar charts showing the mean score per model for each metric, sorted highest to lowest. - Aggregated across all translation pairs in each corpus. - - **Key finding:** - - Observation 1: google_tllm ranks first on every metric and both corpora, with a consistent - lead. On sentences: chrF ~0.55, COMET ~0.81, CometKiwi ~0.84. On paragraphs the absolute - scores are similar but the gap over the other two models narrows slightly. - - Observation 2: gemma and hymt are very close to each other on all metrics — the bars are - nearly the same length. Neither consistently beats the other across all metrics and corpora. - - Observation 3: The ranking is stable across metrics (google_tllm > gemma ≈ hymt) even though - the absolute scale differs a lot between chrF and the two neural metrics. - - Conclusion: google_tllm is the clear winner. gemma and hymt are statistically hard to - separate — the mean score difference between them is smaller than the within-model variance - seen in section 1. - """) - return - - -@app.cell -def _(alt, mo, pars_df, pl, sents_df): - def model_ranking_chart(df, title: str): - melted = ( - df.group_by("model") - .agg( - pl.col("chrf").mean().alias("chrf"), - pl.col("comet").mean().alias("comet"), - pl.col("cometkiwi").mean().alias("cometkiwi"), - ) - .unpivot(index="model", variable_name="metric", value_name="score") - .to_pandas() - ) - return ( - alt.Chart(melted, title=title) - .mark_bar() - .encode( - x=alt.X( - "score:Q", scale=alt.Scale(zero=False), title="Mean score" - ), - y=alt.Y("model:N", sort="-x", title=None), - color="model:N", - row=alt.Row("metric:N", title="Metric"), - ) - .properties(width=300, height=70) - ) - - - mo.vstack( - [ - mo.md("**Sentences**"), - mo.ui.altair_chart(model_ranking_chart(sents_df, "Sentences")), - mo.md("**Paragraphs**"), - mo.ui.altair_chart(model_ranking_chart(pars_df, "Paragraphs")), - ] - ) - return - - -@app.cell -def _(mo): - mo.md(""" - ## 3. Metric agreement - - How well do the three metrics agree with each other at the instance level? Computed using - Pearson r (linear correlation) and Spearman ρ (rank correlation) across all translation pairs - in each corpus, pooled across models. The scatter matrix plots every metric pair against each - other; the correlation tables give exact coefficients and p-values. The COMET vs CometKiwi - scatter adds a linear regression line to make the trend visible. - - **Key finding:** - - Observation 1: On sentences, all three metrics show positive correlation with each other - (all blue in the heatmap), with chrF vs COMET being the strongest pair. The scatter plots - show a positive trend but with considerable spread — the metrics broadly agree on direction - but not on exact rankings. - - Observation 2: On paragraphs, the scatter plots split into two visible clusters — one group - with low chrF (CJK directions) and one with higher chrF (Latin-script directions). This - distorts the chrF correlations. The heatmap shows chrF vs CometKiwi turning near-zero or - slightly negative on paragraphs (r ≈ −0.05), and chrF vs COMET also weakens substantially. - - Observation 3: COMET vs CometKiwi correlation is moderate on sentences but drops further on - paragraphs (r ≈ 0.28), meaning the two neural metrics diverge on longer texts — they are - measuring somewhat different things. - - Analysis: The chrF correlation collapse on paragraphs has two causes: (1) the cross-script - artefact described in section 4, and (2) reference translations that are paraphrastic rather - than literal — chrF penalises valid paraphrases, while CometKiwi (being reference-free) does - not. The COMET/CometKiwi divergence on paragraphs suggests CometKiwi is the more honest - signal for longer texts. - - Conclusion: On sentences, the three metrics broadly agree. On paragraphs, chrF becomes - unreliable and COMET and CometKiwi should be weighted more heavily — with CometKiwi - preferred where reference quality is uncertain. - """) - return - - -@app.cell -def _(mo, pars_df, sents_df, stats): - def correlation_table(df, label: str) -> str: - pairs = [("chrf", "comet"), ("chrf", "cometkiwi"), ("comet", "cometkiwi")] - rows = [] - for a, b in pairs: - x = df[a].to_numpy() - y = df[b].to_numpy() - r, p = stats.pearsonr(x, y) - rho, p_rho = stats.spearmanr(x, y) - rows.append( - f"| {a} vs {b} | {r:.3f} | {p:.2e} | {rho:.3f} | {p_rho:.2e} |" - ) - header = ( - f"**{label}**\n\n" - "| Pair | Pearson r | p | Spearman ρ | p |\n" - "|------|-----------|---|------------|---|" - ) - return header + "\n" + "\n".join(rows) - - - mo.vstack( - [ - mo.md(correlation_table(sents_df, "Sentences")), - mo.md(correlation_table(pars_df, "Paragraphs")), - ] - ) - return - - -@app.cell -def _(alt, mo, pars_df, sents_df): - def scatter_matrix(df, title: str): - pdf = df.select(["model", "chrf", "comet", "cometkiwi"]).to_pandas() - return ( - alt.Chart(pdf) - .mark_point(opacity=0.4, size=20) - .encode( - alt.X( - alt.repeat("column"), - type="quantitative", - scale=alt.Scale(zero=False), - ), - alt.Y( - alt.repeat("row"), - type="quantitative", - scale=alt.Scale(zero=False), - ), - color="model:N", - ) - .repeat( - row=["chrf", "comet", "cometkiwi"], - column=["chrf", "comet", "cometkiwi"], - ) - ) - - - mo.vstack( - [ - mo.md("**Sentences**"), - mo.ui.altair_chart(scatter_matrix(sents_df, "Sentences")), - mo.md("**Paragraphs**"), - mo.ui.altair_chart(scatter_matrix(pars_df, "Paragraphs")), - ] - ) - return - - -@app.cell -def _(alt, mo, pars_df, sents_df): - def kiwi_vs_comet(df, title: str): - pdf = df.select(["model", "comet", "cometkiwi"]).to_pandas() - base = alt.Chart(pdf, title=title).properties(width=300, height=260) - points = base.mark_point(opacity=0.5, size=25).encode( - x=alt.X("comet:Q", scale=alt.Scale(zero=False), title="COMET"), - y=alt.Y("cometkiwi:Q", scale=alt.Scale(zero=False), title="CometKiwi"), - color="model:N", - ) - regression = ( - base.transform_regression("comet", "cometkiwi") - .mark_line(color="gray", strokeDash=[4, 2]) - .encode( - x=alt.X("comet:Q"), - y=alt.Y("cometkiwi:Q"), - ) - ) - return alt.layer(points, regression) - - - mo.vstack( - [ - mo.md("**Sentences — COMET vs CometKiwi**"), - mo.ui.altair_chart(kiwi_vs_comet(sents_df, "Sentences")), - mo.md("**Paragraphs — COMET vs CometKiwi**"), - mo.ui.altair_chart(kiwi_vs_comet(pars_df, "Paragraphs")), - ] - ) - return - - -@app.cell -def _(alt, mo, pars_df, pd, pl, sents_df, stats): - def agreement_heatmap(df, title: str): - pairs = [("chrf", "comet"), ("chrf", "cometkiwi"), ("comet", "cometkiwi")] - rows = [ - { - "model": model, - "pair": f"{a} vs {b}", - "rho": round( - stats.spearmanr( - df.filter(pl.col("model") == model)[a].to_numpy(), - df.filter(pl.col("model") == model)[b].to_numpy(), - )[0], - 3, - ), - } - for model in sorted(df["model"].unique().to_list()) - for a, b in pairs - ] - pdf = pd.DataFrame(rows) - return ( - alt.Chart(pdf, title=title) - .mark_rect() - .encode( - x=alt.X("pair:N", title=None), - y=alt.Y("model:N", title=None), - color=alt.Color( - "rho:Q", - scale=alt.Scale(scheme="redblue", domain=[-1, 1]), - title="Spearman ρ", - ), - tooltip=["model", "pair", "rho"], - ) - .properties(width=280, height=100) - ) - - - mo.vstack( - [ - mo.md("**Sentences — instance-level metric agreement (Spearman ρ)**"), - mo.ui.altair_chart(agreement_heatmap(sents_df, "Sentences")), - mo.md("**Paragraphs — instance-level metric agreement (Spearman ρ)**"), - mo.ui.altair_chart(agreement_heatmap(pars_df, "Paragraphs")), - ] - ) - return - - -@app.cell -def _(mo): - mo.md(""" - ## 4. Language breakdown - - Scores broken down by translation direction (e.g. `zh→en`, `en→zh`), derived from the - `src_lang` and `tr_lang` fields in the eval CSVs. The box plots show the full score - distribution per direction; the grouped bar charts show mean scores per direction × model; - the final chart collapses all directions into two groups — into English (`src→en`) vs. out - of English (`en→src`) — to test for a systematic directionality bias. - - **Key finding:** - - Observation 1: chrF scores vary dramatically by direction — `ja→en` and `zh→en` score around 0.4 on - sentences, while `pt→en` reaches ~0.7. On paragraphs, `en→zh` collapses to near zero - (median ~0.08) and `en→ja` is similarly low (~0.25). - - Analysis: This is not caused by quality difference. Because: - chrF works by counting shared characters between the translation and the reference, so when - the two are in completely different writing systems (e.g. CJK vs. Latin), they share no - characters at all and the score is near zero by construction — regardless of translation - quality. - - Observation 2: COMET and CometKiwi are unaffected — both stay flat across all directions (~0.75–0.85), - with no CJK gap. - - Conclusion: For cross-script directions, chrF is meaningless; COMET and CometKiwi - are the only reliable metrics. - """) - return - - -@app.cell -def _(alt, mo, pars_df, pl, sents_df): - def lang_dir_chart(df, title: str): - melted = ( - df.with_columns( - (pl.col("src_lang") + "→" + pl.col("tr_lang")).alias("direction") - ) - .select(["direction", "chrf", "comet", "cometkiwi"]) - .unpivot(index="direction", variable_name="metric", value_name="score") - .to_pandas() - ) - return ( - alt.Chart(melted, title=title) - .mark_boxplot(extent="min-max") - .encode( - x=alt.X("direction:N", title="Direction"), - y=alt.Y("score:Q", scale=alt.Scale(zero=False)), - color="direction:N", - column=alt.Column("metric:N"), - ) - .properties(width=160, height=220) - ) - - - mo.vstack( - [ - mo.md("**Sentences — score by direction**"), - mo.ui.altair_chart(lang_dir_chart(sents_df, "Sentences")), - mo.md("**Paragraphs — score by direction**"), - mo.ui.altair_chart(lang_dir_chart(pars_df, "Paragraphs")), - ] - ) - return - - -@app.cell -def _(alt, mo, pars_df, pl, sents_df): - def lang_breakdown_chart(df, title: str) -> alt.Chart: - melted = ( - df.with_columns( - (pl.col("src_lang") + "→" + pl.col("tr_lang")).alias("direction") - ) - .group_by(["direction", "model"]) - .agg( - pl.col("chrf").mean().round(4).alias("chrf"), - pl.col("comet").mean().round(4).alias("comet"), - pl.col("cometkiwi").mean().round(4).alias("cometkiwi"), - ) - .unpivot( - index=["direction", "model"], - variable_name="metric", - value_name="score", - ) - .to_pandas() - ) - return ( - alt.Chart(melted, title=title) - .mark_bar() - .encode( - x=alt.X("model:N", title=None), - y=alt.Y("score:Q", scale=alt.Scale(zero=False)), - color="model:N", - column=alt.Column("direction:N", title="Direction"), - row=alt.Row("metric:N", title="Metric"), - ) - .properties(width=80, height=100) - ) - - - mo.vstack( - [ - mo.md("**Sentences — mean score by direction and model**"), - mo.ui.altair_chart(lang_breakdown_chart(sents_df, "Sentences")), - mo.md("**Paragraphs — mean score by direction and model**"), - mo.ui.altair_chart(lang_breakdown_chart(pars_df, "Paragraphs")), - ] - ) - return - - -@app.cell -def _(alt, mo, pars_df, pd, pl, sents_df): - def direction_chart(df, title: str): - rows = [ - { - "direction": direction, - "metric": metric, - "score": group[metric].mean(), - } - for direction, group in [ - ("src→en", df.filter(pl.col("tr_lang") == "en")), - ("en→src", df.filter(pl.col("src_lang") == "en")), - ] - for metric in ["chrf", "comet", "cometkiwi"] - ] - pdf = pd.DataFrame(rows) - return ( - alt.Chart(pdf, title=title) - .mark_bar() - .encode( - x=alt.X("direction:N", title=None), - y=alt.Y( - "score:Q", scale=alt.Scale(zero=False), title="Mean score" - ), - color="direction:N", - column=alt.Column("metric:N", title="Metric"), - ) - .properties(width=120, height=180) - ) - - - mo.vstack( - [ - mo.md("**Sentences — src→en vs en→src**"), - mo.ui.altair_chart(direction_chart(sents_df, "Sentences")), - mo.md("**Paragraphs — src→en vs en→src**"), - mo.ui.altair_chart(direction_chart(pars_df, "Paragraphs")), - ] - ) - return - - @app.cell def _(DATA_DIR, pars_df, pl, sents_df): - # Load full text corpora and join with scores for qualitative browser + # Load full text corpora and join with scores _sents_full = ( pl.read_ndjson( DATA_DIR / "prodigy/notion-concept/notion-concept-tasks.jsonl" @@ -627,147 +152,118 @@ def _(DATA_DIR, pars_df, pl, sents_df): browser_data = ( pl.concat([_sents_full, _pars_full]) .join(_scores, on="tr_id", how="left") - .with_columns( - (pl.col("cometkiwi") - pl.col("chrf")).alias("kiwi_minus_chrf") - ) ) return (browser_data,) @app.cell -def _(browser_data, mo, pl): - _corpora = ["sentences", "paragraphs"] - _models = sorted(browser_data["model"].unique().to_list()) - _directions = sorted( - browser_data.with_columns( - (pl.col("src_lang") + "→" + pl.col("tr_lang")).alias("dir") - )["dir"] - .unique() - .to_list() - ) - _terms = ["all", *sorted(browser_data["term"].drop_nulls().unique().to_list())] - _sort_opts = [ - "kiwi_minus_chrf ↓", # high CometKiwi but low chrF — paraphrase cases - "kiwi_minus_chrf ↑", - "cometkiwi ↓", - "cometkiwi ↑", - "comet ↓", - "comet ↑", - "chrf ↓", - "chrf ↑", - "pair_id", - ] - - corpus_sel = mo.ui.dropdown(_corpora, value="sentences", label="Corpus") - model_sel = mo.ui.dropdown(["all", *_models], value="all", label="Model") - dir_sel = mo.ui.dropdown(["all", *_directions], value="all", label="Direction") - term_sel = mo.ui.dropdown(_terms, value="all", label="Term") - sort_sel = mo.ui.dropdown( - _sort_opts, value="kiwi_minus_chrf ↓", label="Sort by" - ) - n_sel = mo.ui.slider(5, 50, step=5, value=10, label="Show N") +def _(mo): + mo.md(""" + ## 1. Translations + """) + return - mo.vstack( - [ - mo.md( - "## 5. Qualitative translation browser\n\nRead src / ref / translation side-by-side with scores. Data is joined from the full-text JSONL files (`notion-concept-tasks.jsonl` for sentences, `mt-pars-{model}.jsonl` for paragraphs) with the metric scores from the eval CSVs. The `kiwi_minus_chrf` column is computed as CometKiwi − chrF: a high value means the model produced a fluent translation that diverges from the reference wording. Sort by `kiwi_minus_chrf ↓` to surface the clearest paraphrase cases; sort by `cometkiwi ↓` or `comet ↓` to find the worst translations." - ), - mo.hstack( - [corpus_sel, model_sel, dir_sel, term_sel, sort_sel, n_sel], - justify="start", - ), - ] + +@app.cell +def _(browser_data, mo, pl): + # Sentences are all forward translations (src != en). + # Paragraphs: forward translations have src_lang != en. + _fwd = browser_data.filter(pl.col("src_lang") != "en") + _corpora = sorted(_fwd["corpus"].unique().to_list()) + corpus_sel_fwd = mo.ui.dropdown(_corpora, value="sentences", label="Corpus") + + _models = sorted(_fwd["model"].unique().to_list()) + model_sel_fwd = mo.ui.dropdown(["all", *_models], value="all", label="Model") + + _all_dirs = sorted( + _fwd.with_columns((pl.col("src_lang") + "→" + pl.col("tr_lang")).alias("dir"))["dir"] + .unique().to_list() ) - return corpus_sel, dir_sel, model_sel, n_sel, sort_sel, term_sel + dir_sel_fwd = mo.ui.dropdown(["all", *_all_dirs], value="all", label="Direction") + _sort_opts = ["cometkiwi ↓", "cometkiwi ↑", "comet ↓", "comet ↑", "chrf ↓", "chrf ↑", "pair_id"] + sort_sel_fwd = mo.ui.dropdown(_sort_opts, value="cometkiwi ↓", label="Sort by") + n_sel_fwd = mo.ui.slider(5, 50, step=5, value=10, label="Show N") -@app.cell -def _( - browser_data, - corpus_sel, - dir_sel, - mo, - model_sel, - n_sel, - pl, - sort_sel, - term_sel, -): - _df = browser_data.filter(pl.col("corpus") == corpus_sel.value) - - if model_sel.value != "all": - _df = _df.filter(pl.col("model") == model_sel.value) - - if dir_sel.value != "all": - _src, _tgt = dir_sel.value.split("→") - _df = _df.filter( - (pl.col("src_lang") == _src) & (pl.col("tr_lang") == _tgt) - ) + mo.hstack([corpus_sel_fwd, model_sel_fwd, dir_sel_fwd, sort_sel_fwd, n_sel_fwd], justify="start") + return corpus_sel_fwd, dir_sel_fwd, model_sel_fwd, n_sel_fwd, sort_sel_fwd - if term_sel.value != "all": - _df = _df.filter(pl.col("term") == term_sel.value) - _sort_col, _sort_dir = ( - sort_sel.value.rsplit(" ", 1) - if " " in sort_sel.value - else (sort_sel.value, "↑") +@app.cell +def _(browser_data, corpus_sel_fwd, dir_sel_fwd, model_sel_fwd, mo, n_sel_fwd, pl, sort_sel_fwd): + _df = browser_data.filter( + (pl.col("src_lang") != "en") & (pl.col("corpus") == corpus_sel_fwd.value) ) - _df = _df.sort(_sort_col, descending=(_sort_dir == "↓")) - - _display = ( - _df.head(n_sel.value) - .select( - [ - "pair_id", - "model", - "src_lang", - "tr_lang", - "chrf", - "comet", - "cometkiwi", - "kiwi_minus_chrf", - "term", - "src_text", - "ref_text", - "tr_text", - ] - ) - .with_columns( - [ - pl.col("chrf").round(3), - pl.col("comet").round(3), - pl.col("cometkiwi").round(3), - pl.col("kiwi_minus_chrf").round(3), - ] - ) + if model_sel_fwd.value != "all": + _df = _df.filter(pl.col("model") == model_sel_fwd.value) + if dir_sel_fwd.value != "all": + _s, _t = dir_sel_fwd.value.split("→") + _df = _df.filter((pl.col("src_lang") == _s) & (pl.col("tr_lang") == _t)) + _sc, _sd = ( + sort_sel_fwd.value.rsplit(" ", 1) + if " " in sort_sel_fwd.value + else (sort_sel_fwd.value, "↑") + ) + _df = _df.sort(_sc, descending=(_sd == "↓")) + mo.plain( + _df.head(n_sel_fwd.value) + .select(["pair_id", "model", "src_lang", "tr_lang", "chrf", "comet", "cometkiwi", "src_text", "ref_text", "tr_text"]) + .with_columns(pl.col("chrf").round(3), pl.col("comet").round(3), pl.col("cometkiwi").round(3)) ) - - mo.plain(_display) return @app.cell def _(mo): mo.md(""" - ## Summary - - **Models** - google_tllm is the clear winner on all metrics across both corpora, with statistically - significant margins. gemma and hymt are statistically indistinguishable from each other. - - **Metrics** - - **COMET** — It's trained on human judgements, robust to paraphrase, - and shows consistent model separation. The compressed range (0.77–0.81) is normal. - - **CometKiwi** — worth reporting alongside COMET, especially for paragraphs where - it diverges from COMET (r ≈ 0.28). Being reference-free makes it more honest when - the reference translations are paraphrastic, which is likely here. - - **chrF** — use with caution. It's the most discriminating metric numerically (high CV), - but for non-literal, domain-specific translations it mostly measures surface similarity - to the reference rather than actual quality. The near-zero correlation with CometKiwi - on paragraphs (r ≈ −0.05) is a red flag. + ## 2. Backtranslations """) return +@app.cell +def _(browser_data, mo, pl): + # Backtranslations: src_lang == en (paragraphs only — sentences have no backtranslations). + _back = browser_data.filter(pl.col("src_lang") == "en") + + _models_b = sorted(_back["model"].unique().to_list()) + model_sel_back = mo.ui.dropdown(["all", *_models_b], value="all", label="Model") + + _all_dirs_b = sorted( + _back.with_columns((pl.col("src_lang") + "→" + pl.col("tr_lang")).alias("dir"))["dir"] + .unique().to_list() + ) + dir_sel_back = mo.ui.dropdown(["all", *_all_dirs_b], value="all", label="Direction") + + _sort_opts_b = ["cometkiwi ↓", "cometkiwi ↑", "comet ↓", "comet ↑", "chrf ↓", "chrf ↑", "pair_id"] + sort_sel_back = mo.ui.dropdown(_sort_opts_b, value="cometkiwi ↓", label="Sort by") + n_sel_back = mo.ui.slider(5, 50, step=5, value=10, label="Show N") + + mo.hstack([model_sel_back, dir_sel_back, sort_sel_back, n_sel_back], justify="start") + return dir_sel_back, model_sel_back, n_sel_back, sort_sel_back + + +@app.cell +def _(browser_data, dir_sel_back, model_sel_back, mo, n_sel_back, pl, sort_sel_back): + _df = browser_data.filter(pl.col("src_lang") == "en") + if model_sel_back.value != "all": + _df = _df.filter(pl.col("model") == model_sel_back.value) + if dir_sel_back.value != "all": + _s, _t = dir_sel_back.value.split("→") + _df = _df.filter((pl.col("src_lang") == _s) & (pl.col("tr_lang") == _t)) + _sc, _sd = ( + sort_sel_back.value.rsplit(" ", 1) + if " " in sort_sel_back.value + else (sort_sel_back.value, "↑") + ) + _df = _df.sort(_sc, descending=(_sd == "↓")) + mo.plain( + _df.head(n_sel_back.value) + .select(["pair_id", "model", "src_lang", "tr_lang", "chrf", "comet", "cometkiwi", "src_text", "ref_text", "tr_text"]) + .with_columns(pl.col("chrf").round(3), pl.col("comet").round(3), pl.col("cometkiwi").round(3)) + ) + return + + if __name__ == "__main__": app.run() diff --git a/pyproject.toml b/pyproject.toml index 5aca88d..88de31e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -63,7 +63,7 @@ target-version = "py312" # Configure src path so ruff import fixes can identify local imports src = [ "src" ] # Ignore notebooks — marimo notebooks are not linted -extend-exclude = [ "notebooks/mt_eval_analysis.py" ] +extend-exclude = [ "notebooks/" ] [tool.ruff.lint] # Include these rules in addition to ruff's defaults From c399c4984182672d23aeefcc298eb60de3276af7 Mon Sep 17 00:00:00 2001 From: hao <97079365+tanhaow@users.noreply.github.com> Date: Fri, 17 Apr 2026 09:40:49 -0400 Subject: [PATCH 07/10] Rewrite notebook as mt_browser.py per review feedback MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Rename to mt_browser.py - Use full sentence corpus (mt-sents-*.jsonl, 854 rows, 4 models including madlad) instead of annotation subset (notion-concept-tasks.jsonl, 300 rows) - Add sentence backtranslations section (en→* directions) - Replace mo.ui widgets with native marimo dataframe viewer for full-text hover - Remove metric descriptions from notebook header - Split into 4 sections: sentence translations, sentence backtranslations, paragraph translations, paragraph backtranslations --- notebooks/mt_browser.py | 155 ++++++++++++++++++++ notebooks/mt_eval_analysis.py | 269 ---------------------------------- 2 files changed, 155 insertions(+), 269 deletions(-) create mode 100644 notebooks/mt_browser.py delete mode 100644 notebooks/mt_eval_analysis.py diff --git a/notebooks/mt_browser.py b/notebooks/mt_browser.py new file mode 100644 index 0000000..7a9e81a --- /dev/null +++ b/notebooks/mt_browser.py @@ -0,0 +1,155 @@ +import marimo + +__generated_with = "0.22.0" +app = marimo.App(width="medium") + + +@app.cell +def _(): + import marimo as mo + + return (mo,) + + +@app.cell +def _(mo): + mo.md(""" + # Phase 1 Machine Translation Browser + + Browse Phase 1 machine translations side-by-side with source, reference, and evaluation + scores (chrF, COMET, CometKiwi). Translations and backtranslations are shown in separate + sections. + """) + return + + +@app.cell +def _(): + import pathlib + + import polars as pl + + return pathlib, pl + + +@app.cell +def _(mo): + mo.md(""" + ## Configuration + + Set `DATA_DIR` to the phase-1 data directory (e.g. the project drive or TigerData mount). + All data files are resolved relative to this path. + """) + return + + +@app.cell +def _(pathlib): + # Set this to the phase-1 data directory on the project drive / TigerData mount. + # Defaults to the local data directory for local development. + DATA_DIR = pathlib.Path(__file__).parent.parent / "data" / "Phase 1" + return (DATA_DIR,) + + +@app.cell +def _(DATA_DIR, pl): + # Load full sentence translations and join with eval scores. + # Uses the complete notion-sents corpus (all Notion concepts), not the annotation subset. + # Note: madlad does not have eval scores. + _sents_meta = pl.concat( + [ + pl.read_ndjson(DATA_DIR / f"notion-sents/mt-sents-{m}.jsonl") + for m in ["google_tllm", "hymt", "gemma", "madlad"] + ] + ) + _sents_scores = pl.concat( + [ + pl.read_csv(DATA_DIR / f"notion-sents/eval-sents-{m}.csv") + for m in ["google_tllm", "hymt", "gemma"] + ] + ) + sents_df = _sents_meta.join(_sents_scores, on="tr_id", how="left").with_columns( + pl.col("chrf").round(3), + pl.col("comet").round(3), + pl.col("cometkiwi").round(3), + ) + return (sents_df,) + + +@app.cell +def _(DATA_DIR, pl): + # Load paragraph translations and join with eval scores. + _pars_meta = pl.concat( + [ + pl.read_ndjson(DATA_DIR / f"mto-pars/mt-pars-{m}.jsonl") + for m in ["google_tllm", "hymt", "gemma"] + ] + ) + _pars_scores = pl.concat( + [ + pl.read_csv(DATA_DIR / f"mto-pars/eval-pars-{m}.csv") + for m in ["google_tllm", "hymt", "gemma"] + ] + ) + pars_df = _pars_meta.join(_pars_scores, on="tr_id", how="left").with_columns( + pl.col("chrf").round(3), + pl.col("comet").round(3), + pl.col("cometkiwi").round(3), + ) + return (pars_df,) + + +@app.cell +def _(mo): + mo.md("## 1. Sentence translations") + return + + +@app.cell +def _(pl, sents_df): + sents_df.filter(pl.col("src_lang") != "en").select( + ["pair_id", "model", "src_lang", "tr_lang", "chrf", "comet", "cometkiwi", "src_text", "ref_text", "tr_text"] + ) + + +@app.cell +def _(mo): + mo.md("## 2. Sentence backtranslations") + return + + +@app.cell +def _(pl, sents_df): + sents_df.filter(pl.col("src_lang") == "en").select( + ["pair_id", "model", "src_lang", "tr_lang", "chrf", "comet", "cometkiwi", "src_text", "ref_text", "tr_text"] + ) + + +@app.cell +def _(mo): + mo.md("## 3. Paragraph translations") + return + + +@app.cell +def _(pars_df, pl): + pars_df.filter(pl.col("src_lang") != "en").select( + ["pair_id", "model", "src_lang", "tr_lang", "chrf", "comet", "cometkiwi", "src_text", "ref_text", "tr_text"] + ) + + +@app.cell +def _(mo): + mo.md("## 4. Paragraph backtranslations") + return + + +@app.cell +def _(pars_df, pl): + pars_df.filter(pl.col("src_lang") == "en").select( + ["pair_id", "model", "src_lang", "tr_lang", "chrf", "comet", "cometkiwi", "src_text", "ref_text", "tr_text"] + ) + + +if __name__ == "__main__": + app.run() diff --git a/notebooks/mt_eval_analysis.py b/notebooks/mt_eval_analysis.py deleted file mode 100644 index 0f247c3..0000000 --- a/notebooks/mt_eval_analysis.py +++ /dev/null @@ -1,269 +0,0 @@ -import marimo - -__generated_with = "0.22.0" -app = marimo.App(width="medium") - - -@app.cell -def _(): - import marimo as mo - - return (mo,) - - -@app.cell -def _(mo): - mo.md(""" - # Phase 1 Machine Translation Browser - - Browse Phase 1 machine translations side-by-side with source, reference, and evaluation - scores (chrF, COMET, CometKiwi). Translations and backtranslations are shown in separate - sections. - - **Metrics:** chrF measures character n-gram overlap with the reference (unreliable for - cross-script directions such as `en→zh`). COMET and CometKiwi are neural metrics trained - on human judgements; CometKiwi is reference-free and does not penalise paraphrastic output. - """) - return - - -@app.cell -def _(): - import pathlib - - import polars as pl - - return pathlib, pl - - -@app.cell -def _(mo): - mo.md(""" - ## Configuration - - Set `DATA_DIR` to the phase-1 data directory (e.g. the project drive or TigerData mount). - All data files are resolved relative to this path. - """) - return - - -@app.cell -def _(pathlib): - # Set this to the phase-1 data directory on the project drive / TigerData mount. - # Defaults to the local data directory for local development. - DATA_DIR = pathlib.Path(__file__).parent.parent / "data" / "Phase 1" - return (DATA_DIR,) - - -@app.cell -def _(DATA_DIR, pl): - # Load sentence eval CSVs and join with metadata from notion-concept-tasks.jsonl - sents_meta = pl.read_ndjson( - DATA_DIR / "prodigy/notion-concept/notion-concept-tasks.jsonl" - ).select(["tr_id", "model", "src_lang", "tr_lang", "pair_id"]) - - def load_sents_csv(model: str) -> pl.DataFrame: - return pl.read_csv(DATA_DIR / f"notion-sents/eval-sents-{model}.csv").join( - sents_meta.filter(pl.col("model") == model), on="tr_id" - ) - - sents_df = pl.concat( - [ - load_sents_csv("google_tllm"), - load_sents_csv("hymt"), - load_sents_csv("gemma"), - ] - ) - return (sents_df,) - - -@app.cell -def _(DATA_DIR, pl): - # Load paragraph eval CSVs and join with metadata from mt-pars-*.jsonl - def load_pars_csv(model: str) -> pl.DataFrame: - meta = pl.read_ndjson(DATA_DIR / f"mto-pars/mt-pars-{model}.jsonl").select( - ["tr_id", "model", "src_lang", "tr_lang", "pair_id"] - ) - return pl.read_csv(DATA_DIR / f"mto-pars/eval-pars-{model}.csv").join( - meta, on="tr_id" - ) - - pars_df = pl.concat( - [ - load_pars_csv("google_tllm"), - load_pars_csv("hymt"), - load_pars_csv("gemma"), - ] - ) - return (pars_df,) - - -@app.cell -def _(DATA_DIR, pars_df, pl, sents_df): - # Load full text corpora and join with scores - _sents_full = ( - pl.read_ndjson( - DATA_DIR / "prodigy/notion-concept/notion-concept-tasks.jsonl" - ) - .rename({"text": "tr_text"}) - .select( - [ - "tr_id", - "pair_id", - "model", - "src_lang", - "tr_lang", - "src_text", - "ref_text", - "tr_text", - "term", - ] - ) - .with_columns(pl.lit("sentences").alias("corpus")) - ) - _pars_full = pl.concat( - [ - pl.read_ndjson(DATA_DIR / f"mto-pars/mt-pars-{m}.jsonl").select( - [ - "tr_id", - "pair_id", - "model", - "src_lang", - "tr_lang", - "src_text", - "ref_text", - "tr_text", - ] - ) - for m in ["google_tllm", "hymt", "gemma"] - ] - ).with_columns( - pl.lit(None).cast(pl.String).alias("term"), - pl.lit("paragraphs").alias("corpus"), - ) - - _scores = pl.concat( - [ - sents_df.select(["tr_id", "chrf", "comet", "cometkiwi"]), - pars_df.select(["tr_id", "chrf", "comet", "cometkiwi"]), - ] - ) - - browser_data = ( - pl.concat([_sents_full, _pars_full]) - .join(_scores, on="tr_id", how="left") - ) - return (browser_data,) - - -@app.cell -def _(mo): - mo.md(""" - ## 1. Translations - """) - return - - -@app.cell -def _(browser_data, mo, pl): - # Sentences are all forward translations (src != en). - # Paragraphs: forward translations have src_lang != en. - _fwd = browser_data.filter(pl.col("src_lang") != "en") - _corpora = sorted(_fwd["corpus"].unique().to_list()) - corpus_sel_fwd = mo.ui.dropdown(_corpora, value="sentences", label="Corpus") - - _models = sorted(_fwd["model"].unique().to_list()) - model_sel_fwd = mo.ui.dropdown(["all", *_models], value="all", label="Model") - - _all_dirs = sorted( - _fwd.with_columns((pl.col("src_lang") + "→" + pl.col("tr_lang")).alias("dir"))["dir"] - .unique().to_list() - ) - dir_sel_fwd = mo.ui.dropdown(["all", *_all_dirs], value="all", label="Direction") - - _sort_opts = ["cometkiwi ↓", "cometkiwi ↑", "comet ↓", "comet ↑", "chrf ↓", "chrf ↑", "pair_id"] - sort_sel_fwd = mo.ui.dropdown(_sort_opts, value="cometkiwi ↓", label="Sort by") - n_sel_fwd = mo.ui.slider(5, 50, step=5, value=10, label="Show N") - - mo.hstack([corpus_sel_fwd, model_sel_fwd, dir_sel_fwd, sort_sel_fwd, n_sel_fwd], justify="start") - return corpus_sel_fwd, dir_sel_fwd, model_sel_fwd, n_sel_fwd, sort_sel_fwd - - -@app.cell -def _(browser_data, corpus_sel_fwd, dir_sel_fwd, model_sel_fwd, mo, n_sel_fwd, pl, sort_sel_fwd): - _df = browser_data.filter( - (pl.col("src_lang") != "en") & (pl.col("corpus") == corpus_sel_fwd.value) - ) - if model_sel_fwd.value != "all": - _df = _df.filter(pl.col("model") == model_sel_fwd.value) - if dir_sel_fwd.value != "all": - _s, _t = dir_sel_fwd.value.split("→") - _df = _df.filter((pl.col("src_lang") == _s) & (pl.col("tr_lang") == _t)) - _sc, _sd = ( - sort_sel_fwd.value.rsplit(" ", 1) - if " " in sort_sel_fwd.value - else (sort_sel_fwd.value, "↑") - ) - _df = _df.sort(_sc, descending=(_sd == "↓")) - mo.plain( - _df.head(n_sel_fwd.value) - .select(["pair_id", "model", "src_lang", "tr_lang", "chrf", "comet", "cometkiwi", "src_text", "ref_text", "tr_text"]) - .with_columns(pl.col("chrf").round(3), pl.col("comet").round(3), pl.col("cometkiwi").round(3)) - ) - return - - -@app.cell -def _(mo): - mo.md(""" - ## 2. Backtranslations - """) - return - - -@app.cell -def _(browser_data, mo, pl): - # Backtranslations: src_lang == en (paragraphs only — sentences have no backtranslations). - _back = browser_data.filter(pl.col("src_lang") == "en") - - _models_b = sorted(_back["model"].unique().to_list()) - model_sel_back = mo.ui.dropdown(["all", *_models_b], value="all", label="Model") - - _all_dirs_b = sorted( - _back.with_columns((pl.col("src_lang") + "→" + pl.col("tr_lang")).alias("dir"))["dir"] - .unique().to_list() - ) - dir_sel_back = mo.ui.dropdown(["all", *_all_dirs_b], value="all", label="Direction") - - _sort_opts_b = ["cometkiwi ↓", "cometkiwi ↑", "comet ↓", "comet ↑", "chrf ↓", "chrf ↑", "pair_id"] - sort_sel_back = mo.ui.dropdown(_sort_opts_b, value="cometkiwi ↓", label="Sort by") - n_sel_back = mo.ui.slider(5, 50, step=5, value=10, label="Show N") - - mo.hstack([model_sel_back, dir_sel_back, sort_sel_back, n_sel_back], justify="start") - return dir_sel_back, model_sel_back, n_sel_back, sort_sel_back - - -@app.cell -def _(browser_data, dir_sel_back, model_sel_back, mo, n_sel_back, pl, sort_sel_back): - _df = browser_data.filter(pl.col("src_lang") == "en") - if model_sel_back.value != "all": - _df = _df.filter(pl.col("model") == model_sel_back.value) - if dir_sel_back.value != "all": - _s, _t = dir_sel_back.value.split("→") - _df = _df.filter((pl.col("src_lang") == _s) & (pl.col("tr_lang") == _t)) - _sc, _sd = ( - sort_sel_back.value.rsplit(" ", 1) - if " " in sort_sel_back.value - else (sort_sel_back.value, "↑") - ) - _df = _df.sort(_sc, descending=(_sd == "↓")) - mo.plain( - _df.head(n_sel_back.value) - .select(["pair_id", "model", "src_lang", "tr_lang", "chrf", "comet", "cometkiwi", "src_text", "ref_text", "tr_text"]) - .with_columns(pl.col("chrf").round(3), pl.col("comet").round(3), pl.col("cometkiwi").round(3)) - ) - return - - -if __name__ == "__main__": - app.run() From 2dd44a91b24c09be7116a3c81778e538cc2b3eb2 Mon Sep 17 00:00:00 2001 From: hao <97079365+tanhaow@users.noreply.github.com> Date: Fri, 17 Apr 2026 11:30:33 -0400 Subject: [PATCH 08/10] Remove unused dependencies from pyproject.toml altair, pandas, scipy, nbformat, nbconvert, and playwright were added for the previous notebook version and are no longer used. --- pyproject.toml | 6 - uv.lock | 431 ------------------------------------------------- 2 files changed, 437 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 88de31e..3a9d966 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,12 +36,6 @@ dependencies = [ "datasets", "sacrebleu", "unbabel-comet", - "altair>=5", - "pandas", - "scipy", - "nbformat>=5.10.4", - "nbconvert>=7.17.0", - "playwright>=1.58.0", ] [project.optional-dependencies] diff --git a/uv.lock b/uv.lock index 8424a6e..a16f73c 100644 --- a/uv.lock +++ b/uv.lock @@ -138,22 +138,6 @@ wheels = [ { 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" }, ] -[[package]] -name = "altair" -version = "6.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jinja2" }, - { name = "jsonschema" }, - { name = "narwhals" }, - { name = "packaging" }, - { name = "typing-extensions", marker = "python_full_version < '3.15'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f7/c0/184a89bd5feba14ff3c41cfaf1dd8a82c05f5ceedbc92145e17042eb08a4/altair-6.0.0.tar.gz", hash = "sha256:614bf5ecbe2337347b590afb111929aa9c16c9527c4887d96c9bc7f6640756b4", size = 763834, upload-time = "2025-11-12T08:59:11.519Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/db/33/ef2f2409450ef6daa61459d5de5c08128e7d3edb773fefd0a324d1310238/altair-6.0.0-py3-none-any.whl", hash = "sha256:09ae95b53d5fe5b16987dccc785a7af8588f2dca50de1e7a156efa8a461515f8", size = 795410, upload-time = "2025-11-12T08:59:09.804Z" }, -] - [[package]] name = "anyio" version = "4.12.1" @@ -185,19 +169,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" }, ] -[[package]] -name = "beautifulsoup4" -version = "4.14.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "soupsieve" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c3/b0/1c6a16426d389813b48d95e26898aff79abbde42ad353958ad95cc8c9b21/beautifulsoup4-4.14.3.tar.gz", hash = "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86", size = 627737, upload-time = "2025-11-30T15:08:26.084Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb", size = 107721, upload-time = "2025-11-30T15:08:24.087Z" }, -] - [[package]] name = "black" version = "26.1.0" @@ -230,23 +201,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e4/3d/51bdb3ecbfadfaf825ec0c75e1de6077422b4afa2091c6c9ba34fbfc0c2d/black-26.1.0-py3-none-any.whl", hash = "sha256:1054e8e47ebd686e078c0bb0eaf31e6ce69c966058d122f2c0c950311f9f3ede", size = 204010, upload-time = "2026-01-18T04:50:09.978Z" }, ] -[[package]] -name = "bleach" -version = "6.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "webencodings" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/07/18/3c8523962314be6bf4c8989c79ad9531c825210dd13a8669f6b84336e8bd/bleach-6.3.0.tar.gz", hash = "sha256:6f3b91b1c0a02bb9a78b5a454c92506aa0fdf197e1d5e114d2e00c6f64306d22", size = 203533, upload-time = "2025-10-27T17:57:39.211Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl", hash = "sha256:fe10ec77c93ddf3d13a73b035abaac7a9f5e436513864ccdad516693213c65d6", size = 164437, upload-time = "2025-10-27T17:57:37.538Z" }, -] - -[package.optional-dependencies] -css = [ - { name = "tinycss2" }, -] - [[package]] name = "blobfile" version = "3.1.0" @@ -516,15 +470,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" }, ] -[[package]] -name = "defusedxml" -version = "0.7.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload-time = "2021-03-08T10:59:26.269Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" }, -] - [[package]] name = "dill" version = "0.4.0" @@ -608,15 +553,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" }, ] -[[package]] -name = "fastjsonschema" -version = "2.21.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/b5/23b216d9d985a956623b6bd12d4086b60f0059b27799f23016af04a74ea1/fastjsonschema-2.21.2.tar.gz", hash = "sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de", size = 374130, upload-time = "2025-08-14T18:49:36.666Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463", size = 24024, upload-time = "2025-08-14T18:49:34.776Z" }, -] - [[package]] name = "filelock" version = "3.20.3" @@ -862,49 +798,6 @@ grpc = [ { name = "grpcio" }, ] -[[package]] -name = "greenlet" -version = "3.3.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a3/51/1664f6b78fc6ebbd98019a1fd730e83fa78f2db7058f72b1463d3612b8db/greenlet-3.3.2.tar.gz", hash = "sha256:2eaf067fc6d886931c7962e8c6bede15d2f01965560f3359b27c80bde2d151f2", size = 188267, upload-time = "2026-02-20T20:54:15.531Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ea/ab/1608e5a7578e62113506740b88066bf09888322a311cff602105e619bd87/greenlet-3.3.2-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:ac8d61d4343b799d1e526db579833d72f23759c71e07181c2d2944e429eb09cd", size = 280358, upload-time = "2026-02-20T20:17:43.971Z" }, - { url = "https://files.pythonhosted.org/packages/a5/23/0eae412a4ade4e6623ff7626e38998cb9b11e9ff1ebacaa021e4e108ec15/greenlet-3.3.2-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ceec72030dae6ac0c8ed7591b96b70410a8be370b6a477b1dbc072856ad02bd", size = 601217, upload-time = "2026-02-20T20:47:31.462Z" }, - { url = "https://files.pythonhosted.org/packages/f8/16/5b1678a9c07098ecb9ab2dd159fafaf12e963293e61ee8d10ecb55273e5e/greenlet-3.3.2-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a2a5be83a45ce6188c045bcc44b0ee037d6a518978de9a5d97438548b953a1ac", size = 611792, upload-time = "2026-02-20T20:55:58.423Z" }, - { url = "https://files.pythonhosted.org/packages/5c/c5/cc09412a29e43406eba18d61c70baa936e299bc27e074e2be3806ed29098/greenlet-3.3.2-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ae9e21c84035c490506c17002f5c8ab25f980205c3e61ddb3a2a2a2e6c411fcb", size = 626250, upload-time = "2026-02-20T21:02:46.596Z" }, - { url = "https://files.pythonhosted.org/packages/50/1f/5155f55bd71cabd03765a4aac9ac446be129895271f73872c36ebd4b04b6/greenlet-3.3.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43e99d1749147ac21dde49b99c9abffcbc1e2d55c67501465ef0930d6e78e070", size = 613875, upload-time = "2026-02-20T20:21:01.102Z" }, - { url = "https://files.pythonhosted.org/packages/fc/dd/845f249c3fcd69e32df80cdab059b4be8b766ef5830a3d0aa9d6cad55beb/greenlet-3.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4c956a19350e2c37f2c48b336a3afb4bff120b36076d9d7fb68cb44e05d95b79", size = 1571467, upload-time = "2026-02-20T20:49:33.495Z" }, - { url = "https://files.pythonhosted.org/packages/2a/50/2649fe21fcc2b56659a452868e695634722a6655ba245d9f77f5656010bf/greenlet-3.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6c6f8ba97d17a1e7d664151284cb3315fc5f8353e75221ed4324f84eb162b395", size = 1640001, upload-time = "2026-02-20T20:21:09.154Z" }, - { url = "https://files.pythonhosted.org/packages/9b/40/cc802e067d02af8b60b6771cea7d57e21ef5e6659912814babb42b864713/greenlet-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:34308836d8370bddadb41f5a7ce96879b72e2fdfb4e87729330c6ab52376409f", size = 231081, upload-time = "2026-02-20T20:17:28.121Z" }, - { url = "https://files.pythonhosted.org/packages/58/2e/fe7f36ff1982d6b10a60d5e0740c759259a7d6d2e1dc41da6d96de32fff6/greenlet-3.3.2-cp312-cp312-win_arm64.whl", hash = "sha256:d3a62fa76a32b462a97198e4c9e99afb9ab375115e74e9a83ce180e7a496f643", size = 230331, upload-time = "2026-02-20T20:17:23.34Z" }, - { url = "https://files.pythonhosted.org/packages/ac/48/f8b875fa7dea7dd9b33245e37f065af59df6a25af2f9561efa8d822fde51/greenlet-3.3.2-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:aa6ac98bdfd716a749b84d4034486863fd81c3abde9aa3cf8eff9127981a4ae4", size = 279120, upload-time = "2026-02-20T20:19:01.9Z" }, - { url = "https://files.pythonhosted.org/packages/49/8d/9771d03e7a8b1ee456511961e1b97a6d77ae1dea4a34a5b98eee706689d3/greenlet-3.3.2-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab0c7e7901a00bc0a7284907273dc165b32e0d109a6713babd04471327ff7986", size = 603238, upload-time = "2026-02-20T20:47:32.873Z" }, - { url = "https://files.pythonhosted.org/packages/59/0e/4223c2bbb63cd5c97f28ffb2a8aee71bdfb30b323c35d409450f51b91e3e/greenlet-3.3.2-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d248d8c23c67d2291ffd47af766e2a3aa9fa1c6703155c099feb11f526c63a92", size = 614219, upload-time = "2026-02-20T20:55:59.817Z" }, - { url = "https://files.pythonhosted.org/packages/94/2b/4d012a69759ac9d77210b8bfb128bc621125f5b20fc398bce3940d036b1c/greenlet-3.3.2-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ccd21bb86944ca9be6d967cf7691e658e43417782bce90b5d2faeda0ff78a7dd", size = 628268, upload-time = "2026-02-20T21:02:48.024Z" }, - { url = "https://files.pythonhosted.org/packages/7a/34/259b28ea7a2a0c904b11cd36c79b8cef8019b26ee5dbe24e73b469dea347/greenlet-3.3.2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b6997d360a4e6a4e936c0f9625b1c20416b8a0ea18a8e19cabbefc712e7397ab", size = 616774, upload-time = "2026-02-20T20:21:02.454Z" }, - { url = "https://files.pythonhosted.org/packages/0a/03/996c2d1689d486a6e199cb0f1cf9e4aa940c500e01bdf201299d7d61fa69/greenlet-3.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:64970c33a50551c7c50491671265d8954046cb6e8e2999aacdd60e439b70418a", size = 1571277, upload-time = "2026-02-20T20:49:34.795Z" }, - { url = "https://files.pythonhosted.org/packages/d9/c4/2570fc07f34a39f2caf0bf9f24b0a1a0a47bc2e8e465b2c2424821389dfc/greenlet-3.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1a9172f5bf6bd88e6ba5a84e0a68afeac9dc7b6b412b245dd64f52d83c81e55b", size = 1640455, upload-time = "2026-02-20T20:21:10.261Z" }, - { url = "https://files.pythonhosted.org/packages/91/39/5ef5aa23bc545aa0d31e1b9b55822b32c8da93ba657295840b6b34124009/greenlet-3.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:a7945dd0eab63ded0a48e4dcade82939783c172290a7903ebde9e184333ca124", size = 230961, upload-time = "2026-02-20T20:16:58.461Z" }, - { url = "https://files.pythonhosted.org/packages/62/6b/a89f8456dcb06becff288f563618e9f20deed8dd29beea14f9a168aef64b/greenlet-3.3.2-cp313-cp313-win_arm64.whl", hash = "sha256:394ead29063ee3515b4e775216cb756b2e3b4a7e55ae8fd884f17fa579e6b327", size = 230221, upload-time = "2026-02-20T20:17:37.152Z" }, - { url = "https://files.pythonhosted.org/packages/3f/ae/8bffcbd373b57a5992cd077cbe8858fff39110480a9d50697091faea6f39/greenlet-3.3.2-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:8d1658d7291f9859beed69a776c10822a0a799bc4bfe1bd4272bb60e62507dab", size = 279650, upload-time = "2026-02-20T20:18:00.783Z" }, - { url = "https://files.pythonhosted.org/packages/d1/c0/45f93f348fa49abf32ac8439938726c480bd96b2a3c6f4d949ec0124b69f/greenlet-3.3.2-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:18cb1b7337bca281915b3c5d5ae19f4e76d35e1df80f4ad3c1a7be91fadf1082", size = 650295, upload-time = "2026-02-20T20:47:34.036Z" }, - { url = "https://files.pythonhosted.org/packages/b3/de/dd7589b3f2b8372069ab3e4763ea5329940fc7ad9dcd3e272a37516d7c9b/greenlet-3.3.2-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c2e47408e8ce1c6f1ceea0dffcdf6ebb85cc09e55c7af407c99f1112016e45e9", size = 662163, upload-time = "2026-02-20T20:56:01.295Z" }, - { url = "https://files.pythonhosted.org/packages/cd/ac/85804f74f1ccea31ba518dcc8ee6f14c79f73fe36fa1beba38930806df09/greenlet-3.3.2-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e3cb43ce200f59483eb82949bf1835a99cf43d7571e900d7c8d5c62cdf25d2f9", size = 675371, upload-time = "2026-02-20T21:02:49.664Z" }, - { url = "https://files.pythonhosted.org/packages/d2/d8/09bfa816572a4d83bccd6750df1926f79158b1c36c5f73786e26dbe4ee38/greenlet-3.3.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63d10328839d1973e5ba35e98cccbca71b232b14051fd957b6f8b6e8e80d0506", size = 664160, upload-time = "2026-02-20T20:21:04.015Z" }, - { url = "https://files.pythonhosted.org/packages/48/cf/56832f0c8255d27f6c35d41b5ec91168d74ec721d85f01a12131eec6b93c/greenlet-3.3.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8e4ab3cfb02993c8cc248ea73d7dae6cec0253e9afa311c9b37e603ca9fad2ce", size = 1619181, upload-time = "2026-02-20T20:49:36.052Z" }, - { url = "https://files.pythonhosted.org/packages/0a/23/b90b60a4aabb4cec0796e55f25ffbfb579a907c3898cd2905c8918acaa16/greenlet-3.3.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:94ad81f0fd3c0c0681a018a976e5c2bd2ca2d9d94895f23e7bb1af4e8af4e2d5", size = 1687713, upload-time = "2026-02-20T20:21:11.684Z" }, - { url = "https://files.pythonhosted.org/packages/f3/ca/2101ca3d9223a1dc125140dbc063644dca76df6ff356531eb27bc267b446/greenlet-3.3.2-cp314-cp314-win_amd64.whl", hash = "sha256:8c4dd0f3997cf2512f7601563cc90dfb8957c0cff1e3a1b23991d4ea1776c492", size = 232034, upload-time = "2026-02-20T20:20:08.186Z" }, - { url = "https://files.pythonhosted.org/packages/f6/4a/ecf894e962a59dea60f04877eea0fd5724618da89f1867b28ee8b91e811f/greenlet-3.3.2-cp314-cp314-win_arm64.whl", hash = "sha256:cd6f9e2bbd46321ba3bbb4c8a15794d32960e3b0ae2cc4d49a1a53d314805d71", size = 231437, upload-time = "2026-02-20T20:18:59.722Z" }, - { url = "https://files.pythonhosted.org/packages/98/6d/8f2ef704e614bcf58ed43cfb8d87afa1c285e98194ab2cfad351bf04f81e/greenlet-3.3.2-cp314-cp314t-macosx_11_0_universal2.whl", hash = "sha256:e26e72bec7ab387ac80caa7496e0f908ff954f31065b0ffc1f8ecb1338b11b54", size = 286617, upload-time = "2026-02-20T20:19:29.856Z" }, - { url = "https://files.pythonhosted.org/packages/5e/0d/93894161d307c6ea237a43988f27eba0947b360b99ac5239ad3fe09f0b47/greenlet-3.3.2-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b466dff7a4ffda6ca975979bab80bdadde979e29fc947ac3be4451428d8b0e4", size = 655189, upload-time = "2026-02-20T20:47:35.742Z" }, - { url = "https://files.pythonhosted.org/packages/f5/2c/d2d506ebd8abcb57386ec4f7ba20f4030cbe56eae541bc6fd6ef399c0b41/greenlet-3.3.2-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b8bddc5b73c9720bea487b3bffdb1840fe4e3656fba3bd40aa1489e9f37877ff", size = 658225, upload-time = "2026-02-20T20:56:02.527Z" }, - { url = "https://files.pythonhosted.org/packages/d1/67/8197b7e7e602150938049d8e7f30de1660cfb87e4c8ee349b42b67bdb2e1/greenlet-3.3.2-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:59b3e2c40f6706b05a9cd299c836c6aa2378cabe25d021acd80f13abf81181cf", size = 666581, upload-time = "2026-02-20T21:02:51.526Z" }, - { url = "https://files.pythonhosted.org/packages/8e/30/3a09155fbf728673a1dea713572d2d31159f824a37c22da82127056c44e4/greenlet-3.3.2-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b26b0f4428b871a751968285a1ac9648944cea09807177ac639b030bddebcea4", size = 657907, upload-time = "2026-02-20T20:21:05.259Z" }, - { url = "https://files.pythonhosted.org/packages/f3/fd/d05a4b7acd0154ed758797f0a43b4c0962a843bedfe980115e842c5b2d08/greenlet-3.3.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1fb39a11ee2e4d94be9a76671482be9398560955c9e568550de0224e41104727", size = 1618857, upload-time = "2026-02-20T20:49:37.309Z" }, - { url = "https://files.pythonhosted.org/packages/6f/e1/50ee92a5db521de8f35075b5eff060dd43d39ebd46c2181a2042f7070385/greenlet-3.3.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:20154044d9085151bc309e7689d6f7ba10027f8f5a8c0676ad398b951913d89e", size = 1680010, upload-time = "2026-02-20T20:21:13.427Z" }, - { url = "https://files.pythonhosted.org/packages/29/4b/45d90626aef8e65336bed690106d1382f7a43665e2249017e9527df8823b/greenlet-3.3.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c04c5e06ec3e022cbfe2cd4a846e1d4e50087444f875ff6d2c2ad8445495cf1a", size = 237086, upload-time = "2026-02-20T20:20:45.786Z" }, -] - [[package]] name = "grpc-google-iam-v1" version = "0.14.3" @@ -1203,71 +1096,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/04/cf/b8bdb5d6b631766a2332dca19cb2b214620a65c398636012dde69b71f36f/jsonargparse-3.13.1-py3-none-any.whl", hash = "sha256:b58188b98f2ac2b1f5007ece7ea821628883ce3f3ee448eb17c72d9d3b8ec893", size = 101364, upload-time = "2021-06-03T05:50:56.686Z" }, ] -[[package]] -name = "jsonschema" -version = "4.26.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "attrs" }, - { name = "jsonschema-specifications" }, - { name = "referencing" }, - { name = "rpds-py" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", size = 90630, upload-time = "2026-01-07T13:41:05.306Z" }, -] - -[[package]] -name = "jsonschema-specifications" -version = "2025.9.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "referencing" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, -] - -[[package]] -name = "jupyter-client" -version = "8.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jupyter-core" }, - { name = "python-dateutil" }, - { name = "pyzmq" }, - { name = "tornado" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/05/e4/ba649102a3bc3fbca54e7239fb924fd434c766f855693d86de0b1f2bec81/jupyter_client-8.8.0.tar.gz", hash = "sha256:d556811419a4f2d96c869af34e854e3f059b7cc2d6d01a9cd9c85c267691be3e", size = 348020, upload-time = "2026-01-08T13:55:47.938Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl", hash = "sha256:f93a5b99c5e23a507b773d3a1136bd6e16c67883ccdbd9a829b0bbdb98cd7d7a", size = 107371, upload-time = "2026-01-08T13:55:45.562Z" }, -] - -[[package]] -name = "jupyter-core" -version = "5.9.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "platformdirs" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/02/49/9d1284d0dc65e2c757b74c6687b6d319b02f822ad039e5c512df9194d9dd/jupyter_core-5.9.1.tar.gz", hash = "sha256:4d09aaff303b9566c3ce657f580bd089ff5c91f5f89cf7d8846c3cdf465b5508", size = 89814, upload-time = "2025-10-16T19:19:18.444Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl", hash = "sha256:ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407", size = 29032, upload-time = "2025-10-16T19:19:16.783Z" }, -] - -[[package]] -name = "jupyterlab-pygments" -version = "0.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/90/51/9187be60d989df97f5f0aba133fa54e7300f17616e065d1ada7d7646b6d6/jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", size = 512900, upload-time = "2023-11-23T09:26:37.44Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780", size = 15884, upload-time = "2023-11-23T09:26:34.325Z" }, -] - [[package]] name = "lightning-utilities" version = "0.15.3" @@ -1558,15 +1386,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl", hash = "sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76", size = 9516, upload-time = "2025-10-23T09:00:20.675Z" }, ] -[[package]] -name = "mistune" -version = "3.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9d/55/d01f0c4b45ade6536c51170b9043db8b2ec6ddf4a35c7ea3f5f559ac935b/mistune-3.2.0.tar.gz", hash = "sha256:708487c8a8cdd99c9d90eb3ed4c3ed961246ff78ac82f03418f5183ab70e398a", size = 95467, upload-time = "2025-12-23T11:36:34.994Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl", hash = "sha256:febdc629a3c78616b94393c6580551e0e34cc289987ec6c35ed3f4be42d0eee1", size = 53598, upload-time = "2025-12-23T11:36:33.211Z" }, -] - [[package]] name = "mpmath" version = "1.3.0" @@ -1736,7 +1555,6 @@ wheels = [ name = "muse" source = { editable = "." } dependencies = [ - { name = "altair" }, { name = "datasets" }, { name = "evaluate" }, { name = "ftfy" }, @@ -1744,17 +1562,11 @@ dependencies = [ { name = "google-cloud-translate" }, { name = "ipython" }, { name = "marimo" }, - { name = "nbconvert" }, - { name = "nbformat" }, { name = "numpy" }, { name = "orjsonl" }, - { name = "pandas", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" }, - { name = "pandas", version = "3.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" }, { name = "pip" }, - { name = "playwright" }, { name = "polars" }, { name = "sacrebleu" }, - { name = "scipy" }, { name = "transformers", extra = ["sentencepiece", "tiktoken", "torch"] }, { name = "unbabel-comet" }, ] @@ -1773,7 +1585,6 @@ dev = [ [package.metadata] requires-dist = [ - { name = "altair", specifier = ">=5" }, { name = "datasets" }, { name = "evaluate" }, { name = "ftfy" }, @@ -1782,18 +1593,13 @@ requires-dist = [ { name = "ipython" }, { name = "marimo", specifier = ">=0.22.0" }, { name = "marimo", extras = ["lsp"], marker = "extra == 'dev'" }, - { name = "nbconvert", specifier = ">=7.17.0" }, - { name = "nbformat", specifier = ">=5.10.4" }, { name = "numpy" }, { name = "orjsonl" }, - { name = "pandas" }, { name = "pip" }, - { name = "playwright", specifier = ">=1.58.0" }, { name = "polars", specifier = ">=0.20.4" }, { name = "pre-commit", marker = "extra == 'dev'" }, { name = "ruff", marker = "extra == 'dev'" }, { name = "sacrebleu" }, - { name = "scipy" }, { name = "transformers", extras = ["sentencepiece", "tiktoken", "torch"] }, { name = "unbabel-comet" }, ] @@ -1820,61 +1626,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3d/2e/cf2ffeb386ac3763526151163ad7da9f1b586aac96d2b4f7de1eaebf0c61/narwhals-2.15.0-py3-none-any.whl", hash = "sha256:cbfe21ca19d260d9fd67f995ec75c44592d1f106933b03ddd375df7ac841f9d6", size = 432856, upload-time = "2026-01-06T08:10:11.511Z" }, ] -[[package]] -name = "nbclient" -version = "0.10.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jupyter-client" }, - { name = "jupyter-core" }, - { name = "nbformat" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/56/91/1c1d5a4b9a9ebba2b4e32b8c852c2975c872aec1fe42ab5e516b2cecd193/nbclient-0.10.4.tar.gz", hash = "sha256:1e54091b16e6da39e297b0ece3e10f6f29f4ac4e8ee515d29f8a7099bd6553c9", size = 62554, upload-time = "2025-12-23T07:45:46.369Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl", hash = "sha256:9162df5a7373d70d606527300a95a975a47c137776cd942e52d9c7e29ff83440", size = 25465, upload-time = "2025-12-23T07:45:44.51Z" }, -] - -[[package]] -name = "nbconvert" -version = "7.17.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "beautifulsoup4" }, - { name = "bleach", extra = ["css"] }, - { name = "defusedxml" }, - { name = "jinja2" }, - { name = "jupyter-core" }, - { name = "jupyterlab-pygments" }, - { name = "markupsafe" }, - { name = "mistune" }, - { name = "nbclient" }, - { name = "nbformat" }, - { name = "packaging" }, - { name = "pandocfilters" }, - { name = "pygments" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/38/47/81f886b699450d0569f7bc551df2b1673d18df7ff25cc0c21ca36ed8a5ff/nbconvert-7.17.0.tar.gz", hash = "sha256:1b2696f1b5be12309f6c7d707c24af604b87dfaf6d950794c7b07acab96dda78", size = 862855, upload-time = "2026-01-29T16:37:48.478Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl", hash = "sha256:4f99a63b337b9a23504347afdab24a11faa7d86b405e5c8f9881cd313336d518", size = 261510, upload-time = "2026-01-29T16:37:46.322Z" }, -] - -[[package]] -name = "nbformat" -version = "5.10.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "fastjsonschema" }, - { name = "jsonschema" }, - { name = "jupyter-core" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749, upload-time = "2024-04-04T11:20:37.371Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454, upload-time = "2024-04-04T11:20:34.895Z" }, -] - [[package]] name = "networkx" version = "3.6.1" @@ -2230,15 +1981,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/68/b0/34937815889fa982613775e4b97fddd13250f11012d769949c5465af2150/pandas-3.0.1-cp314-cp314t-win_arm64.whl", hash = "sha256:108dd1790337a494aa80e38def654ca3f0968cf4f362c85f44c15e471667102d", size = 9452085, upload-time = "2026-02-17T22:20:14.331Z" }, ] -[[package]] -name = "pandocfilters" -version = "1.5.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/70/6f/3dd4940bbe001c06a65f88e36bad298bc7a0de5036115639926b0c5c0458/pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e", size = 8454, upload-time = "2024-01-18T20:08:13.726Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc", size = 8663, upload-time = "2024-01-18T20:08:11.28Z" }, -] - [[package]] name = "parso" version = "0.8.5" @@ -2287,25 +2029,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31", size = 18731, upload-time = "2025-12-05T13:52:56.823Z" }, ] -[[package]] -name = "playwright" -version = "1.58.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "greenlet" }, - { name = "pyee" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/c9/9c6061d5703267f1baae6a4647bfd1862e386fbfdb97d889f6f6ae9e3f64/playwright-1.58.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:96e3204aac292ee639edbfdef6298b4be2ea0a55a16b7068df91adac077cc606", size = 42251098, upload-time = "2026-01-30T15:09:24.028Z" }, - { url = "https://files.pythonhosted.org/packages/e0/40/59d34a756e02f8c670f0fee987d46f7ee53d05447d43cd114ca015cb168c/playwright-1.58.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:70c763694739d28df71ed578b9c8202bb83e8fe8fb9268c04dd13afe36301f71", size = 41039625, upload-time = "2026-01-30T15:09:27.558Z" }, - { url = "https://files.pythonhosted.org/packages/e1/ee/3ce6209c9c74a650aac9028c621f357a34ea5cd4d950700f8e2c4b7fe2c4/playwright-1.58.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:185e0132578733d02802dfddfbbc35f42be23a45ff49ccae5081f25952238117", size = 42251098, upload-time = "2026-01-30T15:09:30.461Z" }, - { url = "https://files.pythonhosted.org/packages/f1/af/009958cbf23fac551a940d34e3206e6c7eed2b8c940d0c3afd1feb0b0589/playwright-1.58.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:c95568ba1eda83812598c1dc9be60b4406dffd60b149bc1536180ad108723d6b", size = 46235268, upload-time = "2026-01-30T15:09:33.787Z" }, - { url = "https://files.pythonhosted.org/packages/d9/a6/0e66ad04b6d3440dae73efb39540c5685c5fc95b17c8b29340b62abbd952/playwright-1.58.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f9999948f1ab541d98812de25e3a8c410776aa516d948807140aff797b4bffa", size = 45964214, upload-time = "2026-01-30T15:09:36.751Z" }, - { url = "https://files.pythonhosted.org/packages/0e/4b/236e60ab9f6d62ed0fd32150d61f1f494cefbf02304c0061e78ed80c1c32/playwright-1.58.0-py3-none-win32.whl", hash = "sha256:1e03be090e75a0fabbdaeab65ce17c308c425d879fa48bb1d7986f96bfad0b99", size = 36815998, upload-time = "2026-01-30T15:09:39.627Z" }, - { url = "https://files.pythonhosted.org/packages/41/f8/5ec599c5e59d2f2f336a05b4f318e733077cd5044f24adb6f86900c3e6a7/playwright-1.58.0-py3-none-win_amd64.whl", hash = "sha256:a2bf639d0ce33b3ba38de777e08697b0d8f3dc07ab6802e4ac53fb65e3907af8", size = 36816005, upload-time = "2026-01-30T15:09:42.449Z" }, - { url = "https://files.pythonhosted.org/packages/c8/c4/cc0229fea55c87d6c9c67fe44a21e2cd28d1d558a5478ed4d617e9fb0c93/playwright-1.58.0-py3-none-win_arm64.whl", hash = "sha256:32ffe5c303901a13a0ecab91d1c3f74baf73b84f4bedbb6b935f5bc11cc98e1b", size = 33085919, upload-time = "2026-01-30T15:09:45.71Z" }, -] - [[package]] name = "pluggy" version = "1.6.0" @@ -2642,18 +2365,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f9/93/45c1cdcbeb182ccd2e144c693eaa097763b08b38cded279f0053ed53c553/pycryptodomex-3.23.0-cp37-abi3-win_arm64.whl", hash = "sha256:02d87b80778c171445d67e23d1caef279bf4b25c3597050ccd2e13970b57fd51", size = 1707161, upload-time = "2025-05-17T17:23:11.414Z" }, ] -[[package]] -name = "pyee" -version = "13.0.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/8b/04/e7c1fe4dc78a6fdbfd6c337b1c3732ff543b8a397683ab38378447baa331/pyee-13.0.1.tar.gz", hash = "sha256:0b931f7c14535667ed4c7e0d531716368715e860b988770fc7eb8578d1f67fc8", size = 31655, upload-time = "2026-02-14T21:12:28.044Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/c4/b4d4827c93ef43c01f599ef31453ccc1c132b353284fc6c87d535c233129/pyee-13.0.1-py3-none-any.whl", hash = "sha256:af2f8fede4171ef667dfded53f96e2ed0d6e6bd7ee3bb46437f77e3b57689228", size = 15659, upload-time = "2026-02-14T21:12:26.263Z" }, -] - [[package]] name = "pygments" version = "2.19.2" @@ -2894,20 +2605,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/81/d6/4bfbb40c9a0b42fc53c7cf442f6385db70b40f74a783130c5d0a5aa62228/pyzmq-27.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7", size = 575170, upload-time = "2025-09-08T23:09:01.418Z" }, ] -[[package]] -name = "referencing" -version = "0.37.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "attrs" }, - { name = "rpds-py" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" }, -] - [[package]] name = "regex" version = "2026.1.15" @@ -3011,87 +2708,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, ] -[[package]] -name = "rpds-py" -version = "0.30.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/af/3f2f423103f1113b36230496629986e0ef7e199d2aa8392452b484b38ced/rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84", size = 69469, upload-time = "2025-11-30T20:24:38.837Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/03/e7/98a2f4ac921d82f33e03f3835f5bf3a4a40aa1bfdc57975e74a97b2b4bdd/rpds_py-0.30.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a161f20d9a43006833cd7068375a94d035714d73a172b681d8881820600abfad", size = 375086, upload-time = "2025-11-30T20:22:17.93Z" }, - { url = "https://files.pythonhosted.org/packages/4d/a1/bca7fd3d452b272e13335db8d6b0b3ecde0f90ad6f16f3328c6fb150c889/rpds_py-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6abc8880d9d036ecaafe709079969f56e876fcf107f7a8e9920ba6d5a3878d05", size = 359053, upload-time = "2025-11-30T20:22:19.297Z" }, - { url = "https://files.pythonhosted.org/packages/65/1c/ae157e83a6357eceff62ba7e52113e3ec4834a84cfe07fa4b0757a7d105f/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca28829ae5f5d569bb62a79512c842a03a12576375d5ece7d2cadf8abe96ec28", size = 390763, upload-time = "2025-11-30T20:22:21.661Z" }, - { url = "https://files.pythonhosted.org/packages/d4/36/eb2eb8515e2ad24c0bd43c3ee9cd74c33f7ca6430755ccdb240fd3144c44/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1010ed9524c73b94d15919ca4d41d8780980e1765babf85f9a2f90d247153dd", size = 408951, upload-time = "2025-11-30T20:22:23.408Z" }, - { url = "https://files.pythonhosted.org/packages/d6/65/ad8dc1784a331fabbd740ef6f71ce2198c7ed0890dab595adb9ea2d775a1/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8d1736cfb49381ba528cd5baa46f82fdc65c06e843dab24dd70b63d09121b3f", size = 514622, upload-time = "2025-11-30T20:22:25.16Z" }, - { url = "https://files.pythonhosted.org/packages/63/8e/0cfa7ae158e15e143fe03993b5bcd743a59f541f5952e1546b1ac1b5fd45/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d948b135c4693daff7bc2dcfc4ec57237a29bd37e60c2fabf5aff2bbacf3e2f1", size = 414492, upload-time = "2025-11-30T20:22:26.505Z" }, - { url = "https://files.pythonhosted.org/packages/60/1b/6f8f29f3f995c7ffdde46a626ddccd7c63aefc0efae881dc13b6e5d5bb16/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47f236970bccb2233267d89173d3ad2703cd36a0e2a6e92d0560d333871a3d23", size = 394080, upload-time = "2025-11-30T20:22:27.934Z" }, - { url = "https://files.pythonhosted.org/packages/6d/d5/a266341051a7a3ca2f4b750a3aa4abc986378431fc2da508c5034d081b70/rpds_py-0.30.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:2e6ecb5a5bcacf59c3f912155044479af1d0b6681280048b338b28e364aca1f6", size = 408680, upload-time = "2025-11-30T20:22:29.341Z" }, - { url = "https://files.pythonhosted.org/packages/10/3b/71b725851df9ab7a7a4e33cf36d241933da66040d195a84781f49c50490c/rpds_py-0.30.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a8fa71a2e078c527c3e9dc9fc5a98c9db40bcc8a92b4e8858e36d329f8684b51", size = 423589, upload-time = "2025-11-30T20:22:31.469Z" }, - { url = "https://files.pythonhosted.org/packages/00/2b/e59e58c544dc9bd8bd8384ecdb8ea91f6727f0e37a7131baeff8d6f51661/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73c67f2db7bc334e518d097c6d1e6fed021bbc9b7d678d6cc433478365d1d5f5", size = 573289, upload-time = "2025-11-30T20:22:32.997Z" }, - { url = "https://files.pythonhosted.org/packages/da/3e/a18e6f5b460893172a7d6a680e86d3b6bc87a54c1f0b03446a3c8c7b588f/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5ba103fb455be00f3b1c2076c9d4264bfcb037c976167a6047ed82f23153f02e", size = 599737, upload-time = "2025-11-30T20:22:34.419Z" }, - { url = "https://files.pythonhosted.org/packages/5c/e2/714694e4b87b85a18e2c243614974413c60aa107fd815b8cbc42b873d1d7/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee9c752c0364588353e627da8a7e808a66873672bcb5f52890c33fd965b394", size = 563120, upload-time = "2025-11-30T20:22:35.903Z" }, - { url = "https://files.pythonhosted.org/packages/6f/ab/d5d5e3bcedb0a77f4f613706b750e50a5a3ba1c15ccd3665ecc636c968fd/rpds_py-0.30.0-cp312-cp312-win32.whl", hash = "sha256:1ab5b83dbcf55acc8b08fc62b796ef672c457b17dbd7820a11d6c52c06839bdf", size = 223782, upload-time = "2025-11-30T20:22:37.271Z" }, - { url = "https://files.pythonhosted.org/packages/39/3b/f786af9957306fdc38a74cef405b7b93180f481fb48453a114bb6465744a/rpds_py-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:a090322ca841abd453d43456ac34db46e8b05fd9b3b4ac0c78bcde8b089f959b", size = 240463, upload-time = "2025-11-30T20:22:39.021Z" }, - { url = "https://files.pythonhosted.org/packages/f3/d2/b91dc748126c1559042cfe41990deb92c4ee3e2b415f6b5234969ffaf0cc/rpds_py-0.30.0-cp312-cp312-win_arm64.whl", hash = "sha256:669b1805bd639dd2989b281be2cfd951c6121b65e729d9b843e9639ef1fd555e", size = 230868, upload-time = "2025-11-30T20:22:40.493Z" }, - { url = "https://files.pythonhosted.org/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2", size = 374887, upload-time = "2025-11-30T20:22:41.812Z" }, - { url = "https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8", size = 358904, upload-time = "2025-11-30T20:22:43.479Z" }, - { url = "https://files.pythonhosted.org/packages/58/70/faed8186300e3b9bdd138d0273109784eea2396c68458ed580f885dfe7ad/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4", size = 389945, upload-time = "2025-11-30T20:22:44.819Z" }, - { url = "https://files.pythonhosted.org/packages/bd/a8/073cac3ed2c6387df38f71296d002ab43496a96b92c823e76f46b8af0543/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0a59119fc6e3f460315fe9d08149f8102aa322299deaa5cab5b40092345c2136", size = 407783, upload-time = "2025-11-30T20:22:46.103Z" }, - { url = "https://files.pythonhosted.org/packages/77/57/5999eb8c58671f1c11eba084115e77a8899d6e694d2a18f69f0ba471ec8b/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76fec018282b4ead0364022e3c54b60bf368b9d926877957a8624b58419169b7", size = 515021, upload-time = "2025-11-30T20:22:47.458Z" }, - { url = "https://files.pythonhosted.org/packages/e0/af/5ab4833eadc36c0a8ed2bc5c0de0493c04f6c06de223170bd0798ff98ced/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:692bef75a5525db97318e8cd061542b5a79812d711ea03dbc1f6f8dbb0c5f0d2", size = 414589, upload-time = "2025-11-30T20:22:48.872Z" }, - { url = "https://files.pythonhosted.org/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6", size = 394025, upload-time = "2025-11-30T20:22:50.196Z" }, - { url = "https://files.pythonhosted.org/packages/91/c4/fc70cd0249496493500e7cc2de87504f5aa6509de1e88623431fec76d4b6/rpds_py-0.30.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:9cf69cdda1f5968a30a359aba2f7f9aa648a9ce4b580d6826437f2b291cfc86e", size = 408895, upload-time = "2025-11-30T20:22:51.87Z" }, - { url = "https://files.pythonhosted.org/packages/58/95/d9275b05ab96556fefff73a385813eb66032e4c99f411d0795372d9abcea/rpds_py-0.30.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4796a717bf12b9da9d3ad002519a86063dcac8988b030e405704ef7d74d2d9d", size = 422799, upload-time = "2025-11-30T20:22:53.341Z" }, - { url = "https://files.pythonhosted.org/packages/06/c1/3088fc04b6624eb12a57eb814f0d4997a44b0d208d6cace713033ff1a6ba/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d4c2aa7c50ad4728a094ebd5eb46c452e9cb7edbfdb18f9e1221f597a73e1e7", size = 572731, upload-time = "2025-11-30T20:22:54.778Z" }, - { url = "https://files.pythonhosted.org/packages/d8/42/c612a833183b39774e8ac8fecae81263a68b9583ee343db33ab571a7ce55/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba81a9203d07805435eb06f536d95a266c21e5b2dfbf6517748ca40c98d19e31", size = 599027, upload-time = "2025-11-30T20:22:56.212Z" }, - { url = "https://files.pythonhosted.org/packages/5f/60/525a50f45b01d70005403ae0e25f43c0384369ad24ffe46e8d9068b50086/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:945dccface01af02675628334f7cf49c2af4c1c904748efc5cf7bbdf0b579f95", size = 563020, upload-time = "2025-11-30T20:22:58.2Z" }, - { url = "https://files.pythonhosted.org/packages/0b/5d/47c4655e9bcd5ca907148535c10e7d489044243cc9941c16ed7cd53be91d/rpds_py-0.30.0-cp313-cp313-win32.whl", hash = "sha256:b40fb160a2db369a194cb27943582b38f79fc4887291417685f3ad693c5a1d5d", size = 223139, upload-time = "2025-11-30T20:23:00.209Z" }, - { url = "https://files.pythonhosted.org/packages/f2/e1/485132437d20aa4d3e1d8b3fb5a5e65aa8139f1e097080c2a8443201742c/rpds_py-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:806f36b1b605e2d6a72716f321f20036b9489d29c51c91f4dd29a3e3afb73b15", size = 240224, upload-time = "2025-11-30T20:23:02.008Z" }, - { url = "https://files.pythonhosted.org/packages/24/95/ffd128ed1146a153d928617b0ef673960130be0009c77d8fbf0abe306713/rpds_py-0.30.0-cp313-cp313-win_arm64.whl", hash = "sha256:d96c2086587c7c30d44f31f42eae4eac89b60dabbac18c7669be3700f13c3ce1", size = 230645, upload-time = "2025-11-30T20:23:03.43Z" }, - { url = "https://files.pythonhosted.org/packages/ff/1b/b10de890a0def2a319a2626334a7f0ae388215eb60914dbac8a3bae54435/rpds_py-0.30.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:eb0b93f2e5c2189ee831ee43f156ed34e2a89a78a66b98cadad955972548be5a", size = 364443, upload-time = "2025-11-30T20:23:04.878Z" }, - { url = "https://files.pythonhosted.org/packages/0d/bf/27e39f5971dc4f305a4fb9c672ca06f290f7c4e261c568f3dea16a410d47/rpds_py-0.30.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:922e10f31f303c7c920da8981051ff6d8c1a56207dbdf330d9047f6d30b70e5e", size = 353375, upload-time = "2025-11-30T20:23:06.342Z" }, - { url = "https://files.pythonhosted.org/packages/40/58/442ada3bba6e8e6615fc00483135c14a7538d2ffac30e2d933ccf6852232/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdc62c8286ba9bf7f47befdcea13ea0e26bf294bda99758fd90535cbaf408000", size = 383850, upload-time = "2025-11-30T20:23:07.825Z" }, - { url = "https://files.pythonhosted.org/packages/14/14/f59b0127409a33c6ef6f5c1ebd5ad8e32d7861c9c7adfa9a624fc3889f6c/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47f9a91efc418b54fb8190a6b4aa7813a23fb79c51f4bb84e418f5476c38b8db", size = 392812, upload-time = "2025-11-30T20:23:09.228Z" }, - { url = "https://files.pythonhosted.org/packages/b3/66/e0be3e162ac299b3a22527e8913767d869e6cc75c46bd844aa43fb81ab62/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3587eb9b17f3789ad50824084fa6f81921bbf9a795826570bda82cb3ed91f2", size = 517841, upload-time = "2025-11-30T20:23:11.186Z" }, - { url = "https://files.pythonhosted.org/packages/3d/55/fa3b9cf31d0c963ecf1ba777f7cf4b2a2c976795ac430d24a1f43d25a6ba/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39c02563fc592411c2c61d26b6c5fe1e51eaa44a75aa2c8735ca88b0d9599daa", size = 408149, upload-time = "2025-11-30T20:23:12.864Z" }, - { url = "https://files.pythonhosted.org/packages/60/ca/780cf3b1a32b18c0f05c441958d3758f02544f1d613abf9488cd78876378/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a1234d8febafdfd33a42d97da7a43f5dcb120c1060e352a3fbc0c6d36e2083", size = 383843, upload-time = "2025-11-30T20:23:14.638Z" }, - { url = "https://files.pythonhosted.org/packages/82/86/d5f2e04f2aa6247c613da0c1dd87fcd08fa17107e858193566048a1e2f0a/rpds_py-0.30.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:eb2c4071ab598733724c08221091e8d80e89064cd472819285a9ab0f24bcedb9", size = 396507, upload-time = "2025-11-30T20:23:16.105Z" }, - { url = "https://files.pythonhosted.org/packages/4b/9a/453255d2f769fe44e07ea9785c8347edaf867f7026872e76c1ad9f7bed92/rpds_py-0.30.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bdfdb946967d816e6adf9a3d8201bfad269c67efe6cefd7093ef959683c8de0", size = 414949, upload-time = "2025-11-30T20:23:17.539Z" }, - { url = "https://files.pythonhosted.org/packages/a3/31/622a86cdc0c45d6df0e9ccb6becdba5074735e7033c20e401a6d9d0e2ca0/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c77afbd5f5250bf27bf516c7c4a016813eb2d3e116139aed0096940c5982da94", size = 565790, upload-time = "2025-11-30T20:23:19.029Z" }, - { url = "https://files.pythonhosted.org/packages/1c/5d/15bbf0fb4a3f58a3b1c67855ec1efcc4ceaef4e86644665fff03e1b66d8d/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:61046904275472a76c8c90c9ccee9013d70a6d0f73eecefd38c1ae7c39045a08", size = 590217, upload-time = "2025-11-30T20:23:20.885Z" }, - { url = "https://files.pythonhosted.org/packages/6d/61/21b8c41f68e60c8cc3b2e25644f0e3681926020f11d06ab0b78e3c6bbff1/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c5f36a861bc4b7da6516dbdf302c55313afa09b81931e8280361a4f6c9a2d27", size = 555806, upload-time = "2025-11-30T20:23:22.488Z" }, - { url = "https://files.pythonhosted.org/packages/f9/39/7e067bb06c31de48de3eb200f9fc7c58982a4d3db44b07e73963e10d3be9/rpds_py-0.30.0-cp313-cp313t-win32.whl", hash = "sha256:3d4a69de7a3e50ffc214ae16d79d8fbb0922972da0356dcf4d0fdca2878559c6", size = 211341, upload-time = "2025-11-30T20:23:24.449Z" }, - { url = "https://files.pythonhosted.org/packages/0a/4d/222ef0b46443cf4cf46764d9c630f3fe4abaa7245be9417e56e9f52b8f65/rpds_py-0.30.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f14fc5df50a716f7ece6a80b6c78bb35ea2ca47c499e422aa4463455dd96d56d", size = 225768, upload-time = "2025-11-30T20:23:25.908Z" }, - { url = "https://files.pythonhosted.org/packages/86/81/dad16382ebbd3d0e0328776d8fd7ca94220e4fa0798d1dc5e7da48cb3201/rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0", size = 362099, upload-time = "2025-11-30T20:23:27.316Z" }, - { url = "https://files.pythonhosted.org/packages/2b/60/19f7884db5d5603edf3c6bce35408f45ad3e97e10007df0e17dd57af18f8/rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be", size = 353192, upload-time = "2025-11-30T20:23:29.151Z" }, - { url = "https://files.pythonhosted.org/packages/bf/c4/76eb0e1e72d1a9c4703c69607cec123c29028bff28ce41588792417098ac/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f251c812357a3fed308d684a5079ddfb9d933860fc6de89f2b7ab00da481e65f", size = 384080, upload-time = "2025-11-30T20:23:30.785Z" }, - { url = "https://files.pythonhosted.org/packages/72/87/87ea665e92f3298d1b26d78814721dc39ed8d2c74b86e83348d6b48a6f31/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac98b175585ecf4c0348fd7b29c3864bda53b805c773cbf7bfdaffc8070c976f", size = 394841, upload-time = "2025-11-30T20:23:32.209Z" }, - { url = "https://files.pythonhosted.org/packages/77/ad/7783a89ca0587c15dcbf139b4a8364a872a25f861bdb88ed99f9b0dec985/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e62880792319dbeb7eb866547f2e35973289e7d5696c6e295476448f5b63c87", size = 516670, upload-time = "2025-11-30T20:23:33.742Z" }, - { url = "https://files.pythonhosted.org/packages/5b/3c/2882bdac942bd2172f3da574eab16f309ae10a3925644e969536553cb4ee/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e7fc54e0900ab35d041b0601431b0a0eb495f0851a0639b6ef90f7741b39a18", size = 408005, upload-time = "2025-11-30T20:23:35.253Z" }, - { url = "https://files.pythonhosted.org/packages/ce/81/9a91c0111ce1758c92516a3e44776920b579d9a7c09b2b06b642d4de3f0f/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad", size = 382112, upload-time = "2025-11-30T20:23:36.842Z" }, - { url = "https://files.pythonhosted.org/packages/cf/8e/1da49d4a107027e5fbc64daeab96a0706361a2918da10cb41769244b805d/rpds_py-0.30.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b4dc1a6ff022ff85ecafef7979a2c6eb423430e05f1165d6688234e62ba99a07", size = 399049, upload-time = "2025-11-30T20:23:38.343Z" }, - { url = "https://files.pythonhosted.org/packages/df/5a/7ee239b1aa48a127570ec03becbb29c9d5a9eb092febbd1699d567cae859/rpds_py-0.30.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4559c972db3a360808309e06a74628b95eaccbf961c335c8fe0d590cf587456f", size = 415661, upload-time = "2025-11-30T20:23:40.263Z" }, - { url = "https://files.pythonhosted.org/packages/70/ea/caa143cf6b772f823bc7929a45da1fa83569ee49b11d18d0ada7f5ee6fd6/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0ed177ed9bded28f8deb6ab40c183cd1192aa0de40c12f38be4d59cd33cb5c65", size = 565606, upload-time = "2025-11-30T20:23:42.186Z" }, - { url = "https://files.pythonhosted.org/packages/64/91/ac20ba2d69303f961ad8cf55bf7dbdb4763f627291ba3d0d7d67333cced9/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ad1fa8db769b76ea911cb4e10f049d80bf518c104f15b3edb2371cc65375c46f", size = 591126, upload-time = "2025-11-30T20:23:44.086Z" }, - { url = "https://files.pythonhosted.org/packages/21/20/7ff5f3c8b00c8a95f75985128c26ba44503fb35b8e0259d812766ea966c7/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:46e83c697b1f1c72b50e5ee5adb4353eef7406fb3f2043d64c33f20ad1c2fc53", size = 553371, upload-time = "2025-11-30T20:23:46.004Z" }, - { url = "https://files.pythonhosted.org/packages/72/c7/81dadd7b27c8ee391c132a6b192111ca58d866577ce2d9b0ca157552cce0/rpds_py-0.30.0-cp314-cp314-win32.whl", hash = "sha256:ee454b2a007d57363c2dfd5b6ca4a5d7e2c518938f8ed3b706e37e5d470801ed", size = 215298, upload-time = "2025-11-30T20:23:47.696Z" }, - { url = "https://files.pythonhosted.org/packages/3e/d2/1aaac33287e8cfb07aab2e6b8ac1deca62f6f65411344f1433c55e6f3eb8/rpds_py-0.30.0-cp314-cp314-win_amd64.whl", hash = "sha256:95f0802447ac2d10bcc69f6dc28fe95fdf17940367b21d34e34c737870758950", size = 228604, upload-time = "2025-11-30T20:23:49.501Z" }, - { url = "https://files.pythonhosted.org/packages/e8/95/ab005315818cc519ad074cb7784dae60d939163108bd2b394e60dc7b5461/rpds_py-0.30.0-cp314-cp314-win_arm64.whl", hash = "sha256:613aa4771c99f03346e54c3f038e4cc574ac09a3ddfb0e8878487335e96dead6", size = 222391, upload-time = "2025-11-30T20:23:50.96Z" }, - { url = "https://files.pythonhosted.org/packages/9e/68/154fe0194d83b973cdedcdcc88947a2752411165930182ae41d983dcefa6/rpds_py-0.30.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:7e6ecfcb62edfd632e56983964e6884851786443739dbfe3582947e87274f7cb", size = 364868, upload-time = "2025-11-30T20:23:52.494Z" }, - { url = "https://files.pythonhosted.org/packages/83/69/8bbc8b07ec854d92a8b75668c24d2abcb1719ebf890f5604c61c9369a16f/rpds_py-0.30.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a1d0bc22a7cdc173fedebb73ef81e07faef93692b8c1ad3733b67e31e1b6e1b8", size = 353747, upload-time = "2025-11-30T20:23:54.036Z" }, - { url = "https://files.pythonhosted.org/packages/ab/00/ba2e50183dbd9abcce9497fa5149c62b4ff3e22d338a30d690f9af970561/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d08f00679177226c4cb8c5265012eea897c8ca3b93f429e546600c971bcbae7", size = 383795, upload-time = "2025-11-30T20:23:55.556Z" }, - { url = "https://files.pythonhosted.org/packages/05/6f/86f0272b84926bcb0e4c972262f54223e8ecc556b3224d281e6598fc9268/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5965af57d5848192c13534f90f9dd16464f3c37aaf166cc1da1cae1fd5a34898", size = 393330, upload-time = "2025-11-30T20:23:57.033Z" }, - { url = "https://files.pythonhosted.org/packages/cb/e9/0e02bb2e6dc63d212641da45df2b0bf29699d01715913e0d0f017ee29438/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a4e86e34e9ab6b667c27f3211ca48f73dba7cd3d90f8d5b11be56e5dbc3fb4e", size = 518194, upload-time = "2025-11-30T20:23:58.637Z" }, - { url = "https://files.pythonhosted.org/packages/ee/ca/be7bca14cf21513bdf9c0606aba17d1f389ea2b6987035eb4f62bd923f25/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d3e6b26f2c785d65cc25ef1e5267ccbe1b069c5c21b8cc724efee290554419", size = 408340, upload-time = "2025-11-30T20:24:00.2Z" }, - { url = "https://files.pythonhosted.org/packages/c2/c7/736e00ebf39ed81d75544c0da6ef7b0998f8201b369acf842f9a90dc8fce/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:626a7433c34566535b6e56a1b39a7b17ba961e97ce3b80ec62e6f1312c025551", size = 383765, upload-time = "2025-11-30T20:24:01.759Z" }, - { url = "https://files.pythonhosted.org/packages/4a/3f/da50dfde9956aaf365c4adc9533b100008ed31aea635f2b8d7b627e25b49/rpds_py-0.30.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:acd7eb3f4471577b9b5a41baf02a978e8bdeb08b4b355273994f8b87032000a8", size = 396834, upload-time = "2025-11-30T20:24:03.687Z" }, - { url = "https://files.pythonhosted.org/packages/4e/00/34bcc2565b6020eab2623349efbdec810676ad571995911f1abdae62a3a0/rpds_py-0.30.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe5fa731a1fa8a0a56b0977413f8cacac1768dad38d16b3a296712709476fbd5", size = 415470, upload-time = "2025-11-30T20:24:05.232Z" }, - { url = "https://files.pythonhosted.org/packages/8c/28/882e72b5b3e6f718d5453bd4d0d9cf8df36fddeb4ddbbab17869d5868616/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:74a3243a411126362712ee1524dfc90c650a503502f135d54d1b352bd01f2404", size = 565630, upload-time = "2025-11-30T20:24:06.878Z" }, - { url = "https://files.pythonhosted.org/packages/3b/97/04a65539c17692de5b85c6e293520fd01317fd878ea1995f0367d4532fb1/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3e8eeb0544f2eb0d2581774be4c3410356eba189529a6b3e36bbbf9696175856", size = 591148, upload-time = "2025-11-30T20:24:08.445Z" }, - { url = "https://files.pythonhosted.org/packages/85/70/92482ccffb96f5441aab93e26c4d66489eb599efdcf96fad90c14bbfb976/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dbd936cde57abfee19ab3213cf9c26be06d60750e60a8e4dd85d1ab12c8b1f40", size = 556030, upload-time = "2025-11-30T20:24:10.956Z" }, - { url = "https://files.pythonhosted.org/packages/20/53/7c7e784abfa500a2b6b583b147ee4bb5a2b3747a9166bab52fec4b5b5e7d/rpds_py-0.30.0-cp314-cp314t-win32.whl", hash = "sha256:dc824125c72246d924f7f796b4f63c1e9dc810c7d9e2355864b3c3a73d59ade0", size = 211570, upload-time = "2025-11-30T20:24:12.735Z" }, - { url = "https://files.pythonhosted.org/packages/d0/02/fa464cdfbe6b26e0600b62c528b72d8608f5cc49f96b8d6e38c95d60c676/rpds_py-0.30.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27f4b0e92de5bfbc6f86e43959e6edd1425c33b5e69aab0984a72047f2bcf1e3", size = 226532, upload-time = "2025-11-30T20:24:14.634Z" }, -] - [[package]] name = "rsa" version = "4.9.1" @@ -3296,15 +2912,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, ] -[[package]] -name = "soupsieve" -version = "2.8.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7b/ae/2d9c981590ed9999a0d91755b47fc74f74de286b0f5cee14c9269041e6c4/soupsieve-2.8.3.tar.gz", hash = "sha256:3267f1eeea4251fb42728b6dfb746edc9acaffc4a45b27e19450b676586e8349", size = 118627, upload-time = "2026-01-20T04:27:02.457Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl", hash = "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95", size = 37016, upload-time = "2026-01-20T04:27:01.012Z" }, -] - [[package]] name = "stack-data" version = "0.6.3" @@ -3400,18 +3007,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/af/df/c7891ef9d2712ad774777271d39fdef63941ffba0a9d59b7ad1fd2765e57/tiktoken-0.12.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f61c0aea5565ac82e2ec50a05e02a6c44734e91b51c10510b084ea1b8e633a71", size = 920667, upload-time = "2025-10-06T20:22:34.444Z" }, ] -[[package]] -name = "tinycss2" -version = "1.4.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "webencodings" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085, upload-time = "2024-10-24T14:58:29.895Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610, upload-time = "2024-10-24T14:58:28.029Z" }, -] - [[package]] name = "tokenizers" version = "0.22.2" @@ -3513,23 +3108,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/08/b7/f1e49be0e076c8ec981f1d4cea1f32da2bd754eaeaf6ed74d5add3f840b4/torchmetrics-0.10.3-py3-none-any.whl", hash = "sha256:b12cf92897545e24a825b0d168888c0f3052700c2901e2d4f7d90b252bc4a343", size = 529740, upload-time = "2022-11-16T18:15:16.597Z" }, ] -[[package]] -name = "tornado" -version = "6.5.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f8/f1/3173dfa4a18db4a9b03e5d55325559dab51ee653763bb8745a75af491286/tornado-6.5.5.tar.gz", hash = "sha256:192b8f3ea91bd7f1f50c06955416ed76c6b72f96779b962f07f911b91e8d30e9", size = 516006, upload-time = "2026-03-10T21:31:02.067Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/59/8c/77f5097695f4dd8255ecbd08b2a1ed8ba8b953d337804dd7080f199e12bf/tornado-6.5.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:487dc9cc380e29f58c7ab88f9e27cdeef04b2140862e5076a66fb6bb68bb1bfa", size = 445983, upload-time = "2026-03-10T21:30:44.28Z" }, - { url = "https://files.pythonhosted.org/packages/ab/5e/7625b76cd10f98f1516c36ce0346de62061156352353ef2da44e5c21523c/tornado-6.5.5-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:65a7f1d46d4bb41df1ac99f5fcb685fb25c7e61613742d5108b010975a9a6521", size = 444246, upload-time = "2026-03-10T21:30:46.571Z" }, - { url = "https://files.pythonhosted.org/packages/b2/04/7b5705d5b3c0fab088f434f9c83edac1573830ca49ccf29fb83bf7178eec/tornado-6.5.5-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e74c92e8e65086b338fd56333fb9a68b9f6f2fe7ad532645a290a464bcf46be5", size = 447229, upload-time = "2026-03-10T21:30:48.273Z" }, - { url = "https://files.pythonhosted.org/packages/34/01/74e034a30ef59afb4097ef8659515e96a39d910b712a89af76f5e4e1f93c/tornado-6.5.5-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:435319e9e340276428bbdb4e7fa732c2d399386d1de5686cb331ec8eee754f07", size = 448192, upload-time = "2026-03-10T21:30:51.22Z" }, - { url = "https://files.pythonhosted.org/packages/be/00/fe9e02c5a96429fce1a1d15a517f5d8444f9c412e0bb9eadfbe3b0fc55bf/tornado-6.5.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3f54aa540bdbfee7b9eb268ead60e7d199de5021facd276819c193c0fb28ea4e", size = 448039, upload-time = "2026-03-10T21:30:53.52Z" }, - { url = "https://files.pythonhosted.org/packages/82/9e/656ee4cec0398b1d18d0f1eb6372c41c6b889722641d84948351ae19556d/tornado-6.5.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:36abed1754faeb80fbd6e64db2758091e1320f6bba74a4cf8c09cd18ccce8aca", size = 447445, upload-time = "2026-03-10T21:30:55.541Z" }, - { url = "https://files.pythonhosted.org/packages/5a/76/4921c00511f88af86a33de770d64141170f1cfd9c00311aea689949e274e/tornado-6.5.5-cp39-abi3-win32.whl", hash = "sha256:dd3eafaaeec1c7f2f8fdcd5f964e8907ad788fe8a5a32c4426fbbdda621223b7", size = 448582, upload-time = "2026-03-10T21:30:57.142Z" }, - { url = "https://files.pythonhosted.org/packages/2c/23/f6c6112a04d28eed765e374435fb1a9198f73e1ec4b4024184f21faeb1ad/tornado-6.5.5-cp39-abi3-win_amd64.whl", hash = "sha256:6443a794ba961a9f619b1ae926a2e900ac20c34483eea67be4ed8f1e58d3ef7b", size = 448990, upload-time = "2026-03-10T21:30:58.857Z" }, - { url = "https://files.pythonhosted.org/packages/b7/c8/876602cbc96469911f0939f703453c1157b0c826ecb05bdd32e023397d4e/tornado-6.5.5-cp39-abi3-win_arm64.whl", hash = "sha256:2c9a876e094109333f888539ddb2de4361743e5d21eece20688e3e351e4990a6", size = 448016, upload-time = "2026-03-10T21:31:00.43Z" }, -] - [[package]] name = "tqdm" version = "4.67.1" @@ -3738,15 +3316,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, ] -[[package]] -name = "webencodings" -version = "0.5.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721, upload-time = "2017-04-05T20:21:34.189Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774, upload-time = "2017-04-05T20:21:32.581Z" }, -] - [[package]] name = "websockets" version = "16.0" From c7351dd3c3bc309421648c7329ccbc3219588080 Mon Sep 17 00:00:00 2001 From: hao <97079365+tanhaow@users.noreply.github.com> Date: Fri, 17 Apr 2026 11:39:31 -0400 Subject: [PATCH 09/10] Fix ruff config per review feedback - Change extend-exclude to notebooks/*.py (more precise) - Remove per-file-ignores section for notebooks (redundant when excluded) --- pyproject.toml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 3a9d966..9194bfc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,7 +57,7 @@ target-version = "py312" # Configure src path so ruff import fixes can identify local imports src = [ "src" ] # Ignore notebooks — marimo notebooks are not linted -extend-exclude = [ "notebooks/" ] +extend-exclude = [ "notebooks/*.py" ] [tool.ruff.lint] # Include these rules in addition to ruff's defaults @@ -75,10 +75,6 @@ extend-select = [ # Can use to ignore specific rules within above selection ignore = [] -[tool.ruff.lint.per-file-ignores] -# Notebooks use typographic Unicode in markdown strings intentionally -"notebooks/*.py" = ["RUF001"] - [tool.marimo.display] cell_output = "below" theme = "system" # honor user preference, including in static html exports From 5811462d98b9b2884eb720bca4f8a51a5fa018ca Mon Sep 17 00:00:00 2001 From: hao <97079365+tanhaow@users.noreply.github.com> Date: Fri, 17 Apr 2026 12:54:45 -0400 Subject: [PATCH 10/10] Drop madlad from sentence corpus per review feedback madlad was replaced by TranslateGemma in our working set of models. --- notebooks/mt_browser.py | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/notebooks/mt_browser.py b/notebooks/mt_browser.py index 7a9e81a..77a656a 100644 --- a/notebooks/mt_browser.py +++ b/notebooks/mt_browser.py @@ -55,11 +55,10 @@ def _(pathlib): def _(DATA_DIR, pl): # Load full sentence translations and join with eval scores. # Uses the complete notion-sents corpus (all Notion concepts), not the annotation subset. - # Note: madlad does not have eval scores. _sents_meta = pl.concat( [ pl.read_ndjson(DATA_DIR / f"notion-sents/mt-sents-{m}.jsonl") - for m in ["google_tllm", "hymt", "gemma", "madlad"] + for m in ["google_tllm", "hymt", "gemma"] ] ) _sents_scores = pl.concat( @@ -101,7 +100,9 @@ def _(DATA_DIR, pl): @app.cell def _(mo): - mo.md("## 1. Sentence translations") + mo.md(""" + ## 1. Sentence translations + """) return @@ -110,11 +111,14 @@ def _(pl, sents_df): sents_df.filter(pl.col("src_lang") != "en").select( ["pair_id", "model", "src_lang", "tr_lang", "chrf", "comet", "cometkiwi", "src_text", "ref_text", "tr_text"] ) + return @app.cell def _(mo): - mo.md("## 2. Sentence backtranslations") + mo.md(""" + ## 2. Sentence backtranslations + """) return @@ -123,11 +127,14 @@ def _(pl, sents_df): sents_df.filter(pl.col("src_lang") == "en").select( ["pair_id", "model", "src_lang", "tr_lang", "chrf", "comet", "cometkiwi", "src_text", "ref_text", "tr_text"] ) + return @app.cell def _(mo): - mo.md("## 3. Paragraph translations") + mo.md(""" + ## 3. Paragraph translations + """) return @@ -136,11 +143,14 @@ def _(pars_df, pl): pars_df.filter(pl.col("src_lang") != "en").select( ["pair_id", "model", "src_lang", "tr_lang", "chrf", "comet", "cometkiwi", "src_text", "ref_text", "tr_text"] ) + return @app.cell def _(mo): - mo.md("## 4. Paragraph backtranslations") + mo.md(""" + ## 4. Paragraph backtranslations + """) return @@ -149,6 +159,7 @@ def _(pars_df, pl): pars_df.filter(pl.col("src_lang") == "en").select( ["pair_id", "model", "src_lang", "tr_lang", "chrf", "comet", "cometkiwi", "src_text", "ref_text", "tr_text"] ) + return if __name__ == "__main__":