# The engine panel

Every shopper question is asked of four model families in parallel, through the
Vercel AI Gateway.

## The panel

| Family | Primary model | Fallbacks |
|---|---|---|
| OpenAI | `openai/gpt-5.6-terra` | `openai/gpt-5.4`, `openai/gpt-4o` |
| Anthropic | `anthropic/claude-sonnet-5` | `anthropic/claude-sonnet-4.6`, `anthropic/claude-sonnet-4.5` |
| Google | `google/gemini-3.6-flash` | `google/gemini-3.5-flash`, `google/gemini-2.5-pro` |
| Perplexity | `perplexity/sonar` | `perplexity/sonar-pro` |

Fallbacks are **same-provider only**, by design: falling back across providers would
silently change which family answered, and the panel exists precisely to measure
per-family difference.

Model IDs are pinned in source and re-asserted against the live gateway catalog in CI,
so a model retirement fails the build rather than silently degrading an audit.

## Call parameters

- `temperature: 0`
- `max_tokens: 1024`
- Per-call timeout: **20 seconds**
- Engine concurrency: **4**

## Volume per run

Up to **4 engines × 5 questions = 20 engine calls**, plus one brand-profile call and
one judge call per response that came back.

## Two supporting models

Not part of the panel, and not scored:

| Role | Model |
|---|---|
| [Brand profile extraction](brand-profile.md) | `openai/gpt-4o-mini` |
| [Response judging](judging.md) | `openai/gpt-4o-mini` |

## Skipped engines

An engine that could not be reached is recorded in `engine_panel.skipped` with a reason,
and each of its unanswered questions counts as a hole in the evidence denominator. Enough
holes trips the [coverage gate](scoring.md#evidence-gates) and the score is withheld.

Zero available engines is a hard failure. It is never a 100/100.
