Skip to main content

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-publisher on tag runs). Use the git pin until docs/helix/05-deploy/runbook-pypi-trusted-publishing.md is 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, error
  • prompt_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)

Source distribution for lucebench 0.3.3
File Size Uploaded
lucebench-0.3.3.tar.gz 3.0 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for lucebench 0.3.3
File Interpreter ABI Platform
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 log

Release 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

Release history Release notifications | RSS feed

This release

0.3.3 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page