Know what you are not testing before you ship - an eval coverage auditor for RAG and agent systems.
Project description
Eval Doctor
Know what you are not testing before you ship.
Eval Doctor is a CLI that helps AI builders find blind spots in their eval suite — a linter for AI evals.
Most AI projects start with architecture and implementation. Evals come later, once the system already "kind of works." But for RAG systems and agents, the hardest part is not writing test cases — it's knowing what failure modes matter. Eval Doctor scans your repo, detects your AI system's capabilities, maps them to expected evaluation dimensions, and tells you what your current eval suite is missing.
You are testing faithfulness and answer relevance.
You are not testing:
- empty retrieval
- stale documents
- tool timeout
- hallucinated tool arguments
- prompt injection
- ambiguous user requests
Install
pip install eval-doctor # static analysis, no API keys needed
pip install "eval-doctor[anthropic]" # + optional LLM-powered capability detection (Claude API)
pip install "eval-doctor[openai]" # + optional LLM-powered capability detection (OpenAI API)
Already have Claude Code installed? No extra or API key needed — eval-doctor audit --llm uses your Claude subscription through the claude CLI.
Usage
cd your-ai-project
eval-doctor audit
You get a console report plus two files:
eval_doctor_report.md— human-readable coverage reporteval_doctor_findings.json— machine-readable findings for automation
Options:
eval-doctor audit --repo path/to/repo # audit a different directory
eval-doctor audit --evals path/to/evals # eval files living outside the repo
eval-doctor audit --output-dir reports/ # where to write report files
eval-doctor audit --llm # force LLM enrichment (also enables the claude CLI path)
eval-doctor audit --no-llm # force pure static analysis
eval-doctor audit --force # overwrite existing report files
eval-doctor interview # short risk interview; audit picks up the answers
eval-doctor show-taxonomy # print the built-in taxonomy
Risk interview
Severity defaults are generic; your risks are not. eval-doctor interview asks a few multiple-choice questions keyed to what the scanner actually found in your repo — retrieval, web grounding, tool calling, SQL, memory — plus where the system will run, and writes eval_doctor_risk.json. The next eval-doctor audit picks it up automatically (or point at one with --risk path/to/eval_doctor_risk.json) and elevates the severity of the dimensions you said would hurt most, re-ordering the report. Answers only ever raise severity — the interview never argues a risk away.
How it works
Repo Scanner ──► Capability Extractor ──► Coverage Engine ──► Report
(deterministic) (static rules, (expected vs
optional LLM enrich) observed dimensions)
- Scan — a deterministic scanner walks your repo and detects signals: frameworks (LangChain, LlamaIndex, CrewAI, ...), vector DBs, embeddings, chunking, reranking, tool definitions, SQL, browser automation, memory, prompt templates, and existing eval/test files. Nothing leaves your machine.
- Extract — signals are mapped to a capability profile (
rag,tool_calling_agent,sql_agent, ...). - Compare — the profile selects applicable dimensions from a built-in taxonomy of 40 eval dimensions across RAG, tool calling, SQL agents, memory, and general AI risks. Your existing eval files are checked for evidence of each.
- Report — every applicable dimension is rated
covered,weak, ormissing, with a severity and a concrete recommendation.
Optional LLM enhancement
Static analysis sees imports and patterns, not intent. With an LLM available, Eval Doctor sends its collected evidence snippets (never your whole repo) to a model to correct and complete the capability profile — catching things like web-search-grounded generation that deserves faithfulness evals, hand-rolled RAG with no framework, and pruning false positives like an sqlite cache being flagged as a SQL agent. Two ways to enable it:
- API key — set
ANTHROPIC_API_KEYorOPENAI_API_KEYand install the matching extra. Used automatically when present. - Claude subscription — have Claude Code installed and signed in, then pass
--llm. Eval Doctor shells out toclaudeon your machine; no API key or extra needed. This path is opt-in only — an installed CLI is never used unless you ask.
Without either, everything still works; the report just notes it ran in static-only mode.
Additional providers are welcome contributions: implement the two-method LLMProvider protocol in eval_doctor/llm.py — the existing providers are small, self-contained classes.
Example
See examples/sample_report.md for the report produced by auditing a small RAG + tool-calling fixture project.
Roadmap
- Candidate eval generation — generate golden eval cases for your missing dimensions
- Coverage diff —
eval-doctor diffto score an eval suite against recommended coverage - CI / PR mode — comment on PRs that add AI capabilities without corresponding evals
Development
pip install -e ".[dev]"
pytest
License
MIT
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 eval_doctor-0.1.1.tar.gz.
File metadata
- Download URL: eval_doctor-0.1.1.tar.gz
- Upload date:
- Size: 43.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
73033deb1d408e659a6caeb9d269d8bfddd3c21b0758d825143ce63caf9fe06d
|
|
| MD5 |
da744bcc95c762c83653081c2705bfec
|
|
| BLAKE2b-256 |
bcb5cb2059a53bdbda9be582e6a2bd6366f0b4828b01f52440d572a98af5b3d4
|
Provenance
The following attestation bundles were made for eval_doctor-0.1.1.tar.gz:
Publisher:
release.yml on usneha/eval-doctor
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
eval_doctor-0.1.1.tar.gz -
Subject digest:
73033deb1d408e659a6caeb9d269d8bfddd3c21b0758d825143ce63caf9fe06d - Sigstore transparency entry: 2148219385
- Sigstore integration time:
-
Permalink:
usneha/eval-doctor@eeae6802d4e98a3f3a9cbb05d6f3b6ad6a7ee8b4 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/usneha
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@eeae6802d4e98a3f3a9cbb05d6f3b6ad6a7ee8b4 -
Trigger Event:
push
-
Statement type:
File details
Details for the file eval_doctor-0.1.1-py3-none-any.whl.
File metadata
- Download URL: eval_doctor-0.1.1-py3-none-any.whl
- Upload date:
- Size: 34.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 |
b8cbc79b95dc0009b46bc1a19e779406491abcd3f1862e9a08c67c86d07cb031
|
|
| MD5 |
dde92fda793a82d50e3d7f0a317b08be
|
|
| BLAKE2b-256 |
0d9707cda3434edc7e9941233117118d71299d87b6be2710c490a67ecf3480d8
|
Provenance
The following attestation bundles were made for eval_doctor-0.1.1-py3-none-any.whl:
Publisher:
release.yml on usneha/eval-doctor
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
eval_doctor-0.1.1-py3-none-any.whl -
Subject digest:
b8cbc79b95dc0009b46bc1a19e779406491abcd3f1862e9a08c67c86d07cb031 - Sigstore transparency entry: 2148219392
- Sigstore integration time:
-
Permalink:
usneha/eval-doctor@eeae6802d4e98a3f3a9cbb05d6f3b6ad6a7ee8b4 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/usneha
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@eeae6802d4e98a3f3a9cbb05d6f3b6ad6a7ee8b4 -
Trigger Event:
push
-
Statement type: