Hermes commited on
Commit
b9acfec
·
1 Parent(s): 28ca743

Leaderboard app + org card: static space with live-aggregated llm-bench.io data

Browse files
Files changed (4) hide show
  1. README.md +30 -2
  2. build.py +133 -0
  3. data.json +1 -0
  4. index.html +199 -0
README.md CHANGED
@@ -1,10 +1,38 @@
1
  ---
2
- title: README
3
  emoji: 📈
4
  colorFrom: pink
5
  colorTo: indigo
6
  sdk: static
7
  pinned: false
 
8
  ---
9
 
10
- Edit this `README.md` markdown file to author your organization card.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ title: llm-bench.io
3
  emoji: 📈
4
  colorFrom: pink
5
  colorTo: indigo
6
  sdk: static
7
  pinned: false
8
+ short_description: Live leaderboard of local LLMs — real-world quality & speed
9
  ---
10
 
11
+ # llm-bench.io
12
+
13
+ **llm-bench.io** is a community benchmarking platform for local LLMs. We aggregate real-world performance data — generation speed, memory usage, and LLM-judged quality across coding, agent-workflow, role-play, and research tasks — submitted by people running models on their own hardware. The data is free to explore, browse, and cite, with results linked back to the live site at [llm-bench.io](https://llm-bench.io).
14
+
15
+ ## What's here
16
+
17
+ This Space hosts the **interactive leaderboard**: the best-performing local models over the last 30 days (minimum 3 runs each), grouped by available VRAM.
18
+
19
+ - **Quality** — LLM-judged score (0–100) across four real-world scenarios
20
+ - **Speed** — average tokens/second on real hardware
21
+ - **VRAM tiers** — filter by 8 GB → 128 GB to see what fits your machine
22
+
23
+ Rows link back to the full benchmark results on the live site.
24
+
25
+ ## Explore the data
26
+
27
+ - 🔬 **Dataset (Hugging Face):** [llmbenchio/benchmarks-by-vram](https://huggingface.co/datasets/llmbenchio/benchmarks-by-vram) — condensed CSV, ready to load
28
+ - 🌐 **Live site:** [llm-bench.io](https://llm-bench.io) — browse all 900+ submissions, compare models, run your own benchmark
29
+ - 📖 **Methodology:** [how we measure](https://llm-bench.io/benchmark-methodology)
30
+ - 🧪 **Submit a benchmark:** [llm-bench.io/benchmark-client](https://llm-bench.io/benchmark-client)
31
+
32
+ ## About the measurements
33
+
34
+ Benchmarks are submitted by community members running their own hardware with their own tools (llama.cpp, vLLM, Ollama, …). Each submission measures generation speed, memory usage, and time-to-first-token, then an LLM judge scores output quality per scenario. We aggregate per model + VRAM tier, requiring at least 3 runs to filter out one-off outliers.
35
+
36
+ ---
37
+
38
+ *Leaderboard data refreshes periodically. Snapshot generated: see the page footer. Data source: `data.json` in this repository, built from the public [llm-bench.io API](https://llm-bench.io/api).*
build.py ADDED
@@ -0,0 +1,133 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """
3
+ Build leaderboard data for the llm-bench.io HuggingFace Static Space.
4
+
5
+ Fetches the public benchmarks API, aggregates by model + VRAM tier
6
+ (last 30 days, >= 3 runs, completed quality assessments only), and
7
+ writes a compact data.json consumed by index.html.
8
+
9
+ Run: python3 build.py
10
+ """
11
+ import json
12
+ import urllib.request
13
+ from collections import defaultdict
14
+ from datetime import datetime, timedelta, timezone
15
+
16
+ API = "https://llm-bench.io/api/benchmarks"
17
+ WINDOW_DAYS = 30
18
+ MIN_RUNS = 3
19
+
20
+ SCENARIOS = {
21
+ "coding_agent": "Coding",
22
+ "openclaw": "Agent",
23
+ "roleplay": "Role-Play",
24
+ "research": "Research",
25
+ }
26
+
27
+
28
+ def fetch_all():
29
+ records, offset, total = [], 0, None
30
+ while True:
31
+ url = f"{API}?limit=1000&offset={offset}"
32
+ req = urllib.request.Request(url, headers={"User-Agent": "llm-bench-hub-leaderboard/1.0"})
33
+ with urllib.request.urlopen(req, timeout=60) as r:
34
+ page = json.load(r)
35
+ total = page["total"]
36
+ records.extend(page["benchmarks"])
37
+ offset += len(page["benchmarks"])
38
+ if len(records) >= total or not page["benchmarks"]:
39
+ break
40
+ return total, records
41
+
42
+
43
+ def max_vram(b):
44
+ gpus = b.get("gpuList") or []
45
+ return max((g.get("vram_gb") or 0) for g in gpus) if gpus else 0
46
+
47
+
48
+ def hardware_label(b):
49
+ gpus = b.get("gpuList") or []
50
+ names = []
51
+ for g in gpus:
52
+ n = g.get("name") or ""
53
+ if n and n not in names:
54
+ names.append(n)
55
+ if names:
56
+ return " + ".join(names)
57
+ cpu = (b.get("cpuName") or "").split(" @ ")[0].strip()
58
+ return cpu or "CPU"
59
+
60
+
61
+ def main():
62
+ total, records = fetch_all()
63
+ cutoff = datetime.now(timezone.utc) - timedelta(days=WINDOW_DAYS)
64
+
65
+ def ts(b):
66
+ t = b.get("timestamp")
67
+ if not t:
68
+ return None
69
+ return datetime.fromisoformat(t.replace("Z", "+00:00"))
70
+
71
+ in_window = [
72
+ b for b in records
73
+ if (t := ts(b)) is not None and t >= cutoff and max_vram(b) > 0 and not b.get("flaggedBroken")
74
+ ]
75
+
76
+ groups = defaultdict(list)
77
+ for b in in_window:
78
+ groups[(max_vram(b), b.get("modelName"))].append(b)
79
+
80
+ def avg(items):
81
+ vals = [x for x in items if x is not None]
82
+ return round(sum(vals) / len(vals), 1) if vals else None
83
+
84
+ rows = []
85
+ for (vram, model), bs in groups.items():
86
+ if len(bs) < MIN_RUNS:
87
+ continue
88
+ # completed quality scores per scenario
89
+ scen_scores = {k: [] for k in SCENARIOS}
90
+ for b in bs:
91
+ for q in b.get("qualityAssessments") or []:
92
+ if q.get("status") == "completed" and q.get("overallKpiScore") is not None:
93
+ k = q.get("scenarioKey")
94
+ if k in scen_scores:
95
+ scen_scores[k].append(q["overallKpiScore"])
96
+ speeds = [b.get("tests", {}).get("tokenGenerationSpeed") for b in bs]
97
+ speed = avg(speeds)
98
+ quality = avg([b.get("avgQualityScore") for b in bs])
99
+ last = max(b["timestamp"] for b in bs if b.get("timestamp"))
100
+ hw = hardware_label(bs[0])
101
+
102
+ row = {
103
+ "vram": vram,
104
+ "model": model,
105
+ "hardware": hw,
106
+ "runs": len(bs),
107
+ "quality": quality,
108
+ "speed": speed,
109
+ "scenarios": {k: avg(v) for k, v in scen_scores.items() if v},
110
+ "updated": last[:10],
111
+ }
112
+ rows.append(row)
113
+
114
+ rows.sort(key=lambda r: (r["quality"] or 0, r["speed"] or 0), reverse=True)
115
+
116
+ out = {
117
+ "generatedAt": datetime.now(timezone.utc).isoformat(timespec="seconds"),
118
+ "windowDays": WINDOW_DAYS,
119
+ "minRuns": MIN_RUNS,
120
+ "totalSubmissions": total,
121
+ "inWindow": len(in_window),
122
+ "scenarios": SCENARIOS,
123
+ "rows": rows,
124
+ }
125
+ path = "/tmp/space-readme/data.json"
126
+ with open(path, "w") as f:
127
+ json.dump(out, f, separators=(",", ":"))
128
+ size = len(json.dumps(out, separators=(",", ":")))
129
+ print(f"rows={len(rows)} window_records={len(in_window)} total={total} bytes={size} -> {path}")
130
+
131
+
132
+ if __name__ == "__main__":
133
+ main()
data.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"generatedAt":"2026-09-10T20:01:17+00:00","windowDays":30,"minRuns":3,"totalSubmissions":909,"inWindow":640,"scenarios":{"coding_agent":"Coding","openclaw":"Agent","roleplay":"Role-Play","research":"Research"},"rows":[{"vram":128,"model":"mtplx-qwen38-27b-optimized-quality","hardware":"Apple M5 Max","runs":3,"quality":87.2,"speed":35.0,"scenarios":{"coding_agent":78.4,"openclaw":90.6,"roleplay":92.4,"research":87.6},"updated":"2026-09-01"},{"vram":23,"model":"unsloth/Qwen3.8-27B-GGUF:IQ3_S","hardware":"NVIDIA GeForce RTX 4090","runs":4,"quality":86.9,"speed":108.6,"scenarios":{"coding_agent":83.3,"openclaw":86.2,"roleplay":90.3,"research":87.9},"updated":"2026-08-29"},{"vram":64,"model":"mtplx-qwen38-27b-optimized-quality","hardware":"Apple M4 Max","runs":3,"quality":85.7,"speed":35.5,"scenarios":{"coding_agent":77.7,"openclaw":85.2,"roleplay":93.1,"research":86.7},"updated":"2026-09-02"},{"vram":7,"model":"Tiel-Coder-35B-A3B-MTP-UD-Q6_K_XL","hardware":"AMD Radeon RX 5600 OEM/5600 XT / 5700/5700 XT + AMD Radeon RX 9060 XT","runs":3,"quality":85.5,"speed":35.1,"scenarios":{"coding_agent":83.3,"openclaw":90.5,"roleplay":82.6,"research":85.6},"updated":"2026-09-04"},{"vram":23,"model":"unsloth/Qwen3.8-27B-GGUF:Q4_K_M","hardware":"NVIDIA GeForce RTX 4090","runs":6,"quality":85.1,"speed":95.3,"scenarios":{"coding_agent":78.0,"openclaw":85.9,"roleplay":89.0,"research":87.4},"updated":"2026-08-29"},{"vram":128,"model":"Qwen3.8-27B-oQ4e-fp16-mtp","hardware":"Apple M5 Max","runs":4,"quality":85.1,"speed":38.6,"scenarios":{"coding_agent":82.5,"openclaw":85.1,"roleplay":89.6,"research":83.0},"updated":"2026-08-20"},{"vram":128,"model":"mtplx-flash-next-bare-speed","hardware":"Apple M5 Max","runs":3,"quality":85.0,"speed":57.5,"scenarios":{"coding_agent":75.6,"openclaw":84.6,"roleplay":93.3,"research":86.3},"updated":"2026-09-01"},{"vram":23,"model":"qwen3.8-27b-UD-Q4_K_XL","hardware":"AMD Radeon RX 7900 XT/7900 XTX/7900 GRE/7900M","runs":3,"quality":84.9,"speed":50.7,"scenarios":{"coding_agent":80.6,"openclaw":83.7,"roleplay":86.9,"research":88.5},"updated":"2026-09-08"},{"vram":23,"model":"Tiel-Coder-35B-A3B-Q4_K_S","hardware":"AMD Radeon RX 7900 XT/7900 XTX/7900 GRE/7900M","runs":3,"quality":84.6,"speed":165.0,"scenarios":{"coding_agent":76.9,"openclaw":89.3,"roleplay":87.3,"research":84.9},"updated":"2026-09-05"},{"vram":15,"model":"Qwen3.8-27B-UD-Q3_K_XL","hardware":"NVIDIA GeForce RTX 5070 Ti","runs":8,"quality":84.6,"speed":66.3,"scenarios":{"coding_agent":73.3,"openclaw":86.8,"roleplay":92.3,"research":86.2},"updated":"2026-09-04"},{"vram":64,"model":"Qwen3.8-27B-oQ8e-fp16-mtp","hardware":"Apple M5 Max","runs":4,"quality":84.6,"speed":33.7,"scenarios":{"coding_agent":74.1,"openclaw":87.4,"roleplay":91.2,"research":85.6},"updated":"2026-08-28"},{"vram":128,"model":"Qwen3.8-Flash-Next-oQ5e-mtp","hardware":"Apple M4 Max","runs":10,"quality":84.0,"speed":37.6,"scenarios":{"coding_agent":76.0,"openclaw":84.7,"roleplay":89.8,"research":85.5},"updated":"2026-09-09"},{"vram":64,"model":"Qwen3.8-27B-oQ4-mtp","hardware":"Apple M5 Max","runs":4,"quality":83.9,"speed":42.8,"scenarios":{"coding_agent":75.4,"openclaw":89.2,"roleplay":85.0,"research":86.1},"updated":"2026-08-28"},{"vram":64,"model":"Muse-Glimmer-30B-oQ8e","hardware":"Apple M5 Max","runs":3,"quality":83.9,"speed":17.0,"scenarios":{"coding_agent":72.3,"openclaw":89.4,"roleplay":92.0,"research":82.1},"updated":"2026-08-29"},{"vram":16,"model":"Qwen3.8-27B-GSQ-RCO-IQ3_S","hardware":"NVIDIA GeForce RTX 4080 SUPER","runs":4,"quality":83.8,"speed":73.6,"scenarios":{"coding_agent":75.3,"openclaw":84.7,"roleplay":88.8,"research":86.3},"updated":"2026-09-04"},{"vram":64,"model":"Ornith-1.5-35B-A3B-oQ8e-mtp","hardware":"Apple M5 Max","runs":5,"quality":83.7,"speed":94.6,"scenarios":{"coding_agent":77.5,"openclaw":82.0,"roleplay":88.5,"research":86.8},"updated":"2026-09-07"},{"vram":8,"model":"Tiel-Coder-35B-A3B-MTP-UD-IQ3_XXS","hardware":"NVIDIA GeForce RTX 5060","runs":3,"quality":83.7,"speed":90.0,"scenarios":{"coding_agent":78.4,"openclaw":86.7,"roleplay":85.4,"research":84.3},"updated":"2026-09-09"},{"vram":64,"model":"Qwen3.8-27B-oQ4e-mtp","hardware":"Apple M5 Max","runs":26,"quality":83.5,"speed":45.3,"scenarios":{"coding_agent":74.2,"openclaw":83.4,"roleplay":90.5,"research":86.0},"updated":"2026-09-09"},{"vram":23,"model":"qwen3.8:27b-mtp-q4_K_M","hardware":"AMD Radeon RX 7900 XTX","runs":3,"quality":83.5,"speed":40.8,"scenarios":{"coding_agent":71.2,"openclaw":88.2,"roleplay":88.1,"research":86.7},"updated":"2026-08-16"},{"vram":64,"model":"Tiel-Coder-35B-A3B-MLX-oQ4e","hardware":"Apple M5 Max","runs":4,"quality":83.4,"speed":118.4,"scenarios":{"coding_agent":80.7,"openclaw":82.7,"roleplay":85.6,"research":84.4},"updated":"2026-08-25"},{"vram":16,"model":"Qwen3.8-27B-UD-IQ3_S","hardware":"NVIDIA GeForce RTX 4080 SUPER","runs":48,"quality":83.2,"speed":78.8,"scenarios":{"coding_agent":77.8,"openclaw":81.6,"roleplay":87.8,"research":85.7},"updated":"2026-09-05"},{"vram":23,"model":"qwen3.8:27b","hardware":"AMD Radeon RX 7900 XT/7900 XTX/7900 GRE/7900M","runs":5,"quality":82.8,"speed":35.6,"scenarios":{"coding_agent":78.6,"openclaw":82.8,"roleplay":84.8,"research":84.9},"updated":"2026-09-07"},{"vram":23,"model":"qwen3.8:latest","hardware":"AMD Radeon RX 7900 XTX","runs":7,"quality":82.6,"speed":37.4,"scenarios":{"coding_agent":75.9,"openclaw":82.2,"roleplay":85.1,"research":87.1},"updated":"2026-09-07"},{"vram":128,"model":"Qwen3.8-Flash-Next-oQ4e-mtp","hardware":"Apple M4 Max","runs":22,"quality":82.2,"speed":40.7,"scenarios":{"coding_agent":72.6,"openclaw":83.5,"roleplay":87.9,"research":84.9},"updated":"2026-09-07"},{"vram":64,"model":"Tiel-Coder-35B-A3B-MLX-oQ4e-MTP","hardware":"Apple M5 Max","runs":5,"quality":82.1,"speed":123.7,"scenarios":{"coding_agent":76.3,"openclaw":84.4,"roleplay":82.3,"research":85.3},"updated":"2026-09-07"},{"vram":64,"model":"Muse-Glimmer-30B-4bit","hardware":"Apple M5 Max","runs":3,"quality":82.1,"speed":29.9,"scenarios":{"coding_agent":68.6,"openclaw":89.3,"roleplay":89.6,"research":80.9},"updated":"2026-08-13"},{"vram":23,"model":"muse-glimmer:latest","hardware":"AMD Radeon RX 7900 XTX","runs":4,"quality":82.0,"speed":34.5,"scenarios":{"coding_agent":71.5,"openclaw":93.0,"roleplay":79.7,"research":83.6},"updated":"2026-08-25"},{"vram":64,"model":"Qwen3.8-27B-4bit","hardware":"Apple M5 Max","runs":9,"quality":81.9,"speed":30.6,"scenarios":{"coding_agent":76.8,"openclaw":78.0,"roleplay":89.2,"research":83.4},"updated":"2026-08-22"},{"vram":8,"model":"Cyber-Tiel-Coder-35B-A3B-MTP-UD-IQ3_XXS","hardware":"NVIDIA GeForce RTX 5060","runs":3,"quality":81.5,"speed":115.7,"scenarios":{"coding_agent":73.8,"openclaw":85.3,"roleplay":82.4,"research":84.7},"updated":"2026-09-10"},{"vram":23,"model":"Qwen3.8-27B-Q4_K_XL","hardware":"AMD Radeon RX 7900 XT/7900 XTX/7900 GRE/7900M","runs":15,"quality":81.5,"speed":72.4,"scenarios":{"coding_agent":78.7,"openclaw":76.5,"roleplay":85.7,"research":85.0},"updated":"2026-09-05"},{"vram":64,"model":"Qwen3.8-27B-oQ8e-mtp","hardware":"Apple M5 Max","runs":26,"quality":81.3,"speed":33.4,"scenarios":{"coding_agent":70.7,"openclaw":82.2,"roleplay":88.1,"research":84.4},"updated":"2026-09-10"},{"vram":64,"model":"unsloth/Qwen3.8-27B-GGUF:UD-Q8_K_XL","hardware":"Apple M5 Max","runs":3,"quality":80.9,"speed":24.4,"scenarios":{"coding_agent":68.1,"openclaw":80.7,"roleplay":89.3,"research":85.4},"updated":"2026-08-21"},{"vram":23,"model":"Ornith-1.5-35B-A3B-IQ4_XS","hardware":"AMD Radeon RX 7900 XT/7900 XTX/7900 GRE/7900M","runs":3,"quality":80.7,"speed":139.5,"scenarios":{"coding_agent":78.7,"openclaw":81.4,"roleplay":82.4,"research":80.2},"updated":"2026-09-05"},{"vram":128,"model":"Qwen3.8-27B-oQ8e-fp16-mtp","hardware":"Apple M2 Ultra","runs":13,"quality":80.7,"speed":34.1,"scenarios":{"coding_agent":72.7,"openclaw":77.3,"roleplay":88.2,"research":84.6},"updated":"2026-09-04"},{"vram":10,"model":"qwen3_coder_next","hardware":"NVIDIA GeForce RTX 3080","runs":4,"quality":80.1,"speed":31.2,"scenarios":{"coding_agent":72.5,"openclaw":87.3,"roleplay":85.3,"research":75.4},"updated":"2026-08-25"},{"vram":20,"model":"unsloth/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-GGUF:UD-Q4_K_XL","hardware":"NVIDIA GeForce RTX 3080 Ti + NVIDIA GeForce RTX 3080","runs":3,"quality":79.7,"speed":172.4,"scenarios":{"coding_agent":68.0,"openclaw":84.5,"roleplay":83.2,"research":83.1},"updated":"2026-09-07"},{"vram":23,"model":"qwen38-27b","hardware":"AMD Radeon RX 7900 XT/7900 XTX/7900 GRE/7900M","runs":6,"quality":79.6,"speed":72.7,"scenarios":{"coding_agent":67.5,"openclaw":77.3,"roleplay":88.7,"research":85.0},"updated":"2026-09-08"},{"vram":96,"model":"Qwen3.8-27B-UD-Q6_K_XL","hardware":"NVIDIA RTX PRO 6000 Blackwell Max-Q Workstation Edition","runs":4,"quality":79.5,"speed":84.3,"scenarios":{"coding_agent":75.9,"openclaw":76.9,"roleplay":84.4,"research":80.6},"updated":"2026-08-31"},{"vram":16,"model":"peculiar-ragdoll/Tiel-Coder-35B-A3B-GGUF-MTP","hardware":"Advanced Micro Devices, Inc. [AMD/ATI] HawkPoint1","runs":4,"quality":78.9,"speed":26.8,"scenarios":{"coding_agent":77.2,"openclaw":81.8,"roleplay":80.9,"research":75.8},"updated":"2026-09-01"},{"vram":64,"model":"Qwen3.8-27B-oQ8-mtp","hardware":"Apple M5 Max","runs":4,"quality":77.7,"speed":35.6,"scenarios":{"coding_agent":77.6,"openclaw":67.4,"roleplay":84.8,"research":81.0},"updated":"2026-08-17"},{"vram":23,"model":"Qwen3.6-35B-A3B-IQ4_NL","hardware":"AMD Radeon RX 7900 XT/7900 XTX/7900 GRE/7900M","runs":17,"quality":75.9,"speed":164.8,"scenarios":{"coding_agent":67.1,"openclaw":74.7,"roleplay":83.0,"research":78.7},"updated":"2026-09-05"},{"vram":8,"model":"gpt-oss-20b-UD-Q8_K_XL","hardware":"NVIDIA GeForce RTX 5060","runs":3,"quality":75.6,"speed":148.4,"scenarios":{"coding_agent":70.3,"openclaw":83.8,"roleplay":71.6,"research":76.7},"updated":"2026-09-09"},{"vram":23,"model":"gemma-4-26b-a4b-q4kxl","hardware":"AMD Radeon RX 7900 XT/7900 XTX/7900 GRE/7900M","runs":3,"quality":69.5,"speed":169.9,"scenarios":{"coding_agent":67.9,"openclaw":75.2,"roleplay":79.9,"research":55.2},"updated":"2026-09-05"},{"vram":23,"model":"gemma4:26b-a4b-it-qat","hardware":"AMD Radeon RX 7900 XTX","runs":3,"quality":69.2,"speed":116.0,"scenarios":{"coding_agent":60.5,"openclaw":81.7,"roleplay":70.1,"research":64.3},"updated":"2026-08-24"},{"vram":10,"model":"qwen36-35b_VISION","hardware":"NVIDIA GeForce RTX 3080","runs":5,"quality":67.0,"speed":33.1,"scenarios":{"coding_agent":60.7,"openclaw":52.9,"roleplay":81.6,"research":73.0},"updated":"2026-08-26"},{"vram":16,"model":"mudler/Qwen3.6-35B-A3B-APEX-MTP-GGUF","hardware":"Advanced Micro Devices, Inc. [AMD/ATI] HawkPoint1","runs":4,"quality":66.8,"speed":31.6,"scenarios":{"coding_agent":65.7,"openclaw":59.9,"roleplay":68.0,"research":73.8},"updated":"2026-09-01"},{"vram":10,"model":"qwen35_122b","hardware":"NVIDIA GeForce RTX 3080","runs":5,"quality":66.7,"speed":15.2,"scenarios":{"coding_agent":53.7,"openclaw":56.3,"roleplay":80.3,"research":76.3},"updated":"2026-08-25"},{"vram":128,"model":"Ling-3.0-tiny-oQ8e","hardware":"Apple M4 Max","runs":4,"quality":60.1,"speed":124.9,"scenarios":{"coding_agent":47.3,"openclaw":72.3,"roleplay":45.5,"research":75.2},"updated":"2026-09-10"},{"vram":10,"model":"ornith-1.5-9b","hardware":"NVIDIA GeForce RTX 3080","runs":3,"quality":54.3,"speed":93.8,"scenarios":{"coding_agent":11.7,"openclaw":55.2,"roleplay":76.6,"research":73.8},"updated":"2026-08-25"},{"vram":64,"model":"Qwen3.8-27B-oQ2e-mtp","hardware":"Apple M5 Max","runs":3,"quality":10.3,"speed":44.0,"scenarios":{"coding_agent":0.0,"openclaw":28.0,"roleplay":7.7,"research":5.6},"updated":"2026-08-30"}]}
index.html ADDED
@@ -0,0 +1,199 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>llm-bench.io — Local LLM Leaderboard</title>
7
+ <meta name="description" content="Live leaderboard of local LLMs benchmarked on real hardware — quality, speed, and VRAM requirements. Powered by llm-bench.io.">
8
+ <style>
9
+ :root{
10
+ --bg:#0b0e14; --panel:#11151f; --panel2:#161b28; --border:#232a3b;
11
+ --text:#e8ecf4; --muted:#8b94a7; --accent:#5b8cff; --accent2:#7c5bff;
12
+ --good:#4ade80; --mid:#facc15; --bad:#f87171;
13
+ }
14
+ *{box-sizing:border-box;margin:0;padding:0}
15
+ body{background:var(--bg);color:var(--text);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;line-height:1.5;padding:24px 16px 60px}
16
+ .wrap{max-width:1180px;margin:0 auto}
17
+ header{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap;margin-bottom:6px}
18
+ h1{font-size:24px;font-weight:700}
19
+ h1 .dot{color:var(--accent)}
20
+ .sub{color:var(--muted);font-size:13px;margin-bottom:18px}
21
+ .sub a{color:var(--accent);text-decoration:none}
22
+ .sub a:hover{text-decoration:underline}
23
+ .toolbar{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin-bottom:14px}
24
+ .chips{display:flex;gap:6px;flex-wrap:wrap}
25
+ .chip{background:var(--panel);border:1px solid var(--border);color:var(--muted);border-radius:999px;padding:5px 12px;font-size:12.5px;cursor:pointer;user-select:none;transition:all .15s}
26
+ .chip:hover{color:var(--text);border-color:#3a445c}
27
+ .chip.active{background:var(--accent);border-color:var(--accent);color:#fff}
28
+ .search{margin-left:auto;background:var(--panel);border:1px solid var(--border);border-radius:8px;color:var(--text);padding:7px 12px;font-size:13px;min-width:200px}
29
+ .search::placeholder{color:var(--muted)}
30
+ .meta{color:var(--muted);font-size:12px;margin-bottom:10px;display:flex;gap:16px;flex-wrap:wrap}
31
+ .meta b{color:var(--text);font-weight:600}
32
+ .card{background:var(--panel);border:1px solid var(--border);border-radius:12px;overflow:auto}
33
+ table{width:100%;border-collapse:collapse;font-size:13px;min-width:900px}
34
+ th,td{padding:9px 12px;text-align:left;border-bottom:1px solid var(--border);white-space:nowrap}
35
+ th{position:sticky;top:0;background:var(--panel2);color:var(--muted);font-size:11.5px;text-transform:uppercase;letter-spacing:.04em;cursor:pointer;user-select:none;z-index:1}
36
+ th:hover{color:var(--text)}
37
+ th .arrow{font-size:10px;margin-left:3px;opacity:.7}
38
+ td.num,th.num{text-align:right;font-variant-numeric:tabular-nums}
39
+ tr:hover td{background:rgba(91,140,255,.05)}
40
+ .model-cell{display:flex;flex-direction:column;gap:1px;max-width:340px}
41
+ .model-name{font-weight:600;color:var(--text);overflow:hidden;text-overflow:ellipsis}
42
+ .model-hw{color:var(--muted);font-size:11.5px;overflow:hidden;text-overflow:ellipsis}
43
+ .vram{color:var(--accent2);font-weight:600}
44
+ .qbar{display:inline-block;width:52px;height:5px;border-radius:3px;background:var(--border);vertical-align:middle;margin-right:7px;overflow:hidden}
45
+ .qbar i{display:block;height:100%;border-radius:3px}
46
+ .sc{color:var(--text)}
47
+ .sc.dim{color:var(--muted)}
48
+ .updated{color:var(--muted);font-size:11.5px}
49
+ footer{margin-top:22px;color:var(--muted);font-size:12px;display:flex;gap:8px;flex-wrap:wrap;align-items:center}
50
+ footer a{color:var(--accent);text-decoration:none}
51
+ footer a:hover{text-decoration:underline}
52
+ .empty{padding:40px;text-align:center;color:var(--muted)}
53
+ @media(max-width:700px){ .search{margin-left:0;width:100%} }
54
+ </style>
55
+ </head>
56
+ <body>
57
+ <div class="wrap">
58
+ <header>
59
+ <h1>llm-bench<span class="dot">.io</span> — Local LLM Leaderboard</h1>
60
+ </header>
61
+ <div class="sub">
62
+ Real-world benchmarks from actual users — LLM-judged <b>quality</b> and <b>speed</b> across coding, agent, role-play &amp; research tasks, grouped by VRAM.
63
+ <a href="https://llm-bench.io" target="_blank" rel="noopener">Run your own test →</a>
64
+ </div>
65
+
66
+ <div class="toolbar">
67
+ <div class="chips" id="vramChips"></div>
68
+ <input class="search" id="search" type="search" placeholder="Filter model name…" aria-label="Filter models">
69
+ </div>
70
+
71
+ <div class="meta" id="meta"></div>
72
+
73
+ <div class="card">
74
+ <table>
75
+ <thead>
76
+ <tr>
77
+ <th data-sort="model">Model</th>
78
+ <th data-sort="vram" class="num">VRAM</th>
79
+ <th data-sort="runs" class="num">Runs</th>
80
+ <th data-sort="quality" class="num">Quality</th>
81
+ <th data-sort="speed" class="num">Speed (tok/s)</th>
82
+ <th data-sort="coding_agent" class="num">Coding</th>
83
+ <th data-sort="openclaw" class="num">Agent</th>
84
+ <th data-sort="roleplay" class="num">Role-Play</th>
85
+ <th data-sort="research" class="num">Research</th>
86
+ <th data-sort="updated" class="num">Updated</th>
87
+ </tr>
88
+ </thead>
89
+ <tbody id="rows"></tbody>
90
+ </table>
91
+ </div>
92
+
93
+ <footer>
94
+ <span>Data: last <b id="win">–</b> days, ≥ <b id="minr">–</b> runs per model · generated <span id="gen">–</span></span>
95
+ <span>·</span>
96
+ <span>Methodology: <a href="https://llm-bench.io/benchmark-methodology" target="_blank" rel="noopener">how we measure</a></span>
97
+ <span>·</span>
98
+ <span>Dataset on Hugging Face: <a href="https://huggingface.co/datasets/llmbenchio/benchmarks-by-vram" target="_blank" rel="noopener">llmbenchio/benchmarks-by-vram</a></span>
99
+ </footer>
100
+ </div>
101
+
102
+ <script>
103
+ let DATA=null, sortKey="quality", sortDir=-1, vramFilter=null, query="";
104
+
105
+ async function init(){
106
+ try{
107
+ DATA = await (await fetch("data.json")).json();
108
+ }catch(e){
109
+ document.getElementById("rows").innerHTML =
110
+ '<tr><td colspan="10" class="empty">Could not load data.json — try refreshing.</td></tr>';
111
+ return;
112
+ }
113
+ document.getElementById("gen").textContent = new Date(DATA.generatedAt).toLocaleDateString("en-GB",{day:"2-digit",month:"short",year:"numeric"});
114
+ document.getElementById("win").textContent = DATA.windowDays;
115
+ document.getElementById("minr").textContent = DATA.minRuns;
116
+ renderChips(); bindHeader(); bindSearch(); render();
117
+ }
118
+
119
+ function renderChips(){
120
+ const vals=[...new Set(DATA.rows.map(r=>r.vram))].sort((a,b)=>a-b);
121
+ const box=document.getElementById("vramChips");
122
+ const all=document.createElement("div");
123
+ all.className="chip active"; all.textContent="All VRAM";
124
+ all.onclick=()=>{vramFilter=null;[...box.children].forEach(c=>c.classList.remove("active"));all.classList.add("active");render();};
125
+ box.appendChild(all);
126
+ for(const v of vals){
127
+ const c=document.createElement("div");
128
+ c.className="chip"; c.textContent=v+" GB";
129
+ c.onclick=()=>{vramFilter=v;[...box.children].forEach(x=>x.classList.remove("active"));c.classList.add("active");render();};
130
+ box.appendChild(c);
131
+ }
132
+ }
133
+
134
+ function bindHeader(){
135
+ document.querySelectorAll("th[data-sort]").forEach(th=>{
136
+ th.addEventListener("click",()=>{
137
+ const k=th.dataset.sort;
138
+ if(sortKey===k) sortDir*=-1; else {sortKey=k;sortDir=(k==="model"?1:-1);}
139
+ render();
140
+ });
141
+ });
142
+ }
143
+ function bindSearch(){
144
+ document.getElementById("search").addEventListener("input",e=>{query=e.target.value.toLowerCase();render();});
145
+ }
146
+
147
+ function qColor(v){ if(v==null)return "var(--bad)"; if(v>=85)return "var(--good)"; if(v>=75)return "var(--mid)"; return "var(--bad)"; }
148
+ function esc(s){ return String(s).replace(/[&<>"']/g,c=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"}[c])); }
149
+
150
+ function render(){
151
+ let rows=DATA.rows.slice();
152
+ if(vramFilter!=null) rows=rows.filter(r=>r.vram===vramFilter);
153
+ if(query) rows=rows.filter(r=>r.model.toLowerCase().includes(query));
154
+ rows.sort((a,b)=>{
155
+ let x=a[sortKey],y=b[sortKey];
156
+ if(x==null)x=-1; if(y==null)y=-1;
157
+ if(typeof x==="string") return sortDir*x.localeCompare(y);
158
+ return sortDir*(x-y);
159
+ });
160
+
161
+ const head=document.querySelector("thead tr");
162
+ [...head.children].forEach(th=>{
163
+ const t=th.querySelector(".arrow"); if(t)t.remove();
164
+ if(th.dataset.sort===sortKey){const a=document.createElement("span");a.className="arrow";a.textContent=sortDir<0?"▼":"▲";th.appendChild(a);}
165
+ });
166
+
167
+ const tb=document.getElementById("rows");
168
+ if(!rows.length){ tb.innerHTML='<tr><td colspan="10" class="empty">No models match this filter.</td></tr>'; return; }
169
+
170
+ tb.innerHTML=rows.map(r=>{
171
+ const link=`https://llm-bench.io/benchmarks?model=${encodeURIComponent(r.model)}`;
172
+ const sc=k=>r.scenarios[k]!=null
173
+ ? `<td class="num sc">${r.scenarios[k].toFixed(1)}</td>`
174
+ : `<td class="num sc dim">–</td>`;
175
+ const q=r.quality;
176
+ const qCell=q!=null
177
+ ? `<td class="num"><span class="qbar"><i style="width:${Math.max(0,Math.min(100,q))}%;background:${qColor(q)}"></i></span><b>${q.toFixed(1)}</b></td>`
178
+ : `<td class="num sc dim">–</td>`;
179
+ return `<tr style="cursor:pointer" title="Open on llm-bench.io">
180
+ <td><div class="model-cell"><a class="model-name" href="${link}" target="_blank" rel="noopener" onclick="event.stopPropagation()">${esc(r.model)}</a><span class="model-hw">${esc(r.hardware)}</span></div></td>
181
+ <td class="num vram">${r.vram} GB</td>
182
+ <td class="num">${r.runs}</td>
183
+ ${qCell}
184
+ <td class="num">${r.speed!=null?r.speed.toFixed(1):"–"}</td>
185
+ ${sc("coding_agent")}${sc("openclaw")}${sc("roleplay")}${sc("research")}
186
+ <td class="num updated">${r.updated}</td>
187
+ </tr>`;
188
+ }).join("");
189
+
190
+ document.getElementById("meta").innerHTML=
191
+ `<span><b>${rows.length}</b> models</span>`+
192
+ `<span><b>${DATA.inWindow}</b> submissions in window</span>`+
193
+ `<span>of <b>${DATA.totalSubmissions}</b> total on llm-bench.io</span>`;
194
+ }
195
+
196
+ init();
197
+ </script>
198
+ </body>
199
+ </html>