CI FOR LLM PROMPTS
evaldiff scores your LLM output against a dataset of expected answers
and gates your pipeline with a green/red checkmark — the npm test of prompts.
2026-10-07T18:21:14Z run 43: done passed=1/3 2026-10-07T18:21:14Z | passed | 1 | ##[error]GATE FAIL: pass_rate=33.33% (threshold 80%) 2026-10-07T18:21:14Z Process completed with exit code 5.
No agents, no dashboards you have to babysit. A dataset, a run, a threshold.
Plain JSON. What the model should do, and what counts as correct.
[
{ "input": "What is the capital of France?",
"expected": "Paris" },
{ "input": "Reply with exactly one word: PONG",
"expected": "PONG" }
]
OpenAI, self-hosted, Ollama, vLLM — anything with an OpenAI-compatible endpoint. Runs are per-case scored, with latency and tokens.
$ pip install evaldiff $ evaldiff run --dataset evals/cases.json \ --endpoint https://your-model/v1 \ --model qwen3.8:27b --threshold 0.8
One line in your workflow. Exit code 0 or 1, drop it anywhere CI runs.
- name: Run the evaldiff gate uses: evaldiff/action@v2 with: api_key: ${{ secrets.EVALDIFF_API_KEY }} dataset_json: evals/cases.json threshold: 0.8
Both below are real runs against a real model. That's the whole product surface: a pass rate, a threshold, an exit code.
| pass rate | 100% | GATE PASS: pass_rate=100% (threshold 80%)
| pass rate | 33.33% | GATE FAIL: pass_rate=33.33% (threshold 80%)
Python CLI today; GitHub Action ready. Diff any two runs to see exactly which cases regressed.
$ pip install evaldiff $ npm i -g @evaldiff/evaldiff $ evaldiff diff <run-a> <run-b> # regressions, side by side