tool-eval-bench is an MIT benchmark harness that audits how well an LLM serving stack actually calls tools, running 69 deterministic multi-turn scenarios plus 28 opt-in Hard Mode ones (97 total) against any OpenAI-compatible endpoint, with a second track that scores Jev-class decision-model probabilities over the same /v1/systemone surface the rest of this category speaks.
It is the first member aimed at the tool-calling half of this category’s contract rather than the decision half, and its distinguishing property is determinism: mock tools with seeded payload noise, a fixed in-prompt date, and a full conversation trace per scenario, so a failing scenario is a bug report you can replay rather than a vibe.
What it is #
A Python CLI (installed from PyPI, from git with uv tool install, or Docker) that drives scenarios through OpenAI-compatible /v1/chat/completions endpoints on vLLM, SGLang, LiteLLM, llama.cpp, Strata, TabbyAPI, NInfer, TensorFold, and TandemLLM, plus hosted Gemini and Anthropic.
Each scenario observes one assistant conversation with mock tools, 12 universal tools or 52 in the large-toolset scenarios, and payloads carry deliberate noise so a model that can only read clean fixtures does not pass.
Every scenario is scored by a deterministic evaluator as PASS (2), PARTIAL (1), or FAIL (0), the loop runs to an 8-turn default limit, and multi-trial runs report Pass@k and Pass^k; throughput, long-context retrieval, and accuracy benchmarks run against the same endpoint.
The lineage is a credited extension of ToolCall-15, positioned by the project’s own related-work table against BFCL, ToolBench, API-Bank, and PinchBench as the local-first, multi-turn, deterministic option.
An optional local web UI (tool-eval-bench serve, added 2026-10-14) reports runs in a browser behind a strict CSP, with performance presets, session ids, and a shareable results card.
The decision-model track (--decision) measures how accurate a /v1/systemone endpoint’s probabilities are, scoring accuracy, KL and Brier distance against the soft gold distributions of the vendored Typed Decisions test split (served through llama.cpp’s /v1/systemone), with an optional --decision-judge answer audit and a decision-live canary monitor that do not change official scores, and it aborts with a message rather than scoring zeros when the surface is missing.
Status #
Active, six months old, and steadily released: created 2026-04-17, v3.0.0 published 2026-10-26 (also on PyPI, where the package now self-describes as Production/Stable), pushed 2026-10-26, with 390 stars and 54 forks as of 2026-10-27.
The v3.0.0 major promoted the web UI to a headline feature (the optional local browser UI now launches and streams runs, and a new tool-eval-bench card command renders a session into a shareable SVG results card, with the [web] and [card] extras), added a long-context performance preset sweeping throughput to 128K tokens, corrected two scenario graders (TC-21 grades explicit field and rule IDs, TC-89 distinguishes asserted payment success from negation and future promises, so their scores are not comparable with 2.8 baselines), broadened endpoint compatibility (TandemLLM detection, HTTP retry and URL fixes), and shipped its release-gate at 9,779 tests and 93.79 percent branch-inclusive coverage, with SQLite schema upgraded 4 to 5 on first open and the scenario count unchanged at 69 plus 28 Hard Mode.
The community footprint is thin and stated plainly: no Hacker News story of its own as of 2026-10-08 (two comment mentions, June and July, via the Algolia search API), so adoption evidence is the star and release record, not forum debate. The engineering inside is unusually disciplined for that footprint: the repository carries 8,739 tests at a 93.27 percent branch-coverage gate (v2.8.0’s release notes, up from 3,125 tests at 85 percent in August), AST-enforced architecture boundaries, and a self-published August 2026 quality review that names its own weak point (“The problem is not quality. It is approachability.”).
Strengths #
- Determinism is the design center: seeded runs (
--seed), mock tools with reproducible noise, a fixed in-prompt date, and per-scenario traces, so results are auditable and re-runnable in a way model-judged evals are not. - It measures the half of this category no other scoreboard touches: whether a serving stack picks the right tool, passes the right parameters, chains calls across turns, and holds safety boundaries (Category K includes prompt-injection resistance), where JevBench and the Decision Index score decision models only.
- The
/v1/systemonedecision track extends the same audit to this category’s contract, scoring probability accuracy and confidence trustworthiness, and it refuses to silently zero a missing surface. - The self-audit culture is visible: the August 2026 quality review documents what was measured and what is wrong, alongside CI running Python 3.11 through 3.13 with varying seeds.
Cautions #
- The README states its own limits: difficulty tiers are author estimates, not calibrated rankings, localization coverage is German-focused, and it measures single-assistant conversations, not independent agents, delegation, or handoffs.
- There is no standing leaderboard: results are per-run artifacts, so it audits your stack rather than ranking the field, and nothing here lets you compare hosted vendors without running them yourself.
- Self-graded end to end: the evaluators are the author’s deterministic functions, and the thin community footprint means the scenario design has had no public stress-testing.
- Coverage breadth costs depth per backend: 69 scenarios is small next to BFCL’s 1,700-plus tests, a trade the related-work table owns.
Pricing #
Free and open source under MIT; pricing does not apply. The costs are your endpoint’s tokens per scenario and your time, multiplied on multi-trial runs.
Compared to #
- JevBench: the other in-category benchmark; JevBench ranks decision models on a standing public board, tool-eval-bench audits one endpoint’s tool calling on demand and adds the decision-model accuracy track without a ranking.
- Decision Index: breadth over decision models with a frozen public suite; tool-eval-bench is depth over tool calls with per-scenario traces and no board.
- BFCL (Berkeley’s Function Calling Leaderboard): the large-scale function-calling eval for hosted APIs; per the project’s own comparison, tool-eval-bench targets self-hosted stacks with multi-turn orchestration and deterministic mock tools instead.
Bottom line #
Recommended as a pre-deployment audit for engineers whose agents put tool calls through their own serving stack, run with --seed and read scenario by scenario rather than as one number.
Not as a public scoreboard for shopping hosted vendors, and not for end-to-end agent task completion, which it deliberately does not measure.
The disagreeable claim I will defend: this category spent September learning to measure decisions and has no measurement at all for the tool calls wrapped around them, and a deterministic, trace-first auditor is worth more to a serving-stack owner than another leaderboard row.
Changes #
- 2026-10-08 - Created from the entrant scan (the structured-output and tool-calling sweep), the category’s third benchmark member.
- 2026-10-10 - Recorded v2.8.0 (2026-10-10, the first release also published on PyPI): Hard Mode grew from 23 to 28 scenarios (97 total, the default run unchanged at 69) with per-capability report breakdown, the decision track gained the Typed Decisions test split served through llama.cpp’s
/v1/systemone, an optional--decision-judgeaudit, and adecision-livecanary monitor, Strata and TabbyAPI joined the backend set, the test gate moved to 8,739 tests at 93.27 percent branch coverage, and the release notes state 2.7.0 baselines are not like-for-like comparisons; refreshed stars to 382. - 2026-10-17 - Volatile re-verification after the 2026-10-13/14 pushes (no release since v2.8.0): recorded the optional
tool-eval-bench serveweb UI (performance presets, session ids, shareable results card, strict CSP). - 2026-10-24 - Volatile re-verification after the 2026-10-17 to 10-20 pushes (still no release since v2.8.0): recorded TandemLLM joining the recognized backend set (detected from its model owner or Server header, 2026-10-18) and the rate-limit and retry fixes (Retry-After honoring, queued-request rescheduling, query parameters preserved in endpoint URLs).
- 2026-10-25 - Volatile re-verification after the 2026-10-25 push (a virtualenv dependency bump, no release since v2.8.0); pushed date moved to 2026-10-25, and the README’s backend list re-read unchanged.
- 2026-10-26 - Volatile re-verification after the 2026-10-25/26 pushes (still no release since v2.8.0): the TC-89 scenario now classifies payment claims by grammatical frame and no longer reads a pending payment as a payment claim, plain-mode lines print whole under
--parallel, and the filelock (three lock advisories) and certifi (the compromised emSign roots) dependencies were bumped; pushed date moved to 2026-10-26. - 2026-10-27 - Volatile re-verification after the v3.0.0 release (2026-10-26, also on PyPI, the package now self-described as Production/Stable): the web UI promoted to a headline feature with run launching and streaming plus a new
cardcommand rendering shareable SVG results cards ([web]and[card]extras), a 128K long-context performance preset, TC-21 and TC-89 grader corrections whose scores are not comparable with 2.8 baselines, TandemLLM detection and HTTP retry fixes, the release gate at 9,779 tests and 93.79 percent branch coverage, SQLite schema 4 upgraded to 5, and the scenario count unchanged at 69 plus 28; forks refreshed to 54.
See also #
- JevBench - the standing decision-model scoreboard beside this on-demand audit
- Decision Index - the breadth scoreboard for the decision-model half
- Jev - the contract whose
/v1/systemonesurface this benchmark’s decision track reads - OpenAI Structured Outputs - the vendor strict mode whose tool-call guarantee this audits the failure side of
- Hybrid Execution Feature Matrix - the category comparison this note joins
References #
https://github.com/SeraphimSerapis/tool-eval-bench - repository: MIT, created 2026-04-17, 390 stars, 54 forks, pushed 2026-10-26 (GitHub API, as of 2026-10-27)
https://raw.githubusercontent.com/SeraphimSerapis/tool-eval-bench/main/README.md - the 69-plus-28 scenario design, backend list including Strata, TabbyAPI, and TandemLLM, pass/partial/fail scoring, install paths, and the stated limitations (re-fetched 2026-10-27 via PyPI, the v3.0.0 README)
https://github.com/SeraphimSerapis/tool-eval-bench/releases/tag/v3.0.0 - the v3.0.0 release notes (2026-10-26): the web UI and card command, the long-context preset, the TC-21 and TC-89 grader corrections with the re-run-baselines warning, the 9,779-test gate at 93.79 percent branch coverage, and the SQLite schema upgrade (fetched 2026-10-27)
https://pypi.org/pypi/tool-eval-bench/json - the published package, 3.0.0 since 2026-10-26 (fetched 2026-10-27)
https://raw.githubusercontent.com/SeraphimSerapis/tool-eval-bench/main/docs/methodology.md - the 3-tier scoring rationale, the 12 and 52-tool sets, the 8-turn loop, and deterministic noise
https://raw.githubusercontent.com/SeraphimSerapis/tool-eval-bench/main/docs/decision-models.md - the
/v1/systemonedecision-model track and its missing-surface abort behaviorhttps://raw.githubusercontent.com/SeraphimSerapis/tool-eval-bench/main/docs/quality-review-2026-08.md - the author’s August 2026 quality review: test counts, coverage gate, and the approachability finding (the critical source)
https://raw.githubusercontent.com/SeraphimSerapis/tool-eval-bench/main/docs/related-work.md - the BFCL, ToolBench, API-Bank, ToolCall-15, and PinchBench comparison table grounding the lineage claims
https://raw.githubusercontent.com/SeraphimSerapis/tool-eval-bench/main/docs/backends.md - the served-stack adapter coverage (fetched 200, 2026-10-08)
https://api.github.com/repos/SeraphimSerapis/tool-eval-bench/releases - v2.5.0 through v3.0.0, 2026-08-05 to 2026-10-26 (fetched 2026-10-27)
https://hn.algolia.com/api/v1/search?query=%22tool-eval-bench%22 - the thin-footprint record: no story, two comment mentions (fetched 2026-10-08)