Skip to content

Commit 74ae20f

Browse files
barretodavidclaude
andcommitted
Gemini 3.7 Flash enters fourth, and 3.6 retires
Google shipped gemini-3.7-flash on 2026-08-13 and it was benchmarked the same day: 234 runs, both conditions, $4.65, zero errors and zero retries. Baseline winner is @low at 87.9 +/-3.7 (n=52), rank 4 of 26, on 156/156 solved. It is also the fastest thing in the study by some distance, a 6.2s median answer and a median suite pass 1.8x quicker than Opus 5's, at about a cent a task. Pinned --provider-order google-ai-studio. Gemini thought signatures only validate on the endpoint that issued them, and AI Studio was both the faster half at probe time and the one billing undiscounted; Vertex carries a 50% launch discount, and pricing a permanent row against a promotion is the defect the flex-tier rule already covers. Least squares over the runs implies exactly $0.75/$3.75, so the pin landed where intended. The probe found two real levels, not four. @disabled is a 400 (reasoning is mandatory), and @xHigh and @max are unadvertised, accepted, and sit inside @high's band: 2.7k median first-call output at low against 8.9k/7.1k/9.2k at high/xhigh/max. Neither unadvertised tier was swept, as with Grok 4.6's @max. Two findings worth the space. The dial is the mirror image of Grok 4.6's: the one-shot rate climbs just as honestly, 71% to 83%, but it costs 2.8x the money and 2.6x the wait, so the index hands back nothing and the three tiers finish within 2.9 points. And the MCP cells at @low and @Medium are the cleanest noise measurement in the dataset -- zero tool calls across 52 runs, so they differ from baseline only by an unused tool definition in the prompt, and they still moved -5.4 and +3.4. That is the n=26 error bar with the mechanism held at zero, and it is the scale at which every small lift here should be read. Gemini 3.6 Flash is deprecated, superseded. Unlike the Grok 4.5 retirement yesterday this pair is not a tie: 14.7 points on a combined half-width of 8.6, 3.3x cheaper and 4.7x faster. Its 299 runs stay in main.jsonl as the trail. Also fixes a stale price. Google halved 3.6 Flash after the 2026-08-01 snapshot -- found while pricing 3.7, since both list at $0.75/$3.75 on the same endpoint and scoring one against the other's old price would have made the new model look twice as cheap as it is. All four components moved by exactly 0.5, so it is expressible; 3.6 was 71.3 and is 73.2 at the corrected price. The FAQ's "Opus has the fastest median pass" is retired with a check that now asserts the ordering the sentence claims. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 parent d412393 commit 74ae20f

8 files changed

Lines changed: 683 additions & 33 deletions

File tree

README.md

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
How good is each frontier LLM at writing Starknet smart contracts on its own, and which
44
models get better when you hand them a Cairo documentation tool?
55

