| # Berkeley Function Calling Leaderboard (BFCL) |
|
|
| ## Table of Contents |
|
|
| - [Berkeley Function Calling Leaderboard (BFCL)](#berkeley-function-calling-leaderboard-bfcl) |
| - [Table of Contents](#table-of-contents) |
| - [Introduction](#introduction) |
| - [Installation \& Setup](#installation--setup) |
| - [Basic Installation](#basic-installation) |
| - [Installing from PyPI](#installing-from-pypi) |
| - [Extra Dependencies for Self-Hosted Models](#extra-dependencies-for-self-hosted-models) |
| - [Configuring Project Root Directory](#configuring-project-root-directory) |
| - [Setting up Environment Variables](#setting-up-environment-variables) |
| - [Configuring SerpAPI for Web Search Category](#configuring-serpapi-for-web-search-category) |
| - [Running Evaluations](#running-evaluations) |
| - [Generating LLM Responses](#generating-llm-responses) |
| - [Selecting Models and Test Categories](#selecting-models-and-test-categories) |
| - [Selecting Specific Test Cases with `--run-ids`](#selecting-specific-test-cases-with---run-ids) |
| - [Output and Logging](#output-and-logging) |
| - [For API-based Models](#for-api-based-models) |
| - [For Locally-hosted OSS Models](#for-locally-hosted-oss-models) |
| - [For Pre-existing OpenAI-compatible Endpoints](#for-pre-existing-openai-compatible-endpoints) |
| - [(Alternate) Script Execution for Generation](#alternate-script-execution-for-generation) |
| - [Evaluating Generated Responses](#evaluating-generated-responses) |
| - [Output Structure](#output-structure) |
| - [(Optional) WandB Evaluation Logging](#optional-wandb-evaluation-logging) |
| - [(Alternate) Script Execution for Evaluation](#alternate-script-execution-for-evaluation) |
| - [Contributing \& How to Add New Models](#contributing--how-to-add-new-models) |
| - [Additional Resources](#additional-resources) |
|
|
| --- |
|
|
| ## Introduction |
|
|
| We introduce the Berkeley Function Calling Leaderboard (BFCL), the **first comprehensive and executable function call evaluation** dedicated to assessing Large Language Models' (LLMs) ability to invoke functions. Unlike previous evaluations, BFCL accounts for various forms of function calls, diverse scenarios, and executability. |
|
|
| π‘ Read more in our blog posts: |
|
|
| - [BFCL v1: Simple, Parallel, and Multiple Function Call eval with AST](https://gorilla.cs.berkeley.edu/blogs/8_berkeley_function_calling_leaderboard.html) |
| - [BFCL v2: Enterprise and OSS-contributed Live Data](https://gorilla.cs.berkeley.edu/blogs/12_bfcl_v2_live.html) |
| - [BFCL v3: Multi-Turn & Multi-Step Function Call Evaluation](https://gorilla.cs.berkeley.edu/blogs/13_bfcl_v3_multi_turn.html) |
| - [BFCL V4 Part 1: Agentic Web Search](https://gorilla.cs.berkeley.edu/blogs/15_bfcl_v4_web_search.html) |
| - [BFCL V4 Part 2: Agentic Memory Management](https://gorilla.cs.berkeley.edu/blogs/16_bfcl_v4_memory.html) |
| - [BFCL V4 Part 3: Agentic Format Sensitivity](https://gorilla.cs.berkeley.edu/blogs/17_bfcl_v4_prompt_variation.html) |
|
|
| π¦ See the live leaderboard at [Berkeley Function Calling Leaderboard](https://gorilla.cs.berkeley.edu/leaderboard.html#leaderboard) |
|
|
|  |
|
|
| --- |
|
|
| ## Installation & Setup |
|
|
| ### Basic Installation |
|
|
| ```bash |
| # Create a new Conda environment with Python 3.10 |
| conda create -n BFCL python=3.10 |
| conda activate BFCL |
| |
| # Clone the Gorilla repository |
| git clone https://github.com/ShishirPatil/gorilla.git |
| |
| # Change directory to the `berkeley-function-call-leaderboard` |
| cd gorilla/berkeley-function-call-leaderboard |
| |
| # Install the package in editable mode |
| pip install -e . |
| ``` |
|
|
| ### Installing from PyPI |
|
|
| If you simply want to run the evaluation without making code changes, you can |
| install the prebuilt wheel instead. **Be careful not to confuse our package with |
| the *unrelated* `bfcl` project on PyPIβmake sure you install `bfcl-eval`:** |
|
|
| ```bash |
| pip install bfcl-eval # Be careful not to confuse with the unrelated `bfcl` project on PyPI! |
| ``` |
|
|
| ### Extra Dependencies for Self-Hosted Models |
|
|
| For locally hosted models, choose one of the following backends, ensuring you have the right GPU and OS setup: |
|
|
| `sglang` is *much faster* than `vllm` in our specific multi-turn use case, but it only supports newer GPUs with SM 80+ (Ampere etc). |
| If you are using an older GPU (T4/V100), you should use `vllm` instead as it supports a much wider range of GPUs. |
|
|
| **Using `vllm`:** |
| ```bash |
| pip install -e .[oss_eval_vllm] |
| ``` |
|
|
| **Using `sglang`:** |
| ```bash |
| pip install -e .[oss_eval_sglang] |
| ``` |
|
|
| *Optional:* If using `sglang`, we recommend installing `flashinfer` for speedups. Find instructions [here](https://docs.flashinfer.ai/installation.html). |
|
|
| ### Configuring Project Root Directory |
|
|
| **Important:** If you installed the package from PyPI (using `pip install bfcl-eval`), you **must** set the `BFCL_PROJECT_ROOT` environment variable to specify where the evaluation results and score files should be stored. |
| Otherwise, you'll need to navigate deep into the Python package's source code folder to access the evaluation results and configuration files. |
|
|
| For editable installations (using `pip install -e .`), setting `BFCL_PROJECT_ROOT` is *optional*--it defaults to the `berkeley-function-call-leaderboard` directory. |
|
|
| Set `BFCL_PROJECT_ROOT` as an environment variable in your shell environment: |
|
|
| ```bash |
| # In your shell environment |
| export BFCL_PROJECT_ROOT=/path/to/your/desired/project/directory |
| ``` |
|
|
| When `BFCL_PROJECT_ROOT` is set: |
|
|
| - The `result/` folder (containing model responses) will be created at `$BFCL_PROJECT_ROOT/result/` |
| - The `score/` folder (containing evaluation results) will be created at `$BFCL_PROJECT_ROOT/score/` |
| - The library will look for the `.env` configuration file at `$BFCL_PROJECT_ROOT/.env` (see [Setting up Environment Variables](#setting-up-environment-variables)) |
|
|
| ### Setting up Environment Variables |
|
|
| We store API keys and other configuration variables (separate from the `BFCL_PROJECT_ROOT` variable mentioned above) in a `.env` file. A sample `.env.example` file is distributed with the package. |
|
|
| **For editable installations:** |
|
|
| ```bash |
| cp bfcl_eval/.env.example .env |
| # Fill in necessary values in `.env` |
| ``` |
|
|
| **For PyPI installations (using `pip install bfcl-eval`):** |
|
|
| ```bash |
| cp $(python -c "import bfcl_eval; print(bfcl_eval.__path__[0])")/.env.example $BFCL_PROJECT_ROOT/.env |
| # Fill in necessary values in `.env` |
| ``` |
|
|
| If you are running any proprietary models, make sure the model API keys are included in your `.env` file. Models like GPT, Claude, Mistral, Gemini, Nova, will require them. |
|
|
| The library looks for the `.env` file in the project root, i.e. `$BFCL_PROJECT_ROOT/.env`. |
|
|
| #### Configuring SerpAPI for Web Search Category |
|
|
| For the `web_search` test category, we use the [SerpAPI](https://serpapi.com/) service to perform web search. You need to sign up for an API key and add it to your `.env` file. You can also switch to other web search APIs by changing the `search_engine_query` function in `bfcl_eval/eval_checker/multi_turn_eval/func_source_code/web_search.py`. |
|
|
| --- |
|
|
| ## Running Evaluations |
|
|
| ### Generating LLM Responses |
|
|
| #### Selecting Models and Test Categories |
|
|
| - `MODEL_NAME`: For available models, please refer to [SUPPORTED_MODELS.md](./SUPPORTED_MODELS.md). If not specified, the default model `gorilla-openfunctions-v2` is used. |
| - `TEST_CATEGORY`: For available test categories, please refer to [TEST_CATEGORIES.md](./TEST_CATEGORIES.md). If not specified, all categories are included by default. |
|
|
| You can provide multiple models or test categories by separating them with commas. For example: |
|
|
| ```bash |
| bfcl generate --model claude-3-5-sonnet-20241022-FC,gpt-4o-2024-11-20-FC --test-category simple_python,parallel,live_multiple,multi_turn |
| ``` |
|
|
| #### Selecting Specific Test Cases with `--run-ids` |
|
|
| Sometimes you may only need to regenerate a handful of test entriesβfor instance when iterating on a new model or after fixing an inference bug. Passing the `--run-ids` flag lets you target **exact test IDs** rather than an entire category: |
|
|
| ```bash |
| bfcl generate --model MODEL_NAME --run-ids # --test-category will be ignored |
| ``` |
|
|
| When this flag is set the generation pipeline reads a JSON file named |
| `test_case_ids_to_generate.json` located in the *project root* (the same |
| place where `.env` lives). The file should map each test category to a list of |
| IDs to run: |
|
|
| ```json |
| { |
| "simple_python": ["simple_python_102", "simple_python_103"], |
| "multi_turn_base": ["multi_turn_base_15"] |
| } |
| ``` |
|
|
| > Note: When using `--run-ids`, the `--test-category` flag is ignored. |
|
|
| A sample file is provided at `bfcl_eval/test_case_ids_to_generate.json.example`; **copy it to your project root** so the CLI can pick it up regardless of your working directory: |
|
|
| **For editable installations:** |
|
|
| ```bash |
| cp bfcl_eval/test_case_ids_to_generate.json.example ./test_case_ids_to_generate.json |
| ``` |
|
|
| **For PyPI installations:** |
|
|
| ```bash |
| cp $(python -c "import bfcl_eval, pathlib; print(pathlib.Path(bfcl_eval.__path__[0]) / 'test_case_ids_to_generate.json.example')") $BFCL_PROJECT_ROOT/test_case_ids_to_generate.json |
| ``` |
|
|
| Once `--run-ids` is provided only the IDs listed in the JSON will be evaluated. |
|
|
| #### Output and Logging |
|
|
| - By default, generated model responses are stored in a `result/` folder under the project root (which defaults to the package directory): `result/MODEL_NAME/BFCL_v3_TEST_CATEGORY_result.json`. |
| - You can customise the location by setting the `BFCL_PROJECT_ROOT` environment variable or passing the `--result-dir` option. |
|
|
| An inference log is included with the model responses to help analyze/debug the model's performance, and to better understand the model behavior. For more verbose logging, use the `--include-input-log` flag. Refer to [LOG_GUIDE.md](./LOG_GUIDE.md) for details on how to interpret the inference logs. |
|
|
| #### For API-based Models |
|
|
| ```bash |
| bfcl generate --model MODEL_NAME --test-category TEST_CATEGORY --num-threads 1 |
| ``` |
|
|
| - Use `--num-threads` to control the level of parallel inference. The default (`1`) means no parallelization. |
| - The maximum allowable threads depends on your API's rate limits. |
|
|
| #### For Locally-hosted OSS Models |
|
|
| ```bash |
| bfcl generate \ |
| --model MODEL_NAME \ |
| --test-category TEST_CATEGORY \ |
| --backend {sglang|vllm} \ |
| --num-gpus 1 \ |
| --gpu-memory-utilization 0.9 \ |
| --local-model-path /path/to/base/model \ |
| --enable-lora \ |
| --max-lora-rank 128 \ |
| --lora-modules module1="/path/to/lora/adapter1" module2="/path/to/lora/adapter2" # β optional |
| ``` |
|
|
| - Choose your backend using `--backend sglang` or `--backend vllm`. The default backend is `vllm`. |
| - Control GPU usage by adjusting `--num-gpus` (default `1`, relevant for multi-GPU tensor parallelism) and `--gpu-memory-utilization` (default `0.9`), which can help avoid out-of-memory errors. |
| - `--local-model-path` (optional): Point this flag at a directory that already contains the model's files (`config.json`, tokenizer, weights, etc.). Use it only when you've pre-downloaded the model and the weights live somewhere other than the default `$HF_HOME` cache. |
| - `--enable-lora` (optional): Enable LoRA for the vLLM backend. This flag is required to use LoRA modules. This only works when backend is `vllm`. |
| - `--max-lora-rank` (optional): Specify the maximum LoRA rank for the vLLM backend. This is an integer value. This only works when backend is `vllm` and `--enable-lora` flag is set. |
| - `--lora-modules` (optional): Specify the path to the LoRA modules for the vLLM backend in `name="path"` format. This allows evaluation of fine-tuned models with LoRA adapters. You can specify multiple LoRA modules by repeating this argument. This only works when backend is `vllm` and `--enable-lora` flag is set. |
|
|
| ##### For Pre-existing OpenAI-compatible Endpoints |
|
|
| If you have a server already running (e.g., vLLM in a SLURM cluster), you can bypass the vLLM/sglang setup phase and directly generate responses by using the `--skip-server-setup` flag: |
|
|
| ```bash |
| bfcl generate --model MODEL_NAME --test-category TEST_CATEGORY --skip-server-setup |
| ``` |
|
|
| In addition, you should specify the endpoint and port used by the local server. By default, the endpoint is `localhost` and the port is `1053`. These can be overridden by the `LOCAL_SERVER_ENDPOINT` and `LOCAL_SERVER_PORT` environment variables in the `.env` file: |
|
|
| ```bash |
| LOCAL_SERVER_ENDPOINT=localhost |
| LOCAL_SERVER_PORT=1053 |
| ``` |
|
|
| For remote deployments (e.g., via RunPod, ngrok, or enterprise gateways) that require custom authentication or use non-standard base URLs, you can specify a full base URL and API key: |
|
|
| ```bash |
| REMOTE_OPENAI_BASE_URL=https://your-vllm-server.com/v1 |
| REMOTE_OPENAI_API_KEY=your-api-key-here |
| REMOTE_OPENAI_TOKENIZER_PATH=/path/to/local/tokenizer # Optional: specify local tokenizer for local/remote endpoints |
| ``` |
|
|
| #### (Alternate) Script Execution for Generation |
|
|
| For those who prefer using script execution instead of the CLI, you can run the following command: |
|
|
| ```bash |
| python -m bfcl_eval.openfunctions_evaluation --model MODEL_NAME --test-category TEST_CATEGORY |
| ``` |
|
|
| When specifying multiple models or test categories, separate them with **spaces**, not commas. All other flags mentioned earlier are compatible with the script execution method as well. |
|
|
| ### Evaluating Generated Responses |
|
|
| **Important:** You must have generated the model responses before running the evaluation. |
|
|
| Once you have the results, run: |
|
|
| ```bash |
| bfcl evaluate --model MODEL_NAME --test-category TEST_CATEGORY |
| ``` |
|
|
| If you **only** generated a subset of benchmark entries (e.g. by using `--run-ids` during the generation step or by manually editing the result files) and you wish to evaluate *just* those entries, add the `--partial-eval` flag: |
|
|
| ```bash |
| bfcl evaluate --model MODEL_NAME --test-category TEST_CATEGORY --partial-eval |
| ``` |
|
|
| When `--partial-eval` is set, the evaluator silently skips IDs that are not present in the model result file and computes accuracy on the remaining subset. Please note that the score may differ from a full-set evaluation and therefore might not match the official leaderboard numbers. |
|
|
| The `MODEL_NAME` and `TEST_CATEGORY` options are the same as those used in the [Generating LLM Responses](#generating-llm-responses) section. For details, refer to [SUPPORTED_MODELS.md](./SUPPORTED_MODELS.md) and [TEST_CATEGORIES.md](./TEST_CATEGORIES.md). |
|
|
| If in the previous step you stored the model responses in a custom directory, specify it using the `--result-dir` flag or set `BFCL_PROJECT_ROOT` so the evaluator can locate the files. |
|
|
| > Note: For unevaluated test categories, they will be marked as `N/A` in the evaluation result csv files. |
| > For summary columns (e.g., `Overall Acc`, `Non_Live Overall Acc`, `Live Overall Acc`, and `Multi Turn Overall Acc`), the score reported will treat all unevaluated categories as 0 during calculation. |
| |
| #### Output Structure |
| |
| Evaluation scores are stored in a `score/` directory under the project root (defaults to the package directory), mirroring the structure of `result/`: `score/MODEL_NAME/BFCL_v3_TEST_CATEGORY_score.json`. |
|
|
| - To use a custom directory for the score file, set the `BFCL_PROJECT_ROOT` environment variable or specify `--score-dir`. |
|
|
| Additionally, four CSV files are generated in `./score/`: |
|
|
| - `data_overall.csv` β Overall scores for each model. This is used for updating the leaderboard. |
| - `data_live.csv` β Detailed breakdown of scores for each Live (single-turn) test category. |
| - `data_non_live.csv` β Detailed breakdown of scores for each Non-Live (single-turn) test category. |
| - `data_multi_turn.csv` β Detailed breakdown of scores for each Multi-Turn test category. |
|
|
| #### (Optional) WandB Evaluation Logging |
|
|
| If you'd like to log evaluation results to WandB artifacts: |
|
|
| ```bash |
| pip install -e.[wandb] |
| ``` |
|
|
| Mkae sure you also set `WANDB_BFCL_PROJECT=ENTITY:PROJECT` in `.env`. |
|
|
| #### (Alternate) Script Execution for Evaluation |
|
|
| For those who prefer using script execution instead of the CLI, you can run the following command: |
|
|
| ```bash |
| python -m bfcl_eval.eval_checker.eval_runner --model MODEL_NAME --test-category TEST_CATEGORY |
| ``` |
|
|
| When specifying multiple models or test categories, separate them with **spaces**, not commas. All other flags mentioned earlier are compatible with the script execution method as well. |
|
|
| ## Contributing & How to Add New Models |
|
|
| We welcome contributions! To add a new model: |
|
|
| 1. Review `bfcl_eval/model_handler/base_handler.py` and/or `bfcl_eval/model_handler/local_inference/base_oss_handler.py` (if your model is hosted locally). |
| 2. Implement a new handler class for your model. |
| 3. Update `bfcl_eval/constants/model_config.py`. |
| 4. Submit a Pull Request. |
|
|
| For detailed steps, please see the [Contributing Guide](./CONTRIBUTING.md). |
|
|
| --- |
|
|
| ## Additional Resources |
|
|
| - [Discord](https://discord.gg/grXXvj9Whz) (`#leaderboard` channel) |
| - [Project Website](https://gorilla.cs.berkeley.edu/leaderboard.html#leaderboard) |
|
|
| All the leaderboard statistics, and data used to train the models are released under Apache 2.0. |
| BFCL is an open source effort from UC Berkeley and we welcome contributors. |
| For any comments, criticisms, or questions, please feel free to raise an issue or a PR. You can also reach us via [email](mailto:huanzhimao@berkeley.edu). |
|
|