diff --git a/.gitea/workflows/pages.yml b/.gitea/workflows/pages.yml index 1d263ca..9b139f2 100644 --- a/.gitea/workflows/pages.yml +++ b/.gitea/workflows/pages.yml @@ -26,8 +26,20 @@ jobs: - name: Stage markdown copy run: cp MODELS.md site/MODELS.md + - name: Ensure Pages project exists + env: + CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} + CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + # Idempotent: creates the project on first run, no-ops afterwards. + run: npx wrangler pages project create opencodogoevals || echo "project already exists" + - name: Deploy to Cloudflare Pages env: CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} - run: npx wrangler pages deploy site --project-name opencodogoevals --branch main --commit-hash ${{ gitea.sha }} + run: | + npx wrangler pages deploy site \ + --project-name opencodogoevals \ + --branch main \ + --commit-hash "${{ gitea.sha }}" \ + --commit-message "${{ gitea.event.head_commit.message }}" diff --git a/README.md b/README.md index 11f8c2f..14b6b8e 100644 --- a/README.md +++ b/README.md @@ -49,13 +49,21 @@ Add these as repository secrets (Gitea: *Settings → Actions → Secrets*): | `CLOUDFLARE_API_TOKEN` | Cloudflare API token with **Cloudflare Pages: Edit** (and Account Settings: Read) | | `CLOUDFLARE_ACCOUNT_ID` | The Cloudflare account that owns the Pages project | -The workflow in `.gitea/workflows/pages.yml` then deploys `site/` on every push to `main`. +The workflow in `.gitea/workflows/pages.yml` then: + +1. checks out the repo and installs Wrangler, +2. stages `MODELS.md` next to the site, +3. creates the Pages project if it does not exist yet (idempotent), +4. deploys `site/` on every push to `main`, on a manual *Run workflow*, and hourly. + +A runner must be registered on the Gitea instance for the workflow to execute. ### 3. Deploy manually (optional) ```bash -npm run deploy # wrangler pages deploy site --project-name opencodogoevals -npm run dev # local preview on http://localhost:8788 +./scripts/deploy.sh # uses env vars or your wrangler login session +npm run deploy # same thing, wrangler only +npm run dev # local preview on http://localhost:8788 ``` ### Custom domain @@ -70,13 +78,13 @@ Cloudflare-compatible local server. ## Updating the data -1. Benchmark scores come from each model's Artificial Analysis page - (`https://artificialanalysis.ai/models/`) — the embedded JSON payload in the page - contains the full evaluation set per model. -2. Catalog facts (pricing, context window, modalities, release date) come from - `https://opencode.ai/data//.json` and the Go docs. -3. Edit `site/assets/evals.js` and `site/assets/data.js`, then regenerate `MODELS.md` - from `data.js` and re-commit. +1. `node scripts/refresh-evals.mjs` re-scrapes every model's benchmark scores from + Artificial Analysis and rewrites `site/assets/evals.js`. Model names, OpenCode Go + prices and free-tier flags come from `site/assets/data.js` (hand-maintained from the + Go docs), so the chart always shows Go pricing. +2. Descriptions, modalities, release dates and caveats live in `site/assets/data.js`; + update them there and regenerate `MODELS.md`. +3. Commit both files — CI publishes the site on push. ## Caveats diff --git a/package.json b/package.json index 0c85114..1a589b4 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "type": "module", "scripts": { "dev": "wrangler pages dev site --port 8788", - "deploy": "wrangler pages deploy site --project-name opencodegoevals --branch main", + "deploy": "./scripts/deploy.sh", + "deploy:pages": "wrangler pages deploy site --project-name opencodogoevals --branch main", "project:create": "wrangler pages project create opencodogoevals" }, "devDependencies": { diff --git a/scripts/deploy.sh b/scripts/deploy.sh new file mode 100755 index 0000000..1a2f1d9 --- /dev/null +++ b/scripts/deploy.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +# Manual deploy to Cloudflare Pages (same steps the CI workflow runs). +# +# Requires either: +# - CLOUDFLARE_API_TOKEN + CLOUDFLARE_ACCOUNT_ID exported in the environment, or +# - an existing `wrangler login` session (~/.wrangler/config/default.toml) +set -euo pipefail + +cd "$(dirname "$0")/.." + +PROJECT="${CLOUDFLARE_PAGES_PROJECT:-opencodogoevals}" + +echo "==> staging site/" +cp MODELS.md site/MODELS.md + +if [ ! -d node_modules/wrangler ]; then + echo "==> installing wrangler" + npm install --no-save wrangler@^4 +fi + +echo "==> ensuring Pages project '$PROJECT' exists" +npx wrangler pages project create "$PROJECT" || echo " (project already exists)" + +echo "==> deploying" +npx wrangler pages deploy site \ + --project-name "$PROJECT" \ + --branch main \ + --commit-dirty=true + +echo "==> done: https://$PROJECT.pages.dev" diff --git a/scripts/refresh-evals.mjs b/scripts/refresh-evals.mjs new file mode 100644 index 0000000..9bee193 --- /dev/null +++ b/scripts/refresh-evals.mjs @@ -0,0 +1,179 @@ +#!/usr/bin/env node +// Regenerates site/assets/evals.js from live sources. +// +// node scripts/refresh-evals.mjs +// +// Sources +// - Artificial Analysis model pages (https://artificialanalysis.ai/models/) +// The benchmark payload is embedded in the page as React Server Component flight data. +// - OpenCode Data model JSON (https://opencode.ai/data//.json) +// for context windows and OpenCode Go list prices. +// +// Usage of the AI slug differs slightly from the OpenCode Go model id, so they are +// mapped explicitly below. + +import { writeFileSync } from "node:fs"; +import { GO_MODELS } from "../site/assets/data.js"; +import { dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), ".."); +const UA = + "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126 Safari/537.36"; + +// go model id -> { aa: artificial analysis slug, od: opencode data path } +const MODELS = { + "minimax-m3.1-flash-free": { aa: "minimax-m3-1-flash", od: "minimax/minimax-m3-1-flash" }, + "gemini-4-argon-contributor": { aa: "gemini-4-argon", od: "google/gemini-4-argon" }, + "claude-haiku-5-5": { aa: "claude-haiku-5-5", od: "anthropic/claude-haiku-5-5" }, + "beam-free": { aa: "reflection-beam", od: "reflection/beam" }, + // No Artificial Analysis entry for these two yet — they stay empty rather than + // borrowing a different model's numbers (LongCat 2.0 / Hy3 are not LongCat 2.5 / Hy4). + "longcat-2.5-preview-free": { aa: null, od: "meituan/longcat-2-5-preview" }, + "mimo-v2.6-pro": { aa: "mimo-v2-6-pro", od: "xiaomi/mimo-v2-6-pro" }, + "gpt-6-luna": { aa: "gpt-6-luna", od: "openai/gpt-6-luna" }, + "grok-4.7": { aa: "grok-4-7", od: "xai/grok-4-7" }, + "step-5-preview": { aa: "step-5", od: "stepfun/step-5-preview" }, + "deepseek-v4.1-flash": { aa: "deepseek-v4-1-flash", od: "deepseek/deepseek-v4-1-flash" }, + "muse-spark-1.3-contributor": { aa: "muse-spark-1-3", od: "meta/muse-spark-1-3-contributor" }, + "hy4-preview": { aa: null, od: "tencent/hy4-preview" }, + "qwen3.8-flash": { aa: "qwen3-8-flash-next", od: "alibaba/qwen3-8-flash" }, + "glm-5.3-flash": { aa: "glm-5-3-flash", od: "zhipuai/glm-5-3-flash" }, + "glm-5.3": { aa: "glm-5-3", od: "zhipuai/glm-5-3" }, + "qwen3.8-max": { aa: "qwen3-8-max", od: "alibaba/qwen3-8-max" }, + "kimi-k3": { aa: "kimi-k3", od: "moonshotai/kimi-k3" }, + "kimi-k2.7-code": { aa: "kimi-k2-7-code", od: "moonshotai/kimi-k2-7-code" }, + "qwen3.7-plus": { aa: "qwen3-7-plus", od: "alibaba/qwen3-7-plus" }, + "minimax-m3": { aa: "minimax-m3", od: "minimax/minimax-m3" }, + "deepseek-v4-pro": { aa: "deepseek-v4-pro", od: "deepseek/deepseek-v4-pro" }, + "mimo-v2.5-pro": { aa: "mimo-v2-5-pro", od: "xiaomi/mimo-v2-5-pro" }, + "mimo-v2.5": { aa: "mimo-v2-5-0424", od: "xiaomi/mimo-v2-5" } +}; + +const pct = (v) => (v === null || v === undefined ? null : Math.round(v * 1000) / 10); + +/* --- Artificial Analysis page parsing ------------------------------------ */ +function flightPayload(html) { + const parts = []; + const re = /self\.__next_f\.push\(\[1,"/g; + let m; + while ((m = re.exec(html))) { + const start = re.lastIndex; + const end = html.indexOf('"])', start); + if (end < 0) continue; + try { + parts.push(JSON.parse('"' + html.slice(start, end).replace(/\\\//g, "/") + '"')); + } catch { + /* ignore chunk */ + } + } + return parts.join(""); +} + +function extractModelObjects(html) { + const payload = flightPayload(html); + const out = {}; + const re = /"slug":"/g; + let m; + while ((m = re.exec(payload))) { + const start = payload.lastIndexOf('{"id":"', m.index); + if (start < 0) continue; + let depth = 0, inStr = false, esc = false, k = start; + for (k = start; k < payload.length; k++) { + const c = payload[k]; + if (esc) { esc = false; continue; } + if (c === "\\") { esc = true; continue; } + if (c === '"') { inStr = !inStr; continue; } + if (inStr) continue; + if (c === "{") depth++; + else if (c === "}") { depth--; if (depth === 0) { k++; break; } } + } + let obj; + try { obj = JSON.parse(payload.slice(start, k)); } catch { continue; } + if (obj && obj.slug && obj.intelligenceIndex != null) out[obj.slug] = obj; + } + return out; +} + +async function fetchAA(slug) { + const res = await fetch(`https://artificialanalysis.ai/models/${slug}`, { headers: { "user-agent": UA } }); + if (!res.ok) return null; + const models = extractModelObjects(await res.text()); + return models[slug] || null; +} + +async function fetchOD(path) { + try { + const res = await fetch(`https://opencode.ai/data/${path}.json`); + if (!res.ok) return null; + return (await res.json()).model; + } catch { + return null; + } +} + +/* --- build ---------------------------------------------------------------- */ +// Names, OpenCode Go list prices and free-tier flags come from site/assets/data.js +// (hand-maintained from the OpenCode Go docs), so the chart always shows Go pricing +// rather than the provider's public list price. +const CATALOG = Object.fromEntries(GO_MODELS.map((m) => [m.id, m])); + +const rows = []; +for (const [id, { aa, od }] of Object.entries(MODELS)) { + const [aaModel, odModel] = await Promise.all([aa ? fetchAA(aa) : null, fetchOD(od)]); + if (!aaModel) { + console.warn(` ! no Artificial Analysis entry for ${id}${aa ? ` (slug ${aa})` : ""} — left empty`); + const cat = CATALOG[id]; + rows.push({ + id, n: cat?.name || odModel?.name || id, lab: cat?.lab || odModel?.labName || "", + free: cat ? !!cat.free : !(odModel?.priceUsdPer1M?.input), + pi: cat?.price?.in ?? odModel?.priceUsdPer1M?.input ?? 0, + po: cat?.price?.out ?? odModel?.priceUsdPer1M?.output ?? 0, ii: null, + fc: null, scicode: null, tb21: null, tb40: null, tbh: null, tau2: null, taub: null, apex: null, + analyst: null, auto: null, gpqa: null, critpt: null, hle: null, lcr: null, ifbench: null, + mmmu: null, gdpv: null, gdppdf: null, ctx: odModel?.contextTokens ?? 1048576 + }); + continue; + } + const cat = CATALOG[id]; + const price = cat?.price || odModel?.priceUsdPer1M || {}; + const ctx = odModel?.contextTokens ?? aaModel.contextWindowTokens ?? 1048576; + const free = cat ? !!cat.free : !(odModel?.priceUsdPer1M?.input); + rows.push({ + id, + n: cat?.name || aaModel.name, + lab: cat?.lab || odModel?.labName || aaModel.name, + free, + pi: price.in ?? price.input ?? 0, + po: price.out ?? price.output ?? 0, + ii: Math.round(aaModel.intelligenceIndex * 10) / 10, + fc: pct(aaModel.frontierCode), + scicode: pct(aaModel.scicode), + tb21: pct(aaModel.terminalBench21), + tb40: pct(aaModel.terminalBench40), + tbh: pct(aaModel.terminalbenchHard), + tau2: pct(aaModel.tau2), + taub: pct(aaModel.tauBanking), + apex: pct(aaModel.apexAgents), + analyst: pct(aaModel.analystAgent), + auto: pct(aaModel.automationBenchPartialScore), + gpqa: pct(aaModel.gpqa), + critpt: pct(aaModel.critpt), + hle: pct(aaModel.hle), + lcr: pct(aaModel.lcr), + ifbench: pct(aaModel.ifbench), + mmmu: pct(aaModel.mmmuPro), + gdpv: pct(aaModel.gdpvalNormalized), + gdppdf: pct(aaModel.gdpPdfAllPass), + ctx + }); + console.log(` + ${id} (index ${rows.at(-1).ii})`); +} + +const header = `// Evaluation data scraped from Artificial Analysis model pages (single consistent harness). +// Values are already scaled to 0-100. Regenerate with: node scripts/refresh-evals.mjs +export const RAW = [ +`; +const body = rows.map((r) => " " + JSON.stringify(r)).join(",\n"); +writeFileSync(resolve(ROOT, "site/assets/evals.js"), header + body + "\n];\n"); +console.log(`\nwrote site/assets/evals.js with ${rows.length} models`); diff --git a/site/assets/evals.js b/site/assets/evals.js index f92b9f5..1c372d0 100644 --- a/site/assets/evals.js +++ b/site/assets/evals.js @@ -1,27 +1,27 @@ // Evaluation data scraped from Artificial Analysis model pages (single consistent harness). -// Values are already scaled to 0-100. Retrieved 2026-10-21. +// Values are already scaled to 0-100. Regenerate with: node scripts/refresh-evals.mjs export const RAW = [ - {id:"minimax-m3.1-flash-free",n:"MiniMax M3.1 Flash Free",lab:"MiniMax",free:true,pi:0,po:0,ii:42.7,fc:38.6,scicode:53.4,tb21:null,tb40:25.8,tbh:null,tau2:null,taub:null,apex:null,analyst:null,auto:72.5,gpqa:null,critpt:22.3,hle:48.0,lcr:79.7,ifbench:null,mmmu:79.1,gdpv:47.9,gdppdf:20.8,ctx:1048576}, - {id:"gemini-4-argon-contributor",n:"Gemini 4 Argon Contributor",lab:"Google",pi:4,po:20,ii:52.6,fc:43.5,scicode:61.8,tb21:null,tb40:57.1,tbh:null,tau2:null,taub:null,apex:null,analyst:48.7,auto:77.5,gpqa:null,critpt:27.1,hle:57.1,lcr:79.7,ifbench:null,mmmu:null,gdpv:56.2,gdppdf:21.8,ctx:1048576}, - {id:"claude-haiku-5-5",n:"Claude Haiku 5.5",lab:"Anthropic",pi:0.1,po:0.5,ii:43.4,fc:41.8,scicode:55.0,tb21:null,tb40:32.8,tbh:null,tau2:null,taub:null,apex:null,analyst:53.8,auto:35.4,gpqa:null,critpt:18.9,hle:44.4,lcr:82.7,ifbench:null,mmmu:null,gdpv:55.9,gdppdf:20.8,ctx:1000000}, - {id:"beam-free",n:"Beam Free",lab:"Reflection",free:true,pi:0,po:0,ii:30.3,fc:null,scicode:48.5,tb21:null,tb40:3.0,tbh:null,tau2:null,taub:null,apex:null,analyst:null,auto:48.5,gpqa:null,critpt:13.1,hle:34.7,lcr:78.0,ifbench:null,mmmu:null,gdpv:33.9,gdppdf:11.6,ctx:1048576}, - {id:"longcat-2.5-preview-free",n:"LongCat 2.5 Preview Free",lab:"Meituan",free:true,pi:0,po:0,ii:null,ctx:1000000}, - {id:"mimo-v2.6-pro",n:"MiMo-V2.6-Pro",lab:"Xiaomi",pi:0.435,po:0.87,ii:46.3,fc:45.4,scicode:60.9,tb21:null,tb40:34.8,tbh:null,tau2:null,taub:null,apex:null,analyst:37.5,auto:58.6,gpqa:null,critpt:26.6,hle:49.4,lcr:86.3,ifbench:null,mmmu:null,gdpv:59.2,gdppdf:19.2,ctx:1048576}, - {id:"gpt-6-luna",n:"GPT-6 Luna",lab:"OpenAI",pi:0.1,po:0.5,ii:38.1,fc:41.9,scicode:54.6,tb21:null,tb40:12.6,tbh:null,tau2:null,taub:null,apex:null,analyst:43.8,auto:53.2,gpqa:null,critpt:19.4,hle:38.5,lcr:83.3,ifbench:null,mmmu:79.7,gdpv:46.6,gdppdf:22.8,ctx:1050000}, - {id:"grok-4.7",n:"Grok 4.7",lab:"xAI",pi:2,po:6,ii:46.4,fc:33.8,scicode:57.4,tb21:null,tb40:25.8,tbh:null,tau2:null,taub:null,apex:null,analyst:52.5,auto:65.6,gpqa:null,critpt:17.7,hle:43.1,lcr:76.7,ifbench:null,mmmu:null,gdpv:60.6,gdppdf:20.0,ctx:500000}, - {id:"step-5-preview",n:"Step 5 Preview",lab:"StepFun",pi:1,po:2.7,ii:43.7,fc:38.4,scicode:58.9,tb21:null,tb40:33.3,tbh:null,tau2:null,taub:null,apex:38.0,analyst:35.0,auto:51.0,gpqa:null,critpt:20.9,hle:46.5,lcr:88.3,ifbench:null,mmmu:76.4,gdpv:54.3,gdppdf:14.8,ctx:1000000}, - {id:"deepseek-v4.1-flash",n:"DeepSeek V4.1 Flash",lab:"DeepSeek",pi:0.15,po:0.6,ii:39.5,fc:44.0,scicode:51.9,tb21:null,tb40:26.8,tbh:null,tau2:null,taub:null,apex:null,analyst:35.0,auto:68.9,gpqa:null,critpt:14.3,hle:39.2,lcr:84.0,ifbench:null,mmmu:77.0,gdpv:55.0,gdppdf:12.8,ctx:1000000}, - {id:"muse-spark-1.3-contributor",n:"Muse Spark 1.3 Contributor",lab:"Meta",pi:0.1,po:0.2,ii:48.1,fc:40.6,scicode:58.8,tb21:84.3,tb40:33.3,tbh:null,tau2:null,taub:50.5,apex:null,analyst:37.5,auto:57.9,gpqa:93.5,critpt:24.9,hle:48.7,lcr:83.0,ifbench:null,mmmu:null,gdpv:59.0,gdppdf:26.6,ctx:1048576}, - {id:"hy4-preview",n:"Hy4 preview",lab:"Tencent",pi:0.834,po:2.501,ii:null,ctx:1024000}, - {id:"qwen3.8-flash",n:"Qwen3.8 Flash",lab:"Alibaba",pi:0.15,po:0.47,ii:39.8,fc:null,scicode:50.6,tb21:86.1,tb40:25.3,tbh:null,tau2:null,taub:45.4,apex:null,analyst:null,auto:55.9,gpqa:92.3,critpt:11.1,hle:38.0,lcr:79.7,ifbench:null,mmmu:79.8,gdpv:56.4,gdppdf:15.6,ctx:1000000,note:"AA entry: Qwen3.8-Flash-Next"}, - {id:"glm-5.3-flash",n:"GLM-5.3-Flash",lab:"Zhipu",pi:0.15,po:0.5,ii:41.8,fc:41.0,scicode:51.6,tb21:84.3,tb40:32.8,tbh:null,tau2:null,taub:47.2,apex:null,analyst:25.0,auto:60.4,gpqa:91.2,critpt:15.4,hle:39.9,lcr:80.0,ifbench:null,mmmu:null,gdpv:57.1,gdppdf:15.4,ctx:1000000}, - {id:"glm-5.3",n:"GLM-5.3",lab:"Zhipu",pi:1.4,po:4.4,ii:44.8,fc:40.1,scicode:59.0,tb21:83.9,tb40:41.9,tbh:null,tau2:null,taub:50.3,apex:null,analyst:38.8,auto:62.2,gpqa:91.7,critpt:19.1,hle:42.3,lcr:79.7,ifbench:null,mmmu:null,gdpv:57.5,gdppdf:11.2,ctx:1000000}, - {id:"qwen3.8-max",n:"Qwen3.8 Max",lab:"Alibaba",pi:2,po:6,ii:45.4,fc:43.2,scicode:52.1,tb21:88.8,tb40:38.9,tbh:null,tau2:null,taub:47.8,apex:42.4,analyst:45.0,auto:56.2,gpqa:92.8,critpt:17.7,hle:43.1,lcr:80.3,ifbench:null,mmmu:82.8,gdpv:58.2,gdppdf:22.8,ctx:1000000}, - {id:"kimi-k3",n:"Kimi K3",lab:"Moonshot",pi:3,po:15,ii:43.6,fc:43.6,scicode:59.5,tb21:85.0,tb40:12.6,tbh:null,tau2:null,taub:46.0,apex:41.3,analyst:38.8,auto:58.3,gpqa:93.5,critpt:23.4,hle:46.9,lcr:88.7,ifbench:null,mmmu:80.5,gdpv:51.6,gdppdf:22.0,ctx:1048576}, - {id:"kimi-k2.7-code",n:"Kimi K2.7 Code",lab:"Moonshot",pi:0.95,po:4,ii:25.8,fc:null,scicode:47.8,tb21:67.4,tb40:1.0,tbh:44.7,tau2:90.1,taub:20.2,apex:null,analyst:null,auto:24.5,gpqa:89.6,critpt:10.0,hle:35.0,lcr:79.3,ifbench:63.1,mmmu:null,gdpv:26.9,gdppdf:11.2,ctx:262144}, - {id:"qwen3.7-plus",n:"Qwen3.7 Plus",lab:"Alibaba",pi:0.4,po:1.6,ii:25.2,fc:null,scicode:46.1,tb21:61.0,tb40:1.0,tbh:47.0,tau2:93.0,taub:17.5,apex:22.4,analyst:null,auto:17.4,gpqa:90.0,critpt:9.1,hle:35.6,lcr:73.0,ifbench:78.0,mmmu:80.5,gdpv:13.4,gdppdf:12.2,ctx:1000000}, - {id:"minimax-m3",n:"MiniMax M3",lab:"MiniMax",pi:0.3,po:1.2,ii:29.2,fc:23.0,scicode:47.1,tb21:65.2,tb40:2.0,tbh:42.4,tau2:88.9,taub:15.3,apex:null,analyst:10.0,auto:21.3,gpqa:92.9,critpt:3.7,hle:39.0,lcr:83.0,ifbench:82.9,mmmu:78.6,gdpv:37.1,gdppdf:9.8,ctx:1048576}, - {id:"deepseek-v4-pro",n:"DeepSeek V4 Pro",lab:"DeepSeek",pi:0.66,po:1.98,ii:36.0,fc:38.8,scicode:51.0,tb21:78.7,tb40:14.1,tbh:null,tau2:null,taub:39.6,apex:null,analyst:null,auto:56.7,gpqa:92.8,critpt:18.0,hle:41.0,lcr:80.3,ifbench:null,mmmu:null,gdpv:47.4,gdppdf:11.4,ctx:1000000}, - {id:"mimo-v2.5-pro",n:"MiMo-V2.5-Pro",lab:"Xiaomi",pi:0.435,po:0.87,ii:26.0,fc:null,scicode:50.6,tb21:65.2,tb40:0.0,tbh:43.2,tau2:94.2,taub:9.9,apex:2.4,analyst:20.0,auto:13.7,gpqa:86.6,critpt:4.0,hle:35.7,lcr:79.7,ifbench:79.9,mmmu:null,gdpv:31.0,gdppdf:4.0,ctx:1048576}, - {id:"mimo-v2.5",n:"MiMo-V2.5",lab:"Xiaomi",pi:0.14,po:0.28,ii:21.8,fc:null,scicode:43.9,tb21:63.7,tb40:0.0,tbh:41.7,tau2:90.6,taub:8.7,apex:null,analyst:null,auto:18.4,gpqa:84.9,critpt:3.7,hle:27.2,lcr:73.0,ifbench:67.1,mmmu:75.4,gdpv:24.9,gdppdf:4.0,ctx:1048576} + {"id":"minimax-m3.1-flash-free","n":"MiniMax M3.1 Flash Free","lab":"MiniMax","free":true,"pi":0,"po":0,"ii":42.7,"fc":38.6,"scicode":53.4,"tb21":null,"tb40":25.8,"tbh":null,"tau2":null,"taub":null,"apex":null,"analyst":null,"auto":72.5,"gpqa":null,"critpt":22.3,"hle":48,"lcr":79.7,"ifbench":null,"mmmu":79.1,"gdpv":47.9,"gdppdf":20.8,"ctx":1000000}, + {"id":"gemini-4-argon-contributor","n":"Gemini 4 Argon Contributor","lab":"Google","free":false,"pi":4,"po":20,"ii":52.6,"fc":43.5,"scicode":61.8,"tb21":null,"tb40":57.1,"tbh":null,"tau2":null,"taub":null,"apex":null,"analyst":48.8,"auto":77.5,"gpqa":null,"critpt":27.1,"hle":57.1,"lcr":79.7,"ifbench":null,"mmmu":null,"gdpv":56.2,"gdppdf":21.8,"ctx":1048576}, + {"id":"claude-haiku-5-5","n":"Claude Haiku 5.5","lab":"Anthropic","free":false,"pi":0.1,"po":0.5,"ii":43.4,"fc":41.8,"scicode":55,"tb21":null,"tb40":32.8,"tbh":null,"tau2":null,"taub":null,"apex":null,"analyst":53.8,"auto":35.4,"gpqa":null,"critpt":18.9,"hle":44.4,"lcr":82.7,"ifbench":null,"mmmu":null,"gdpv":55.9,"gdppdf":20.8,"ctx":1000000}, + {"id":"beam-free","n":"Beam Free","lab":"Reflection AI","free":true,"pi":0,"po":0,"ii":30.3,"fc":null,"scicode":48.5,"tb21":null,"tb40":3,"tbh":null,"tau2":null,"taub":null,"apex":null,"analyst":null,"auto":48.5,"gpqa":null,"critpt":13.1,"hle":34.7,"lcr":78,"ifbench":null,"mmmu":null,"gdpv":33.9,"gdppdf":11.6,"ctx":1048576}, + {"id":"longcat-2.5-preview-free","n":"LongCat 2.5 Preview Free","lab":"Meituan","free":true,"pi":0,"po":0,"ii":null,"fc":null,"scicode":null,"tb21":null,"tb40":null,"tbh":null,"tau2":null,"taub":null,"apex":null,"analyst":null,"auto":null,"gpqa":null,"critpt":null,"hle":null,"lcr":null,"ifbench":null,"mmmu":null,"gdpv":null,"gdppdf":null,"ctx":1000000}, + {"id":"mimo-v2.6-pro","n":"MiMo-V2.6-Pro","lab":"Xiaomi","free":false,"pi":0.435,"po":0.87,"ii":46.3,"fc":45.4,"scicode":60.9,"tb21":null,"tb40":34.8,"tbh":null,"tau2":null,"taub":null,"apex":null,"analyst":37.5,"auto":58.6,"gpqa":null,"critpt":26.6,"hle":49.4,"lcr":86.3,"ifbench":null,"mmmu":null,"gdpv":59.2,"gdppdf":19.2,"ctx":1048576}, + {"id":"gpt-6-luna","n":"GPT-6 Luna","lab":"OpenAI","free":false,"pi":0.1,"po":0.5,"ii":38.1,"fc":41.9,"scicode":54.6,"tb21":null,"tb40":12.6,"tbh":null,"tau2":null,"taub":null,"apex":null,"analyst":43.8,"auto":53.2,"gpqa":null,"critpt":19.4,"hle":38.5,"lcr":83.3,"ifbench":null,"mmmu":79.7,"gdpv":46.6,"gdppdf":22.8,"ctx":1050000}, + {"id":"grok-4.7","n":"Grok 4.7","lab":"xAI","free":false,"pi":2,"po":6,"ii":46.4,"fc":33.8,"scicode":57.4,"tb21":null,"tb40":25.8,"tbh":null,"tau2":null,"taub":null,"apex":null,"analyst":52.5,"auto":65.6,"gpqa":null,"critpt":17.7,"hle":43.1,"lcr":76.7,"ifbench":null,"mmmu":null,"gdpv":60.6,"gdppdf":20,"ctx":500000}, + {"id":"step-5-preview","n":"Step 5 Preview","lab":"StepFun","free":false,"pi":1,"po":2.7,"ii":43.7,"fc":38.4,"scicode":58.9,"tb21":null,"tb40":33.3,"tbh":null,"tau2":null,"taub":null,"apex":38,"analyst":35,"auto":51,"gpqa":null,"critpt":20.9,"hle":46.5,"lcr":88.3,"ifbench":null,"mmmu":76.4,"gdpv":54.3,"gdppdf":14.8,"ctx":1000000}, + {"id":"deepseek-v4.1-flash","n":"DeepSeek V4.1 Flash","lab":"DeepSeek","free":false,"pi":0.15,"po":0.6,"ii":39.5,"fc":44,"scicode":51.9,"tb21":null,"tb40":26.8,"tbh":null,"tau2":null,"taub":null,"apex":null,"analyst":35,"auto":68.9,"gpqa":null,"critpt":14.3,"hle":39.2,"lcr":84,"ifbench":null,"mmmu":77,"gdpv":55,"gdppdf":12.8,"ctx":1000000}, + {"id":"muse-spark-1.3-contributor","n":"Muse Spark 1.3 Contributor","lab":"Meta","free":false,"pi":0.1,"po":0.2,"ii":48.1,"fc":40.6,"scicode":58.8,"tb21":84.3,"tb40":33.3,"tbh":null,"tau2":null,"taub":50.5,"apex":null,"analyst":37.5,"auto":57.9,"gpqa":93.5,"critpt":24.9,"hle":48.7,"lcr":83,"ifbench":null,"mmmu":null,"gdpv":59,"gdppdf":26.6,"ctx":1048576}, + {"id":"hy4-preview","n":"Hy4 preview","lab":"Tencent","free":false,"pi":0.834,"po":2.501,"ii":null,"fc":null,"scicode":null,"tb21":null,"tb40":null,"tbh":null,"tau2":null,"taub":null,"apex":null,"analyst":null,"auto":null,"gpqa":null,"critpt":null,"hle":null,"lcr":null,"ifbench":null,"mmmu":null,"gdpv":null,"gdppdf":null,"ctx":1024000}, + {"id":"qwen3.8-flash","n":"Qwen3.8 Flash","lab":"Alibaba","free":false,"pi":0.15,"po":0.47,"ii":39.8,"fc":null,"scicode":50.6,"tb21":86.1,"tb40":25.3,"tbh":null,"tau2":null,"taub":45.4,"apex":null,"analyst":null,"auto":55.9,"gpqa":92.3,"critpt":11.1,"hle":38,"lcr":79.7,"ifbench":null,"mmmu":79.8,"gdpv":56.4,"gdppdf":15.6,"ctx":1000000}, + {"id":"glm-5.3-flash","n":"GLM-5.3-Flash","lab":"Zhipu","free":false,"pi":0.15,"po":0.5,"ii":41.8,"fc":41,"scicode":51.6,"tb21":84.3,"tb40":32.8,"tbh":null,"tau2":null,"taub":47.2,"apex":null,"analyst":25,"auto":60.4,"gpqa":91.2,"critpt":15.4,"hle":39.9,"lcr":80,"ifbench":null,"mmmu":null,"gdpv":57.1,"gdppdf":15.4,"ctx":1000000}, + {"id":"glm-5.3","n":"GLM-5.3","lab":"Zhipu","free":false,"pi":1.4,"po":4.4,"ii":44.8,"fc":40.1,"scicode":59,"tb21":83.9,"tb40":41.9,"tbh":null,"tau2":null,"taub":50.3,"apex":null,"analyst":38.8,"auto":62.2,"gpqa":91.7,"critpt":19.1,"hle":42.3,"lcr":79.7,"ifbench":null,"mmmu":null,"gdpv":57.5,"gdppdf":11.2,"ctx":1000000}, + {"id":"qwen3.8-max","n":"Qwen3.8 Max","lab":"Alibaba","free":false,"pi":2,"po":6,"ii":45.4,"fc":43.2,"scicode":52.1,"tb21":88.8,"tb40":38.9,"tbh":null,"tau2":null,"taub":47.8,"apex":42.4,"analyst":45,"auto":56.2,"gpqa":92.8,"critpt":17.7,"hle":43.1,"lcr":80.3,"ifbench":null,"mmmu":82.8,"gdpv":58.2,"gdppdf":22.8,"ctx":1000000}, + {"id":"kimi-k3","n":"Kimi K3","lab":"Moonshot","free":false,"pi":3,"po":15,"ii":43.6,"fc":43.6,"scicode":59.5,"tb21":85,"tb40":12.6,"tbh":null,"tau2":null,"taub":46,"apex":41.3,"analyst":38.8,"auto":58.3,"gpqa":93.5,"critpt":23.4,"hle":46.9,"lcr":88.7,"ifbench":null,"mmmu":80.5,"gdpv":51.6,"gdppdf":22,"ctx":1048576}, + {"id":"kimi-k2.7-code","n":"Kimi K2.7 Code","lab":"Moonshot","free":false,"pi":0.95,"po":4,"ii":25.8,"fc":null,"scicode":47.8,"tb21":67.4,"tb40":1,"tbh":44.7,"tau2":90.1,"taub":20.2,"apex":null,"analyst":null,"auto":24.5,"gpqa":89.6,"critpt":10,"hle":35,"lcr":79.3,"ifbench":63.1,"mmmu":null,"gdpv":26.9,"gdppdf":11.2,"ctx":262144}, + {"id":"qwen3.7-plus","n":"Qwen3.7 Plus","lab":"Alibaba","free":false,"pi":0.4,"po":1.6,"ii":25.2,"fc":null,"scicode":46.1,"tb21":61,"tb40":1,"tbh":47,"tau2":93,"taub":17.5,"apex":22.4,"analyst":null,"auto":17.4,"gpqa":90,"critpt":9.1,"hle":35.6,"lcr":73,"ifbench":78,"mmmu":80.5,"gdpv":13.4,"gdppdf":12.2,"ctx":1000000}, + {"id":"minimax-m3","n":"MiniMax M3","lab":"MiniMax","free":false,"pi":0.3,"po":1.2,"ii":29.2,"fc":23,"scicode":47.1,"tb21":65.2,"tb40":2,"tbh":42.4,"tau2":88.9,"taub":15.3,"apex":null,"analyst":10,"auto":21.3,"gpqa":92.9,"critpt":3.7,"hle":39,"lcr":83,"ifbench":82.9,"mmmu":78.6,"gdpv":37.1,"gdppdf":9.8,"ctx":1048576}, + {"id":"deepseek-v4-pro","n":"DeepSeek V4 Pro","lab":"DeepSeek","free":false,"pi":0.66,"po":1.98,"ii":36,"fc":38.8,"scicode":51,"tb21":78.7,"tb40":14.1,"tbh":null,"tau2":null,"taub":39.6,"apex":null,"analyst":null,"auto":56.7,"gpqa":92.8,"critpt":18,"hle":41,"lcr":80.3,"ifbench":null,"mmmu":null,"gdpv":47.4,"gdppdf":11.4,"ctx":1000000}, + {"id":"mimo-v2.5-pro","n":"MiMo-V2.5-Pro","lab":"Xiaomi","free":false,"pi":0.435,"po":0.87,"ii":26,"fc":null,"scicode":50.6,"tb21":65.2,"tb40":0,"tbh":43.2,"tau2":94.2,"taub":9.9,"apex":2.4,"analyst":20,"auto":13.7,"gpqa":86.6,"critpt":4,"hle":35.7,"lcr":79.7,"ifbench":79.9,"mmmu":null,"gdpv":31,"gdppdf":4,"ctx":1048576}, + {"id":"mimo-v2.5","n":"MiMo-V2.5","lab":"Xiaomi","free":false,"pi":0.14,"po":0.28,"ii":21.8,"fc":null,"scicode":43.9,"tb21":63.7,"tb40":0,"tbh":41.7,"tau2":90.6,"taub":8.7,"apex":null,"analyst":null,"auto":18.4,"gpqa":84.9,"critpt":3.7,"hle":27.2,"lcr":73,"ifbench":67.1,"mmmu":75.4,"gdpv":24.9,"gdppdf":4,"ctx":1048576} ];