EvalVitals
Your eval tells you what failed. EvalVitals investigates why—and tests what fixes it.
Get started · Documentation · Examples · PyPI
Most evaluation tools end with a score and a table of failures. EvalVitals starts there. It can explore raw eval logs, find recurring patterns, propose falsifiable explanations, test them on held-out cases, and validate candidate interventions against the unchanged baseline.
Use the whole investigation loop—or take only the layer you need:
- Explore existing results: point a coding agent at arbitrary JSON/JSONL logs and get observations, charts, tables, and testable hypotheses.
- Investigate a target model: adaptively probe failures, diagnose systematic modes, verify hypotheses, and test interventions.
- Run one focused analyzer: use the same sklearn-like interface for black-box APIs and white-box local models.
flowchart LR
A[Eval logs or target model] --> B[Probe]
B --> C[Explore patterns]
C --> D[Diagnose]
D --> E{Held-out verification}
E -->|supported| F[Test interventions]
E -->|refuted| B
F --> G[Validated fix or honest inconclusive result]
Quickstart: Analyze Your Eval Logs
Install EvalVitals with the report dashboard:
pip install "evalvitals[dashboard]"
Then point it at a file or directory of JSON/JSONL results:
evalvitals explore ./results \
--backend codex \
-q "What distinguishes failed cases from successful ones?" \
--dashboard
codex can be replaced with claude_code, opencode, gemini_cli,
kimi_cli, or antigravity. The selected coding-agent CLI must be installed
and authenticated separately.
Prefer a browser? evalvitals web serves a local data-analysis workbench:
drop a .zip containing JSON/JSONL/CSV/TSV/Parquet/Excel data and/or images,
PDFs, audio, or video. Each upload becomes a persistent data thread: the page
shows ingestion and M2/M3 progress, renders M2 as soon as it finishes, and
accepts artifact-grounded follow-up questions without uploading again.
EvalVitals writes an auditable analysis bundle instead of returning only prose:
evalvitals_explore_output/
├── exploratory_report.json # observations, candidate signals, hypotheses
├── records.json # normalized records used by the analysis
├── figures/ # rendered charts
├── tables/ # analysis-ready tables
└── analysis.py # the generated code that was actually run
A real bundled run: on the synthetic-yield example, Explore identified
temperature as the strongest observed correlate (r = 0.86), separated that
finding from weak pressure evidence (r = -0.21), and proposed mechanism-level
hypotheses for a later confirmatory experiment. See the reproducible example →
Already have your own analysis code? Use the analyzer toolkit directly, or feed the resulting cases into the full diagnosis loop. EvalVitals does not require you to replace your existing eval or observability stack.
What Makes It Different
| Typical eval workflow | EvalVitals |
|---|---|
| Aggregate a metric | Investigate the cases behind the metric |
| Browse failures manually | Search for recurring, structured failure modes |
| Accept an LLM explanation | Turn explanations into falsifiable hypotheses |
| Test on the same cases used for discovery | Separate exploration from held-out confirmation |
| Report a promising prompt rewrite | Compare interventions with the unchanged baseline |
| Choose either API-level or internal analysis | Negotiate black-box and white-box capabilities through one interface |
Statistical gates use paired tests and e-values, including multiplicity control when several hypotheses or fixes are tried. A run may end inconclusive; EvalVitals does not turn weak evidence into a success verdict.
Three Ways to Use EvalVitals
1. Explore — raw results to testable hypotheses
evalvitals explore recursively samples arbitrary JSON/JSONL shapes. The
coding agent performs exploratory data analysis; the host records generated
code, adjudicates host-checkable statistics, renders figures, and proposes
1–3 falsifiable hypotheses.
2. Investigate — failures to verified interventions
VLDiagnoseLoop chains the full workflow:
M1 targeted probes
→ M2 exploratory and statistical analysis
→ M3 diagnosis hypotheses
→ M5 held-out hypothesis verification
→ M4 surgery and tiered fixes
Interventions can range from prompt changes and scaffolds to read/write access to model internals. Each candidate is evaluated against the unmodified baseline; automatic escalation happens only when explicitly enabled.
Full-loop quickstart → · Intervention guide →
3. Analyze — one model, one question
Every registered analyzer follows the same call shape:
from evalvitals import Capability, compose
from evalvitals.analyzers.attention.summary import AttentionAnalyzer
model = compose(
"qwen2.5-7b-instruct",
"hf_local",
want={Capability.ATTENTION},
)
result = AttentionAnalyzer(layer=-1, top_k=5).run(
model, "The Eiffel Tower is in"
)
print(result.summary())
The analyzer zoo includes attention, uncertainty, hallucination, attribution, logit-lens, representation-geometry, and agent-trajectory analysis.
Installation
The core install stays lightweight—no Torch required:
pip install evalvitals
Add only the capabilities you need:
pip install "evalvitals[api]" # OpenAI-compatible API models
pip install "evalvitals[local]" # local Hugging Face models + Torch
pip install "evalvitals[interp]" # interpretability toolchains
pip install "evalvitals[viz]" # plots
pip install "evalvitals[dashboard]" # Streamlit reports
pip install "evalvitals[stats]" # inferential statistics
For development:
git clone https://github.com/evalvitals/evalvitals.git
cd evalvitals
pip install -e ".[dev]"
pytest -m "not gpu"
Architecture in One Minute
Model identity is separate from runtime, and analyzers declare the capabilities they need. The same model spec can run through a black-box API or a white-box local backend; only the available capability set changes.
| Contract | Role |
|---|---|
ModelSpec |
Model identity: family, repository, architecture traits, modalities. |
Backend |
Runtime: local internals, black-box API, or offline batch engine. |
Model |
Runnable model with generation and optional internal capture. |
Analyzer |
Analyzer(**params).run(model, data) -> Result. |
Capability |
Matches analyzers to compatible model runtimes before execution. |
FailureCase |
Prompts, labels, provenance, metadata, and agent trajectories. |
Result |
Human-readable summary plus structured, serializable findings. |
Reproducible Examples
| Example | What it demonstrates |
|---|---|
synthetic_yield_explore |
Standalone Explore on structured tabular outcomes. |
deco_hallu_explore |
Explore → held-out hypothesis tests → tiered repair. |
deco_hallu |
Decoupled multimodal hallucination diagnosis and intervention. |
qwen_attention |
White-box attention analysis on a local model. |
Documentation
- Quickstart
- Exploratory Analysis
- Intervention & Verification
- Analyzer Zoo
- Architecture
- Extending EvalVitals
- Roadmap
Project Status
EvalVitals is an early-stage research toolkit. Interfaces may evolve, and some full-loop examples require model weights, a GPU, or an external coding-agent CLI. Bug reports, reproducible failure cases, analyzer contributions, and evaluation integrations are welcome.
If EvalVitals helps you understand a model failure, consider starring the repo and sharing the smallest reproducible case—it makes the toolkit better for the next investigation.
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 evalvitals-0.1.1.tar.gz.
File metadata
- Download URL: evalvitals-0.1.1.tar.gz
- Upload date:
- Size: 608.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f0cbbd4057a557a4fdaccf50c53fcc874a904d4b8dc3ed050023b9db6e39c40f
|
|
| MD5 |
546c2d027b8be9216dc05bc628260a29
|
|
| BLAKE2b-256 |
82c619f65590247f7af2417859e22ddd94be7c6c2ad3d83918f4c901bafd8597
|
Provenance
The following attestation bundles were made for evalvitals-0.1.1.tar.gz:
Publisher:
release.yml on evalvitals/evalvitals
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
evalvitals-0.1.1.tar.gz -
Subject digest:
f0cbbd4057a557a4fdaccf50c53fcc874a904d4b8dc3ed050023b9db6e39c40f - Sigstore transparency entry: 2256488069
- Sigstore integration time:
-
Permalink:
evalvitals/evalvitals@2492564a710f6f84c6e310585a5316b4ccd0afbe -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/evalvitals
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@2492564a710f6f84c6e310585a5316b4ccd0afbe -
Trigger Event:
push
-
Statement type:
File details
Details for the file evalvitals-0.1.1-py3-none-any.whl.
File metadata
- Download URL: evalvitals-0.1.1-py3-none-any.whl
- Upload date:
- Size: 734.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ae7848fbba47edb47b0b2aa85bbbfdcd631c8d17bfe682ed235977e5d2249b5c
|
|
| MD5 |
cf159484dcff18e70f0531bf0e09f804
|
|
| BLAKE2b-256 |
34758edfb0b20c9799722307d4aff3300076a14576d473d16fbeab7636e74107
|
Provenance
The following attestation bundles were made for evalvitals-0.1.1-py3-none-any.whl:
Publisher:
release.yml on evalvitals/evalvitals
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
evalvitals-0.1.1-py3-none-any.whl -
Subject digest:
ae7848fbba47edb47b0b2aa85bbbfdcd631c8d17bfe682ed235977e5d2249b5c - Sigstore transparency entry: 2256488079
- Sigstore integration time:
-
Permalink:
evalvitals/evalvitals@2492564a710f6f84c6e310585a5316b4ccd0afbe -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/evalvitals
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@2492564a710f6f84c6e310585a5316b4ccd0afbe -
Trigger Event:
push
-
Statement type: