--assert)Block regressions before merging code. When prompt engineers or backend developers tweak a system prompt,
promptdiffenforces hard performance & accuracy boundaries in your CI/CD pipeline.
promptdiff test prompts/v1.txt prompts/v2.txt \
--inputs datasets/testcases.jsonl \
--model gpt-4o \
--assert "cost_delta <= 10%, latency_delta <= 15%, json_validity == 1.0"
| Exit Code | Condition | CI/CD Action |
|---|---|---|
0 |
All assertions satisfied across test suite | β PR Checks Pass β Safe to merge |
1 |
Cost spike, latency regression, or invalid JSON detected | β PR Checks Blocked β Regression prevented |
When engineering LLM prompts, even small tweaksβsuch as changing a system rule, adjusting formatting requirements, or rewriting examplesβcan cause silent production regressions:
Testing prompts manually in web playgrounds is slow, unrepeatable, and disconnected from software engineering workflows.
git diff) highlighting exact word, line, and JSON key modifications.json_validity, latency_delta, token_cost, similarity, and regex_match.--assert rules with non-zero exit codes for GitHub Actions / GitLab CI.MockProvider. promptdiff CLI
β
ββββββββββββββββββββββββ΄βββββββββββββββββββββββ
βΌ βΌ
Prompt Version 1 Prompt Version 2
(Baseline Template) (Candidate Template)
β β
ββββββββββββββββ¬βββββββββββββββββββββββββββββββ
βΌ
Dataset / Test Cases Loader
(.jsonl, .yaml, .csv, .json)
β
βΌ
Async Batch Execution Engine
(Semaphore Concurrency + Cache)
β
βββββββββββββββββΌββββββββββββββββ
βΌ βΌ βΌ
OpenAI/Claude Gemini/Ollama MockProvider
β
βΌ
Evaluation Registry
βββββββββββββββββββββββββΌββββββββββββββββββββββββ
βΌ βΌ βΌ
JSON Schema & Latency & Cost Text & Semantic
Validity Checker Delta Tracker Similarity Engine
β
βΌ
CI/CD Assertion Engine
(Threshold Pass/Fail Rules)
β
ββββββββββββββββββββββββΌβββββββββββββββββββββββ
βΌ βΌ βΌ
Terminal UI HTML Report Markdown Summary
(Side-by-Side Diff) (Interactive Dark UI) (GitHub Actions / PR)
Install directly from GitHub or source:
# Direct install from GitHub
pip install git+https://github.com/latryee/promptdiff.git
# Or clone and install editable with dev dependencies
git clone https://github.com/latryee/promptdiff.git
cd promptdiff
pip install -e ".[dev]"
You donβt need any API keys to try promptdiff. Run our realistic offline mock engine:
promptdiff test examples/prompts/support_bot_v1.txt examples/prompts/support_bot_v2.txt \
--inputs examples/testcases.jsonl \
--eval "json_validity,latency,cost,similarity" \
--mock \
--export-html report.html
promptdiff test prompts/v1.txt prompts/v2.txt \
--model gpt-4o \
--eval "json_validity,latency,cost,similarity"
promptdiff test prompts/v1.txt prompts/v2.txt \
--inputs datasets/eval_cases.jsonl \
--model claude-3-5-sonnet-latest \
--concurrency 8
Check token costs per 1 Million tokens across 40+ models:
promptdiff pricing
# Or filter specific models:
promptdiff pricing gemini
Diff two prompt files without invoking models:
promptdiff diff prompts/v1.txt prompts/v2.txt
promptdiff init my-prompt-suite
promptdiff cache stats
promptdiff cache clear
| Metric Name | Evaluator Purpose | Output Range / Details |
|---|---|---|
json_validity |
Validates JSON syntax and schema compliance | 1.0 (Valid), 0.0 (Invalid), 0.5 (Schema Mismatch) |
latency |
Measures execution latency delta | Milliseconds delta (-35.4ms (-15.2%)) |
cost |
Computes token dollar cost from pricing tables | USD delta ($0.0012 -> $0.0009 (-25%)) |
similarity |
Measures sequence & token overlap preservation | 0.0 to 1.0 (100% Identical) |
regex_match |
Enforces output regex structure & mandatory keywords | 1.0 (Matched), 0.0 (Failed) |
length_drift |
Tracks output token & character inflation | Delta tokens and percentage drift |
| Provider | Model Identifier Examples | Environment Variable |
|---|---|---|
| OpenAI | gpt-4o, gpt-4o-mini, o1-preview, o3-mini |
OPENAI_API_KEY |
| Anthropic | claude-3-5-sonnet-latest, claude-3-5-haiku-latest, claude-3-opus-latest |
ANTHROPIC_API_KEY |
| Google Gemini | gemini-2.0-flash, gemini-1.5-pro, gemini-1.5-flash |
GEMINI_API_KEY |
| Ollama (Local) | ollama/llama3, ollama/mistral, ollama/deepseek-r1 |
OLLAMA_HOST (Optional) |
| OpenRouter / DeepSeek | deepseek-chat, deepseek-reasoner |
OPENAI_BASE_URL, OPENAI_API_KEY |
| Mock (Offline) | mock, --mock |
None (Zero API keys required) |
Add promptdiff to your .github/workflows/prompt-test.yml to automatically prevent prompt regressions on pull requests:
name: Prompt Regression CI
on:
pull_request:
paths:
- 'prompts/**'
- 'datasets/**'
jobs:
prompt-regression:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install promptdiff
run: pip install git+https://github.com/latryee/promptdiff.git
- name: Run promptdiff Regression Suite
env:
OPENAI_API_KEY: $
run: |
promptdiff test prompts/system_v1.txt prompts/system_v2.txt \
--inputs datasets/testcases.jsonl \
--model gpt-4o \
--assert "cost_delta <= 10%, latency_delta <= 20%, json_validity == 1.0" \
--export-markdown comment.md \
--export-html report.html
- name: Comment PR Summary
if: always()
uses: thollander/actions-comment-pull-request@v2
with:
filePath: comment.md
Run unit tests, integration tests, and check test coverage:
# Run pytest with code coverage
pytest --cov=promptdiff --cov-report=term-missing
# Run linter & type checker
ruff check .
mypy promptdiff
Distributed under the MIT License. See LICENSE for more information.