skills/cli-eval/SKILL.md
Create and run evaluation suites, watch live benchmark progress, view scorecards, compare model performance, and integrate eval runs with CI workflows from the CLI.
npm install -g omniroute # or: npx omniroute
omniroute --version
evalExample:
omniroute eval
eval suitesExample:
omniroute eval suites
eval listExample:
omniroute eval list
eval get <suiteId>Example:
omniroute eval get <suiteId>
eval createFlags:
--file <path>Example:
omniroute eval create
eval run <suiteId>Flags:
-m, --model <id>--combo <name>--concurrency <n>--tag <tag>--watchExample:
omniroute eval run <suiteId>
eval listFlags:
--suite <id>--status <s>--since <ts>--limit <n>Example:
omniroute eval list
eval get <runId>Example:
omniroute eval get <runId>
eval results <runId>Flags:
--failedExample:
omniroute eval results <runId>
eval cancel <runId>Flags:
--yesExample:
omniroute eval cancel <runId>
eval scorecard <runId>Example:
omniroute eval scorecard <runId>
simulate [prompt]Flags:
--file <path>-m, --model <id>--combo <name>--reasoning-effort <level>--thinking-budget <n>--explainExample:
omniroute simulate [prompt]
Requires the omniroute CLI. See CLI entry-point skill for install + global flags.
Evals are automated test suites that score LLM outputs against expected answers or rubrics. OmniRoute stores suites and run results in its local database.
omniroute eval suites list # List all eval suites
omniroute eval suites list --json # JSON output
omniroute eval suites get <suiteId> # Full suite definition
omniroute eval suites create \
--name "code-quality" \
--rubric "exact-match" \
--samples-file ./samples.jsonl # JSONL: {input, expected_output}
Rubric options: exact-match, contains, llm-judge, regex.
--samples-file format (one JSON object per line):
{"input": "What is 2+2?", "expected_output": "4"}
{"input": "Translate 'hello' to Spanish", "expected_output": "hola"}
omniroute eval suites run <suiteId> \
--model claude-sonnet-4-6 # Run suite against a specific model
omniroute eval suites run <suiteId> \
--model gpt-4o \
--watch # Live TUI progress (EvalWatch)
The run is asynchronous. Use --watch for a live terminal dashboard or poll manually:
RUN_ID=$(omniroute eval suites run <suiteId> --model claude-sonnet-4-6 --output json | jq -r '.id')
omniroute eval get $RUN_ID
omniroute eval list # List all eval runs
omniroute eval list --json
omniroute eval get <runId> # Run details (status, model, score)
omniroute eval results <runId> # Per-sample results
omniroute eval scorecard <runId> # Full scorecard with pass/fail per sample
omniroute eval cancel <runId> # Cancel a running eval
omniroute eval scorecard <runId> --output json
Response fields per sample:
{
"id": "sample-1",
"score": 0.95,
"passed": true,
"input": "What is 2+2?",
"output": "4",
"expected": "4"
}
Run the same suite against multiple models and compare:
for MODEL in claude-sonnet-4-6 gpt-4o gemini-2.0-flash; do
omniroute eval suites run $SUITE_ID --model $MODEL --output json | jq '{model: .model, score: .score}'
done
# Run and fail CI if score drops below threshold
SCORE=$(omniroute eval suites run $SUITE_ID --model claude-sonnet-4-6 --output json | jq -r '.score')
python3 -c "import sys; score=float('$SCORE'); sys.exit(0 if score >= 0.90 else 1)"
suites create fails with invalid rubric → use one of: exact-match, contains, llm-judge, regexsuites run returns model not found → verify model ID with omniroute models --search <name>eval get shows status: failed → check omniroute logs --search eval for error detailsscorecard returns empty results → the run may still be running; poll omniroute eval get <runId> until status is completed