NiceEval

AI-Native Eval for Agents.

Docs

Read the quickstart guide, then write an eval and run it across targets without building a bespoke harness.

niceeval
$ niceeval exp compare
PLAN ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
8 attempts · 4 evals × 2 configs · concurrency 4
2 of 8 carried in from cache · 6 to run
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
@1bwcxxiy checkout/apply-coupon [compare/gpt-5.4]
gate: cart total reflects the SAVE20 coupon
equals(80) · expected 80 · received 100
FAILED ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── 2m 07s
7 passed · 1 failed · 0 errored (2 reused)
330.5k new tok · $0.51
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
FAILURES ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
@1bwcxxiy checkout/apply-coupon [compare/gpt-5.4]
gate: cart total reflects the SAVE20 coupon
equals(80) · expected 80 · received 100
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
NEXT ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Catalog: niceeval query discover
Runs: niceeval query run --request runs-list.json
Attempt: niceeval query run --request attempt.json
Compare: niceeval query run --request runs-compare.json
Human: niceeval view @1bwcxxiy
├─ RESULTS ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
.niceeval/compare/gpt-5.4/2026-07-30T09-14-22-118Z-i080
.niceeval/compare/sonnet-5/2026-07-30T09-14-22-140Z-b3kq
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
$ niceeval query run --request runs-compare.json
compare · 2 conditions · paired by eval id · baseline compare/gpt-5.4
common 4 · compare/gpt-5.4 only 0 · compare/sonnet-5 only 0
evalgpt-5.4sonnet-5Δ sonnet-5checkout/apply-coupon 84.9k $0.14 61.2k $0.09⇄ -23.7k -$0.05checkout/refund-window 52.4k $0.08 57.9k $0.09+5.5k +$0.01support/order-status ↩ 2h 38.1k $0.06 ↩ 2h 35.2k $0.05-2.9k -$0.01support/escalation 40.3k $0.06 33.8k $0.05-6.5k -$0.01totals3/4 passed 215.7k $0.344/4 passed 188.1k $0.28
common vs baseline · pass rate +25.0pt · tokens -27.6k · cost -$0.06
$
1

Connect

Connect your agent — or CC/Codex — via an adapter plus o11y.

2

Define

Write evals and experiments the way you'd write unit tests.

3

Evaluate

Evaluate in parallel.

Eval examples

eval chats, tool calls, and coding agents

Each card is a runnable defineEval file. Click a highlighted line to peek at replies and assertion notes.

multimodalMulti-turn image Q&A
passed
1import { defineEval, defineJudge } from "niceeval";
2import { pattern } from "niceeval/expect";
3
4const imageContext = defineJudge({ name: "image-context", rubric: "Does the last reply stay grounded in the earlier image?" });
5
6export default defineEval({
7 judge: imageContext,
8 description: "Evaluate an agent's multimodal ability across a multi-turn conversation",
9
10 async test(t) {
17
18 await t.group("follow-ups stay grounded in the image context", () => {
20 });
21
22 t.check({ earlierImageFacts: ["blue background", "white square"], question: third.input, answer: third.message }, imageContext.atLeast(0.7)).gate();
24});

Agents are users too

turn evals into a loop

The NiceEval CLI is designed for agents as much as for humans — not just an evaluation tool, but a framework that loops: build evals, run them, improve the agent system. Every output has an agent-readable face, so a coding agent drives the whole loop over bash.

evalexp localtriagequery discoverevidencequery runrefineclaude
terminalniceeval exp local --output agent --force
$ niceeval exp local --output agent --force
NICEEVAL RESULT failed
summary: 14 passed, 1 failed, 0 errored
failures:
  - @1k2m9qtr weather/brooklyn [local]
      gate: tool was never called
next:
  niceeval query discover
  niceeval query run --request runs-list.json