Character Benchmark

One identical prompt → 25 LLMs (via OpenRouter) each asked to write a single self-contained Three.js page that procedurally models a manga/anime character, rigs it, and animates idle · walk · jump · wave · sit — no asset files. Hit ▶ Live on any card to orbit it and trigger the animations yourself.

25models
17render clean
$1.76total spend
cost · tokens · tok/s from OpenRouter generation accounting
The prompt every model received
# Benchmark task: a procedural anime character in Three.js

Build a **single, self-contained HTML file** that renders a **manga / anime-style humanoid character** that is fully **procedural** (constructed in code from primitives and parametric geometry — NO external model files, textures, or asset URLs), **rigged**, and **animated**.

## Hard requirements (this file is auto-loaded and screenshotted by a harness — follow exactly)

1. **One HTML file. No build step.** Load Three.js (r160+) and `OrbitControls` via an ES-module `importmap` from a CDN (unpkg / jsdelivr / esm.sh). No bundler, no npm, no local files.
2. **Self-contained character.** Construct the entire character procedurally from Three.js geometry (boxes, spheres, capsules, lathes, extrudes, custom `BufferGeometry`, …). Do **not** load `.glb/.gltf/.fbx/.vrm` or any image texture from a URL. Define all materials in code.
3. **Anime / manga style & proportions:** stylized — large head ratio (~1:5 to 1:6), large eyes, slim limbs, clean readable silhouette. Cel / flat shading is welcome. It must read as an anime character, not a generic grey mannequin.
4. **A real rig.** The character must be genuinely articulated: either a `SkinnedMesh` + `THREE.Skeleton` / `Bone` hierarchy, **or** a clean parented `Group` / `Object3D` joint hierarchy (hips → spine → head; shoulders → arms; hips → legs). Animations must rotate these joints — not merely translate the whole mesh.
5. **Five animations**, each a believable clip:
   - `idle` — subtle breathing / weight-shift sway, looping
   - `walk` — walk cycle in place, arms and legs counter-swinging, looping
   - `jump` — crouch → launch → airborne → land, looping
   - `wave` — standing and waving one arm hello, looping
   - `sit` — lower into a seated pose and hold it (calm idle while seated)
6. **Scene:** a `PerspectiveCamera`, `OrbitControls`, a ground / floor plane, sensible lighting (a key light + ambient or hemisphere), and a neutral background. The character is centered and fully in frame at load.
7. **Animation-switching UI:** on-screen buttons for the five animations.
8. **Harness control hook — REQUIRED.** Expose this on `window` exactly:
   ```js
   window.__bench = {
     animations: ['idle', 'walk', 'jump', 'wave', 'sit'],
     setAnim(name) { /* switch to that animation immediately */ },
   };
   ```
   `setAnim` must accept exactly those five names. The default animation at load is `idle`.
9. **Zero console errors.** It must run cleanly when the file is opened directly over `file://`.

## Output format

