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

# LLM engines

> The engines ai-cmo.dev measures, their providers, and how engine weighting feeds the GEO score.

ai-cmo.dev sends prompts to multiple answer engines and measures how each one responds. The engine registry at `engines.yaml` defines the model, provider, weight, and behavior for each engine.

## Grounded engines

These engines retrieve external information before generating an answer. They can cite sources and provide more current information than parametric recall alone.

| Engine     | Model                       | Provider   | Weight | Native grounding               |
| ---------- | --------------------------- | ---------- | ------ | ------------------------------ |
| ChatGPT    | `openai/gpt-5.6-terra`      | OpenRouter | 0.30   | Yes                            |
| Gemini     | `google/gemini-3.6-flash`   | OpenRouter | 0.20   | Yes                            |
| Perplexity | `perplexity/sonar`          | OpenRouter | 0.20   | Yes (`native_grounding: true`) |
| Claude     | `anthropic/claude-sonnet-5` | OpenRouter | 0.20   | No ZDR route (`zdr: false`)    |
| Grok       | `x-ai/grok-4.5`             | OpenRouter | 0.10   | No                             |

ChatGPT has the highest weight (0.30), reflecting its position as the most widely used consumer answer engine. Grok has the lowest weight among grounded engines.

Perplexity uses `native_grounding: true`, meaning its retrieval and citation behavior is built into the model endpoint rather than added as a separate RAG layer. Claude explicitly has `zdr: false` — no zero-data retrieval — meaning it answers from parametric memory unless the caller adds retrieval.

## Exa — retrieval engine

Exa is not an OpenRouter model. It has its own transport and bills per request rather than per token. The platform runs two Exa modes:

| Mode   | Engine ID    | Behavior                                    |
| ------ | ------------ | ------------------------------------------- |
| Answer | `exa`        | Generated answer with citation evidence     |
| Search | `exa_search` | Ranked retrieval results without generation |

Both have zero engine weight (0.00). They do not contribute to the score's engine-weighing directly but provide independent measurement of whether a brand is findable in the retrieval index. The `exa` preset exercises both modes on the same prompts.

## Parametric engines

These engines answer from training data only. They are not grounded and cannot cite sources.

| Engine   | Model                         | Provider   |
| -------- | ----------------------------- | ---------- |
| DeepSeek | `deepseek/deepseek-v4-flash`  | OpenRouter |
| Llama    | `meta-llama/llama-4-maverick` | OpenRouter |

Both parametric engines have low observed cost per call (0.0005 µUSD) and are included in the `standard` and `deep` presets. Their output reflects the model's training data, not current web content. A brand that launched recently may be absent from their parametric memory.

## Provider architecture

All OpenRouter engines are accessed through the operator's OpenRouter API key (`OPENROUTER_API_KEY`). Exa is accessed through a separate `EXA_API_KEY`. Both keys are operator-custodied — they go in the deployment environment, not the workspace settings. See [Connections](/connections) for the custody model.

## How engine weighting feeds the score

The GEO score's **modeled reach** component (weight 0.15) uses engine weights as a volume proxy. The calculation multiplies each measured engine's visibility by its configured weight, sums across all grounded engines, and divides by the total configured weight:

```text theme={null}
modeledReach = sum(visibility_engine * weight_engine) / sum(weight_engine)
```

The weights come from `engines.yaml`. They are modeling choices, not claimed traffic share. The weight of 0.30 on ChatGPT means the score treats ChatGPT coverage as 30% of the modeled reach. Weights are declared only for grounded engines; Exa modes and parametric engines have zero weight.

Missing components — an engine that was not measured — affect modeled reach through the grounded-engine penalty described in the [GEO Score](/geo-score) documentation. The `volumeProxy.source` is always `engines.yaml grounded usage weights`.

## Per-engine measurement

Each run records per-engine metrics: visibility, share of voice, average position, sentiment, citation share, and observation count. The [engine scoreboard](/dashboard) on the dashboard shows these side by side. An engine with zero responses (skipped, failed, or not in the preset) is not evidence of zero visibility.

See [How answer engines work](/learn/how-answer-engines-work) for the retrieval mechanics, and [Visibility metrics](/learn/visibility-metrics) for how each metric is defined.
