benchmark challenges
fixed, revisitable model-vs-model sessions — niche task mixes saved forever in sqlite + committed json.
related: aiml api testing · zero context mode · realshot tasks · api
what you get
- manifest —
data/challenges/{slug}/manifest.jsondefines tasks + models - results —
data/challenges/{slug}/results.json(committed for devlog / deploy revisit) - sqlite —
data/local.dbtableschallenges,challenge_runs(local forever) - ui —
/challenge/{slug}infographic + per-model drill-down - api —
GET /api/challenges,GET /api/challenges/{slug}
niche sprint v1
| slug | niche-sprint-v1 |
| models | 6 low-tier AIML models (verified via /v1/models) |
| tasks | 10 mixed: procedural, extract, html, constraint, json, regex |
| harness | zero_context (see zero context) |
| view | /challenge/niche-sprint-v1 |
| devlog asset | /challenges/niche-sprint-v1-infographic.png |
run it
# needs AIMLAPI_KEY in .env.local
npm run challenge
# or
npx tsx scripts/run-challenge.ts niche-sprint-v1
smoke-tests every model first, then runs all task×model combos (~60 API calls).
latest results (june 2026)
| rank | model | pass rate |
|---|---|---|
| 1 | Gemini 2.5 Flash | 90% |
| 2 | DeepSeek V3 | 70% |
| 3 | GPT-4o Mini | 60% |
| 3 | Llama 3.1 8B | 60% |
| 5 | Ministral 3B | 50% |
| 5 | Qwen 2.5 7B | 50% |
every model failed the ANSWER: 8 words constraint burst (partial credit only).
adding a new challenge
- create
data/challenges/my-challenge/manifest.json - run
npx tsx scripts/run-challenge.ts my-challenge - commit
manifest.json+results.json - open
/challenge/my-challenge
manifest shape:
{
"slug": "my-challenge",
"title": "My Challenge",
"subtitle": "…",
"description": "…",
"harness_mode": "zero_context",
"tasks": [{ "id": "proc-sequence-5", "label": "…", "category": "procedural" }],
"models": [{ "slug": "aiml/openai/gpt-4o-mini", "label": "GPT-4o Mini" }]
}
task ids can be procedural (proc-*), realshot (rs-*), or domain tasks (json-01, etc.).
storage
| layer | path / table | purpose |
|---|---|---|
| sqlite | challenges, challenge_runs | local query + forever persistence |
| json export | data/challenges/{slug}/results.json | git-tracked revisit without db |
| supabase | supabase/schema.sql | production postgres when linked |
api prefers committed json for public deploys; sqlite is for local CLI runs.
drawing contest v1
| slug | drawing-contest-v1 |
| models | 5 Fireworks serverless (fireworks/ slugs) |
| tasks | 10 SVG drawing contracts |
| harness | zero_context, 4000 max tokens |
| view | /challenge/drawing-contest-v1 (gallery renders every drawing) |
top scores: GPT-OSS 120B + GLM 5.1 at 100%; GLM 5.2 / DeepSeek V4 Pro / Kimi K2.6 at 90% (rocket flame color). see drawing docs.
game night v1
| slug | game-night-v1 |
| models | 5 Fireworks serverless (same lineup as drawing contest) |
| tasks | 10 party-game instruction contracts (ins-game-*) |
| harness | zero_context |
| view | /challenge/game-night-v1 |
scoreboard
| rank | model | pass rate |
|---|---|---|
| 1 | GPT-OSS 120B | 90% (9/10) |
| 2 | DeepSeek V4 Pro | 60% |
| 3 | Kimi K2.6 | 30% |
| 4 | GLM 5.2 | 20% |
| 5 | GLM 5.1 | 10% |
unlike drawing contest (~90–100% across the board), game night spreads hard — models leak chain-of-thought into answers under zero context (one-word / ALL CAPS / haiku contracts expose narrators). GPT-OSS’s only miss: empty output on the no-letter-e pizza lipogram.
tasks live in data/tasks/instruction.json as ins-game-*.
production (vercel)
deployed api routes read from committed json via lib/challenges/store-json.ts — no sqlite on serverless. see deploy.
phase 2 — BYOK bench (live)
/bench now has a use my own API key toggle. keys stay in sessionStorage — sent per request only.
POST /api/eval/run accepts optional provider:
{
"taskId": "json-01",
"provider": {
"name": "my model",
"baseURL": "https://api.aimlapi.com/v1",
"apiKey": "…",
"model": "openai/gpt-4o-mini"
},
"harnessMode": "zero_context"
}
POST /api/eval/suite also accepts provider for full-domain BYOK sweeps.
test connection uses the same pong smoke as realshot (PUT /api/realshot/duel).
phase 3 — build your own sprint (ad-hoc)
/challenges/new — pick preset tasks, add 1–6 BYOK models, run, get the same infographic inline.
POST /api/challenges/run — ad-hoc challenge (max 15 tasks × 6 models). returns full ChallengeResults json. download from the ui — not persisted on vercel unless you commit json locally.
roadmap
| phase | feature |
|---|---|
| 2 | BYOK solo eval on /bench via optional provider in POST /api/eval/run |
| 3 | challenge builder + POST /api/challenges + supabase persistence |
| 4 | background jobs + redis rate limits |