> ## Documentation Index
> Fetch the complete documentation index at: https://docs.vizra.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Migrating from Vizra ADK

> Moving from the ADK's CSV-based evaluations to recorded, baseline-compared evals.

The ADK's evaluation system ([legacy docs](/testing/evaluations)) ran single-pass CSV evals against ADK agents and wrote CSV results. Vizra Evals is its successor, rebuilt on the official [Laravel AI SDK](https://github.com/laravel/ai): sampled runs, database persistence, baselines, and a [dashboard](/evals/dashboard). It's a reposition, not a rename — the concepts map, the code changes.

## The mapping

| Vizra ADK                                               | Vizra Evals                                                                                                       |
| ------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| `public string $agentName = 'support'` + `Agent::run()` | A `laravel/ai` agent target: `target(): mixed` or `expect(SupportBot::class)`                                     |
| `BaseEvaluation` subclass required                      | Optional — inline `toPassEval()` covers most evals; [classes](/evals/class-based-evaluations) remain for matrices |
| `preparePrompt(array $csvRowData): string`              | `transform(Row $row): Row` (optional; preserves row identity)                                                     |
| `evaluateRow(array $row, string $llmResponse)`          | `evaluate(Row $row, AgentResponse $response)` — the full response object, not a string                            |
| `$this->assertResponseContains($response, 'x')`         | `$this->assertContains('x')` — the response is ambient; no parameter threading                                    |
| CSV datasets only                                       | JSONL (preferred), CSV still supported, arrays, Eloquent, [production conversations](/evals/multi-turn)           |
| One run per row, pass/fail                              | `samples(n)` — pass rates and score distributions ([scoring](/evals/scoring))                                     |
| `vizra:run:eval` + CSV output in `storage/`             | `evals:run` / `pest --evals` + database + dashboard + `--output=json`                                             |
| Always exit 0                                           | Exit codes gate CI: 0/1/2 ([CLI](/evals/cli))                                                                     |
| `assertLlmJudge*` with regex response parsing           | [`judge()`](/evals/judge) on structured output — no parsing, reasoning persisted, calibration                     |

## Renamed for honesty

| Old              | New                      | Why                                      |
| ---------------- | ------------------------ | ---------------------------------------- |
| `assertNotToxic` | `containsNoBlockedWords` | It's a wordlist — the name now says so   |
| `assertNoPII`    | `noObviousPII`           | Regex-grade detection, named accordingly |

## Removed — deliberately

`assertResponseHasPositiveSentiment` (keyword counting), `assertGrammarCorrect` (regex heuristics), and `assertReadabilityLevel` (hand-rolled Flesch-Kincaid) measured nothing real. Each is one properly-done judge call away:

```php The honest replacement theme={null}
->judge('The response reads as positive and professionally written.', min: 7)
```

## A worked migration

```php Before — ADK theme={null}
class SupportEvaluation extends BaseEvaluation
{
    public string $agentName = 'customer_support';
    public string $csvPath = 'app/Evaluations/data/support.csv';

    public function evaluateRow(array $csvRowData, string $llmResponse): array
    {
        $this->resetAssertionResults();
        $this->assertResponseContains($llmResponse, $csvRowData['expected_response']);
        // ... manual final_status bookkeeping
    }
}
```

```php After — Vizra Evals theme={null}
it('handles support questions', function () {
    expect(SupportBot::class)->toPassEval(fn ($eval) => $eval
        ->dataset(base_path('evals/support.jsonl'))
        ->samples(3)
        ->assert(fn ($a, $row) => $a->contains($row->expected()))
        ->judge('Answers accurately without inventing policy.', min: 7)
        ->gate(maxRegressions: 0)
    );
});
```

No manual resets, no status bookkeeping, no CSV parsing — and the run is recorded, baselined, and visible in the dashboard.

<Info>
  Your ADK **agents** need porting to the Laravel AI SDK to be evaluated directly (the SDK's `Agent` contract + `Promptable`). Until then, the `Closure` target is the bridge — wrap anything that can produce an `AgentResponse`.
</Info>
