Skip to main content

Compare prompt variants and models from the command line

Project description

evaling

CI

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 modeeyes-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.yaml reference, 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 command provider, 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

evaling-0.1.0.tar.gz (440.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

evaling-0.1.0-py3-none-any.whl (132.9 kB view details)

Uploaded Python 3

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

Hashes for evaling-0.1.0.tar.gz
Algorithm Hash digest
SHA256 584354899d4eb4bf610b5057eb65c2f6b780e85a2619363841a212b4dd31f044
MD5 36cd24fe3342d0bab7753799e04ca921
BLAKE2b-256 56b54850f7fb3923bc5e1fb287a474c61d23c4a78c241dde2d8dc3402bb1ed55

See more details on using hashes here.

Provenance

The following attestation bundles were made for evaling-0.1.0.tar.gz:

Publisher: publish.yml on amro/evaling

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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

Hashes for evaling-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 09f604efef33a0a3797d996fa18a2c0f111f6bfe7169961717ced453f38153c0
MD5 1c7f4712e0be1c96f0216fc60785e7e1
BLAKE2b-256 3a1c6c1db9e1399d97d5b3e75ec631e2b4de41c5cf868b6251a287b323a6b27f

See more details on using hashes here.

Provenance

The following attestation bundles were made for evaling-0.1.0-py3-none-any.whl:

Publisher: publish.yml on amro/evaling

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page