SolarQuoteBench

An AI benchmark and RL environment for designing, pricing and financially evaluating solar PV and battery installations.

v0.7.0 / 119 hand-checked public instances / 8 task families / deterministic grading / runs in verifiers and Inspect

How two AI models score

Average score across the published test tasks. 1.0 means every answer was right.

gpt-5.6-lunaClaude Sonnet 5.5
T5 proposal audit
Luna
0.600
Sonnet
0.966
T7 system sizing
Luna
0.591
Sonnet
0.771
T4 time-of-use payback
Luna
0.379
Sonnet
0.415
Who built it

Built with SolarSight

SolarQuoteBench is built by Cody Labs, the developer behind SolarSight, a free solar savings estimate for homeowners and quoting software for installers. The benchmark's grading engine is ported from the engine behind SolarSight's quotes.

These are screenshots of the public SolarSight site and show the kind of quote the benchmark asks an agent to get right.

getsolarsight.com
SolarSight homepage: a headline, an Estimate my solar button and an example card showing panels placed on an aerial photo of a roof with net cost and monthly bill before and after.
The SolarSight homepage, with an example roof layout and bill comparison.
Example proposal

An example installer proposal: roof layout, system size, cost and payback. Example customer and figures. The second shot is the same proposal further down: itemised quote, payment terms and acceptance.

SolarSight example installer proposal: roof layout with panels placed on an aerial photo, a 6.4 kW system for 18,240 dollars paying for itself in about 14 years.
SolarSight example proposal, lower half: itemised quote with panels, inverter, mounting kit and labour, total, payment terms and an accepted record.
A worked example

Why this is hard

Here is one task from the public set. A vendor proposal for a 10.56 kW system on the Gold Coast promises 18,970 kWh a year, and calls it a figure "you can rely on for the life of the system". The rebate, the savings, the GST and the price all check out.

Annual output, 10.56 kW Gold Coast system
Quote
18,970 kWh/year
Real
about 16,300 kWh/year

The production figure is wrong. It assumes the system turns every bit of sunlight reaching the panels into power. Real systems lose around 14% on the way: dust and grime on the glass, resistance in the cables, the inverter's conversion, and panels that never quite match each other. Cloud and weather are already in the solar data, so these losses come on top. Allow for them and that roof makes about 16,300 kWh, so the quote overstates output by roughly 16%.

To catch it, an agent has to pull the solar data for that exact roof, apply the losses correctly, find the one wrong number among many right ones, and leave the correct ones alone. Flagging a figure that is fine costs points, and some proposals have no errors at all. On this family gpt-5.6-luna averages 0.60 and Claude Sonnet 5.5 averages 0.97.

Every family works the same way: a realistic job, one checkable answer, and a deterministic grader. The rest of the tasks, and the held-out set, stay unseen.

The strongest evidence

Two families where the models separate

The agent gets a real customer situation: location, roof, electricity bills and tariff. It does the job of a solar sales engineer, using tools for PVGIS yield, tariffs, incentive rules, a usage profile and year-1 energy flows. It returns numbers or a structured audit.

T5 proposal audit

Luna over-flags clean proposals

gpt-5.6-luna4 of 5
Claude Sonnet 5.50 of 5

Clean proposals flagged as containing errors. Luna: precision 0.517, recall 1.000. Claude: precision 0.948, recall 0.979. Solved instances: 3 of 16 against 13 of 16.

T7 system sizing

The most headroom for both

gpt-5.6-luna, solved7 / 14
Claude Sonnet 5.5, solved10 / 14

Choose panels per plane and a battery to maximise NPV or hit a self-sufficiency target at lowest cost. Ground truth is the exhaustive optimum. Both models miss the time-of-use instances, where the supplied energy flow tool has no TOU windows.

Results by family

The eight task families

119 hand-checked public instances across eight families. We report which ones separate models and which ones do not. Each bar is a model's average score across that family's published tasks. 1.0 means every answer was right.

gpt-5.6-lunaClaude Sonnet 5.5

T5 proposal audit Discriminates

Find, classify and quantify planted errors in a vendor proposal. Clean proposals are included as controls.

Luna
0.600 / 3 of 16
Sonnet
0.966 / 13 of 16

T7 system sizing Discriminates

Choose panels per plane and a battery to maximise NPV or hit a self-sufficiency target at lowest cost. Ground truth is the exhaustive optimum.

Luna
0.591 / 7 of 14
Sonnet
0.771 / 10 of 14

T3 incentive eligibility Discriminates

Which schemes apply for a jurisdiction, system and install date, and what they are worth. Includes not-eligible cases and a withheld-tool variant.

Luna
0.749 / 8 of 16
Sonnet
0.944 / 14 of 16

