Skip to main content
Crilio

crilio

The CI/CD quality gate for AI — pytest for prompts.

If Crilio helps you, please ⭐ star this repo — it helps other devs find it and motivates me to keep building.

☁️ Join the Crilio Cloud Waitlist (Get 40% off team dashboards & analytics when we launch)

PyPI Python License


Crilio stops prompt regressions from reaching production. Version your prompts + natural-language rules in crilio.yaml — Crilio calls your model, judges every response with an LLM, and reports PASS / FAIL per rule.


✨ Features

  • LLM-as-a-Judge — Strict Pydantic-verified verdicts (rule_passed: bool), temp 0. No flaky free-text parsing.
  • BYOK — Your keys, your bill. OpenAI + Anthropic. Typically < $0.01 / test on gpt-4o-mini.
  • CI/CD Native — exit 1 blocks PRs in GitHub Actions. Locally it warns but never blocks.
  • PR Comments — Auto-posts formatted failure details to the PR when running in Actions (GITHUB_TOKEN, silent fail, never blocks gate).
  • Leak Guard — Rejects crilio.yaml containing sk-.../api_key — keys must be in .env/Secrets, never committed.
  • Local Bots — target: {command: "python bot.py '{{prompt}}'"} runs any local model (Ollama/vLLM) via stdout → Judge, $0 target.
  • Skip & List — skip: true per-test to pause, crilio ls [--tag] [--json] to preview tests without running.
  • Diff — crilio diff --base main shows prompt/rule changes between git refs (+/- per rule, not whole list).
  • Budget Guard — max_monthly_budget_usd halts the run when cost exceeds cap. Delete the line or leave it blank for unlimited.

🚀 Quick Start

pip install crilio

export OPENAI_API_KEY="sk-proj-..."  # or ANTHROPIC_API_KEY — .env also works
crilio init                          # creates crilio.yaml
crilio run --dry-run                 # validate without API calls
crilio run                           # Target → Judge → gate

crilio with no args shows status, budget, and next steps.


⚙️ Usage

Command Description
crilio init [--force] [--yes] Create crilio.yaml + optional GitHub Actions workflow
crilio ls [-c FILE] [--tag TAG] [--json] List tests — preview without running
crilio diff [--base REF] [-c FILE] [--json] [--fail-on-change] Show prompt/rule diff between git refs
crilio run [-c FILE] [-m MODEL] [--judge-model MODEL] [--verbose] [--json] [--dry-run] [--tag TAG] Run gate — 0 pass, 1 fail (only in CI) · --tag filters to tags: [TAG] tests
crilio validate [-c FILE] [--json] Validate config without API calls — 0 valid, 2 invalid
crilio --version / crilio --docs Version / full interactive guide
Variable Description
OPENAI_API_KEY OpenAI — default target gpt-4o-mini, judge gpt-4o-mini
ANTHROPIC_API_KEY Anthropic — default target claude-3-5-sonnet-latest, judge claude-3-5-haiku-latest

Provider is inferred from env if not set in crilio.yaml. Keys are never flags — env only.

crilio.yaml
settings:
  target_model: gpt-4o
  judge_model: gpt-4o-mini
  max_monthly_budget_usd: 10.0  # delete or leave blank for unlimited

tests:
  - name: Refund Policy Check
    prompt: How long do I have to return a product?
    rules:
      - Must mention the 30-day return window.
      - Must NOT mention competitor names.
    tags: ["smoke", "critical"]

  - name: JSON Format Check
    prompt: |
      Return ONLY this JSON and nothing else: {"status": "shipped", "order_id": "12345"}
    rules:
      - Must return valid JSON with keys 'status' and 'order_id'.
      - Must NOT include apologies or extra prose.

  - name: Local Bot Check
    prompt: How long do I have to return a product?
    target:
      command: "python bot.py '{{prompt}}'"
    rules:
      - "Must mention the 30-day return window."
    tags: ["local"]

Per-test overrides: provider, model, judge_model, system, tags, target, skip can be set per test. skip: true pauses, crilio ls previews. Use crilio run --tag smoke to run only tagged tests. target.command runs local CLI ({{prompt}} → shlex.quote, no placeholder → stdin, 30s timeout).

🦙 Ollama template — test any local model
# 1. ollama serve & ollama pull llama3  (or mistral, qwen2, etc.)
# 2. crilio.yaml:
settings:
  target_model: gpt-4o
  judge_model: gpt-4o-mini

tests:
  - name: Ollama Refund
    prompt: "How long do I have to return a product?"
    target:
      command: "ollama run llama3 '{{prompt}}'"  # any model: mistral, qwen2, gemma
      # no placeholder also works → stdin: command: "ollama run llama3"
    rules:
      - "Must mention the 30-day return window."
    tags: ["ollama", "local"]

# 3. export OPENAI_API_KEY="sk-..."  # Judge still API
# 4. crilio run --tag ollama --verbose

🔄 CI/CD Integration

crilio init can scaffold this for you. Or drop in .github/workflows/crilio.yml:

name: Crilio AI Tests
on: [pull_request]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with: { python-version: '3.10' }
      - run: pip install crilio
      - run: crilio run
        env:
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}  # for PR failure comments (auto-provided)

Add the secret matching your provider. A FAIL gate exits 1 and blocks the PR. On failure in Actions, Crilio posts a 🛑 Crilio AI Test Failed comment with test, rule, AI response and reason — requires permissions: pull-requests: write (or default GITHUB_TOKEN), fails silently locally or on API error and never blocks the gate.


📄 License

AGPL-3.0 — see LICENSE.

Metadata

Release files for crilio 0.0.6

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for crilio 0.0.6
File Size Uploaded
crilio-0.0.6.tar.gz 53.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for crilio 0.0.6
File Interpreter ABI Platform
crilio-0.0.6-py3-none-any.whl Python 3 none any Details

Total release size: 95.3 kB

Release files / crilio-0.0.6.tar.gz

Download URL crilio-0.0.6.tar.gz
Size 53.2 kB
Tags Source
SHA-256 checksum
How to use checksums
b61708d214689ef763b86e769b8f1fa8574c0da40d05502518793243aa879aeb
BLAKE2b-256 checksum
How to use checksums
d7b4eb92843f88306703457b203cd919c03c74b75c97be84f6f12744a574a264
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.9

Release files / crilio-0.0.6-py3-none-any.whl

Download URL crilio-0.0.6-py3-none-any.whl
Size 42.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
24addf1e848d27b7690c008e7c95d2c70b9a6890ee9067e7f41597d95af24abd
BLAKE2b-256 checksum
How to use checksums
8c073eb54d060dbd0530efa848312e95a0baa11a45aae21ed6b78ac02311b67c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.9

Release history Release notifications | RSS feed

0.0.8

2 release files

0.0.7

2 release files

This release

0.0.6 This release

2 release files

0.0.5

2 release files

0.0.4

2 release files

0.0.3

2 release files

0.0.2

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page