MODEL COMPARISON & BENCHMARKS

Kimi, DeepSeek, GLM, or Qwen?

Keep one prompt and one constraint set, then compare each model's real frontend output, token usage, cost, and wait time.

Animation benchmark updated on 2026-10-04 from production API billing records.

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.

01 / FOCUS

What we watch for each model

K

Kimi

Chinese writing, context retention, and fast small-page generation.

Chinese contextContext retentionGeneration speed
D

DeepSeek

Reasoning, code structure, and animation completeness.

ReasoningCodingPage completeness
G

GLM

Chinese workflows, structured output, and long reasoning requests.

Chinese tasksStructured outputReasoning time
Q

Qwen

Multilingual, coding, and visual scene generation together.

MultilingualCode and toolsVisual structure
02 / MATRIX

One test matrix for every model

All four models receive the same public task, with billed production metrics shown beside the output.

DimensionWhat we recordWhy it matters
Visual completenessCharacter, bicycle, motion, and depthWhether the page is usable as delivered
Code constraintsSingle file, inline resources, responsive CSSWhether it can be embedded safely
Output usageInput / output tokens and CNY costWhether reasoning spend is controllable
SpeedTime to first token and full responseInteraction and automation wait time
03 / SAME BUILD TASK

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.

Real HTML previewDeepSeek V4.1 Flash
D

DeepSeek V4.1 Flash

The production API returned a complete single-file HTML scene with a visible rider, bicycle, and layered seaside background.

Renderable
Input tokens25609
Output tokens3047
Cost¥0.009160
Total time15.79s
Checks score7/7
Real HTMLdeepseek-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>
ChecksComplete HTMLPelican + bicycleSpinning wheelsIndependent wing rhythmThree scene layers390px CSSNo external dependency
04 / REPRODUCIBLE TESTS

Reproducible test cases

Alongside the animation, small support and code tasks check structured output and minimal fixes.

01

Case 01 · Support-ticket routing

一个充值已扣款但余额未到账的紧急工单,测试模型能否稳定输出可入库的 JSON。

Task prompt你是客服工单路由器。只输出 JSON,不要 Markdown,不要解释。字段必须为 category、priority、needs_human、reply_language、reason。category 只能是 billing、account、api;priority 只能是 low、medium、high;reply_language 使用 BCP-47。 工单:我昨晚给 API 账户充值 200 元,银行卡已经扣款,但余额仍然是 0。我们今天要上线,能否尽快处理?
Acceptance checkscategory=billingpriority=highneeds_human=truereply_language=zh-CN输出可被 JSON.parse 解析

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.

ModelChecksOutput summaryTTFTTotalInput / output tokensUsage cost
DeepSeek V4 ProPassed4/4 checks passedJSON 有效;billing / high / true / zh-CN11.79s12.92s118 / 134¥0.004680
GLM-5.2Passed4/4 checks passedJSON 有效;billing / high / true / zh-CN8.24s8.75s99 / 64¥0.001938
Qwen3.7 MaxPassed4/4 checks passedJSON 有效;billing / high / true / zh-CN9.37s10.22s106 / 627¥0.019075
Kimi K3Passed4/4 checks passedJSON 有效;billing / high / true / zh-CN17.12s17.79s174 / 209¥0.014628
02

Case 02 · TypeScript Production TypeScript bug

一个很小但常见的字段名错误,测试模型能否给出最小可运行修复。

Task prompt只输出修复后的 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); }
Acceptance checks使用 item.qty删除 item.quantity保留 subtotal 函数名输出可直接通过类型检查

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.

ModelChecksOutput summaryTTFTTotalInput / output tokensUsage cost
DeepSeek V4 ProPassed3/3 checks passedReplaced item.quantity with item.qty5.14s6.40s93 / 98¥0.003483
GLM-5.2Passed3/3 checks passedReplaced item.quantity with item.qty5.64s6.03s69 / 54¥0.001548
Qwen3.7 MaxPassed3/3 checks passedReplaced item.quantity with item.qty3.01s3.73s80 / 126¥0.004397
Kimi K3Passed3/3 checks passedReplaced item.quantity with item.qty16.01s16.01s153 / 179¥0.012576
03

Case 03 · 订单统计 SQL

一个产品后台常用的付费订单统计,测试过滤、聚合、分组和排序是否完整。

Task prompt只输出一条 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)
Acceptance checksSUM(amount) 汇总金额过滤 status='paid'按 user_id 分组按 total_amount 降序只保留过去 30 天

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.

ModelChecksOutput summaryTTFTTotalInput / output tokensUsage cost
DeepSeek V4 ProPassed5/5 checks passedComplete SQLite query with a 30-day filter9.91s10.92s98 / 42¥0.002016
GLM-5.2Passed5/5 checks passedComplete SQLite query with a 30-day filter19.73s25.99s77 / 46¥0.001428
Qwen3.7 MaxPassed5/5 checks passedComplete SQLite query with a 30-day filter9.84s10.46s85 / 752¥0.022474
Kimi K3Passed5/5 checks passed · rerunComplete SQLite query with a 30-day filter—11.77s176 / 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.

FieldMeaningDecision ruleDisplay
RenderableComplete HTML runs in the iframeAutomated checks plus Chrome screenshotsGreen Renderable
FixedOriginal output had a clear layout conflictMinimal labeled fix with raw file retainedLabeled separately
CostSettled input and output token amountProduction D1 usage_recordsCNY
LatencyFirst token and full responseProduction first_token_ms / duration_msTTFT / Total

This is a single-task observation, not a permanent ranking. Model versions, upstream load, and parameters change results.

05 / METHOD

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.

06 / FAQ

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.

KIMISEEK

Use one task and verify the difference

Copy the prompt, change the model parameter, and choose based on your inputs, latency target, and budget.

Start
testing
Kimi, DeepSeek, GLM, and Qwen Compared with a Real Frontend Task | KimiSeek