Agent Arena

Troubleshooting

Real error messages, causes and fixes.

Symptoms, with the real messages the code emits.

Nothing ran

"every model would be skipped, so there is nothing to run"

every model would be skipped, so there is nothing to run: opus_5 (ANTHROPIC_API_KEY is not set).
Export the missing API key(s), or add a `mock:` model to compare against.

Cause. No model has usable credentials.

Fix. Export the key, or add a mock: model so the project runs offline.

export ANTHROPIC_API_KEY="sk-ant-..."
arena validate --project projects/my_project

Some models silently missing from the leaderboard

They are not missing — they are there with status no_data and a skip reason. A model whose key is absent is skipped, not failed, and the run continues.

In CI this is the dangerous one: a misconfigured secret gives a green build that evaluated only your mock models. Put arena validate before arena evaluate — it fails on missing credentials.

Config problems

"config must list at least one entry under 'models' (or 'targets')"

The file parsed but has no competitors. Note models: and targets: are the same list under two names.

"No config file in \<path>. Expected one of: ..."

Fix. --project must point at a folder containing config.yaml (or .yml, .json, arena.yaml, arena.json), or directly at a config file.

"duplicate model key 'x'; give one of them an explicit 'key'"

Two entries resolved to the same key — usually the same model id twice, which is exactly what you do when comparing two configurations of one model.

models:
  - {key: gpt5_cold, model: gpt-5, params: {temperature: 0}}
  - {key: gpt5_warm, model: gpt-5, params: {temperature: 1}}

"metrics.\<metric>.normalize is 'target' but no target/budget was given"

target and budget modes need a reference point.

metrics:
  latency: {target_ms: 800}
  cost:    {budget_usd_per_1k_calls: 2.0}

"unknown model(s): x. Available: ..."

--models named a key that is not in the config. It lists what is.

"duplicate provider id 'x'"

Two entries in providers: share an id.

Model routing

"cannot infer a provider for model 'x'"

The id matches no known prefix. The message shows the YAML that fixes it:

models:
  - model: some-exotic-model
    provider: litellm          # or anthropic | openai | gemini | local | mock

An explicit api_base also resolves it — giving a URL means it is an OpenAI-compatible server.

"the 'anthropic' provider needs the 'anthropic' package"

pip install 'agent-arena[anthropic]'

Provider SDKs are optional and import lazily, so this is expected the first time you call a new vendor.

"model 'x': run target does not exist"

A run: target points at a file that is not there. The path resolves relative to the project folder, not your working directory.

targets:
  - key: rag
    run: pipelines/rag.py:answer      # projects/my_project/pipelines/rag.py

Format must be path/to/file.py:function.

Scorers

"classification scorer needs a 'labels' list"

scorers:
  options:
    classification:
      labels: [billing, technical, account, other]

"llm_judge needs a judge model"

judge:
  model: claude-sonnet-5

"code_exec needs assertions — put them in the test case's reference"

code_exec runs generated code against assertions you supply as the reference.

"exact_match got an empty list of acceptable answers"

A case has an empty list reference. Give at least one acceptable answer.

Everything scores zero

Usually a scorer misconfiguration, not a bad model. Check one case:

arena evaluate --project p --models sim_small --limit 1

Then read reason in the report. Common causes: labels that do not match the model's wording, a json_match reference against output wrapped in a markdown fence (strip it in post_process), or exact_match where the model adds a preamble.

Cost

No cost column at all

Cause. At least one completed call had no price, so cost is nulled for the whole run. This is deliberate — a mean over the priced subset would be a fabricated number.

The leaderboard warns and names the unpriced models.

Fix. Add a card: override, a project pricing file, or return cost_usd from a run: target.

models:
  - key: my_model
    model: some-model
    card: {input_usd_per_mtok: 3.0, output_usd_per_mtok: 15.0}

The catalog will not invent a price for you; supplying one is your deliberate act.

The UI

"Could not start the UI on 127.0.0.1:8420"

Another program is probably using that port. Try `arena ui --port 8421`.

"This server only answers requests from localhost"

A 403 from the Host allow-list, which blocks DNS rebinding. If you deliberately bound elsewhere, pass the same value to --host so it joins the allow-list.

A run cannot be stopped from the browser

Correct — the runner has no cooperative cancellation check yet. Ctrl-C in the terminal running arena ui stops the process; the run is closed out as aborted with partial results kept. See ../roadmap/status.md.

Local models

Symptom Cause Fix
Connection refused Runtime not running ollama serve
404 from the endpoint Wrong base path api_base ends at /v1
Model not found Not pulled ollama pull <model>
Timeouts Large model, small timeout Raise run.timeout_s
Very slow first call Model loading Warm it before timing

Rate limits and flakiness

Many retries, a slow run

Concurrency above what the provider allows. Every rejected call becomes a retry with backoff, so raising it further makes things worse.

run:
  concurrency: 4

A 401 fails immediately

Correct behaviour. A bad key cannot be fixed by retrying, so it is classified terminal and fails on the first attempt rather than sleeping through three.

Results differ between runs

Expected. Providers are not fully deterministic even at temperature: 0.

arena history --project p --flaky

A case that flips repeatedly is either genuinely ambiguous or badly specified, and either way it is adding noise to your ranking.

Getting more detail

arena validate --project p          # config, tests, credentials
arena tests    --project p          # what will actually run
arena models   --project p          # cards, prices, inferred providers
arena evaluate --project p --dry-run
arena ui --verbose                  # log every HTTP request

An ArenaError prints as error: <message> and exits 1. Those messages are written to name the fix — read the whole thing before searching.