Return **exactly one** ```html fenced code block containing the complete file, and nothing else — no explanation before or after.

glm-5.2

z-ai · Friendli
🖼 renders 🎮 hook ✅ clean
🧩 26.2k 💰 $0.116 ⚡ 90 tok/s ⏱ 290.8s
idle
idle
walk
walk
jump
jump
wave
wave
sit
sit
open ↗

gpt-5-mini

openai
🖼 renders 🎮 hook ✅ clean
🧩 8.7k 💰 $0.018 ⚡ — ⏱ —
idle
idle
walk
walk
jump
jump
wave
wave
sit
sit
open ↗

qwen3.7-max

qwen
🖼 renders 🎮 hook ✅ clean
🧩 9.9k 💰 $0.038 ⚡ — ⏱ —
idle
idle
walk
walk
jump
jump
wave
wave
sit
sit
open ↗

gpt-oss-120b

openai · WandB
🖼 renders 🎮 hook ✅ clean
🧩 3.8k 💰 $0.0006 ⚡ 72 tok/s ⏱ 52.4s
idle
idle
walk
walk
jump
jump
wave
wave
sit
sit
open ↗

mimo-v2.5

xiaomi · Xiaomi
⛔ blank ⚠ no hook ✅ clean ✂ truncated
🧩 32.0k 💰 $0.0091 ⚡ 144 tok/s ⏱ 221.7s
idle
idle
walk
walk
jump
jump
wave
wave
sit
sit
open ↗

llama-4-maverick

meta-llama
⛔ generation failed
HTTP 402: {"error":{"message":"This request requires more credits, or fewer max_tokens. You requested up to 32000 tokens, but can only afford 5932. To increase, visit https://openrouter.ai/settings/credits and add more credits","code":402,"metadata":{"provider_name":null}},"user_id":"user_30IDjHDwjTt8iGjyTlPVYkqtVlM"}

hy3-preview

tencent
🖼 renders 🎮 hook ✅ clean
🧩 7.3k 💰 $0.0019 ⚡ — ⏱ —
idle
idle
walk
walk
jump
jump
wave
wave
sit
sit
open ↗

qwen3-coder-plus

qwen · Alibaba
🖼 renders 🎮 hook ✅ clean
🧩 3.9k 💰 $0.013 ⚡ 76 tok/s ⏱ 50.9s
idle
idle
walk
walk
jump
jump
wave
wave
sit
sit
open ↗

gemini-3.5-flash

google
🖼 renders 🎮 hook ✅ clean
🧩 27.0k 💰 $0.244 ⚡ — ⏱ —
idle
idle
walk
walk
jump
jump
wave
wave
sit
sit
open ↗

claude-sonnet-4.6

anthropic
🖼 renders 🎮 hook ✅ clean
🧩 11.5k 💰 $0.175 ⚡ — ⏱ —
idle
idle
walk
walk
jump
jump
wave
wave
sit
sit
open ↗

deepseek-v3.2

deepseek · StreamLake
🖼 renders 🎮 hook 🐞 15
🧩 4.6k 💰 $0.0017 ⚡ 63 tok/s ⏱ 72.4s
idle
idle
walk
walk
jump
jump
wave
wave
sit
sit
open ↗
errors
THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton. [object r]
THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton. [object r]
Cannot read properties of undefined (reading 'getX')
Cannot read properties of undefined (reading 'getX')
Cannot read properties of undefined (reading 'getX')
Cannot read properties of undefined (reading 'getX')

grok-4.3

x-ai
⛔ blank ⚠ no hook 🐞 6
🧩 3.9k 💰 $0.011 ⚡ — ⏱ —
idle
idle
walk
walk
jump
jump
wave
wave
sit
sit
open ↗
errors
Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.
setAnim is not defined
setAnim is not defined
setAnim is not defined
setAnim is not defined
setAnim is not defined

gemini-3.1-pro-preview

google
🖼 renders 🎮 hook ✅ clean
🧩 10.9k 💰 $0.132 ⚡ — ⏱ —
idle
idle
walk
walk
jump
jump
wave
wave
sit
sit
open ↗

glm-5.1

z-ai
⛔ generation failed
JSON Parse error: Unexpected EOF

gpt-5.3-codex

openai
🖼 renders 🎮 hook ✅ clean
🧩 7.4k 💰 $0.105 ⚡ — ⏱ —
idle
idle
walk
walk
jump
jump
wave
wave
sit
sit
open ↗

kimi-k2.7-code

moonshotai · Cloudflare
🖼 renders 🎮 hook ✅ clean
🧩 21.6k 💰 $0.087 ⚡ 80 tok/s ⏱ 270.1s
idle
idle
walk
walk
jump
jump
wave
wave
sit
sit
open ↗

deepseek-v4-pro

deepseek
🖼 renders 🎮 hook ✅ clean
🧩 25.7k 💰 $0.022 ⚡ — ⏱ —
idle
idle
walk
walk
jump
jump
wave
wave
sit
sit
open ↗

owl-alpha

openrouter · Stealth
🖼 renders 🎮 hook ✅ clean
🧩 7.9k 💰 $0.0000 ⚡ 39 tok/s ⏱ 201.5s
idle
idle
walk
walk
jump
jump
wave
wave
sit
sit
open ↗

claude-opus-4.7

anthropic
🖼 renders 🎮 hook ✅ clean
🧩 9.4k 💰 $0.240 ⚡ — ⏱ —
idle
idle
walk
walk
jump
jump
wave
wave
sit
sit
open ↗

deepseek-v4-flash

deepseek · WandB
🖼 renders 🎮 hook ✅ clean
🧩 5.3k 💰 $0.0016 ⚡ 45 tok/s ⏱ 117.5s
idle
idle
walk
walk
jump
jump
wave
wave
sit
sit
open ↗

claude-haiku-4.5

anthropic
⛔ blank ⚠ no hook 🐞 4
🧩 6.1k 💰 $0.031 ⚡ — ⏱ —
idle
idle
walk
walk
jump
jump
wave
wave
sit
sit
open ↗
errors
Failed to load resource: the server responded with a status of 404 ()
net: https://cdn.jsdelivr.net/npm/three@r160/examples/jsm/controls/OrbitControls.js
Failed to load resource: the server responded with a status of 404 ()
net: https://cdn.jsdelivr.net/npm/three@r160/build/three.module.js

mistral-large-2512

mistralai
⛔ generation failed
HTTP 402: {"error":{"message":"This request requires more credits, or fewer max_tokens. You requested up to 32000 tokens, but can only afford 3955. To increase, visit https://openrouter.ai/settings/credits and add more credits","code":402,"metadata":{"provider_name":null}},"user_id":"user_30IDjHDwjTt8iGjyTlPVYkqtVlM"}

minimax-m3

minimax
⛔ blank ⚠ no hook ✅ clean ✂ truncated
🧩 32.0k 💰 $0.039 ⚡ — ⏱ —
idle
idle
walk
walk
jump
jump
wave
wave
sit
sit
open ↗

claude-opus-4.8

anthropic
🖼 renders 🎮 hook ✅ clean
🧩 6.8k 💰 $0.176 ⚡ — ⏱ —
idle
idle
walk
walk
jump
jump
wave
wave
sit
sit
open ↗

gpt-5.5

openai · OpenAI
🖼 renders 🎮 hook ✅ clean
🧩 10.0k 💰 $0.303 ⚡ 68 tok/s ⏱ 147.8s
idle
idle
walk
walk
jump
jump
wave
wave
sit
sit
open ↗