T4 time-of-use payback Hard for both

Payback year and 25-year NPV under a TOU tariff, battery and export limit. Neither model solves more than 1 of 13.

Luna
0.379 / 0 of 13
Sonnet
0.415 / 1 of 13

T2 orientation allocate Partial

Split a panel budget across roof planes for yield or for dollar value. Two of the value instances are real tests of objective awareness. Both models fail them.

Luna
0.863 / 11 of 14
Sonnet
0.863 / 11 of 14

T8 full quote Near ceiling

The whole quote from a raw intake: production, flows, costs, rebates, savings, payback, NPV, IRR. Scored against truth and against the agent's own upstream numbers.

Luna
0.916 / 9 of 14
Sonnet
0.987 / 13 of 14

T6 consumption estimate Near ceiling

Annual consumption from bills: tax and supply charges, tiers, TOU periods, existing solar, part-year scaling.

Luna
0.944 / 15 of 16
Sonnet
1.000 / 16 of 16

T1 yield estimate Near ceiling

Annual kWh for a site, roof planes and panel spec. Traps: compass bearing versus PVGIS aspect, hemisphere tilt, loss composition.

Luna
0.999 / 16 of 16
Sonnet
1.000 / 16 of 16
T1 to T5 overall (75 instances)
Luna
0.728 / 38 solved
Sonnet
0.854 / 55 solved

Solved means the instance clears the family's pass threshold. gpt-5.6-luna, reasoning effort medium, through the OpenAI Responses API. T1 to T5 ran on 18 August 2026 and T6 to T8 in November 2026, with the T1 to T5 scores regraded under the current graders (no model calls, answers unchanged). Claude Sonnet 5.5 ran on 2 November 2026 through Claude Code's own agent loop (headless, tools supplied through an MCP server, effort left at the Claude Code default), not the raw API. A score gap between the two models can come from the harness as well as the model. Each model was run once per instance.

T1, T6 and T8 are at or near ceiling for Claude. Do not read them as evidence of difficulty. They work as controls and regression checks. T4 is hard for both models: we audited the grading bands and the errors are real arithmetic failures, not a band that is too tight. T3 separates them on rebate value, not on which scheme applies. Scheme identification is 0.938 for both. Luna returned a wrong or zero Australian STC value on several instances. The cause was not diagnosed, and the harness difference is one candidate.

Hardened tiers T6H and T8H also exist. Claude Sonnet 5.5 scored 1.000 on T6H and 0.978 on T8H, which is above the bar we set for a hard tier, so both ship as labelled control tiers and are not part of the default environment.

Method

Every answer checked by a calculator

There is no LLM judge, so a score can be reproduced exactly. Each grader reports a breakdown per dimension, and names the known failure mode an answer looks like.

01

Deterministic oracle

The grading engine is ported from the production solar quoting engine behind SolarSight. Each ported module reuses the original TypeScript test suite's asserted values, and a single cross-validation test file runs them together.

02

PVGIS-backed yields

Tools serve cached PVGIS fixtures. No live API call happens during grading, and a missing fixture fails loudly.

03

Error-origin attribution

Per-dimension breakdowns and a failure taxonomy for every family. In T8, each field is also scored against what it should have been given the agent's own earlier numbers, and the grader names the step where the chain first broke.

04

Public and private splits

The public split is 119 curated, hand-checked instances. A private held-out split is generated from disjoint seeds, kept private and used for re-runs. Private counts per family: T1 200, T2 80, T3 200, T4 200, T5 200, T6 200, T7 24, T8 60. Private instances are structurally validated, not individually hand-checked.

Free and commercial

What is free, and what we sell

Free, MIT licensed

The public benchmark

On the Prime Intellect Hub. Install it and run it on your own model.

  • 119 hand-checked public instances across eight task families
  • The graders and tools
  • MIT licensed
prime env install solar-sight/solarquotebench
uv run vf-eval solarquotebench
View on the Prime Hub
Limitations

What the benchmark does not claim

  • The hourly PV generation shape behind T2 value scoring, T4 and T7/T8 flows was authored, then measured against PVGIS hourly data. It diverges 2 to 11% on value-type quantities. T4 NPV differs by a mean 2.2% of system cost against PVGIS hourly data. One T2 instance sits just over a 20% divergence. Part of T4's ground truth rests on this authored shape.
  • Time-of-use tariffs are sourced for Ontario and Great Britain only. AU, IE, NZ and US instances use synthetic TOU shapes, labelled as such on the instance. T6 to T8 bill layouts and prices are synthetic.
  • T6 to T8 grade use of the supplied seasonal profile and tools, not how real households behave.
  • One run per model per instance. The two models used different harnesses, and no raw-API Claude run exists yet.