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.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

lucebench-0.3.3.tar.gz (3.0 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

lucebench-0.3.3-py3-none-any.whl (3.0 MB view details)

Uploaded Python 3

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

Hashes for lucebench-0.3.3.tar.gz
Algorithm Hash digest
SHA256 5c2d3f4ef5d078e9d239b6c8fa9e5abae1787d250831589e126c370030e5c306
MD5 e3e2b333e3694ee4fcd4a53e2fcf52b9
BLAKE2b-256 2bbe767421f682a33b3961cdbfa13add32256f0e3573d5df65a15acd990f5f5f

See more details on using hashes here.

Provenance

The following attestation bundles were made for lucebench-0.3.3.tar.gz:

Publisher: ci.yml on easel/lucebench

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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

Hashes for lucebench-0.3.3-py3-none-any.whl
Algorithm Hash digest
SHA256 676c9d58b867f522ef2ea8b4378c3523f05348e2fe208886ca0db59503a4f94c
MD5 4fd097abee2a28ee66946b173d372b36
BLAKE2b-256 87edebebc19db8b5fc68dee01a84b1b6b62c9f25a1a08e8e1856cf475372de34

See more details on using hashes here.

Provenance

The following attestation bundles were made for lucebench-0.3.3-py3-none-any.whl:

Publisher: ci.yml on easel/lucebench

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page