EthanHarwood97/ai-model-tracker:自托管多源 AI 模型评测追踪工具
EthanHarwood97/ai-model-tracker
EthanHarwood97/ai-model-tracker 是一个自托管多源 AI 模型证据追踪器,抓取公开榜单并按 Research、轻量智能体、通用编码、UI 编码、复杂代码四类角色分别给出推荐,预测分、model-index 分与 Coding Agent 实测数据分开保存。
Self-hosted, multi-source tracker for AI model evidence. Polls public leaderboards, keeps benchmark types separate, and produces four role-specific recommendations:
- Research / lightweight agent
- General coder
- UI coder
- Complex code
Predicted scores, model-index scores, and Coding Agent measurements are kept separate. The aggregate meta score remains available as a coverage summary, but it is not used as a substitute for a role recommendation.
Runs on Windows with only httpx + fastapi + uvicorn. Data lives in a
single SQLite file with per-source snapshots and a change log.
Running online (GitHub Actions + Pages, $0)
This repo is set up to run itself in the cloud — no local machine needed:
.github/workflows/track.ymlrunspython -m model_tracker.cli publishevery 30 minutes on GitHub's free runners (public repos get unlimited minutes).- Each run fetches all sources fresh, rebuilds history from
snapshots/*.json, diffs against the previous snapshot (NEW/updated/removed events), computes scores, and commits:snapshots/<source>/<ts>.json— full per-source history, written only when data actually changed (git-friendly, diffable)docs/— static dashboard (same UI as local, loadsdata.json)
- GitHub Pages serves
docs/from themainbranch athttps://<you>.github.io/ai-model-tracker/. - Push notifications on NEW models: set
alerts.webhook_urlinconfig.jsonto an ntfy.sh topic URL (e.g.https://ntfy.sh/your-random-topic), then install the ntfy app. Pick an unguessable topic name — the repo is public.
Manual trigger: gh workflow run track.yml (or the Actions tab → Run workflow).
Local usage still works exactly as before; publish uses a separate
data/publish.db so local and cloud histories never collide.
Quick start
python -m model_tracker.cli run-once # scrape everything once + print summary python -m model_tracker.cli serve # scheduler + dashboard on http://127.0.0.1:8137 python -m model_tracker.cli summary # print latest scores from the db python -m model_tracker.cli scrape lmarena --verbose # debug one source # or: .\run.ps1
On first run the AA scrapers are self-verified against known-good values
(see scripts/verify_aa.py). The first run-once takes ~4 min (HF datasets
server index warm-up); everything is disk-cached afterwards.
Dashboard views
- Role recommendations – four recommendations with evidence, confidence, projected OpenCode-turn cost, and warnings.
- Evidence explorer – one model list with measured Coding Agent results, model-index signals, benchmark support, and predictions labelled separately.
- Coding evidence – AA Coding Agent measurements, benchmark task cost, and wall time. Unrelated benchmark scores are not promoted into this list.
- Value (separate bases) – benchmark task value and token-price value are separate datasets; neither treats $/Mtok as $/task.
- Change Log – new / updated / removed entries across all sources.
- Sources – per-source health, last run, consecutive errors (auto-pauses after 4 failures).
Evidence and recommendation design
Every source row is assigned an evidence lane before it can affect a score. The important distinction is between an actual benchmark measurement and a supporting signal:
| Evidence lane | Examples | Used for |
|---|---|---|
| Coding Agent | AA Coding Agent leaderboard | General coder and complex code |
| Coding support | LiveBench coding, SWE-bench, Aider, EvalPlus | Supporting evidence |
| Agentic / tool use | Terminal-Bench, DeepSWE, BFCL | Research and complex-code evidence |
| Visual / frontend | LMArena vision and WebDev boards | UI coder |
| Intelligence / reasoning | AA Intelligence, LiveBench reasoning | Research and supporting evidence |
Repeated rows from one benchmark are aggregated before they contribute. A singleton benchmark cohort is treated as missing evidence rather than being given a synthetic score of 50. Every recommendation carries its measurement type, evidence coverage, source names, and warnings.
The role profiles and OpenCode workload are configured in config.json.
The default workload uses 120k input tokens and 8k output tokens per turn.
Token price and benchmark task cost are never placed in the same price tier.
The EST estimator
CodingAgentIndex ≈ 0.01417 × IntelligenceIndex − 0.2089(r = 0.898)- cross-check:
≈ 0.01206 × codingIndex − 0.3022(r = 0.883) - both regressions are recomputed live from current matched pairs as a diagnostic; config values are canonical.
- matching rules: harness prefix stripped, effort suffix extracted, "Fallback" names excluded unless the coding entry says "(with fallback)", exact-effort variant required, non-estimated variants preferred.
- family adjustments apply only to predictions. Observed Coding Agent and model-index values are never changed by a family heuristic.
- estimates above the regression's training range are capped at 75 points and
flagged
extrapolatedwith a wider ±10-point band. - validation: Qwen3.8 Max predicted 0.614 → actual 0.587.
Sources (verified live 2026-08-13)
| Source | Endpoint | Notes |
|---|---|---|
| AA Coding Agents | artificialanalysis.ai/agents/coding-agents |
RSC payload in HTML, regex window extraction; KNOWN-GOOD sanity-checked |
| AA Models | artificialanalysis.ai/leaderboards/models |
4.8 MB HTML, ~600 models |
| AA Changelog | artificialanalysis.ai/changelog |
new-article signal |
| LMArena | lmarena.ai/leaderboard |
Elo entries embedded in RSC payload (11 arenas) |
| LiveBench | livebench.ai/table_2026_06_25.csv + categories_*.json |
release date auto-discovered from site JS |
| SWE-bench | swebench.com |
<script id="leaderboard-data"> JSON, resolve-rate computed from per-instance details |
| aider polyglot | aider.chat/docs/leaderboards/ |
HTML table parse |
| EvalPlus | evalplus.github.io/results.json |
HumanEval+/MBPP+ pass@1 mean |
| HF Open LLM | datasets-server open-llm-leaderboard/contents |
chat + pretrained rows, flagged filtered, top 300 |
| OpenRouter | openrouter.ai/api/v1/models |
pricing / context / created (market data, no score) |
| DeepSeek official | api-docs.deepseek.com/quick_start/pricing |
first-party peak/off-peak pricing (market data) |
| Terminal-Bench | tbench.ai |
accuracy JSON embedded in RSC payload |
| DeepSWE | deepswe.datacurve.ai/artifacts/v1/leaderboard.json |
task pass-any rate, CIs, cost |
| BFCL (Gorilla) | gorilla.cs.berkeley.edu/data_overall.csv |
tool-use (informational, not in composite weights) |
Scale SEAL is disabled by default (scale_seal.enabled=false) — its data is
loaded client-side from an undiscoverable endpoint; re-enable after wiring a
source module in model_tracker/sources/.
All sources are best-effort: 403/429 → exponential backoff with jitter; repeated failures pause the source (resume after 4× interval); everything is cached on disk per-URL. Personal use — respect each site's ToS.
Prior analysis findings (live in dashboard)
- Value king: Codex - GPT-5.6 Luna (max) 0.587 @ $0.31/task (raw ratio king: DeepSeek V4 Flash at $0.07/task).
- Best workhorses: Grok 4.5 (high) 0.644 @ $2.59; GPT-5.6 Terra (max) 0.623 @ $2.21.
- OpenRouter: pass-through pricing + 5.5% credit fee, no volume discounts, not AA-benchmarked, worse prompt-caching for agents; direct providers (DeepSeek official, DeepInfra, CoreWeave, Novita, Cerebras, Groq) are usually cheaper/faster. First-party for closed frontier models.
- DeepSeek repriced 2026-08-16 (16:00 UTC): flat rates replaced by
peak/off-peak billing. V4 Pro went from $0.435/$0.87 (in/out) to
$0.66/$1.98 off-peak and $1.32/$3.96 at peak (01:00–04:00 and
06:00–10:00 UTC) — up to 4.55× on output, 12× on cache hits. Third-party
hosts lagged the change; the
deepseeksource tracks the official rates.
Layout
model_tracker/
aa.py AA page parsers (proven regex-window extraction)
http.py fetch + retry/backoff + disk cache
store.py SQLite snapshots / rows / changes / scores
normalize.py model identity resolution (family+version canon keys)
estimator.py EST regressions, matching rules, outlier adjustments
composite.py evidence lanes, benchmark aggregation, meta summary
recommendations.py role-specific scoring and OpenCode cost model
validation.py fail-closed source snapshot validation
engine.py orchestration: scrape → diff → estimate → score → alert
scheduler.py per-source threads, jitter, backoff, pause
alerts.py console banner + Windows toast
web.py FastAPI dashboard API
cli.py run-once / serve / summary / scrape
static/ dashboard UI (vanilla JS, sortable tables)
config.json weights, intervals, EST params, workloads, alerts
tests/ replayable scoring, recommendation, and source validation tests
scripts/verify_aa.py KNOWN-GOOD regression check for the AA scrapers
data/ tracker.db + http cache (gitignored)
Config knobs (config.json)
weights– composite category weightsnormalization.mode–minmax(default) orpercentileest.*– regression coefficients, ±band, cap, agreement thresholdworkloads.opencode_turn– token assumptions and per-role budgetssources.<name>.interval_min/.enabledalerts.desktop_toast/console_banner/max_consecutive_errorsknown_underperform/known_overperform– family adjustment lists
来源:GitHub · github.com