2.8 KiB
2.8 KiB
name, description
| name | description |
|---|---|
| aa-chart-model-score-extraction | Extract per-model benchmark scores from artificialanalysis.ai pages: charts are client-rendered Recharts SVGs; zip label-list texts to foreignObject names by x-sorted index, validate chart identity against the page's published top-3 sentence, apply Elo/Omniscience normalization laws, seed frank-intelligence-bench aa-scores.yml. |
Extract AI benchmark scores for a specific model from artificialanalysis.ai. Per-model per-eval numbers are NOT in SSR HTML (JS charts, API needs key); eval-page SSR text DOES carry the top-3 sentence.
Procedure (validated 5x on this repo's model pages)
browser.open({ name, url: "https://artificialanalysis.ai/models/<slug>", wait_until: "domcontentloaded" }), then scroll in ~6 steps (0.15..0.9 of scrollHeight, ~1.3 s pauses) — charts lazy-render.- Extract each chart: pair
g.recharts-label-list text(values, takexattr) withforeignObject div(model names, x from parentg[transform] translate(x,y)). Sort both lists by x and zip by index — NOT nearest-x (nearest-x is off by one bar; index-zip matches published tops exactly). - Self row: match name loosely (
Qwen3.8-Flash-Nexthas hyphens — test both forms).
Identity law (never ship an order-guessed chart→eval mapping)
- Model pages have ~14 charts, 18 eval cards; DOM order and geometry pairing BOTH proved ambiguous.
- Anchor every chart by its top-3 names/values vs the eval page's published sentence:
https://artificialanalysis.ai/evaluations/<slug>body text: "X scores the highest on with a score of N%, followed by …". Regex must tolerate decimals: value pattern(-?[\\d.]+%?); build page scripts withString.raw(bun template literals eat\\d). - A chart's
selfvalue on the MODEL page is page-local → trustworthy once the top-3 anchor confirms the eval (e.g. AA-LCR: Kimi 88.7 → chart top "Kimi K3 (max)=89").
Normalization laws (frank-intelligence-bench aa-scores.yml)
- Elo evals (AA-Briefcase, GDPval-AA): store
(Elo−500)/2000×100(1866 → 68.3), AA's published normalization. - AA-Omniscience: score = Accuracy (w10) + 1−Hallucination (w5), both 0–100 → composite
(10·acc + 5·nonhall)/15. NEVER feed the −100..100 Index chart value (pre-fix cost ~7 pts; calibration then reproduces AA's official index ±0.6: Flash-Next 39.85≈40, Haiku 43.4≈43, 27B 33.85≈34, 3.6-27B 21.55≈21). - Every seeded row:
source_url+fetched_at+index_version.
Seed + validate loop
Append model block to config/references/aa-scores.yml (block-insert via python string replace on the - name: <anchor> line — beware: dropping rows from a block loses the 2-space indent on the anchor line; verify with yaml.safe_load), then bun -e loadAaRefs parse-check, bun src/cli.ts report $RID, calibration check (full-row models: lite vs AA official), bun test, commit.