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.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file lucebench-0.3.3.tar.gz.
File metadata
- Download URL: lucebench-0.3.3.tar.gz
- Upload date:
- Size: 3.0 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5c2d3f4ef5d078e9d239b6c8fa9e5abae1787d250831589e126c370030e5c306
|
|
| MD5 |
e3e2b333e3694ee4fcd4a53e2fcf52b9
|
|
| BLAKE2b-256 |
2bbe767421f682a33b3961cdbfa13add32256f0e3573d5df65a15acd990f5f5f
|
Provenance
The following attestation bundles were made for lucebench-0.3.3.tar.gz:
Publisher:
ci.yml on easel/lucebench
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
lucebench-0.3.3.tar.gz -
Subject digest:
5c2d3f4ef5d078e9d239b6c8fa9e5abae1787d250831589e126c370030e5c306 - Sigstore transparency entry: 2235661439
- Sigstore integration time:
-
Permalink:
easel/lucebench@8c7f35e2644d482188ea9b5ad8ffd750a916ccb1 -
Branch / Tag:
refs/tags/v0.3.3 - Owner: https://github.com/easel
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@8c7f35e2644d482188ea9b5ad8ffd750a916ccb1 -
Trigger Event:
push
-
Statement type:
File details
Details for the file lucebench-0.3.3-py3-none-any.whl.
File metadata
- Download URL: lucebench-0.3.3-py3-none-any.whl
- Upload date:
- Size: 3.0 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
676c9d58b867f522ef2ea8b4378c3523f05348e2fe208886ca0db59503a4f94c
|
|
| MD5 |
4fd097abee2a28ee66946b173d372b36
|
|
| BLAKE2b-256 |
87edebebc19db8b5fc68dee01a84b1b6b62c9f25a1a08e8e1856cf475372de34
|
Provenance
The following attestation bundles were made for lucebench-0.3.3-py3-none-any.whl:
Publisher:
ci.yml on easel/lucebench
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
lucebench-0.3.3-py3-none-any.whl -
Subject digest:
676c9d58b867f522ef2ea8b4378c3523f05348e2fe208886ca0db59503a4f94c - Sigstore transparency entry: 2235661467
- Sigstore integration time:
-
Permalink:
easel/lucebench@8c7f35e2644d482188ea9b5ad8ffd750a916ccb1 -
Branch / Tag:
refs/tags/v0.3.3 - Owner: https://github.com/easel
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@8c7f35e2644d482188ea9b5ad8ffd750a916ccb1 -
Trigger Event:
push
-
Statement type: