๐ Just launched! If you find this useful, give it a star โ it's the only metric that helps me justify spending more time on it.
A single number tells you nothing.
llm-eval-kittells you why a response is good or bad โ and how to fix it.
$ llm-eval refine "Propose un plan stratรฉgique pour une startup IA en France en 2026."
โญโ Iteration 1 โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฎ
โ โ น Reasoning โโโโโโโโโโโโโโโโโโโโ 0.62 โ
โ โ น Factual โโโโโโโโโโโโโโโโโโโโ 0.78 โ
โ โ น Coherence โโโโโโโโโโโโโโโโโโโโ 0.55 โ weakest โ
โ โ น Safety โโโโโโโโโโโโโโโโโโโโ 0.99 โ
โ Overall: 0.74 โ refining... โ
โฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏ
โญโ Iteration 2 โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฎ
โ โ Reasoning โโโโโโโโโโโโโโโโโโโโ 0.84 (+0.22) โ
โ โ Factual โโโโโโโโโโโโโโโโโโโโ 0.83 (+0.05) โ
โ โ Coherence โโโโโโโโโโโโโโโโโโโโ 0.87 (+0.32) โ
โ โ Safety โโโโโโโโโโโโโโโโโโโโ 0.99 ( = ) โ
โ Overall: 0.88 โ โ
converged โ
โฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏ
โ Strengths: Clear value-prop, sound market sizing
โ Weaknesses: Missing GTM timeline, vague pricing
โ Recommend: Add 6-month milestones, propose 3 pricing tiers
Pour une dรฉmo animรฉe, voir demo.ipynb ou les exemples Python.
๐ Table of Contents
Click to expand
โจ Why llm-eval-kit?
Most LLM evaluation tools give you one number. That's a thermometer โ useful, but it doesn't tell you what's broken or how to fix it.
llm-eval-kit is built around three convictions:
- Evaluation should be multi-dimensional. A response can be factually correct but incoherent, safe but illogical, creative but rambling. We score across 8 orthogonal critics so failure modes don't hide behind an average.
- Evaluation should be actionable. Every score ships with a rationale, issues, and suggestions โ fed straight into a self-refinement loop that rewrites the response until quality converges.
- Evaluation should be hackable. Every critic is a 30-line plugin. Every scorer is swappable. Every provider (Anthropic, OpenAI, Gemini, your local model) plugs into the same registry.
If you've ever shipped a prompt change and wondered "did I actually make it better?" โ this is for you.
๐ How it compares
| llm-eval-kit | DeepEval | RAGAS | LangSmith | promptfoo | |
|---|---|---|---|---|---|
| Open source | โ MIT | โ | โ | โ | |
| Multi-dimensional scoring | โ 8 critics | ||||
| Self-refinement loop | โ Built-in | โ | โ | โ | โ |
| Explainable output | โ Strengths/weaknesses/recs | ||||
| Plugin architecture | โ
BaseCritic registry |
โ | โ | โ JS plugins | |
| Multi-model benchmark | โ Async runner | โ | โ | โ | |
| CLI included | โ
llm-eval |
โ | โ | โ | โ |
| HTML / MD reports | โ | โ Web UI | โ | ||
| Focus | General-purpose + safety | Test-driven | RAG-only | Tracing/obs | Prompt-tests |
Comparisons reflect maintainer interpretation of public docs as of May 2026 โ the ecosystem moves fast, contributions to this table are welcome.
๐ Installation
With uv (recommended โ 10ร faster than pip)
uv pip install llm-eval-kit
With pip
pip install llm-eval-kit
With uvx (no install โ try it instantly)
uvx --from llm-eval-kit llm-eval evaluate "Explain quantum entanglement to a child."From source (development)
git clone https://github.com/benmeryem-tech/llm-eval-kit.git
cd llm-eval-kit
make install-devOptional extras
pip install "llm-eval-kit[viz]" # plotly + pandas + jinja2 (HTML dashboards) pip install "llm-eval-kit[docs]" # mkdocs-material pip install "llm-eval-kit[logging]" # structlog pip install "llm-eval-kit[all]" # everything
Configure your API key
cp .env.example .env echo "ANTHROPIC_API_KEY=sk-ant-..." >> .env
Or use the bundled MockProvider to develop offline โ no API calls, deterministic scores, zero cost.
โก Quickstart
1. Evaluate a response
from llm_eval_kit import Evaluator, global_weighted_score, explain_score evaluator = Evaluator(model="claude-3-5-sonnet-20241022") result = evaluator.evaluate("Propose a strategic plan for an AI startup in France in 2026.") score = global_weighted_score(result) print(f"Overall: {score.overall_score:.2f}") for dim, s in score.detailed_scores.items(): print(f" โข {dim:<12} {s:.2f}") explanation = explain_score(result) print(f"\nโ {explanation.strengths}") print(f"โ {explanation.weaknesses}") print(f"โ {explanation.recommendations}")
2. Self-refine until quality plateaus
from llm_eval_kit import SelfRefiner refiner = SelfRefiner(model="claude-3-5-sonnet-20241022") refined = refiner.refine(prompt, iterations=3) print(f"Iterations: {refined.iterations}") print(f"Improvements: {refined.improvement_count}") print(f"Converged: {refined.converged}") print(f"Final score: {refined.final.overall_score:.3f}")
3. Use the CLI
llm-eval evaluate "Explain CRISPR in 3 sentences." --output report.html --format html llm-eval refine "Write a haiku about recursion." --iterations 3 -v llm-eval --version
4. Build a custom critic (plugin system)
from llm_eval_kit.critique.base import BaseCritic from llm_eval_kit.core.types import CritiqueDimension from llm_eval_kit import Evaluator class ConcisenessCritic(BaseCritic): """Penalize verbose responses.""" dimension = CritiqueDimension.COHERENCE def _build_prompt(self, prompt: str, response: str) -> str: return f"""Score this response on conciseness (0-1). PROMPT: {prompt} RESPONSE: {response} Return JSON: {{"score": <float>, "rationale": "...", "issues": [...], "suggestions": [...]}}""" evaluator = Evaluator(critics=[ConcisenessCritic()]) result = evaluator.evaluate("Explain recursion in one sentence.")
5. Benchmark multiple models
from llm_eval_kit.benchmarks import MultiModelBenchmark bench = MultiModelBenchmark( models=["claude-3-5-sonnet-20241022", "claude-3-5-haiku-20241022"], dataset="reasoning_mini", ) report = bench.run() bench.export_html("dashboard.html") bench.export_json("results.json") for model, scores in report.summary.items(): print(f"{model}: overall = {scores['overall']:.3f}")
๐ง The 8 critics
| Critic | Catches | Preset |
|---|---|---|
| Reasoning | Logical leaps, missing premises, fallacies | CORE, FULL |
| Factual | Hallucinations, unsupported claims | CORE, FULL, SAFETY |
| Coherence | Contradictions, off-topic drift | CORE, FULL, CREATIVE |
| Safety | Toxicity, prompt injection, harmful instructions | CORE, FULL, SAFETY |
| Bias | Stereotyping, demographic skew | FULL, SAFETY |
| Creativity | Novelty, originality, style | FULL, CREATIVE |
| Completeness | Missing aspects, partial answers | FULL, CREATIVE |
| Clarity | Jargon, structure, readability | FULL, CREATIVE |
from llm_eval_kit.critique import CORE_CRITICS, FULL_CRITICS, CREATIVE_CRITICS, SAFETY_CRITICS evaluator = Evaluator(critics=FULL_CRITICS)
๐งฉ Architecture
flowchart LR
A[๐ Prompt] --> B{๐ฏ Evaluator}
B -->|fan-out| C1[๐ง Reasoning]
B -->|fan-out| C2[๐ Factual]
B -->|fan-out| C3[๐ Coherence]
B -->|fan-out| C4[๐ก๏ธ Safety]
B -->|fan-out| C5[โ๏ธ Bias]
B -->|fan-out| C6[๐จ Creativity]
B -->|fan-out| C7[โ
Completeness]
B -->|fan-out| C8[๐ Clarity]
C1 & C2 & C3 & C4 & C5 & C6 & C7 & C8 --> D[โ๏ธ Weighted scorer]
D --> E{Converged?}
E -->|no| F[๐ Self-refiner] --> B
E -->|yes| G[๐ Explanation + Report]
src/llm_eval_kit/
โโโ evaluator/ # Main orchestrator (sync + async)
โโโ refinement.py # Self-refinement loop
โโโ scoring/ # Weighted multi-criteria scoring + registry
โโโ explainability/ # Strengths ยท weaknesses ยท recommendations
โโโ report/ # JSON ยท Markdown ยท HTML reports
โโโ providers/ # Anthropic ยท Mock ยท ProviderRegistry
โโโ critique/ # 8 critics + BaseCritic plugin API
โโโ benchmarks/ # Multi-model async runner + datasets
โโโ tracking/ # EvaluationStore (persisted runs)
โโโ config/ # Pydantic settings (.env)
โโโ core/ # Types ยท exceptions ยท logging
โโโ cli.py # `llm-eval` entry point
๐ Extensibility
from llm_eval_kit.providers import ProviderRegistry, AnthropicProvider, MockProvider ProviderRegistry.register("my-llm", MyCustomProvider) from llm_eval_kit import ScorerRegistry, WeightedScorer ScorerRegistry.register("strict", WeightedScorer(weights={"safety": 0.6, "factual": 0.4})) from llm_eval_kit import EvaluationStore store = EvaluationStore("runs.db") store.save(result) history = store.query(model="claude-3-5-sonnet-20241022", min_score=0.8)
๐ Documentation
| Resource | Link |
|---|---|
| ๐ Full docs | benmeryem-tech.github.io/llm-eval-kit |
| โก Quickstart guide | docs/quickstart.md |
| ๐งช Interactive demo | demo.ipynb |
| ๐ Examples | examples/ |
| ๐ ๏ธ Contributing | CONTRIBUTING.md |
| ๐ Changelog | CHANGELOG.md |
| ๐ก๏ธ Security | SECURITY.md |
๐บ๏ธ Roadmap
โ Shipped (v0.2)
- 8-critic evaluation engine
- Self-refinement loop with convergence detection
- Weighted scoring + explainability
- JSON / Markdown / HTML reports
- Anthropic provider + Mock provider
- Async multi-model benchmark runner
- CLI (
llm-eval evaluate/refine) - Plugin registries (critics, scorers, providers)
- Persisted evaluation store
๐ ๏ธ Next (v0.3)
- OpenAI + Gemini + Ollama provider adapters
- Plotly-powered HTML dashboard with drill-down
- Cost tracking per evaluation
- Streaming evaluator (token-by-token critique)
- PyPI release + Homebrew formula
- MkDocs site on GitHub Pages
๐ Beyond (v1.0)
- Web UI (FastAPI + React) for non-developers
- HuggingFace Hub integration
- CI plugin (block PRs if eval score regresses)
- Eval suite marketplace (community-shared critic packs)
Vote on what's next on GitHub Discussions ๐ณ๏ธ
๐ค Contributing
We โค๏ธ contributions:
- ๐ Add a critic โ see
examples/custom_critic.py - ๐ Add a provider โ implement
BaseProviderinproviders/ - ๐ Add a benchmark dataset โ drop a JSON file in
benchmarks/datasets/ - ๐ Fix a bug โ issues tagged
good first issue - ๐ Improve docs โ typos, examples, translations
git clone https://github.com/benmeryem-tech/llm-eval-kit.git cd llm-eval-kit make install-dev pre-commit install make test make lint make format
See CONTRIBUTING.md for the full guide.
๐ Community
- ๐ฌ GitHub Discussions โ questions, ideas, show-and-tell
- ๐ Issues โ bugs and feature requests
- โญ Star the repo if it helps you โ visibility lets us spend more time on it
๐ License & Usage
Dual License Model
llm-eval-kit uses a fair, transparent licensing approach:
โ FREE for non-commercial use
- Personal projects, students, researchers
- Open-source non-profit projects
- Full source code access
- See CUSTOM_LICENSE.md for terms
๐ผ COMMERCIAL LICENSE REQUIRED
- Companies generating revenue
- SaaS platforms
- Integrations into commercial products
- Flexible pricing ($3k - $250k+/year)
Learn More
- ๐ Dual License Terms โ Full legal framework
- ๐ฐ Commercial Solutions โ Pricing, tiers, support
- ๐ง Contact: benmeryemazzadine@gmail.com
Why This Model?
- Transparent and fair for everyone
- Open-source remains accessible
- Businesses pay proportionally
- Supports sustainable development
- Aligns with Anthropic values
๐ค Author
BEN MERYEM Azzadine โ @benmeryem-tech
Built with โค๏ธ in France, on top of Anthropic Claude.





















