Marketing claims are not a substitute for a real request. This page publishes the shared task, raw HTML, visual result, and billed usage; Kimi's layout fix is labeled rather than presented as original output.
What we watch for each model
Kimi
Chinese writing, context retention, and fast small-page generation.
DeepSeek
Reasoning, code structure, and animation completeness.
GLM
Chinese workflows, structured output, and long reasoning requests.
Qwen
Multilingual, coding, and visual scene generation together.
One test matrix for every model
All four models receive the same public task, with billed production metrics shown beside the output.
| Dimension | What we record | Why it matters |
|---|---|---|
| Visual completeness | Character, bicycle, motion, and depth | Whether the page is usable as delivered |
| Code constraints | Single file, inline resources, responsive CSS | Whether it can be embedded safely |
| Output usage | Input / output tokens and CNY cost | Whether reasoning spend is controllable |
| Speed | Time to first token and full response | Interaction and automation wait time |
Give every model the same animation brief
Keep the brief and constraints fixed, then change only the model ID. The carousel embeds each returned HTML document and shows billed tokens, cost, and latency beside it.
DeepSeek V4.1 Flash
The production API returned a complete single-file HTML scene with a visible rider, bicycle, and layered seaside background.
deepseek-v4.1-flash<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Pelican on a Bicycle</title>
<style>
*{box-sizing:border-box}
html,body{margin:0;height:100%}
body{background:#bfe3f2;overflow:hidden;font:12px system-ui,sans-serif}
.scene{position:relative;width:100%;height:100vh;min-height:320px;overflow:hidden}
.layer{position:absolute;left:0;width:200%;height:100%}
.sky{inset:0;background:linear-gradient(#8fc9e8 0%,#d8eef8 62%,#f6f1d8 100%)}
.sun{position:absolute;top:8%;left:12%;width:72px;height:72px;border-radius:50%;background:radial-gradient(#fff9c4,#ffd66b 60%,transparent 72%);opacity:.95}
.clouds{top:6%;animation:drift 34s linear infinite}
.clouds.slow{top:22%;opacity:.55;animation-duration:56s;animation-direction:reverse}
.cloud{position:absolute;background:#fff;border-radius:50%;filter:drop-shadow(0 2px 3px rgba(80,110,130,.18))}
.cloud::before,.cloud::after{content:"";position:absolute;background:#fff;border-radius:50%}
.cloud::before{width:60%;height:150%;left:-18%;top:-55%}
.cloud::after{width:46%;height:120%;right:-14%;top:-38%}
.c1{left:6%;width:120px;height:34px}
.c2{left:34%;width:90px;height:26px;top:34px}
.c3{left:62%;width:150px;height:40px;top:12px}
.c4{left:84%;width:100px;height:30px;top:52px}
.sea{top:50%;background:repeating-linear-gradient(90deg,#2f7fb0 0 40px,#3b90c2 40px 80px)}
.sea .wave{position:absolute;left:0;top:0;width:100%;height:100%;background:repeating-linear-gradient(115deg,rgba(255,255,255,.34) 0 6px,transparent 6px 22px);animation:wave 6s linear infinite}
.far{top:44%;height:44px;background:repeating-linear-gradient(90deg,#8fc7c4 0 70px,#9fd0cd 70px 140px);border-radius:0 0 40px 40px;opacity:.75}
.boardwalk{position:absolute;left:0;bottom:0;width:200%;height:30%;background:repeating-linear-gradient(90deg,#c69a63 0 46px,#b98c56 46px 50px);animation:drift 7s linear infinite}
.boardwalk::before{content:"";position:absolute;top:0;left:0;width:100%;height:7px;background:#a97c47}
.boardwalk::after{content:"";position:absolute;bottom:0;left:0;width:100%;height:16px;background:linear-gradient(transparent,rgba(80,50,20,.35))}
.rail{position:absolute;left:0;bottom:28%;width:200%;height:12%;animation:drift 4.6s linear infinite}
.rail::before,.rail::after{content:"";position:absolute;left:0;width:100%;height:5px;background:#8a6a3f;border-radius:3px}
.rail::before{top:0}.rail::after{top:26px}
.rail i{position:absolute;bottom:0;width:8px;height:100%;background:#8a6a3f}
@keyframes drift{from{transform:translateX(0)}to{transform:translateX(-50%)}}
@keyframes wave{from{background-position:0 0}to{background-position:120px 0}}
.rig{position:absolute;left:50%;bottom:20%;width:340px;height:300px;transform:translateX(-50%)}
@media(max-width:640px){.rig{width:250px;height:230px;bottom:16%}}
</style>
</head>
<body>
<div class="scene">
<div class="layer sky"><div class="sun"></div></div>
<div class="layer clouds"><i class="cloud c1"></i><i class="cloud c2"></i><i class="cloud c3"></i><i class="cloud c4"></i></div>
<div class="layer clouds slow"><i class="cloud c2"></i><i class="cloud c3"></i><i class="cloud c4"></i></div>
<div class="layer sea"><div class="wave"></div></div>
<div class="layer far"></div>
<div class="layer rail" id="rail"></div>
<div class="layer boardwalk"></div>
<div class="rig">
<svg viewBox="0 0 340 300" width="100%" height="100%">
<ellipse cx="170" cy="286" rx="120" ry="9" fill="rgba(60,40,20,.28)"/>
<g transform="translate(78,214)">
<g><circle r="46" fill="none" stroke="#26313a" stroke-width="6"/><circle r="8" fill="#26313a"/>
<g stroke="#cfd8dd" stroke-width="2.5">
<line x1="0" y1="-44" x2="0" y2="44"/><line x1="-44" y1="0" x2="44" y2="0"/>
<line x1="-31" y1="-31" x2="31" y2="31"/><line x1="31" y1="-31" x2="-31" y2="31"/>
</g>
<g><animateTransform attributeName="transform" type="rotate" from="0" to="360" dur="1.1s" repeatCount="indefinite"/><circle r="7" fill="#e2554a"/></g></g>
</g>
<g transform="translate(258,214)">
<g><circle r="46" fill="none" stroke="#26313a" stroke-width="6"/><circle r="8" fill="#26313a"/>
<g stroke="#cfd8dd" stroke-width="2.5">
<line x1="0" y1="-44" x2="0" y2="44"/><line x1="-44" y1="0" x2="44" y2="0"/>
<line x1="-31" y1="-31" x2="31" y2="31"/><line x1="31" y1="-31" x2="-31" y2="31"/>
</g>
<g><animateTransform attributeName="transform" type="rotate" from="0" to="360" dur="1.1s" repeatCount="indefinite"/><circle r="7" fill="#e2554a"/></g></g>
</g>
<g stroke="#e2554a" stroke-width="7" stroke-linecap="round" fill="none">
<line x1="78" y1="214" x2="168" y2="214"/><line x1="78" y1="214" x2="150" y2="150"/>
<line x1="150" y1="150" x2="168" y2="214"/><line x1="168" y1="214" x2="258" y2="214"/>
<line x1="168" y1="214" x2="196" y2="146"/><line x1="196" y1="146" x2="150" y2="150"/>
<line x1="196" y1="146" x2="212" y2="122"/>
</g>
<line x1="150" y1="150" x2="132" y2="118" stroke="#e2554a" stroke-width="7" stroke-linecap="round"/>
<path d="M116 116 q16 -10 34 2" stroke="#26313a" stroke-width="6" fill="none" stroke-linecap="round"/>
<circle cx="168" cy="214" r="13" fill="#26313a"/><circle cx="168" cy="214" r="5" fill="#8a949b"/>
<g transform="translate(168,214)"><g><animateTransform attributeName="transform" type="rotate" from="0" to="360" dur="0.55s" repeatCount="indefinite"/>
<line x1="0" y1="-2" x2="0" y2="-28" stroke="#26313a" stroke-width="6" stroke-linecap="round"/>
<line x1="0" y1="2" x2="0" y2="28" stroke="#26313a" stroke-width="6" stroke-linecap="round"/>
<rect x="-7" y="-34" width="14" height="7" rx="2" fill="#1c2429"/>
<rect x="-7" y="27" width="14" height="7" rx="2" fill="#1c2429"/>
</g></g>
<g transform="translate(200,152)">
<g>
<animateTransform attributeName="transform" type="translate" values="0 0;0 -6;0 0" dur="0.55s" repeatCount="indefinite" calcMode="spline" keyTimes="0;.5;1" keySplines=".4 0 .6 1;.4 0 .6 1"/>
<path d="M-58 -6 q-26 4 -40 -8 q-8 -8 4 -12 l52 -4 z" fill="#f4a72c"/>
<path d="M-40 14 q-4 26 -6 40" stroke="#f4a72c" stroke-width="6" fill="none" stroke-linecap="round"/>
<path d="M-18 14 q-2 26 -2 40" stroke="#f4a72c" stroke-width="6" fill="none" stroke-linecap="round"/>
<ellipse cx="8" cy="6" rx="66" ry="40" fill="#fdfefe"/>
<path d="M-52 20 q26 34 62 10 q10 -6 6 -18 q-34 12 -68 8z" fill="#eef3f6"/>
<g transform="translate(58,-16) rotate(-8)">
<animateTransform attributeName="transform" type="rotate" values="0 58 -16;0 58 -16;16 58 -16;0 58 -16;0 58 -16;-14 58 -16;0 58 -16" dur="2.4s" repeatCount="indefinite"/>
<path d="M0 0 q40 -34 74 -6 q-34 26 -74 12z" fill="#eef3f6" stroke="#dbe4ea" stroke-width="2"/>
<path d="M12 2 q26 -14 50 -2" stroke="#dbe4ea" stroke-width="2" fill="none"/>
</g>
<path d="M56 -8 q26 2 30 -14" stroke="#f4a72c" stroke-width="9" fill="none" stroke-linecap="round"/>
<circle cx="88" cy="-24" r="12" fill="#fdfefe"/>
<circle cx="92" cy="-25" r="3" fill="#26313a"/>
<path d="M62 -10 q22 -6 30 6 q-14 12 -30 4z" fill="#e6edf1"/>
<path d="M92 -34 q30 0 46 20 q-10 12 -26 12 q-20 2 -28 -10 q-4 -14 8 -22z" fill="#f4a72c"/>
<path d="M100 -30 q22 2 32 16 l-10 6 q-10 -12 -26 -14z" fill="#e08f1e"/>
<path d="M86 -22 q30 -10 58 6 q-16 14 -40 10z" fill="#f7b74a"/>
</g>
</g>
</svg>
</div>
</div>
<script>
(function(){
var rail=document.getElementById("rail");
var f=document.createDocumentFragment();
for(var x=0;x<120;x++){var p=document.createElement("i");p.style.left=(x*24)+"px";f.appendChild(p);}
rail.appendChild(f);
})();
</script>
</body>
</html>Reproducible test cases
Alongside the animation, small support and code tasks check structured output and minimal fixes.
Case 01 · Support-ticket routing
一个充值已扣款但余额未到账的紧急工单,测试模型能否稳定输出可入库的 JSON。
你是客服工单路由器。只输出 JSON,不要 Markdown,不要解释。字段必须为 category、priority、needs_human、reply_language、reason。category 只能是 billing、account、api;priority 只能是 low、medium、high;reply_language 使用 BCP-47。
工单:我昨晚给 API 账户充值 200 元,银行卡已经扣款,但余额仍然是 0。我们今天要上线,能否尽快处理?Case 01 · Support-ticket routing
Animation and small-task metrics come from production API records on 2026-10-04 UTC. Output tokens are billed usage and may include model reasoning.
| Model | Checks | Output summary | TTFT | Total | Input / output tokens | Usage cost |
|---|---|---|---|---|---|---|
| DeepSeek V4 Pro | Passed4/4 checks passed | JSON 有效;billing / high / true / zh-CN | 11.79s | 12.92s | 118 / 134 | ¥0.004680 |
| GLM-5.2 | Passed4/4 checks passed | JSON 有效;billing / high / true / zh-CN | 8.24s | 8.75s | 99 / 64 | ¥0.001938 |
| Qwen3.7 Max | Passed4/4 checks passed | JSON 有效;billing / high / true / zh-CN | 9.37s | 10.22s | 106 / 627 | ¥0.019075 |
| Kimi K3 | Passed4/4 checks passed | JSON 有效;billing / high / true / zh-CN | 17.12s | 17.79s | 174 / 209 | ¥0.014628 |
Case 02 · TypeScript Production TypeScript bug
一个很小但常见的字段名错误,测试模型能否给出最小可运行修复。
只输出修复后的 TypeScript 函数,不要解释,不要 Markdown。保留函数名和类型定义。
type LineItem = { price: number; qty: number };
export function subtotal(items: LineItem[]): number {
return items.reduce((sum, item) => sum + item.price * item.quantity, 0);
}Case 02 · TypeScript Production TypeScript bug
Animation and small-task metrics come from production API records on 2026-10-04 UTC. Output tokens are billed usage and may include model reasoning.
| Model | Checks | Output summary | TTFT | Total | Input / output tokens | Usage cost |
|---|---|---|---|---|---|---|
| DeepSeek V4 Pro | Passed3/3 checks passed | Replaced item.quantity with item.qty | 5.14s | 6.40s | 93 / 98 | ¥0.003483 |
| GLM-5.2 | Passed3/3 checks passed | Replaced item.quantity with item.qty | 5.64s | 6.03s | 69 / 54 | ¥0.001548 |
| Qwen3.7 Max | Passed3/3 checks passed | Replaced item.quantity with item.qty | 3.01s | 3.73s | 80 / 126 | ¥0.004397 |
| Kimi K3 | Passed3/3 checks passed | Replaced item.quantity with item.qty | 16.01s | 16.01s | 153 / 179 | ¥0.012576 |
Case 03 · 订单统计 SQL
一个产品后台常用的付费订单统计,测试过滤、聚合、分组和排序是否完整。
只输出一条 SQLite SQL,不要解释,不要 Markdown。统计过去 30 天内 status 为 paid 的订单,按 user_id 汇总 amount,结果列必须叫 user_id 和 total_amount,并按 total_amount 从高到低排序。
表结构:orders(id INTEGER, user_id INTEGER, status TEXT, amount REAL, created_at TEXT)Case 03 · 订单统计 SQL
Animation and small-task metrics come from production API records on 2026-10-04 UTC. Output tokens are billed usage and may include model reasoning.
| Model | Checks | Output summary | TTFT | Total | Input / output tokens | Usage cost |
|---|---|---|---|---|---|---|
| DeepSeek V4 Pro | Passed5/5 checks passed | Complete SQLite query with a 30-day filter | 9.91s | 10.92s | 98 / 42 | ¥0.002016 |
| GLM-5.2 | Passed5/5 checks passed | Complete SQLite query with a 30-day filter | 19.73s | 25.99s | 77 / 46 | ¥0.001428 |
| Qwen3.7 Max | Passed5/5 checks passed | Complete SQLite query with a 30-day filter | 9.84s | 10.46s | 85 / 752 | ¥0.022474 |
| Kimi K3 | Passed5/5 checks passed · rerun | Complete SQLite query with a 30-day filter | — | 11.77s | 176 / 81 | ¥0.009296 |
How to read the results
Animation and small-task metrics come from production API records on 2026-10-04 UTC. Output tokens are billed usage and may include model reasoning.
| Field | Meaning | Decision rule | Display |
|---|---|---|---|
| Renderable | Complete HTML runs in the iframe | Automated checks plus Chrome screenshots | Green Renderable |
| Fixed | Original output had a clear layout conflict | Minimal labeled fix with raw file retained | Labeled separately |
| Cost | Settled input and output token amount | Production D1 usage_records | CNY |
| Latency | First token and full response | Production first_token_ms / duration_ms | TTFT / Total |
This is a single-task observation, not a permanent ranking. Model versions, upstream load, and parameters change results.
How we run the tests
Keep the task and technical constraints fixed; change only the model ID.
Save the raw model response and check desktop plus 390px views in Chrome.
Read input/output tokens, cost, TTFT, and total duration from production D1 usage_records.
Label every manual fix instead of presenting a corrected page as raw output.
FAQ
Which model is best for frontend work?
Compare completion on the same task, then factor in tokens, cost, and wait time.
Why can output tokens exceed the HTML size?
Billed output tokens can include hidden model reasoning, so HTML bytes are not a usage estimate.
Why is Kimi labeled fixed?
Its CSS animation overrode the SVG positioning transform and moved the rider off canvas; only that conflict was fixed and the raw file remains available.
Use one task and verify the difference
Copy the prompt, change the model parameter, and choose based on your inputs, latency target, and budget.
testing