Running clean-evals¶
clean-evals is a local tool for single-user / single-team use. There is no authentication at any layer: anyone who can reach the port can read and edit datasets and trigger runs that spend real provider credits.
Bind to localhost — that is the default everywhere, including the Docker setup. Binding to a non-loopback address is explicitly your choice and your responsibility; if you must share an instance, keep it on a private network you control and put a reverse proxy with authentication in front of it. clean-evals is not designed to be exposed to the public internet, with or without a proxy.
Single-host install¶
pip install clean-evals
clean-evals migrate
# Run these as separate services (systemd, supervisor, nohup):
clean-evals worker --concurrency 4
clean-evals beat
clean-evals serve # binds 127.0.0.1:8080
worker and beat are only needed for scheduled runs; interactive use works
with serve alone.
Docker¶
git clone https://github.com/datathere/clean-evals
cd clean-evals
cp .env.example .env
docker-compose up
docker-compose.yml brings up MySQL (or Postgres if DB_FLAVOR=postgres),
Redis, the worker, beat, and the web server in one command. All published
ports bind to 127.0.0.1, so the services are reachable only from the
machine running them. The bundled database and Redis credentials are
development defaults; do not expose these services to a network.
Artifacts¶
Rendered reports are written to ./clean-evals-data/artifacts/. Set
CLEAN_EVALS_ARTIFACT_DIR to change the location. ArtifactStore is a
protocol, so an installation can provide its own storage implementation.
Artifacts and database rows contain your prompts and model outputs in plain text. Treat the data directory as sensitive.
Postgres backend (optional)¶
pip install "clean-evals[postgres]"
export CLEAN_EVALS_DATABASE_URL=postgresql+psycopg2://user:pass@host/db
clean-evals migrate
Cost safety nets¶
Both limits are best-effort and do not guarantee a spend ceiling. Always verify actual spend in your provider's billing console.
- Per-run limit:
--max-cost(default $5). Spend is checked as results arrive; cases that have not started when the ceiling trips are aborted, but calls already in flight complete, so the run can overshoot the limit (bounded by how many calls run concurrently). - Daily limit: the
CLEAN_EVALS_DAILY_COST_LIMIT_USDenv var. The runner refuses to start a new run once today's cumulative spend meets the limit. Only persisted runs count toward the total — web and scheduled runs, and CLI runs with--persist. CLI runs without--persistleave no cost trail and are invisible to this check.
Run retention¶
By default, run rows are kept forever. Set
CLEAN_EVALS_RUN_RETENTION_DAYS=365 to enable a janitor (planned).