Production-grade LLM evaluation and benchmark harness
Project description
evalkit
A production-grade LLM evaluation and benchmark harness. Point it at a YAML test suite, get a rich terminal table, a self-contained HTML report, a JSON results file for regression tracking, and a diff against the last run.
Install
pip install -e .
Copy .env.example to .env and fill in your API keys:
cp .env.example .env
Quick start
evalkit run evals/example_factual.yaml
Override the model at runtime:
evalkit run evals/example_factual.yaml --model claude-haiku-4-5-20251001
evalkit run evals/example_code.yaml --model gpt-4o
The command prints a live progress ticker, then a results table, saves a JSON run file, and opens an HTML report in your browser.
YAML reference
name: "my-suite" # required — used in filenames and reports
description: "Optional one-liner"
model: "gpt-4o-mini" # default model for this suite
judge_model: "claude-haiku-4-5-20251001" # model used by the llm_judge scorer
temperature: 0.0
max_tokens: 512
system: null # optional system prompt for every case
cases:
- id: my-case # required, must be unique within the suite
prompt: "What is {input}?" # supports {input} substitution
input: "the capital of France" # replaces {input} in prompt
expected: "Paris" # reference answer (required by exact/contains/embed)
scorers: [exact] # list of scorer names (see below)
rubric: "Is the answer correct?" # guidance for llm_judge
tags: [geography, easy] # arbitrary labels for filtering
pattern: null # regex pattern for ExactScorer
Scorers
| Name | Passes when | Use for |
|---|---|---|
exact |
Output exactly matches expected (case-insensitive). Substring match gives partial credit (0.5) but doesn't pass at default threshold. | Short, deterministic answers |
contains |
Expected string appears anywhere in output | Keywords, code snippets |
llm_judge |
Claude scores the output ≥ 3.5/5 | Open-ended, subjective quality |
embed |
Cosine similarity of sentence embeddings ≥ 0.7 | Semantic equivalence |
Multiple scorers per case are AND-ed: a case passes only if all scorers pass.
CLI reference
evalkit run <suite.yaml> [--model MODEL] [--output-dir DIR] [--no-report]
evalkit diff <run_a.json> <run_b.json>
evalkit list-runs [--runs-dir DIR]
evalkit show <run_id> [--runs-dir DIR]
evalkit run exit codes: 0 = all passed, 1 = any failed — plugs straight into CI.
Regression tracking
Every run is saved to .evalkit/runs/<timestamp>_<suite_name>.json. After each run, evalkit automatically diffs against the previous run for the same suite and prints:
Diff vs previous: 2 regressions, 1 improvement
Compare any two runs manually:
evalkit diff .evalkit/runs/20260505T090000_factual-qa-v1.json \
.evalkit/runs/20260505T100000_factual-qa-v1.json
List all saved runs:
evalkit list-runs
Roadmap
- Web UI dashboard for run history
- Gemini and local (Ollama) providers
- Custom scorer plugins via entry points
- Parallel case execution
- CI GitHub Action
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
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 evalkit_bench-0.1.0.tar.gz.
File metadata
- Download URL: evalkit_bench-0.1.0.tar.gz
- Upload date:
- Size: 22.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4f139a5087d0a3f3db60490cdd6154b36c4f836fef9fdec0335c6df7c3a121b6
|
|
| MD5 |
d433633f62c58ff09ff9a88512281f6f
|
|
| BLAKE2b-256 |
022c8fec30f9f6b9ce707e1b1981ad7c4060196d8dbce8a4d281b84186b21903
|
Provenance
The following attestation bundles were made for evalkit_bench-0.1.0.tar.gz:
Publisher:
publish.yml on Arman176001/evalkit
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
evalkit_bench-0.1.0.tar.gz -
Subject digest:
4f139a5087d0a3f3db60490cdd6154b36c4f836fef9fdec0335c6df7c3a121b6 - Sigstore transparency entry: 1439609659
- Sigstore integration time:
-
Permalink:
Arman176001/evalkit@c9349201a15010017abf1773ab025352d9bd2a71 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Arman176001
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c9349201a15010017abf1773ab025352d9bd2a71 -
Trigger Event:
release
-
Statement type:
File details
Details for the file evalkit_bench-0.1.0-py3-none-any.whl.
File metadata
- Download URL: evalkit_bench-0.1.0-py3-none-any.whl
- Upload date:
- Size: 23.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5f63d9b7c2ecd9cbf66bc3cc0eced7ce3ea27be623c5a920558291bca8d32c80
|
|
| MD5 |
a20c6ebcd776ba906af6cc4061f8b0bc
|
|
| BLAKE2b-256 |
a5d1366c898c3a0dbbee75f9a1e04406ab008e6ef7c0004ba6ea9216598cba5d
|
Provenance
The following attestation bundles were made for evalkit_bench-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on Arman176001/evalkit
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
evalkit_bench-0.1.0-py3-none-any.whl -
Subject digest:
5f63d9b7c2ecd9cbf66bc3cc0eced7ce3ea27be623c5a920558291bca8d32c80 - Sigstore transparency entry: 1439609684
- Sigstore integration time:
-
Permalink:
Arman176001/evalkit@c9349201a15010017abf1773ab025352d9bd2a71 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Arman176001
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c9349201a15010017abf1773ab025352d9bd2a71 -
Trigger Event:
release
-
Statement type: