Hermes commited on
Commit ·
b9acfec
1
Parent(s): 28ca743
Leaderboard app + org card: static space with live-aggregated llm-bench.io data
Browse files
README.md
CHANGED
|
@@ -1,10 +1,38 @@
|
|
| 1 |
---
|
| 2 |
-
title:
|
| 3 |
emoji: 📈
|
| 4 |
colorFrom: pink
|
| 5 |
colorTo: indigo
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
|
|
|
| 8 |
---
|
| 9 |
|
| 10 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 & 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=>({"&":"&","<":"<",">":">",'"':""","'":"'"}[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>
|