This guide walks you through installing harness-evaluator from PyPI, getting the Docker image, configuring API keys, and running your first evaluation end-to-end. No clone required — the task library is bundled into the wheel.
Prerequisites
Python 3.11+ (3.12 recommended)
Docker — for running harnesses in isolated containers
API keys — at least one of:
ANTHROPIC_API_KEY (for Claude models and Claude Code)
OPENAI_API_KEY (for GPT models and Codex)
Quick start (no clone)
harness-evaluator is published on PyPI as harness-evaluator. It bundles its task library, so you can run it without cloning the repository.
Step 1: Install
Use uv (recommended) to run it without installing:
Terminal window
# Run without installing (ephemeral environment per invocation)
uvxharness-evaluator--help
# Or install persistently
uvtoolinstallharness-evaluator
# Alternative: pipx install harness-evaluator
Both uvx and uv tool install provide the harness-evaluator command. If you don’t have uv, install it first:
Terminal window
curl-LsSfhttps://astral.sh/uv/install.sh|sh
You can also install with pip:
Terminal window
pipinstallharness-evaluator
Step 2: Scaffold a config
Terminal window
uvxharness-evaluatorinit
This creates harness-evaluator.yaml in the current directory with a minimal starter config (1 harness, 1 model, 1 task, 1 repeat, $5 budget).
Step 3: Pull the Docker image
The runner executes harnesses inside a Docker container. The image contains 5
preinstalled harnesses (Claude Code, Codex, OpenCode, Pi, OMP) + Python + Git.
The adapter registry also includes Aider, Gemini CLI, Antigravity, Copilot,
Cursor, and Kiro — these require a custom Docker image with the harness binary
installed (see Docker Runner):
The run name (minimal-first-run) comes from the name: field in your
config YAML, not the filename. To list all runs in the database, run
harness-evaluator results with no argument.
Step 9: View results
The “Next steps” section at the end of the run output shows the exact
commands to use. You can also discover them at any time:
Terminal window
# List all runs in the database (useful if you forgot the run name)
This verifies the judge produces consistent scores against known anchor submissions. If calibration fails (MAE > 0.15), the open-ended track should be flagged as unreliable.
Running with a subscription (Claude Code OAuth / Codex ChatGPT)
If you have a Claude Pro/Max or ChatGPT subscription, you can run Claude Code or
Codex against your subscription instead of pay-per-token API keys. Token usage is
still captured for analysis, but cost is recorded as $0 and does not count
against budget_usd.
Set auth_mode and credentials_path on the model, and cost_mode: subscription:
models:
- name: claude-sonnet-5
provider: anthropic
api_key_env: ANTHROPIC_API_KEY
auth_mode: claude_oauth
credentials_path: "~/.claude/.credentials.json"
cost_mode: subscription
For the full setup — obtaining the OAuth credential files, the Codex ChatGPT
variant, how credentials are mounted into containers, and security notes — see
the Subscription auth guide.
Troubleshooting
Gateway not reachable
Gateway is NOT reachable on 127.0.0.1:8877.
Start the gateway in a separate terminal: uvx harness-evaluator gateway --port 8877
No API calls found for trace_id
WARNING: No API calls found with trace_id=... for cell ...; cost attribution will be zero.
This means the harness is not routing through the gateway proxy. Common with minimal-observability harnesses (Pi, OMP) that may bypass the proxy. For partial-observability harnesses, check that the adapter’s get_env() is setting the correct base URL.
Docker image not found
docker run failed (exit 1): Unable to find image 'harness-evaluator-runner:latest' locally
Either pull the pre-built image or build it locally:
If missing, rebuild the image or check the Dockerfile.
Budget cap reached
Cells are being skipped with reason “Budget cap reached”. Either increase budget_usd in the config or reduce the number of cells (fewer harnesses, models, tasks, or repeats).