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.
  • Telemetry — Anonymous cli_command/cli_run events to PostHog (no prompts/keys). Disable via --off-tracking, CRILIO_DISABLE_TELEMETRY=1/DO_NOT_TRACK=1, or settings.telemetry: false.
  • Skip & List — skip: true per-test to pause, crilio ls [--tag] [--json] to preview tests without running.
  • 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 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.5

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.5
File Size Uploaded
crilio-0.0.5.tar.gz 52.6 kB Details

Built distribution (wheel)

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

Total release size: 95.1 kB

Release files / crilio-0.0.5.tar.gz

Download URL crilio-0.0.5.tar.gz
Size 52.6 kB
Tags Source
SHA-256 checksum
How to use checksums
6622e56aa33d372817ec81c4a9853b54c670d9a46c2f2de7157b1dc10fd0754d
BLAKE2b-256 checksum
How to use checksums
c3474f70942106422dd24a33f1449586c1825750b912cc668a48054ded8dce99
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.5-py3-none-any.whl

Download URL crilio-0.0.5-py3-none-any.whl
Size 42.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
abb74df80e546ca4b38a3f18720c0b704ccd733dda2e2507a14c0cba30dc1a71
BLAKE2b-256 checksum
How to use checksums
65893572a3c3f1063046a50dd43f983f6afb4ff780f88acfbe9ca5357611a949
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

0.0.6

2 release files

This release

0.0.5 This release

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