Skip to main content
Inline toPassEval() config covers most evals. Reach for a class when a suite deserves a name of its own, needs a model matrix, or should be runnable from the CLI and the dashboard’s Run button.
Terminal
app/Evals/SupportQuality.php
Inside evaluate(), the current response and row are ambient — assertion helpers take no $response argument, and every helper from the assertions reference exists as $this->assert*().

Model matrices with across()

Run the whole dataset against multiple provider/model combos — each becomes its own series in results, comparisons, and the dashboard:
Compare models on your own data
This is how you answer “can we move to the cheaper model?” with your own dataset instead of someone else’s benchmark.

Transform hooks

Rewrite rows before they reach the agent — keeping row identity intact:
Prompt wrapping
Use $row->withInput() (and friends) rather than constructing new rows — they preserve the content hash, so baseline comparison still lines up across runs even as your transform evolves.

Running class-based suites

From Pest — recorded under the class name
From the CLI
And from the dashboard’s Run button, which executes discovered classes via a queued job. All three surfaces share the tables, baselines, and history.