Molecular-visualization benchmark

MolBench

Can LLM assistants turn natural-language requests — “show the heme as orange ball-and-stick”, “superpose the subunits and hide the waters” — into correct molecular visualizations? MolBench measures two distinct skills: authoring a declarative MolViewSpec scene (what the picture is) and controlling a live Mol* viewer through imperative API calls (what the tool does). Both are graded deterministically against frozen, correct-by-construction answers.

LLMs evaluated
15
open & closed
Benchmark tasks
70 + 20
MVS ×1 · API ×3
MVS F1 leader
0.90
deepseek-v3.2
Median valid scenes
81%
Mol* accepts the scene

Leaderboard

Two tracks, two skills. MVS F1 (the primary ranking) scores scene authoring — the declarative MolViewSpec tree a model emits, matched against the reference by the atoms each selection picks out. A scene scores 0 unless Mol* would show it. API F1 scores tool control — the imperative Mol*/PDBeMolstar calls that drive a live viewer (superpose, hide waters, spin, focus), the operations a static scene cannot express. The leader is highlighted; open-weight models are namespaced with a provider slash.

# Model MVS F1 Validated F1 Valid scene Cond F1 API F1 Cost Speed
1deepseek/deepseek-v3.2openopenrouter:deepseek/deepseek-v3.20.903 ±0.180.92199%0.9160.859 ±0.28$0.04538.85s
2deepseek/deepseek-v4-flashopenopenrouter:deepseek/deepseek-v4-flash0.859 ±0.270.87093%0.9250.930 ±0.10—9.03s
3claude-haiku-4-5closedanthropic:claude-haiku-4-50.857 ±0.240.87796%0.8950.928 ±0.14$0.30731.87s
4gemini-3.5-flash1closedopenrouter:google/gemini-3.5-flash0.849 ±0.280.87094%0.9000.951 ±0.10$0.24205.20s
5minimax/minimax-m3openopenrouter:minimax/minimax-m30.817 ±0.310.82590%0.9070.721 ±0.28—6.31s
6qwen/qwen3-next-80b-a3b-instructopenopenrouter:qwen/qwen3-next-80b-a3b-instruct0.805 ±0.280.83191%0.8810.871 ±0.16—1.62s
7z-ai/glm-5.2openopenrouter:z-ai/glm-5.20.805 ±0.310.83290%0.8950.932 ±0.10—7.22s
8meta-llama/llama-4-maverickopenopenrouter:meta-llama/llama-4-maverick0.792 ±0.380.79981%0.9730.807 ±0.23—4.42s
9google/gemma-3-27b-itopenopenrouter:google/gemma-3-27b-it0.713 ±0.380.71881%0.8760.834 ±0.15$0.01675.61s
10moonshotai/kimi-k2.6openopenrouter:moonshotai/kimi-k2.60.657 ±0.420.68073%0.9020.787 ±0.30—21.24s
11gpt-5.4-nano1closedopenrouter:openai/gpt-5.4-nano0.654 ±0.400.68276%0.8640.835 ±0.17$0.01562.53s
12openai/gpt-oss-120bopenopenrouter:openai/gpt-oss-120b0.561 ±0.450.57463%0.8930.894 ±0.15—7.56s
13qwen/qwen3-30b-a3b-instruct-2507openopenrouter:qwen/qwen3-30b-a3b-instruct-25070.519 ±0.470.53056%0.9320.897 ±0.13$0.00994.35s
14openai/gpt-oss-20bopenopenrouter:openai/gpt-oss-20b0.252 ±0.410.25629%0.8830.881 ±0.14$0.01317.15s
15nvidia/nemotron-3-super-120b-a12bopenopenrouter:nvidia/nemotron-3-super-120b-a12b0.078 ±0.260.0799%0.9100.860 ±0.17—8.27s
16baseline-rulesclosed0.000—0%0.0000.715 ±0.10——
—mistralai/mistral-small-26032openopenrouter:mistralai/mistral-small-2603————0.817 ±0.17—1.39s

