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
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
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