lucebench
Endpoint capability gate for OpenAI-compatible chat-completion servers — and Anthropic-messages tool scenarios. Ten evaluation areas, progressive snapshot levels, vendored fixtures, machine-readable reports.
Distribution, import, primary CLI, and GitHub repo are all lucebench
(no hyphen). Hyphenated console scripts (luce-bench, …) remain as aliases.
Who this is for
| Audience | Job |
|---|---|
| Inference server authors | Post-restart / post-PR smoke → level1 capability gate |
| Lab / machine operators | Named snapshots comparable across hosts and models |
| Agent-runtime owners | Cheap preflight before expensive agent/terminal-bench runs |
Not this tool: research leaderboard campaigns (use lm-evaluation-harness / OpenCompass), app/prompt/RAG QA (Promptfoo, DeepEval), or full agent loops (fizeau, terminal-bench). lucebench scores the endpoint.
Areas: smoke, ds4-eval, gsm8k, truthfulqa-mc1, hellaswag,
code, longctx, agent, agent_recorded, forge.
Install
PyPI status (2026-07-23): package name reserved in CI, but trusted publishing is not configured on pypi.org yet (
invalid-publisheron tag runs). Use the git pin untildocs/helix/05-deploy/runbook-pypi-trusted-publishing.mdis completed.
# Current reliable install — pin a release tag
uvx --from "git+https://github.com/easel/lucebench@v0.3.2" \
lucebench --base-url http://127.0.0.1:8000
# Unreleased main
uvx --from "git+https://github.com/easel/lucebench@main" \
lucebench --base-url http://127.0.0.1:8000
# After PyPI is live (see runbook)
# uvx lucebench --base-url http://127.0.0.1:8000
# uv add lucebench
# pip install lucebench
anthropic is a hard runtime dependency (forge + default judge path).
The legacy [forge] extra still resolves as an empty alias.
Every run prints a version banner first — [lucebench] vX.Y.Z — so
stale caches are easy to spot.
Quick start
# Smoke (3 cases) — default when --areas is omitted
uvx --from "git+https://github.com/easel/lucebench@v0.3.2" \
lucebench --base-url http://127.0.0.1:8000
# Progressive post-change gate (host + levels)
uvx --from "git+https://github.com/easel/lucebench@v0.3.2" \
lucebench snapshot --level level1 \
--base-url http://127.0.0.1:8000 --name my-machine
# OpenRouter
export OPENROUTER_API_KEY=sk-or-...
uvx --from "git+https://github.com/easel/lucebench@v0.3.2" \
lucebench --base-url https://openrouter.ai/api \
--model qwen/qwen3.6-27b --auth-env OPENROUTER_API_KEY
# Multi-area sweep (see "areas all" policy below)
uvx --from "git+https://github.com/easel/lucebench@v0.3.2" \
lucebench --areas all --name my-machine \
--base-url http://127.0.0.1:8000
--areas all policy
--areas all runs: smoke, ds4-eval, gsm8k, truthfulqa-mc1, hellaswag,
code, longctx, agent, forge.
It does not include agent_recorded or agent_recorded_v1 (side
effects: optional service restart, LLM judge cost). Run those explicitly:
lucebench --areas agent_recorded --base-url http://127.0.0.1:8000
snapshot --level level3 does include agent_recorded by design
(baseline-grade full suite). See
docs/helix/02-design/contracts/CONTRACT-001-cli.md.
More examples
# Single case, json-out for downstream analysis
lucebench --areas ds4-eval --case-id aime2025-02 \
--base-url http://localhost:8080 --json-out /tmp/aime02.json
# Limit each area to N questions
lucebench --areas all --name quick --questions 2 \
--base-url http://localhost:8080
# Parallel against a stateless gateway (skip on single-GPU local servers)
lucebench --areas ds4-eval --base-url https://openrouter.ai/api \
--model openai/gpt-5.4 --auth-env OPENROUTER_API_KEY --parallel 8
# Single-case multi-mode reasoning probe
lucebench-probe --case-id aime2025-02 \
--url http://localhost:8080 --out-dir ./probes/my-model
A sweep writes per-area JSON and a combined _summary.md under
./snapshots/<name>/. Envelope fields and headline metrics:
docs/helix/02-design/contracts/CONTRACT-002-result-envelope.md
and docs/metrics.md.
What's benchmarked
| Area | Cases | Grader | Source |
|---|---|---|---|
smoke |
3 (arithmetic, capital, sequence) | case-insensitive substring | own — default sanity check |
ds4-eval |
92 (GPQA Diamond, SuperGPQA, AIME2025, COMPSEC) | strict Answer: X extract |
antirez/ds4 (MIT) |
gsm8k |
100 (test split sample, seed 42) | #### N marker, last-number fallback |
openai/gsm8k (MIT) |
truthfulqa-mc1 |
100 (validation split sample, seed 42) | MC letter extract (2–13 choices) | truthful_qa (Apache-2.0) |
hellaswag |
100 (validation split sample, seed 42) | MC letter extract (A–D endings) | Rowan/hellaswag (MIT) |
code |
10 (mid-function completion) | ast.parse(prompt + completion) |
openai/human-eval (MIT) port |
longctx |
6 frontiers (2k → 64k tokens) | ^Risk: prefix check |
own ports |
agent |
N codex-style prompts paired with coding tasks | code-fence / json-tool / apply_patch detect | own ports |
agent_recorded |
48 recorded Claude Code + Codex session prefixes replayed turn-by-turn | LLM judge on final turn + per-turn cache metrics | own — mined via scripts/extract-agentic-fixture.py |
forge |
7+ tool-calling scenarios | error_type == None | antoinezambelli/forge 0.7.1 (MIT) |
Each row in the result carries:
pass(bool),graded(full grader output)wall_seconds,http_status,errorprompt_tokens,completion_tokens,timings(when surfaced by the server)content,reasoning_content,finish_reason,finish_details
The default sampling shape is send-nothing-explicit — the server applies its own defaults. Sampling flags are omitted unless the user sets them.
Snapshot levels
| Level | Intent | Areas (caps) |
|---|---|---|
level0 |
Alive? | smoke |
level1 |
Post-change gate | smoke; code×5; gsm8k×5; agent×2; longctx×1 |
level2 |
Broader capability | smoke, code, gsm8k, truthfulqa-mc1, hellaswag, agent, longctx (full) |
level3 |
Baseline-grade | level2 + ds4-eval, agent_recorded, forge |
lucebench snapshot --level level1 --base-url http://127.0.0.1:8000
Programmatic use
from lucebench.areas import ds4_eval
from lucebench.runner import run_case
cases = ds4_eval.load_ds4_eval_cases()
case = next(c for c in cases if c["id"] == "aime2025-02")
row = run_case(
url="http://localhost:8080",
case=case,
model="my-model",
think=True,
)
graded = ds4_eval.grade_case(case, row)
print(graded["pass"], graded["given"], "/", graded["correct"])
Library imports used by external sweeps are provisional until a library Contract lands; prefer the CLI for stable automation.
Attribution
This project redistributes evaluation fixtures from upstream MIT-
licensed projects. See NOTICE for full attribution; in short:
- ds4-eval cases —
antirez/ds4, MIT - GSM8K cases —
openai/gsm8k, MIT - TruthfulQA MC1 cases —
truthful_qa, Apache-2.0 - HellaSwag cases —
Rowan/hellaswag, MIT - HumanEval prompts —
openai/human-eval, MIT - forge eval scenarios —
antoinezambelli/forge, MIT
The lucebench code itself is Apache-2.0.
Product docs
Governed product docs live under docs/helix/ (vision,
competitive analysis, PRD, contracts). Alignment for external release:
docs/helix/06-iterate/alignment-external-release.md.
Contributing
git clone https://github.com/easel/lucebench
cd lucebench
uv sync --extra dev
uv run pytest
uv run ruff check src tests scripts
CI runs the same matrix on Python 3.10–3.13 + a wheel-build check that verifies fixtures are bundled.
Metadata
Release files for lucebench 0.3.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| lucebench-0.3.3.tar.gz | 3.0 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| lucebench-0.3.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 6.0 MB
Release files / lucebench-0.3.3.tar.gz
| Download URL | lucebench-0.3.3.tar.gz |
|---|---|
| Size | 3.0 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5c2d3f4ef5d078e9d239b6c8fa9e5abae1787d250831589e126c370030e5c306
|
|
BLAKE2b-256 checksum How to use checksums |
2bbe767421f682a33b3961cdbfa13add32256f0e3573d5df65a15acd990f5f5f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 24, 2026.
Transparency logRelease files / lucebench-0.3.3-py3-none-any.whl
| Download URL | lucebench-0.3.3-py3-none-any.whl |
|---|---|
| Size | 3.0 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
676c9d58b867f522ef2ea8b4378c3523f05348e2fe208886ca0db59503a4f94c
|
|
BLAKE2b-256 checksum How to use checksums |
87edebebc19db8b5fc68dee01a84b1b6b62c9f25a1a08e8e1856cf475372de34
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 24, 2026.
Transparency log