Stop vibe-checking agents. Test them.
Portable YAML evals for AI agents and model harnesses.
Define your tests once and run them against your own workflow.
Don't just test your model. Test your skills, agent instructions, extensions/plugins, tools, and the real environment where your AI actually runs.
Make AI evals simple.
evaltis pronounced "ee-val-tee", as in eval tests.
Most AI eval tools are model-centric. evalt is "agent-centric".
It is designed for real harnesses and real workflows, because AI is not just the model you use, but is also the skills, agent files and tools you give it.
Create carwash.eval.yaml in your project somewhere.
# carwash.eval.yaml
version: 1
config:
profiles:
main:
harness: pi
profile: main
tests:
- name: car-wash-reasoning
input:
prompt: >
I want to wash my car and the car wash place is 15 meters away from me,
should I walk or drive?
assertions:
- left: output
op: contains
right: drive
- review:
prompt: >
Did the answer correctly choose driving because the car itself
needs to be taken to the car wash, instead of only considering the
short distance?Check that the eval file is valid:
evalt checkThen run it:
evalt runevalt discovers *.eval.yaml files recursively, runs each test through your
selected profile, checks deterministic assertions, and uses an AI reviewer for
the semantic judgement.
The
mainprofile uses the Pi agent harness and lets Pi choose the model from your existing local configuration.
Feel free to look in the project's ./examples folder for more examples.
evalt currently supports macOS and Linux.
You can install it via crates.io:
cargo install evaltor build from source:
cargo install --path .Note
evalt uses the cage CLI to restrict file
access during test runs. cage must be installed separately.
Validate eval files without running them:
evalt check
# or for JSON output:
evalt --json checkRun all evals under the current directory:
evalt run
# or for JSON output:
evalt --json runRun evals from a specific file or directory:
evalt run --path examplesRun tests whose names match a selector:
evalt run car-washPrint the embedded AI guide, designed for coding agents:
evalt aiPrint schemas for editor integration or AI tooling:
evalt ai --schema
evalt ai --config-schemaYou can write the eval schema to a stable location and reference it from any eval file:
mkdir -p ~/.config/evalt
evalt ai --schema > ~/.config/evalt/evalt.schema.jsonThen add this comment at the top of each *.eval.yaml file, replacing the
path with your absolute home directory path:
# macOS example:
# yaml-language-server: $schema=/Users/YOUR_USER/.config/evalt/evalt.schema.json
# Linux example:
# yaml-language-server: $schema=/home/YOUR_USER/.config/evalt/evalt.schema.jsonevalt includes embedded AI-facing docs and schemas, so you can ask your
coding agent to help create evals for your project.
For example:
Use the
evaltCLI to build an eval for this bug so I can catch it next time.
The agent can call evalt ai, evalt ai --schema, and evalt check to learn
the format, draft a test, and validate it before you run it.
Warning
evalt uses cage to block file writes outside the allowed sandbox, but this
is not a full security sandbox. Commands can still mutate external state
through networks, services, credentials, or other side effects. Only run evals
you trust. For stronger isolation, run evalt inside a container or VM.
evalt uses profiles to decide how a test should run. A profile points to a
harness, plus any extra arguments that should be passed to it.
profiles:
local:
harness: pi
fast:
harness: pi
extra-args: ["--model", "github-copilot/gpt-5.4"]
profile: localConfig options can be defined in multiple places and are merged from lowest to highest priority:
- Global config: ~/.config/evalt/config.yaml
- Project config: .evalt.config.yaml
- Eval file config: under
configkey - Individual test config: under
tests.config - CLI options, where supported
This lets you set common defaults once, then override them for a specific project, eval file, or test.
Example .evalt.config.yaml:
# List of profiles
profiles:
local: # Name of profile
harness: pi # Harness to use
extra-args: ["--model", "llamacpp/qwen3.6-30B"] # Extra CLI args to pass into the `pi` command
profile: local # Default profile to use
reviewer: # Reviewer config
profile: local # Default profile to use for the reviewer
default-pass-threshold: 0.8 # The default passing threshold (between 0 and 1) to use if not specified (default 0.8)
run: # Run configuration options
concurrent-tests: 10 # The number of tests to run concurrently
timeout-ms: 120000 # The test timeout in milliseconds
max-turns: 20 # The max number of turns before interrupt
budgets: # Budget configuration options
max-tokens: 2000 # The max number of tokens used in this test before interrupt
max-cost-usd: 0.10 # The max cost for this test before interrupt (if applicable)Warning
Evals can call real models and tools. Use timeout-ms, max-turns, and
budget limits to avoid unexpected long-running or expensive test runs.
If your profile uses a personal AI subscription or account-backed harness,
high concurrency may trigger provider rate limits, quota exhaustion,
temporary blocks, or violate provider terms. Keep run.concurrent-tests
conservative, especially for CI or high-volume evals, and prefer official
API/project keys with appropriate billing and rate limits.
The flow:
- Discover
*.eval.yamlfiles - Validate them against the schema
- Run each eval through an adapter
- Capture the raw output from the harness and translate it
- Use captured data to apply assertions
- Output report
- Claude Code adapter
- More adapters (Antigravity, Opencode, etc.)
- HTML reports
- CI/CD integrations
evalt is still quite early and is actively evolving.
It is possible there will be breaking changes before version 1.0.
evalt was built with AI assistance, but it is not vibe coded. AI helped with
implementation, review, and iteration. Every change was either hand-written or
reviewed before being committed.
The goal is software that can be understood, reviewed, tested, and maintained. Not generated code shipped on faith.
evalt is inspired by and built around a few great tools and ideas:
- Pi — the first supported agent harness.
- cage — used to restrict filesystem access during test runs.
cargo test— inspiration for simple, developer-friendly test runner UX.