6-
This repository is the benchmark behind both answers: 26 models from 13 labs, **8,327
6+
This repository is the benchmark behind both answers: 26 models from 13 labs, **8,262
77
agentic runs** on 13 hand-written contract tasks, graded by 106 hidden `snforge` tests.
88
Every model ran the suite both ways, alone and with the
99
[Cairo Coder](https://www.cairo-coder.com/) MCP documentation tool.
@@ -26,14 +26,19 @@ documentation tool:
2626
| 1 | Opus 5 | low | 92.0 ±0.7 | 100% |
2727
| 2 | Grok 4.6 | xhigh | 90.3 ±3.2 | 87% |
2828
| 3 | Fable 5 | xhigh | 89.3 ±1.2 | 100% |
29-
| 4 | Sonnet 5 | high | 83.4 ±4.3 | 67% |
30-
| 5 | Kimi K3 | low | 83.2 ±4.2 | 71% |
29+
| 4 | Gemini 3.7 Flash | low | 87.9 ±3.7 | 71% |
30+
| 5 | Sonnet 5 | high | 83.4 ±4.3 | 67% |
3131

3232
Intervals are bootstrapped over each model's runs (1,000 resamples), and most of this
33-
table is a tie. Opus 5 separates from Fable 5, Sonnet 5 and Kimi K3, but not from Grok
34-
4.6, whose wider interval overlaps it; Grok 4.6 overlaps everything below it too.
33+
table is a tie. Opus 5 separates from Fable 5 and from Sonnet 5, but not from Grok 4.6
34+
or Gemini 3.7 Flash, whose wider intervals overlap it. Grok 4.6 overlaps everything
35+
below it, and Gemini 3.7 Flash overlaps everything except the top spot.
3536
Read overlapping pairs as ties, not an order.
3637

38+
Gemini 3.7 Flash is the one to look at on price. It reaches fourth at about a cent a
39+
task, on the fastest median answer in the field at 6.2 seconds, while solving every
40+
task in every rep; its predecessor sat 15 points lower for three times the money.
41+
3742
All 26 models, the difficulty breakdown and the documentation-tool deltas are in the
3843
report. To print the full leaderboard yourself:
3944

@@ -104,8 +109,8 @@ version of it. Per-model deltas are charted in the report.
104109

105110
## Published data
106111

107-
`results/runs/main.jsonl` holds 9,214 records: the 8,327 analysed runs, 51 that hit a
108-
transport error and are dropped at load, and 836 belonging to models since retired from
112+
`results/runs/main.jsonl` holds 9,448 records: the 8,262 analysed runs, 51 that hit a
113+
transport error and are dropped at load, and 1,135 belonging to models since retired from
109114
the study, which the report excludes from every figure including its run count. It is
110115
the only input the report and the audit need:
111116

bench/audit.py

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,9 +116,16 @@ def check(claim, cond, detail=""):
116116
o, f, k, mi, s5, sol = (by[n] for n in
117117
["Opus 5", "Fable 5", "Kimi K3", "MiMo-V2.5-Pro", "Sonnet 5", "GPT-5.6 Sol"])
118118
check("Opus 100% one-shot", one(C(o["spec"])) == 100, f"{one(C(o['spec'])):.0f}%")
119-
check("Opus has the fastest median pass of the charted models",
120-
min((pass_time(by[r["label"]]["spec"]), r["label"])
121-
for r in lb if r["label"] in charted)[1] == "Opus 5")
119+
# Opus held this until 2026-08-13, when Gemini 3.7 Flash arrived at half its
120+
# median pass. The card now concedes the point by name, so the check asserts the
121+
# ordering the sentence claims rather than just who is first.
122+
_pass_rank = sorted((pass_time(by[r["label"]]["spec"]), r["label"])
123+
for r in lb if r["label"] in charted)
124+
check("Gemini 3.7 Flash serves the fastest median pass, 1.8x ahead of Opus",
125+
_pass_rank[0][1] == "Gemini 3.7 Flash" and _pass_rank[1][1] == "Opus 5"
126+
and abs(_pass_rank[1][0] / _pass_rank[0][0] - 1.8) < 0.1,
127+
f"{_pass_rank[0][1]} {_pass_rank[0][0]:.1f}s vs {_pass_rank[1][1]} {_pass_rank[1][0]:.1f}s "
128+
f"({_pass_rank[1][0]/_pass_rank[0][0]:.2f}x)")
122129
check("Opus is 2.7 clear of second", abs(o["sci"] - f["sci"] - 2.7) < 0.06, f"{o['sci']-f['sci']:.2f}")
123130
check("Kimi 71% vs MiMo 40% one-shot",
124131
round(one(C(k["spec"]))) == 71 and round(one(C(mi["spec"]))) == 40,
@@ -385,6 +392,34 @@ def chart_labels(svg):
385392
", ".join(f"{v:.1f}" for v in g46)
386393
+ f"; one-shot {_g46_one[0]:.0f}% -> {_g46_one[1]:.0f}%"
387394
+ f"; all tiers 100% solved: {all(_g46_solved)}")
395+
# Gemini 3.7 Flash is the counterweight to Grok 4.6 in the same grid: an equally
396+
# real dial that the index refuses to reward, because the effectiveness it buys
397+
# is paid for exactly in cost and speed. The negative half is the claim worth
398+
# pinning, so the spread is asserted as a ceiling, not just the endpoints.
399+
g37 = {t: sci(C(f"google/gemini-3.7-flash@{t}")) for t in ("low", "medium", "high")}
400+
_g37_one = {t: one(C(f"google/gemini-3.7-flash@{t}")) for t in ("low", "high")}
401+
_g37_x = (med_cost("google/gemini-3.7-flash@high") / med_cost("google/gemini-3.7-flash@low"),
402+
st.median([x["llm_time_s"] for x in C("google/gemini-3.7-flash@high")])
403+
/ st.median([x["llm_time_s"] for x in C("google/gemini-3.7-flash@low")]))
404+
check("Gemini 3.7's dial buys one-shot, 71 to 83%, for 2.8x the money and 2.6x the wait",
405+
max(g37.values()) - min(g37.values()) < 3.0
406+
and round(_g37_one["low"]) == 71 and round(_g37_one["high"]) == 83
407+
and all(all(x["solved"] for x in C(f"google/gemini-3.7-flash@{t}"))
408+
for t in ("low", "medium", "high"))
409+
and abs(_g37_x[0] - 2.8) < 0.15 and abs(_g37_x[1] - 2.6) < 0.15,
410+
", ".join(f"{t} {v:.1f}" for t, v in g37.items())
411+
+ f"; spread {max(g37.values()) - min(g37.values()):.1f}"
412+
+ f"; one-shot {_g37_one['low']:.0f}% -> {_g37_one['high']:.0f}%"
413+
+ f"; {_g37_x[0]:.2f}x cost, {_g37_x[1]:.2f}x time")
414+
# The noise-floor datapoint: two MCP cells where the mechanism is provably absent,
415+
# because the model never called the tool, and the score still moved either way.
416+
_g37_mcp = {t: C(f"google/gemini-3.7-flash@{t}", "mcp") for t in ("low", "medium")}
417+
check("Gemini 3.7's low and medium MCP cells move +/-5 with zero lookups",
418+
all(sum(x.get("n_assist_calls") or 0 for x in rs) == 0 for rs in _g37_mcp.values())
419+
and abs(sci(_g37_mcp["low"]) - g37["low"]) > 3
420+
and abs(sci(_g37_mcp["medium"]) - g37["medium"]) > 3,
421+
", ".join(f"{t}: {sum(x.get('n_assist_calls') or 0 for x in rs)} lookups over {len(rs)} runs, "
422+
f"delta {sci(rs) - g37[t]:+.1f}" for t, rs in _g37_mcp.items()))
388423
fable = {t: sci(C(f"anthropic/claude-fable-5@{t}")) for t in ("xhigh", "max")}
389424
check("Fable's max drops 5.6 below its xhigh plateau",
390425
abs(fable["xhigh"] - fable["max"] - 5.6) < 0.15,

bench/html_report.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -963,7 +963,7 @@ def dial_grid(labels):
963963
<section>
964964
<h2>The thinking dial</h2>
965965
<p class="takeaway" style="margin:0 0 10px">Same index, baseline runs only: the top {word(DIAL_TOP_N)} models, each drawn across its own effort ladder. The ring marks <b>the tier the leaderboard scores</b>.</p>
966-
<p class="takeaway" style="margin:0 0 10px">Things to look for: <b>Muse Spark 1.2's dial splits in two</b>, minimal through medium landing at 66 to 71 and high and xhigh at 80. <b>All three Anthropic models pay for <code>max</code></b>: Opus 5 peaks at <code>low</code> and gives back 7 points, while Fable 5 and Sonnet 5 hold plateaus that <code>max</code> drops by 5.6 and 10. Kimi K3 is level at off, low and its <code>max</code> default, dipping only at <code>high</code>. <b>Grok 4.6 is the only dial here that climbs the whole way</b>, 84.4 at <code>low</code> to 90.3 at <code>xhigh</code>, and it buys first-try success rather than correctness: 62% to 87% one-shot with every tier already at 100% solved.</p>
966+
<p class="takeaway" style="margin:0 0 10px">Things to look for: <b>Muse Spark 1.2's dial splits in two</b>, minimal through medium landing at 66 to 71 and high and xhigh at 80. <b>All three Anthropic models pay for <code>max</code></b>: Opus 5 peaks at <code>low</code> and gives back 7 points, while Fable 5 and Sonnet 5 hold plateaus that <code>max</code> drops by 5.6 and 10. Kimi K3 is level at off, low and its <code>max</code> default, dipping only at <code>high</code>. <b>Grok 4.6 is the only dial here that climbs the whole way</b>, 84.4 at <code>low</code> to 90.3 at <code>xhigh</code>, and it buys first-try success rather than correctness: 62% to 87% one-shot with every tier already at 100% solved. <b>Gemini 3.7 Flash is the same story with the opposite ending</b>: its one-shot rate climbs just as honestly, 71% to 83%, but the ladder costs it 2.8&times; the money and 2.6&times; the wait, so the index hands back nothing and its three tiers finish within 2.9 points of each other.</p>
967967
{dial_grid(dial_labels)}
968968
<div class="legend legend-bottom"><span><span class="key" style="background:{SCI_OPEN_COLOR}"></span>open weights</span><span><span class="key" style="background:{SCI_CLOSED_COLOR}"></span>closed weights</span></div>
969969
</section>"""
@@ -1002,9 +1002,10 @@ def dial_grid(labels):
10021002
# opposite case, number-forward, and use .scorecard.)
10031003
FAQ = [
10041004
("Why does Opus 5 win?", "100% one-shot",
1005-
"Every task in every rep solved on the first submission, at the field's fastest "
1006-
"median pass. Nothing else in the field is perfect on that measure, which is why a "
1007-
"flagship price tag still leaves it 2.7 points clear."),
1005+
"Every task in every rep solved on the first submission. Nothing else in the field is "
1006+
"perfect on that measure, which is why a flagship price tag still leaves it 2.7 points "
1007+
"clear. It is no longer the quickest, though: Gemini 3.7 Flash serves a median pass "
1008+
"1.8&times; faster, and solves everything too."),
10081009
("Kimi K3 over MiMo? MiMo is far cheaper", "71% vs 40% one-shot",
10091010
"This is the index working as intended. MiMo serves a pass 1.4× faster and 6× cheaper, "
10101011
"and still loses 4.3 points, because it delivers broken code first about three runs in "

bench/sci.py

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,18 @@
105105
"openai/gpt-5.6-luna-pro": ((1.00, 6.00, 0.10, 1.250), (0.10, 0.60, 0.01, 0.125)),
106106
# Z.ai cut GLM 5.2 ~10% in the same week, unrelated to OpenAI.
107107
"z-ai/glm-5.2": ((0.7966, 2.5036, 0.14794, None), (0.7168, 2.2528, 0.13312, None)),
108+
# Google halved Gemini 3.6 Flash some time after the 2026-08-01 snapshot;
109+
# found on 2026-08-13 while pricing 3.7 Flash. Every component moved by
110+
# exactly 0.5, so it is expressible. The runs themselves confirm the "was"
111+
# vector: least squares over the 299 recorded runs implies $1.34/$7.56,
112+
# which is $1.50/$7.50 with cache reads pulling the input average down.
113+
#
114+
# This one matters beyond its own row. Both Gemini entries are priced at the
115+
# google-ai-studio standard endpoint, and 3.7 Flash lists at the same
116+
# $0.75/$3.75 there, so without the revision the newer model would appear to
117+
# cost half what its predecessor does when the two are in fact identical.
118+
"google/gemini-3.6-flash": ((1.50, 7.50, 0.15, 0.08333333333333334),
119+
(0.75, 3.75, 0.075, 0.04166666666666667)),
108120
}
109121

110122

@@ -562,7 +574,52 @@ def run_cost(run):
562574
{"specs": ["google/gemini-3.6-flash@max", "google/gemini-3.6-flash@xhigh",
563575
"google/gemini-3.6-flash@high", "google/gemini-3.6-flash@medium",
564576
"google/gemini-3.6-flash@low", "google/gemini-3.6-flash@minimal"],
565-
"label": "Gemini 3.6 Flash", "lab": "Google", "open_weight": False},
577+
# deprecated 2026-08-13: superseded by Gemini 3.7 Flash; charts carry one bar
578+
# per family's best (David). Unlike the Grok 4.5 retirement the same day,
579+
# this pair is not a tie that needed a tiebreak: 87.9 against 73.2 is a gap
580+
# of 14.7 on a combined half-width of 8.6, and 3.7 is also 3.3x cheaper per
581+
# task and 4.7x faster. Its 299 runs stay in main.jsonl as the audit trail.
582+
"label": "Gemini 3.6 Flash", "lab": "Google", "open_weight": False,
583+
"deprecated": True},
584+
# Gemini 3.7 Flash, released and benchmarked 2026-08-13 (canonical slug
585+
# google/gemini-3.7-flash-20260813). Six endpoints, all status 0, but pinned
586+
# --provider-order google-ai-studio regardless: Gemini thought signatures only
587+
# validate on the endpoint that issued them, and AI Studio was both the faster
588+
# half at probe time (144 tok/s p50 against Vertex's 88) and the one billing
589+
# the undiscounted list price. Vertex carries a 50% launch discount, and
590+
# scoring a permanent row against a promotion is the defect the flex-tier note
591+
# above already rules out. The runs confirm the pin landed: least squares over
592+
# them implies exactly $0.75/$3.75. 234 runs, 0 errors, 0 retries.
593+
#
594+
# Probe: @disabled is a 400, "Reasoning is mandatory for this endpoint and
595+
# cannot be disabled", so @low is the floor. OpenRouter advertises low/medium/
596+
# high and defaults to medium; @xhigh and @max are unadvertised, accepted, and
597+
# land INSIDE @high's band. Median first-call output on the two hard probe
598+
# tasks is 2.7k at low against 8.9k / 7.1k / 9.2k at high / xhigh / max: a
599+
# 3.3x step up from the floor, then 1.30x across the top three. Two real
600+
# levels, so neither unadvertised tier was swept, the same call Grok 4.6's
601+
# @max got.
602+
#
603+
# The dial is inert on the index, and the tiers trade one component for
604+
# another rather than climbing: SCI 87.9 / 85.0 / 87.5 at low / medium / high,
605+
# every pair overlapping, while one-shot goes 71 -> 65 -> 83% and pays for the
606+
# top end in cost (77 -> 58) and speed (100 -> 90). Correctness is 100% at all
607+
# three, 156/156. Note @medium, the provider default, is the WORST of the
608+
# three rather than the middle: at n=26 it read as the midpoint of a monotone
609+
# climb, and only the top-up to n=52 broke that. That is why the top-up went
610+
# to all three tiers instead of the nominal winner, and it is the argument for
611+
# doing so whenever a bracket lands inside its own error bar.
612+
#
613+
# The MCP cells are the cleanest noise measurement in the dataset. At @low and
614+
# @medium the model called assist_with_cairo ZERO times across 52 runs, so
615+
# those cells differ from baseline only by an unused tool definition sitting
616+
# in the prompt -- and they still moved -5.4 and +3.4. That is the n=26 error
617+
# bar with the mechanism held at zero, not behaviour, and it is the scale at
618+
# which every small lift in this study should be read. Only @high touches the
619+
# tool at all, 0.42 calls/run over 7 of 26 runs, for +0.6.
620+
{"specs": ["google/gemini-3.7-flash@low", "google/gemini-3.7-flash@medium",
621+
"google/gemini-3.7-flash@high"],
622+
"label": "Gemini 3.7 Flash", "lab": "Google", "open_weight": False},
566623
{"specs": ["openai/gpt-5.6-luna-pro", "openai/gpt-5.6-luna@max",
567624
"openai/gpt-5.6-luna@xhigh", "openai/gpt-5.6-luna@high",
568625
"openai/gpt-5.6-luna@medium", "openai/gpt-5.6-luna@low",

results/model_meta.json

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,27 @@
77
"context_length": 1048576,
88
"hugging_face_id": null,
99
"price_per_m": {
10-
"input": 1.5,
11-
"output": 7.5,
12-
"cache_read": 0.15,
13-
"cache_write": 0.08333333333333334
10+
"input": 0.75,
11+
"output": 3.75,
12+
"cache_read": 0.075,
13+
"cache_write": 0.04166666666666667
1414
},
15-
"pricing_note": null,
15+
"pricing_note": "halved by Google after the snapshot date, found 2026-08-13; the pre-cut $1.50/$7.50 the runs were billed at is the was-vector in sci.PRICE_REVISIONS",
16+
"type": null,
17+
"params_total": null,
18+
"params_active": null
19+
},
20+
"google/gemini-3.7-flash": {
21+
"name": "Google: Gemini 3.7 Flash",
22+
"context_length": 1048576,
23+
"hugging_face_id": null,
24+
"price_per_m": {
25+
"input": 0.75,
26+
"output": 3.75,
27+
"cache_read": 0.075,
28+
"cache_write": 0.04166666666666667
29+
},
30+
"pricing_note": "as listed 2026-08-13 on google-ai-studio, the endpoint the runs were pinned to; the model shipped that day and did not exist at the snapshot date. Google's Vertex endpoints carry a launch discount of 50% that this deliberately does not price against, on the same reasoning that keeps the half-price flex tiers out",
1631
"type": null,
1732
"params_total": null,
1833
"params_active": null

results/report.html

Lines changed: 13 additions & 13 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)