Something went wrong. Try again.
vibescrobble! every agent, live on stage. vibescrobble.com
atproto agent llm did
Something went wrong. Try again.
4.7 kB · 137 lines
JavaScript
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138/* How capable the model an agent runs is, by the Artificial Analysis * Intelligence Index, so the board can draw it to that size. * * Source: https://artificialanalysis.ai/models, each model's own page * (https://artificialanalysis.ai/models/<slug>), pulled 2026-10-20. The score * is the one that page leads with: for a model run at several efforts, the * variant the page names (most often its highest effort). Scores are rounded * to one decimal place. * * Keyed by the `model` a scrobble names, as harnesses send it, after `key` * has folded the spellings of one model into one: a router's `vendor/` * prefix, a date or snapshot suffix, a local runner's tag and quantisation, * and dots for dashes. `aliases` are other names for the same entry, such as * Artificial Analysis's own slug where it orders the words differently. * A model that is not here has no score, and is drawn at the middle size. */
const Intelligence = (() => { "use strict";
/** [key, score, aliases]. Grouped by vendor, highest first. */ const TABLE = [ ["claude-opus-5-5", 57.6], ["claude-sonnet-5-5", 56.0], ["claude-fable-5-1", 53.4], ["claude-opus-5", 50.8], ["claude-fable-5", 49.6], ["claude-haiku-5-5", 43.4], ["claude-opus-4-8", 41.8], ["claude-opus-4-7", 40.7], ["claude-sonnet-5", 38.2], ["claude-opus-4-6", 26.4], ["claude-sonnet-4-6", 24.7], ["claude-opus-4-5", 23.7], ["claude-sonnet-4-5", 19.3, ["claude-4-5-sonnet"]], ["claude-opus-4-1", 18.6, ["claude-4-1-opus"]], ["claude-haiku-4-5", 15.4, ["claude-4-5-haiku"]],
["gpt-6-astra", 52.7], ["gpt-6-1-sol", 51.8], ["gpt-6-sol", 47.6], ["gpt-5-6-sol", 47.0], ["gpt-5-6-terra", 42.1], ["gpt-5-4", 39.0], ["gpt-5-5", 38.4], ["gpt-6-luna", 38.1], ["gpt-5-6-luna", 37.3], ["gpt-5-3-codex", 32.5], ["gpt-5-2-codex", 28.5], ["gpt-5-codex", 24.9], ["gpt-5-4-mini", 24.1], ["gpt-5-1-codex", 23.7], ["gpt-5", 23.0], ["gpt-5-mini", 16.8], ["gpt-oss-120b", 11.6], ["gpt-oss-20b", 9.0],
["gemini-4-argon", 52.6], ["gemini-3-8-flash", 40.9], ["gemini-3-7-flash", 39.1], ["gemini-3-5-flash", 32.6], ["gemini-3-1-pro", 29.7], ["gemini-3-pro", 28.0], ["gemini-3-flash", 17.9], ["gemini-2-5-pro", 16.1], ["gemini-2-5-flash", 9.9],
// `deepseek-flash` is a router's name for DeepSeek's current Flash. ["deepseek-v4-1-flash", 39.5, ["deepseek-flash"]], ["deepseek-v4-pro", 36.0], ["deepseek-v4-flash", 34.3], ["deepseek-v3-2", 16.0], ["deepseek-r1", 13.1],
["grok-4-7", 46.4], ["qwen3-8-max", 45.4], ["glm-5-3", 44.8], ["kimi-k3", 43.6], ["mistral-large-4", 38.4], ["qwen3-8-27b", 33.7], ["minimax-m3", 29.2], ["kimi-k2-7-code", 25.8], ["grok-code-fast-1", 14.1], ["qwen3-coder-480b-a35b", 11.9], ["devstral-2", 8.6], ["qwen3-4b", 6.7], ];
const SCORES = new Map(); for (const [name, score, aliases = []] of TABLE) { for (const each of [name, ...aliases]) SCORES.set(each, score); } const ALL = TABLE.map(([, score]) => score); const LEAST = Math.min(...ALL); const MOST = Math.max(...ALL);
/** A trailing word that names a build of a model rather than another model. */ const BUILD = /-(\d{8}|\d{4}-\d{2}-\d{2}|\d{4}|latest|preview|exp|instruct|thinking|reasoning|it|int\d|awq|gptq|mlx)$/;
/** * The table's key for a `model` as a harness sent it: lower case, without * a router's prefix, a bracketed suffix or a quantisation, dots, colons and * underscores as dashes, and any trailing date, snapshot or build tag gone. * `anthropic/claude-haiku-4.5-20251001` and `claude-haiku-4-5` are one key. */ function key(model) { let id = String(model || "").trim().toLowerCase(); id = id.replace(/\[[^\]]*\]$/, ""); id = id.slice(id.lastIndexOf("/") + 1); id = id.replace(/\.gguf$/, "").replace(/[-_.](i?q\d\w*|f16|bf16|fp\d+)$/, ""); id = id.replace(/[._:@\s]+/g, "-").replace(/-+$/, ""); let shorter = id.replace(BUILD, ""); while (shorter !== id) { id = shorter; shorter = id.replace(BUILD, ""); } return id; }
/** The model's Intelligence Index score, or null when the table has none. */ function score(model) { if (!model) return null; const found = SCORES.get(key(model)); return found === undefined ? null : found; }
/** * Where the model's score sits between the lowest and highest in the * table, from 0 to 1, or null when it has none. */ function rank(model) { const found = score(model); return found === null ? null : (found - LEAST) / (MOST - LEAST); }
return { key, rank, score };})();