toolbench
toolbench is a platform and CLI for building benchmarks for agentic tools and harnesses. Compose a benchmark (a task + a grading rubric) with a harness (the agent runtime), a loadout (the tools the agent is given), and a variant (the prompt + sandbox), run N trials per cell against a model, and get reach / pass@k / pass^k metrics with plots.
It is the benchmarking sibling of toolbase — the package manager and runtime for agent tools. toolbase serves the tools; toolbench measures how well an agent uses them. Together they close the loop for agentic tool and harness development.
Install
pip install toolbench # core framework
pip install 'toolbench[toolbase]' # + resolve tools from toolbase loadouts
Requires Python ≥ 3.12. The CLI is available as both toolbench and the short alias tbe.
Quickstart
The example geometry benchmark (Euclidean distance + midpoint between two 2-D points) is a
self-contained, dependency-free example that exercises the whole framework.
# Validate the wiring with no LLM calls or cost:
toolbench run --benchmark examples/geometry --model stub \
--loadouts full_local --n 1 --max-cost-usd 0 --dry-run
# A real run (a few cheap trials):
toolbench run --benchmark examples/geometry --model claude-haiku-4-5 \
--loadouts core_only,full_local --n 3 --max-cost-usd 0.50
Each run writes a directory under runs/<run_id>/ with a manifest.json, per-trial
transcripts and artifacts, an aggregated summary.json / summary.txt, and headline plots
(k-sweep, parallel-coordinates, per-stage breakdown).
Concepts
A benchmark lives in examples/<name>/ and is composed from four declarative
axes — vary any of them on the command line to run an ablation:
| Concept | What it is | Where it lives |
|---|---|---|
| Benchmark | The task + grading rubric + ground truth. | benchmark.yaml |
| Harness | The agent runtime (orchestral, claude_code, codex), provider, core tools, and loop policy. |
harnesses/*.yaml |
| Loadout | The domain tools the agent gets (beyond the harness core). | loadouts/*.yaml |
| Variant | The prompt + sandbox seed (scaffolding axis), orthogonal to tools. | variants/<name>/ |
| Rubric | Ordered, weighted stages of checks; trial score = weighted reach. | inside benchmark.yaml |
A loadout source is one of:
-
python:— import a module exposingTOOLS/make_tools()(the no-dependency escape hatch), -
toolbase:— resolve tools from a toolbase loadout, in-process (requirestoolbench[toolbase]); served toolkit versions are recorded in the run manifest as reproducibility provenance, or -
mcp:— serve any MCP server's tools, stdio or HTTP (requirestoolbench[mcp]):tools: sources: - toolbase: { loadout: my-loadout } select: [calculator__add] # optional: ablate within the loadout - mcp: { url: "https://host/mcp", headers: { Authorization: "Bearer ${TOK}" } }
Metrics
For each (model × condition) cell over k trials:
- $\overline{\text{reach}}_k$ — mean rubric-weighted reach: how far through the task the agent gets, on average.
- $\text{pass@}k$ — probability that at least one of $k$ trials passes (best-of-$k$).
- $\text{pass}^{k}$ — probability that all $k$ trials pass (worst-of-$k$).
with bootstrap 95% confidence intervals and a metric-correlation matrix. A trial passes
when it clears the rubric's pass criterion — every stage by default, or reach ≥ a
pass_threshold once the rubric uses partial-credit stages. See
Metrics for the exact estimators.
Commands
| Command | What it does |
|---|---|
toolbench run |
Run a benchmark across the harness × loadout × variant × model grid. |
toolbench resume |
Resume an interrupted run; run only the seeds not yet completed. |
toolbench regrade |
Re-judge a finished run's preserved artifacts after a rubric change. |
Run toolbench --help (or tbe --help) for the full reference.
Also
- Runtimes — besides the API-driven
orchestralruntime, toolbench drives theclaude_codeandcodexCLIs directly (subscription auth, no API key), with per-turn token accounting and a filesystem sandbox. Copy-paste starting points live inharness_templates/. - Judges — grade with the deterministic rule judge (default) or add an LLM second
opinion (
--judge rule+llm); the rule grade always stays authoritative. Any judge can be applied after the fact withtoolbench regrade --judge …. - Safeguards — trials that read the ground-truth answer key are quarantined
(
INTEGRITY_LEAK, scored 0) so a leak can't inflate the headline; every trial also gets a readableaudit.txtof its full trajectory.
License
MIT
Release files for toolbench 0.8.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| toolbench-0.8.1.tar.gz | 301.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| toolbench-0.8.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 506.2 kB
Release files / toolbench-0.8.1.tar.gz
| Download URL | toolbench-0.8.1.tar.gz |
|---|---|
| Size | 301.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2ceef381eee29a6468ce3b1dfbcec6ced7cb861ffb053d4f9c7fad5674164f47
|
|
BLAKE2b-256 checksum How to use checksums |
4bc45b5223cc9e7dc777cf96fcc9237ebb4612b3259d958f263984fc2c2b2114
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.12
|
Release files / toolbench-0.8.1-py3-none-any.whl
| Download URL | toolbench-0.8.1-py3-none-any.whl |
|---|---|
| Size | 204.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
76235eaa9eb846d8c9690c74db77d9e4f7238c432dea887bf7c6aa92674499c8
|
|
BLAKE2b-256 checksum How to use checksums |
2951ff193b48586c07c86b7bdce2ad212e7bdc101bbabc9feb71c1f02e250a34
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.12
|