Compare prompt variants and models from the command line
Project description
evaling
A command-line tool for comparing prompt variants and models, easily.
Status: early development — alpha testers wanted. It works end to end and the test suite is thorough, but it's early: expect gaps where the tests don't reach, and expect the config format to shift a little before 1.0. If you try it, open an issue — rough edges, confusing output, and missing providers are all worth reporting.
Why
When you're iterating on a prompt, you want fast answers to questions like:
- Which of these three phrasings performs best on my test cases?
- Does the cheaper model handle this prompt as well as the expensive one?
- Did my latest prompt tweak regress anything?
evaling runs your prompt variants against your chosen models over a set of test
cases, scores the outputs, and shows you a comparison — all from the terminal.
Answering those questions with evidence, rather than by re-reading a handful of outputs, is usually what stands between a prompt change and shipping it. The aim is to make that comparison cheap enough that you run it every time.
What you can evaluate
Anything you can call. Anthropic and OpenAI directly; Ollama, vLLM, LM
Studio, OpenRouter, Gemini and Gemma through the OpenAI-compatible endpoint;
and anything else at all through the command provider, which pipes JSON to a
script — so an agent, a RAG pipeline, or a local binary is as evaluable as a
chat API.
Text, and not only text. Single prompts or scripted multi-turn conversations. Images, PDFs, audio, and video attach to cases and are checked against each model's declared capabilities before a request is sent.
Against whatever "correct" means for you. Exact match, substring, regex, and JSON-schema validation for the mechanical parts; your own Python function when the rule is real but not a pattern; an LLM judge with a rubric when the question is genuinely a matter of judgment — and a meta-eval to check that judge against labels you wrote yourself, before you trust it to gate anything.
At the size you actually have. A dozen cases inline in the config, a JSONL or CSV dataset in git, or hundreds of thousands streamed from your own warehouse or API through a case source — Python you write that evaling pages through. Memory is bounded by concurrency, not by case count, so a 500,000-case run costs no more up front than a ten-case one.
Including data you're not allowed to read. For the narrower case where the data is off-limits to humans, no-look mode — eyes-off evaluation, in privacy terms — keeps prompts, outputs, and attachments out of every artifact: you get the scores, the data stays where it was.
And it tells you whether the change helped. Compare two runs cell by cell, pin a baseline, and fail CI on a regression rather than on a hunch.
Install
Needs Python 3.10+ and uv:
uv tool install evaling
evaling --version
Or from a checkout, which is also the contributor setup:
git clone https://github.com/amro/evaling && cd evaling
uv tool install .
Working on evaling itself? Use uv sync and uv run evaling instead, which
always reflects your working tree. See
getting started.
Quick taste
evaling init # scaffold a working example (offline, mock provider)
evaling run # run it: progress bar, summary matrix, pass/fail gate
evaling show latest --failures
evaling compare <run-a> <run-b>
evaling export latest --format md
See getting started.
Documentation
Full docs live in docs/. New here? Start with the
tutorial — install through CI gating, with runnable
examples at every step.
- Tutorial — the complete walkthrough.
- Getting started — the short version.
- CLI reference — commands, flags, run references, exit codes.
- Configuration — the
eval.yamlreference, settings layering, and environment variables. - Prompts — variants, Jinja2 templating, multi-turn messages, multimodal inputs, and case datasets.
- Scoring — scorers, scorecards, LLM judges, and CI thresholds.
- Providers — Anthropic, OpenAI, OpenAI-compatible (local
models, Gemini, OpenRouter), the
commandprovider, pricing, and adding your own. - Secrets — where API keys come from, and how they're kept out of git and out of your output.
- Storage — the run directory format, resuming interrupted runs, response caching, and programmatic access.
- Large datasets — case sources: streaming cases from your own API or warehouse instead of a file.
- No-look evals — evaluating data nobody is permitted to read.
- CI recipes — gating, baselines, cost ceilings, report artifacts.
- Evaluating judges — calibrate autoraters against human labels (meta-evals).
- MCP server — drive evaling from an agent for hands-off prompt iteration.
- Python API — use evaling as a library.
- Troubleshooting — symptoms, causes, fixes.
- Architecture — how it's built, and why.
Development
Requires uv.
uv sync # create the venv and install dependencies
uv run evaling # run the CLI
uv run pytest # run the test suite
uv run ruff check . # lint
uv run ruff format . # format
Changes are documented in the CHANGELOG.
Seven complete sample evals live in examples/ — text and
multimodal, single- and multi-turn, a RAG pipeline behind the command
provider, and a no-look run over a paging source. The test suite runs them all
end to end on every commit, so they work with the current version.
See CONTRIBUTING.md before opening a pull request.
How this was built
evaling was written with heavy use of AI coding tools — most of it with Claude Code, working from requirements and design decisions recorded in REQUIREMENTS.md. Every change is reviewed before it lands, carries tests, and has to pass the same CI as anything else: lint, formatting, a dependency audit, and the full suite on Linux across Python 3.10–3.13, plus macOS and Windows. The docs and the worked examples are exercised by that suite too, so they cannot quietly drift from the code.
Worth saying plainly rather than leaving you to infer it from the commit log.
License
MIT; © 2026 Amro Mousa
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file evaling-0.1.0.tar.gz.
File metadata
- Download URL: evaling-0.1.0.tar.gz
- Upload date:
- Size: 440.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
584354899d4eb4bf610b5057eb65c2f6b780e85a2619363841a212b4dd31f044
|
|
| MD5 |
36cd24fe3342d0bab7753799e04ca921
|
|
| BLAKE2b-256 |
56b54850f7fb3923bc5e1fb287a474c61d23c4a78c241dde2d8dc3402bb1ed55
|
Provenance
The following attestation bundles were made for evaling-0.1.0.tar.gz:
Publisher:
publish.yml on amro/evaling
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
evaling-0.1.0.tar.gz -
Subject digest:
584354899d4eb4bf610b5057eb65c2f6b780e85a2619363841a212b4dd31f044 - Sigstore transparency entry: 2306857964
- Sigstore integration time:
-
Permalink:
amro/evaling@236c688dab5c8bd8edee539e160069d62d6d2ccb -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/amro
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@236c688dab5c8bd8edee539e160069d62d6d2ccb -
Trigger Event:
release
-
Statement type:
File details
Details for the file evaling-0.1.0-py3-none-any.whl.
File metadata
- Download URL: evaling-0.1.0-py3-none-any.whl
- Upload date:
- Size: 132.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
09f604efef33a0a3797d996fa18a2c0f111f6bfe7169961717ced453f38153c0
|
|
| MD5 |
1c7f4712e0be1c96f0216fc60785e7e1
|
|
| BLAKE2b-256 |
3a1c6c1db9e1399d97d5b3e75ec631e2b4de41c5cf868b6251a287b323a6b27f
|
Provenance
The following attestation bundles were made for evaling-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on amro/evaling
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
evaling-0.1.0-py3-none-any.whl -
Subject digest:
09f604efef33a0a3797d996fa18a2c0f111f6bfe7169961717ced453f38153c0 - Sigstore transparency entry: 2306858021
- Sigstore integration time:
-
Permalink:
amro/evaling@236c688dab5c8bd8edee539e160069d62d6d2ccb -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/amro
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@236c688dab5c8bd8edee539e160069d62d6d2ccb -
Trigger Event:
release
-
Statement type: