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

# Configuration

> Judge defaults, gates, comparison tolerance, concurrency, and the price table behind cost tracking.

```bash Terminal theme={null}
php artisan vendor:publish --tag=evals-config
```

Everything lives in `config/evals.php`:

## Judge defaults

```php config/evals.php theme={null}
'judge' => [
    'agent' => \Vizra\Evals\Judge\JudgeAgent::class,   // swap for a custom judge
    'provider' => env('EVALS_JUDGE_PROVIDER'),          // null → SDK default provider
    'model' => env('EVALS_JUDGE_MODEL'),
    'min_score' => 7,                                   // default threshold, 1–10
    'skip_on_gate_failure' => true,                     // failed gates skip judges
],
```

<Tip>
  Point the judge at a **different model family** than the agents under test — models grade their own family leniently. See [The LLM Judge](/evals/judge).
</Tip>

## Gates and comparison

```php config/evals.php theme={null}
'gate' => [
    'min_score' => null,        // 0..1 — null disables that check
    'min_pass_rate' => null,
    'max_regressions' => 0,     // enforced only when comparing
],

'compare' => [
    'epsilon' => 0.05,          // score drops within this are jitter, not regressions
],
```

Overridable per evaluation (`gatePolicy()`), per Pest eval (`->gate(...)`), and per CLI run (`--min-score` etc.). Pass-rate drops always count as regressions regardless of epsilon — see [Baselines & Regressions](/evals/baselines-and-regressions).

## Execution

```php config/evals.php theme={null}
'paths' => [],                      // extra discovery dirs (app/Evals is always scanned)
'table_prefix' => env('EVALS_TABLE_PREFIX', 'eval_'),
'concurrency' => env('EVALS_CONCURRENCY', 5),   // parallel agent invocations; 1 = sequential
'timeout' => env('EVALS_TIMEOUT'),              // per prompt() call, seconds
```

Concurrency parallelizes the agent invocations (the slow part); assertions, judges, and persistence always run in the parent process. Dry runs force sequential because SDK fakes live in process memory.

## The price table

Cost tracking multiplies each sample's token `Usage` against a **user-maintained** price table:

```php config/evals.php theme={null}
'pricing' => [
    'openai' => [
        'gpt-5.4' => ['input' => 1.25, 'output' => 10.00, 'cache_read' => 0.125],
    ],
    'anthropic' => [
        'claude-sonnet-5' => ['input' => 3.00, 'output' => 15.00, 'cache_read' => 0.30, 'cache_write' => 3.75],
    ],
],
```

USD per million tokens; `cache_read`/`cache_write` optional. Dated model ids reported by providers (`gpt-5.4-2026-05-01`) automatically match their family entry (`gpt-5.4`). Unknown models produce a `null` cost and a single warning — **never** an error, and never a silently-wrong number. Prices change; this table is yours to keep current.

## Safety wordlist

```php config/evals.php theme={null}
'safety' => [
    'blocked_words' => [],   // merged into containsNoBlockedWords()
],
```
