The Berkeley Function Calling Leaderboard: what a BFCL score means

BFCL is the most cited leaderboard for tool calling. It checks whether a model picks the right function with the right arguments, knows when no function fits, and keeps state across turns. Here is how each part is scored.

The short answer

The Berkeley Function Calling Leaderboard (BFCL) measures how accurately language models call functions, or tools. Its first version graded about 2,000 question-function-answer pairs across Python, Java, JavaScript, REST and SQL, mainly by parsing each call and checking the function name, required parameters, types and values against an expected answer.1 Later versions added relevance detection, where the right answer is to call nothing, and multi-turn tasks scored by the state of a simulated backend.12

A high BFCL score tells you a model reliably produces well-formed, correct tool calls in those tests. It doesn’t tell you whether a correct-looking call is safe to run in your system. That’s a different layer.

Deedglass sits between an AI agent and your system. Your rules decide each change before it runs; afterwards Deedglass checks what really changed. In our demo the agent said 1 row; the database changed 301.

What is in it

The original blog describes the data: 1,680 Python cases, 100 Java, 50 JavaScript, 70 REST API and 100 SQL.1 The Python cases are split by shape:

Category The model must…
Simple Call one function correctly
Multiple Choose the right one from several offered
Parallel Make several calls to one function in one turn
Parallel multiple Make several calls to different functions
Relevance detection Recognise that none of the offered functions fits

Version 3, released on 19 September 2024, added multi-turn conversations, with extra categories for missing parameters, missing functions, long context, and a composite of all three, 200 cases each.2 The current leaderboard describes version 4 as holistic agentic evaluation, and its overall accuracy is the unweighted average of all sub-categories.2

AST matching: how a call is graded

Most single-turn cases are graded by parsing the model’s call into an abstract syntax tree and comparing it with possible answers. The rules are strict:1

  1. The function name must match.
  2. Every required parameter must be present.
  3. Parameters that aren’t in the function’s documentation count as hallucinations.
  4. Types and values are checked strictly; a boolean must be a boolean.
  5. For multiple or parallel calls, it’s all or nothing: every expected call must match.

Where the function can actually run, executable evaluation complements the AST check.1

A worked example. Offered get_weather(city: string, unit: "C" | "F") and asked “What’s the weather in Pune in Celsius?”, these are graded:

Model’s call Graded Why
get_weather(city="Pune", unit="C") Correct Name, parameters, values match
get_weather(city="Pune") Wrong Required unit missing
get_weather(city="Pune", unit="C", days=3) Wrong days isn’t in the documentation
get_forecast(city="Pune", unit="C") Wrong Wrong function

The third row is the interesting one for safety: a model that invents parameters is a model that will sometimes send arguments your tool doesn’t expect.

Strict grading can look harsh: a call that is “nearly right” scores zero. For tool use, that’s the correct standard. A tool doesn’t run a nearly right call nearly correctly. It either rejects it, which wastes a turn, or runs it with the wrong meaning, which is worse. A string where a number was expected, a missing unit, a guessed parameter name: each is the kind of small error that becomes a wrong refund or a query against the wrong table. A benchmark that gave partial credit would hide exactly the failures that matter in production.

Knowing when not to call

Relevance detection asks the model to recognise that none of the offered functions fits the request.1 This matters more in production than it looks. A model that always calls something will, when asked for an action it has no tool for, pick the closest tool and misuse it. “Cancel my subscription” with only a delete_account tool available is the kind of near-miss that turns into an incident.

Multi-turn: checking state

Version 3’s multi-turn cases run two checks at the end of every turn: a state-based check that compares the simulated backend’s state with the ground truth, and a response-based check of the model’s execution path. An entry counts only if it passes both, in every turn.2

That state-based check is the same idea τ-bench uses: grade the effect, not the words.3 And the version 3 post makes an observation worth quoting for anyone deploying agents: even the best models sometimes fail to explore the current state before performing actions, which can be dangerous when actions aren’t reversible.2

What a BFCL score doesn’t cover

Question Covered by BFCL?
Is the call well-formed and correct for the test? Yes
Does the model know when not to call? Yes, in relevance cases
Does it keep state across turns? Yes, in multi-turn cases
Is the call safe to run against your data? No
Would a malicious document change which call it makes? No; that’s prompt-injection research
Does it follow your business rules, such as approval limits? No
Is it consistent across repeated tries? Not the focus; see pass^k in τ-bench3

This isn’t a criticism of BFCL. It measures tool-calling skill precisely. But a call can be perfectly formed and still be the wrong thing to do: refunding the right order for the wrong amount, or deleting the right table at the wrong time.

Using it to choose a model

  1. Use BFCL to shortlist models that call tools accurately in your style: parallel calls, many functions, multi-turn.
  2. Check relevance scores if your agent has a narrow tool set. You want a model that says “I can’t do that”.
  3. Test on your own tool definitions. Names, descriptions and argument shapes differ from the benchmark’s. Twenty real requests with expected calls make a useful private benchmark.
  4. Don’t treat accuracy as permission. Put a tool-call policy between the model and anything that writes, so a correct-looking call still has to satisfy your rules.

For the frameworks’ own hooks where such a policy can live, see nine frameworks’ guardrails compared. For reliability across repeated tries, see τ-bench and pass^k; for coding agents, what SWE-bench measures. To see a policy decide each call on a real database in your browser, try the playground; to grade what an agent can reach on your machine, run npx deedglass scan (the grade, explained).

Written with AI assistance and checked against our claims register.

The takeaway

BFCL checks tool-call names, arguments and multi-turn state, all-or-nothing; a high score says a model formats calls well, not that its calls are safe to run.

Read nextAI agent framework guardrails compared: where nine frameworks let you stop a tool call Try it: install in 7 s

Related on this site

In the docs

More posts

Sources

  1. 1Gorilla: Berkeley Function Calling Leaderboard (original blog) · gorilla.cs.berkeley.edu · checked 26 October 2026
  2. 2Gorilla: BFCL V3 multi-turn · gorilla.cs.berkeley.edu · checked 26 October 2026
  3. 3Yao et al. τ-bench (arXiv 2406.12045) · arxiv.org · checked 26 October 2026

Published 26 October 2026, sources last checked 26 October 2026. If something here is out of date, write to hello@deedglass.com.

Try it on your own setup

npx deedglass scan

Grades only your own setup. Nothing is uploaded.

Pricing