Skip to main content

Run your prompts on two LLMs and find out, with statistical confidence, what regressed.

Project description

EvalShift

Run your prompts on two LLMs and find out, with statistical confidence, what regressed.

CI License: AGPL v3 Python 3.14+ Status: alpha

EvalShift is a local-first CLI that helps engineering teams migrate safely between LLM versions (for example gemini-2.5-flashgemini-3.1-flash-lite-preview). Point it at your prompts and a golden suite of inputs; it runs both models, scores the outputs with structural / semantic / LLM-as-judge / tool-call evaluators, and produces a single-file HTML report with defensible statistics: paired tests, Cohen's d, 95% CIs, and Benjamini-Hochberg correction across every (prompt x evaluator x slice) comparison.

Local runs stay on your machine by default. Hosted private-alpha commands are available when you explicitly log in and push a run.

Status

Alpha. Every command in the pipeline is shipped and the test suite is at 95%+ coverage. APIs may still change as feedback comes in.

Install

Requires Python 3.14+.

# Recommended
uv pip install evalshift     # or: pip install evalshift

From source (for contributors):

git clone https://github.com/babaliauskas/evalshift-cli.git
cd evalshift-cli
uv venv --python 3.14
source .venv/bin/activate
uv pip install -e ".[dev]"

Quick start

# 1. Scaffold a starter project. Writes evalshift.yaml + prompts.py +
#    tools.yaml + golden.jsonl + fixtures.jsonl for a support agent.
mkdir my-eval && cd my-eval
evalshift init

# 2. Run the whole pipeline deterministically, without API keys.
evalshift all --offline --yes --open

# 3. For a live run, set whichever provider keys you'll use.
export GOOGLE_API_KEY=<google-api-key>   # or ANTHROPIC_API_KEY / OPENAI_API_KEY

# 4. Run the live pipeline in one command (doctor → run → evaluate
#    → analyze → report). Pass --open to launch the report.
evalshift all --yes --open

evalshift all drives the full five-stage pipeline under a single Rich Live region — stacked status rows, an inline progress bar for the run stage, and a final verdict block that tells you whether the candidate is significantly better, regressed, or showed no significant change.

If you want to drive each stage by hand (useful in CI, or when re-running just one stage after fixing config):

evalshift doctor
evalshift run --yes
evalshift evaluate <run-id>
evalshift analyze <run-id>
evalshift report <run-id> --open

Every artefact lives under .evalshift/runs/<run-id>/state.json, raw.jsonl, scores.jsonl, analysis.json, report.json, report.html. None of it leaves your machine unless you opt in to hosted upload commands.

Hosted private alpha

Hosted EvalShift adds shared run history, web viewing, diffs, and GitHub PR comments. It is optional: local CLI usage does not require an account.

# Sign in through the hosted web app, then approve CLI login in the browser.
evalshift login --host <hosted-api-url>
evalshift whoami

# Add a hosted project to evalshift.yaml:
# project: acme/model-migration
# thresholds:
#   pass_rate_min: 0.95

# Run locally, then package and push the result.
evalshift all --yes --push

You can also drive the hosted steps manually:

evalshift bundle <run-id>
evalshift push <run-id>
evalshift push --bundle .evalshift/runs/<run-id>/run_bundle.json.gz

Credential precedence is explicit CLI flags, then EVALSHIFT_HOST / EVALSHIFT_TOKEN, then ~/.evalshift/credentials.

GitHub Action

evalshift init --ci scaffolds a workflow that runs EvalShift on pull requests, pushes the run to hosted EvalShift, compares against the latest compatible base-branch run, posts or updates one PR comment, and sets the evalshift/regression commit status.

Required setup:

evalshift init --ci

Then add repository secrets for EVALSHIFT_TOKEN and the provider keys your models use. The generated workflow uses:

uses: babaliauskas/evalshift-action@v0

See docs/github-action.md for workflow permissions, fail-on modes, and baseline behavior.

Agent migrations

Migrating an agent (a prompt that uses tools)? EvalShift detects regressions in which tools the new model calls, what arguments it passes, and how it sequences them. The killer scenario: a routing agent that silently stops calling notify_security_team after the migration — text-only eval reports green, EvalShift marks it CRITICAL.

The default evalshift init scaffold is an agent project — six tools, a 40-row golden suite, and deterministic replay fixtures. Just run the offline quick-start above and the tool-call evaluators plus migration policy verdict kick in automatically.

See docs/agents.md for the full walkthrough and the examples/agent/ directory for a runnable customer-support example.

What the report looks like

Generate a deterministic example locally — no API keys required:

scripts/run_showcase.sh --offline --only pass-clean --open

That runs the examples/showcase/pass-clean/ scenario with the bundled fixtures.jsonl, writes a single-file HTML report under .evalshift/runs/<run-id>/report.html, and opens it in your browser.

The HTML report (single file, no external assets, works offline) has:

  • Executive summary — one row per prompt with a severity badge.
  • Per-prompt deep dive — aggregate stats, per-slice breakdown, top-5 worst regressions side-by-side.
  • Methodology appendix — every test, p-value, effect size, and CI is documented.

Why local-first?

Your prompts and suite stay local for doctor, run, evaluate, analyze, and report. The only outbound calls in local mode are to the LLM providers you configure (Anthropic, OpenAI, Google) using your own API keys.

bundle packages completed local artifacts into run_bundle.json.gz without uploading them. push and all --push upload that bundle to the hosted backend associated with your token.

Documentation

Non-goals

  • General-availability hosted service or billing
  • Hosted provider-key storage
  • Multi-criterion judge in a single call
  • Custom evaluator plugin system
  • Comparing more than 2 models in one run
  • Auto-detection of LangChain / LlamaIndex prompt patterns

License

AGPL-3.0-or-later. Free for any use, including commercial, provided that derivative works — including network-hosted services — are released under the same license.

Versions 0.3.0 and earlier (published on PyPI before this change) remain available under the MIT License terms they were released with.

Commercial licenses without the AGPL share-back requirement are available; contact l.babaliauskas@gmail.com.

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

evalshift-0.6.0.tar.gz (295.8 kB view details)

Uploaded Source

Built Distribution

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

evalshift-0.6.0-py3-none-any.whl (208.6 kB view details)

Uploaded Python 3

File details

Details for the file evalshift-0.6.0.tar.gz.

File metadata

  • Download URL: evalshift-0.6.0.tar.gz
  • Upload date:
  • Size: 295.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.10 {"installer":{"name":"uv","version":"0.11.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for evalshift-0.6.0.tar.gz
Algorithm Hash digest
SHA256 589cb08a8991dcd6061fb9a24381177acdf725fd4946066d8ffa42aae1967240
MD5 3f0d54dc829df2be8e4d464e5520cf07
BLAKE2b-256 aec52b1a0a43ed3dbbde13b33c5007f599285c8e3883c4d6c8a185e30c650bde

See more details on using hashes here.

File details

Details for the file evalshift-0.6.0-py3-none-any.whl.

File metadata

  • Download URL: evalshift-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 208.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.10 {"installer":{"name":"uv","version":"0.11.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for evalshift-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b485a09782d463d9fc8ccb5f2b4eab6c90c80751c0cb95f45057b7f3a868fc43
MD5 325191a9ff139c8031d91002aeb500db
BLAKE2b-256 8e6d9ec5f208769c036ea5485740370bb2abfcb629a6c75710fa2c2a942c5905

See more details on using hashes here.

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