Skip to main content
Evals cost tokens — but developing them shouldn’t. Everything runs offline against the Laravel AI SDK’s fakes, which is also exactly how you test eval wiring in your own suite.

Fake the agent

tests/Evals/SupportBotTest.php
Fakes accept canned strings (consumed in order), closures, or full TextResponse objects with real Usage, Meta, and tool calls — so even costBelow() and toolCalled() assertions are testable offline. SupportBot::assertPrompted(...) then verifies exactly what was sent.

Fake the judge

The judge is an agent too:
Faking judge scores

Multi-turn rows just work

When the target agent is faked, multi-turn rows route straight to the fake — your canned responses and assertPrompted() checks behave identically for single- and multi-turn rows, and nothing leaks to the network.

Dry runs from the CLI

For class-based suites, --dry-run fakes everything automatically:
Terminal
The entire suite executes — datasets parse, assertions run, results persist — with zero tokens. Scores are meaningless (responses are auto-generated placeholders); the point is proving the wiring before you spend. Use it whenever you add rows or touch an evaluation class.

Keep faked runs out of Cloud

A faked agent produces real-looking scores from canned strings. If you use Vizra Cloud, say so, and the run stays out of the history:
Wiring test, not measurement
The CLI’s --dry-run is already excluded automatically — this is only needed for Pest evals that fake the agent themselves, because nothing else distinguishes them from a real run. Local recording is unaffected either way.
The pattern to internalize: fakes for wiring, --evals for measurement. The vizra/evals package’s own test suite — 150+ tests — runs entirely on fakes, no API keys anywhere.