MVS F1: primary scene-authoring score, 70 tasks, 1 sample each, run 2026-10-18. Engine-neutral by design — though Mol* is currently the only viewer that implements MolViewSpec. Validated F1: the same scenes after the render-and-judge cascade (see Tiered grading). Valid scene: share of samples Mol* accepts and renders; the rest are invalid JSON, invalid MVS or failed to load, and score 0 — hover for the breakdown, click for every failing sample. Cond F1: scene quality over valid scenes only — the gap from MVS F1 is how much a model loses to broken output rather than to visualization error. API F1: the tool-control track, not re-run in October: these are the 2026-07-04 results (20 tasks, ×3 samples, same grader). Cost: the October MVS run at provider list prices (— = not reported). Speed: seconds per call from the July run (October timings include rendering). ± is the spread across tasks.

1 Ran via OpenRouter in October (the July API-track result used the provider's native API). Treated as the same model. 2 Not re-run in October: OpenRouter's upstream (Mistral) rate-limited every attempt (11 tries). MVS columns blank; API track from July.

Key findings

What the leaderboard actually tells you — read these before the table.

FINDING 01 · THE HEADLINE

Output validity, not competence, drives the ranking

The MVS ranking is largely a valid-output ranking. Over valid scenes, every LLM clusters at 0.86–0.97 Cond F1 — yet the unconditional spread is ~0.83. Valid-scene rate alone correlates with MVS F1 at r = 0.996. Of the 266 failed samples, 227 are invalid JSON and 36 are JSON that Mol* rejects as MVS (3 more failed to load) — details.

nvidia/nemotron-3-super-120b-a12b is last among the LLMs (~0.08 MVS F1) yet scores ~0.91 Cond F1 — competent when its scene is valid, but it usually isn’t (valid scene 9%; 64 of 70 samples are invalid JSON).

FINDING 02

The best open model is at the closed frontier-small tier

The top open model, deepseek-v3.2 (0.90), beats the best closed model, claude-haiku-4-5 (0.86) at 7× lower cost ($0.0453 vs $0.3073 for the run). But “open” spans a wide range: gpt-oss-20b (0.25), nemotron-3-super-120b-a12b (0.08) sit at the bottom, mostly on invalid output.

FINDING 03

Regime spread is dominated by output reliability

Tasks span translation → structure-grounded → clinical. Across regimes the model spread runs ~0.67–1.00; in the expanded panel it tracks output validity — a few models rarely emit a valid scene — more than task difficulty. See the per-regime table below.

FINDING 04 · NOVEL

Clinical grounding into 3D structure

Tasks bridge clinical genetics and structure: ClinVar pathogenic variants mapped via UniProt + PDBe SIFTS numbering onto the correct residues (e.g. p53 R175H). No other molecular-viz benchmark does this.

FINDING 05

Grounding dossiers don’t lift scores

Adding a frozen fact sheet about each structure (chains, ligands, numbering) changes MVS F1 by -0.041 on average across 15 models. On the 647 task×model pairs whose scene is valid in both runs the effect is -0.004. The drop comes from more invalid output on the longer prompt, worst for qwen3-30b-a3b-instruct-2507 (valid scenes 56% → 31%). The 2×2 ↓

FINDING 06

Without the MVS reference, no model writes a valid scene

With only the output contract (“bare”), 0 of 420 scenes are valid across 3 models, with or without a dossier. Mostly the JSON parses but Mol* rejects it — parameters written straight onto the node instead of under params. Models don’t know MVS from pretraining.

Prompting conditions (the 2×2)

Every model above ran with the spec prompt: the output contract plus a neutral MolViewSpec reference. We also ran it with a dossier — a grounding pack of facts about the task’s structure (chains, residue ranges, ligand codes and atom names, SIFTS/UniProt numbering, ClinVar positions), built offline and frozen with the task. And a bare prompt, the output contract only, on three models. 70 MVS tasks, 1 sample, run 2026-10-18.

Dossiers don’t help. Mean change in MVS F1: -0.041 over 15 models. On the 647 task×model pairs valid in both runs: -0.004 (69 better, 92 worse, 486 unchanged). The overall drop is more invalid output on the longer prompt (worst: qwen3-30b-a3b-instruct-2507, valid scenes 56% → 31%). On the 15 lookup-heavy tasks (clinical and resolve-by-name) the mean change is -0.021. 2 models pass +0.10 there — gpt-oss-120b (+0.16; +0.033 on the 4 valid in both), llama-4-maverick (+0.13; -0.044 on the 2 valid in both) — and 4 lose as much. With 15 tasks and one sample, one task flipping between invalid and valid moves the mean by ~0.05; the gains come from such flips, not from better answers. Bare: 0 valid scenes of 420.
Model Spec F1 +Dossier F1 Δ Valid (spec) Valid (+dossier) Δ valid in both Δ lookup tasks
deepseek-v3.20.9030.888-0.01699%97%-0.013 (n=67)-0.152
deepseek-v4-flash0.8590.778-0.08193%84%-0.011 (n=55)-0.073
claude-haiku-4-50.8570.842-0.01596%93%-0.002 (n=65)-0.051
gemini-3.5-flash0.8490.816-0.03394%90%-0.013 (n=62)-0.130
minimax-m30.8170.819+0.00290%91%-0.010 (n=59)-0.037
qwen3-next-80b-a3b-instruct0.8050.830+0.02591%91%+0.020 (n=60)+0.040
glm-5.20.8050.783-0.02290%86%+0.005 (n=56)-0.124
llama-4-maverick0.7920.793+0.00181%83%-0.000 (n=52)+0.127
gemma-3-27b-it0.7130.654-0.05981%70%+0.028 (n=47)-0.159
kimi-k2.60.6570.568-0.08973%64%-0.008 (n=36)-0.027
gpt-5.4-nano0.6540.605-0.04976%76%-0.047 (n=40)+0.085
gpt-oss-120b0.5610.582+0.02063%66%-0.011 (n=26)+0.160
qwen3-30b-a3b-instruct-25070.5190.266-0.25456%31%-0.013 (n=16)+0.042
gpt-oss-20b0.2520.207-0.04629%24%+0.033 (n=6)+0.012
nemotron-3-super-120b-a12b0.0780.081+0.0039%9%— (n=0)-0.035

Δ = dossier − spec, MVS F1 (tree match, no rendering). Δ valid in both: mean paired change over the tasks whose scene Mol* accepts in both runs (n tasks). Δ lookup tasks: all 15 clinical and resolve-by-name tasks, valid or not.

Bare prompt (no MVS reference)

Model Valid (spec)F1 (spec) Valid (bare)F1 (bare) Valid (bare+dossier)F1 (bare+dossier)
deepseek-v3.299%0.9030%0.0000%0.000
claude-haiku-4-596%0.8570%0.0000%0.000
qwen3-30b-a3b-instruct-250756%0.5190%0.0000%0.000

Bare scenes mostly parse as JSON but are invalid MVS — see the Mol* messages. Without the reference, models don’t know the MVS tree format.

Difficulty gradient by task regime

Mean MVS F1 by how the answer key is grounded, easy → hard, left to right. Best per column highlighted. Columns marked other test a different skill and are not ordered by difficulty.

ModelTranslation
n=41
Grounded (ligand/SS)
n=8
Clinical (SIFTS/ClinVar)
n=9
Resolution (by name)
n=6 (other)
Interactions (atoms)
n=6 (other)
deepseek-v3.20.9770.9730.7310.6730.798
deepseek-v4-flash0.9400.8750.6340.6850.795
claude-haiku-4-50.9760.9630.6500.2380.830
gemini-3.5-flash0.9761.0000.7190.4260.395
minimax-m30.9270.9860.6300.3670.569
qwen3-next-80b-a3b-instruct0.8640.8240.5760.7040.823
glm-5.20.9400.7480.6750.4750.488
llama-4-maverick0.9670.9910.3580.0000.773
gemma-3-27b-it0.7860.8630.5930.4720.438
kimi-k2.60.7610.6220.5020.2810.602
gpt-5.4-nano0.7790.8550.3620.1110.515
gpt-oss-120b0.6590.8560.3110.1790.258
qwen3-30b-a3b-instruct-25070.7300.3750.2220.0000.235
gpt-oss-20b0.3170.0000.2220.2780.167
nemotron-3-super-120b-a12b0.0980.1180.0580.0000.000
baseline-rules0.0000.0000.0000.0000.000

Where models differ by skill

Mean MVS F1 on tasks tagged with each skill (task count under the name). Skills are derived automatically from the reference scene tree.

Modelcamera
n=5
color
n=63
interactions
n=2
load
n=70
measurement
n=3
multi-component
n=50
representation
n=70
resolve
n=6
selection
n=35
surface
n=8
transparency
n=1
deepseek-v3.21.0000.9240.5000.9030.9290.9040.9030.6730.8631.0001.000
deepseek-v4-flash0.7810.8740.9000.8590.6670.8610.8590.6850.8330.9960.969
claude-haiku-4-51.0000.9191.0000.8570.7630.8910.8570.2380.8530.9620.692
gemini-3.5-flash1.0000.8860.6860.8490.0000.8570.8490.4260.7961.0001.000
minimax-m30.7810.8611.0000.8170.2330.8190.8170.3670.8100.9640.711
qwen3-next-80b-a3b-instruct0.4860.8170.9000.8050.8090.7630.8050.7040.8000.9640.711
glm-5.20.7810.8380.3330.8050.5230.8100.8050.4750.7690.8370.692
llama-4-maverick1.0000.8690.5000.7920.9760.8490.7920.0000.7920.8390.711
gemma-3-27b-it0.0000.7320.0000.7130.5420.6620.7130.4720.7171.0001.000
kimi-k2.60.6000.6870.8430.6570.3090.6130.6570.2810.5320.9581.000
gpt-5.4-nano0.9120.7060.4610.6540.5000.6900.6540.1110.5990.7990.667
gpt-oss-120b0.4000.5960.4280.5610.0000.6440.5610.1790.6160.4620.692
qwen3-30b-a3b-instruct-25070.5620.5660.0000.5190.2330.4870.5190.0000.3710.7140.711
gpt-oss-20b0.0000.2380.0000.2520.0000.1600.2520.2780.1140.5001.000
nemotron-3-super-120b-a12b0.0000.0870.0000.0780.0000.1090.0780.0000.1280.0000.000
baseline-rules0.0000.0000.0000.0000.0000.0000.0000.0000.0000.0000.000

Tiered grading

Tree-matching can under-credit a scene that renders the same through a different tree. The escalating grader renders each valid but imperfect scene and escalates only when needed: tree-match → visual diff → VLM judge. The visual diff rescues only near-identical renders (≤ 2 pixels changing by > 48 in any channel, at 256 px), because a one-residue highlight changes just a few pixels. Across 15 models it confirmed 84 of 294 imperfect scenes (29%) as the right scene — 25 rendering the same (≤ 2 pixels differ), 59 judged the same by the VLM. That moves validated F1 by only +0.00 to +0.03: grading selections by the atoms they pick out already credits most equivalent namings.

Models analysed
15
spec run, 2026-10-18
Imperfect valid scenes
294
rendered for a visual check
Rescued
84 (29%)
25 by render match · 59 by the VLM
Validated − tree F1
+0.00–0.03
range across models
Model Tree F1 Validated F1 Δ Perfect Escalated Pixel same VLM same Different Failed
deepseek-v3.2open0.9030.921+0.018452406181
claude-haiku-4-5closed0.8570.877+0.020422503223
deepseek-v4-flashopen0.8590.870+0.011442143145
gemini-3.5-flashclosed0.8490.870+0.021491704134
glm-5.2open0.8050.832+0.027402307167
qwen3-next-80b-a3b-instructopen0.8050.831+0.026323208246
minimax-m3open0.8170.825+0.008422103187
llama-4-maverickopen0.7920.799+0.00749812513
gemma-3-27b-itopen0.7130.718+0.0053423032013
gpt-5.4-nanoclosed0.6540.682+0.02811421842017
kimi-k2.6open0.6570.680+0.0233318251119
gpt-oss-120bopen0.5610.574+0.0132519051426
qwen3-30b-a3b-instruct-2507open0.5190.530+0.011261304931
gpt-oss-20bopen0.2520.256+0.00414601550
nemotron-3-super-120b-a12bopen0.0780.079+0.0014201164

Validated F1 uses a rescue-only policy: a task scores 1.0 when the cascade confirms it renders the reference scene, otherwise it keeps its tree-match score (the VLM gives a binary same/different, not a graded score). Perfect: tree match already 1.0, not rendered. Escalated: valid, imperfect scenes that were rendered. Pixel same / VLM same: rescued at the visual-diff / VLM tier. Different: the VLM saw a different scene. Failed: no valid scene, scores 0 (see failures). The VLM verdicts are not yet checked against human raters — see the side-by-side evidence in the evaluator gallery →. Judge: claude-opus-4-8.