Repository: modelscope/evalscope
Issue: BFCL_v3测试结果格式与ground truth不一致
Root cause: External Dependency Breakage

## 自查清单

在提交 issue 之前，请确保您已完成以下步骤:
- [x] 我已仔细阅读了[相关使用说明文档](https://evalscope.readthedocs.io/zh-cn/latest/get_started/parameters.html)
- [x] 我已查看了[常见问题解答](https://evalscope.readthedocs.io/zh-cn/latest/get_started/faq.html)
- [x] 我已搜索并查看了现有的 issues，确认这不是一个重复的问题

## 问题描述

针对`qwen3-vl-235b-a22b-instruct`模型进行BFCL-v3测试的时候，遇到tool-call的很多项评分为0，但是看日志我感觉所有的tool-call执行结果都是正确的，只是格式有一些不同，不知道是不是根因。我测试了多个模型返回值都是类似的，是不是可以放宽判断限制？还是说有什么标准考虑

## EvalScope 版本（必填）
v1.1.1

## 使用的工具
- [x] Native / 原生框架
- [ ] Opencompass backend
- [ ] VLMEvalKit backend
- [ ] RAGEval backend
- [ ] Perf / 模型推理压测工具
- [ ] Arena / 竞技场模式

## 执行的代码或指令

```
import os
from evalscope import TaskConfig, run_task
from evalscope.constants import EvalType

task_cfg = TaskConfig(
    model='qwen/qwen3-vl-235b-a22b-instruct',
    api_url='http://127.0.0.1:9001/v1/chat/completions',
    api_key='xxx',
    eval_type=EvalType.SERVICE,
    datasets=['bfcl_v3'],
    eval_batch_size=10,
    dataset_args={
        'bfcl_v3': {
            'extra_params':{
                # 模型在函数名称中拒绝使用点号（`.`）；设置此项，以便在评估期间自动将点号转换为下划线。
                'underscore_to_dot': True,
                # 模式是否为函数调用模型（Function Calling Model），如果是则会启用函数调用相关的配置；否则会使用prompt绕过函数调用。
                'is_fc_model': True,
            }
        }
    },
    generation_config={
        'temperature': 0,
        'max_tokens': 32000,
        'parallel_tool_calls': True,  # 启用并行函数调用
    },
    limit=10,  # 限制评测数量，便于快速测试，正式评测时建议去掉此项
)
run_task(task_cfg=task_cfg)
```

## 错误日志

```
{
    "index": 4,
    "input": "**User**: \n",
    "target": "",
    "sample_score": {
        "score": {
            "value": {
                "acc": 0.0
            },
            "extracted_prediction": "[\n  [\n    {\n      \"get_current_weather\": {\n        \"location\": \"Tel Aviv, Israel\",\n        \"unit\": \"fahrenheit\"\n      }\n    }\n  ]\n]",
            "prediction": "[\n  [\n    {\n      \"get_current_weather\": {\n        \"location\": \"Tel Aviv, Israel\",\n        \"unit\": \"fahrenheit\"\n      }\n    }\n  ]\n]",
            "explanation": "Invalid syntax. Failed to decode AST. Traceback: Traceback (most recent call last):\n  File \"/Users/mondaylord/miniconda3/lib/python3.13/site-packages/evalscope/benchmarks/bfcl/bfcl_adapter.py\", line 224, in match_score\n    score_result = ast_checker(\n        row['functions'],\n    ...<4 lines>...\n        dummy_model,\n    )\n  File \"/Users/mondaylord/miniconda3/lib/python3.13/site-packages/bfcl_eval/eval_checker/ast_eval/ast_checker.py\", line 59, in ast_checker\n    return simple_function_checker(\n        func_description[0], model_output[0], possible_answer[0], language, model_name\n    )\n  File \"/Users/mondaylord/miniconda3/lib/python3.13/site-packages/bfcl_eval/eval_checker/ast_eval/ast_checker.py\", line 434, in simple_function_checker\n    raise ValueError(f\"Unsupported language: {language}\")\nValueError: Unsupported language: Python\n",
            "metadata": {
                "raw_score_result": {
                    "valid": false,
                    "error_message": "Invalid syntax. Failed to decode AST. Traceback: Traceback (most recent call last):\n  File \"/Users/mondaylord/miniconda3/lib/python3.13/site-packages/evalscope/benchmarks/bfcl/bfcl_adapter.py\", line 224, in match_score\n    score_result = ast_checker(\n        row['functions'],\n    ...<4 lines>...\n        dummy_model,\n    )\n  File \"/Users/mondaylord/miniconda3/lib/python3.13/site-packages/bfcl_eval/eval_checker/ast_eval/ast_checker.py\", line 59, in ast_checker\n    return simple_function_checker(\n        func_description[0], model_output[0], possible_answer[0], language, model_name\n    )\n  File \"/Users/mondaylord/miniconda3/lib/python3.13/site-packages/bfcl_eval/eval_checker/ast_eval/ast_checker.py\", line 434, in simple_function_checker\n    raise ValueError(f\"Unsupported language: {language}\")\nValueError: Unsupported language: Python\n",
                    "error_type": "ast_decoder:decoder_failed"
                },
                "test_category": "live_simple",
                "underscore_to_dot": true,
                "is_fc_model": true
            },
            "main_score_name": "acc"
        },
        "sample_id": 4,
        "group_id": 4,
        "sample_metadata": {
            "id": "live_simple_4-3-0",
            "multi_turn": false,
            "functions": [
                {
                    "name": "get_current_weather",
                    "description": "Retrieves the current weather conditions for a specified city and state. If using state, then use short form like CA.",
                    "parameters": {
                        "type": "dict",
                        "required": [
                            "location"
                        ],
                        "properties": {
                            "location": {
                                "type": "string",
                                "description": "The location for which to get the weather, in the format of 'City, State (abbr)', such as 'San Francisco, CA' if State for the city exists. 'City, Country' if State for the city doesn't exist."
                            },
                            "unit": {
                                "type": "string",
                                "description": "The unit of temperature for the weather report.",
                                "enum": [
                                    "celsius",
                                    "fahrenheit"
                                ],
                                "default": "fahrenheit"
                            }
                        }
                    }
                }
            ],
            "tools": [
                {
                    "type": "function",
                    "function": {
                        "name": "get_current_weather",
                        "description": "Retrieves the current weather conditions for a specified city and state. If using state, then use short form like CA. Note that the provided function is in Python 3 syntax.",
                        "parameters": {
                            "type": "object",
                            "required": [
                                "location"
                            ],
                            "properties": {
                                "location": {
                                    "type": "string",
                                    "description": "The location for which to get the weather, in the format of 'City, State (abbr)', such as 'San Francisco, CA' if State for the city exists. 'City, Country' if State for the city doesn't exist."
                                },
                                "unit": {
                                    "type": "string",
                                    "description": "The unit of temperature for the weather report.",
                                    "enum": [
                                        "celsius",
                                        "fahrenheit"
                                    ],
                                    "default": "fahrenheit"
                                }
                            }
                        }
                    }
                }
            ],
            "missed_functions": "{}",
            "initial_config": {},
            "involved_classes": [],
            "turns": [
                [
                    {
                        "role": "user",
                        "content": "What are the current weather conditions in Tel Aviv, and could you provide that in Fahrenheit, please?"
                    }
                ]
            ],
            "language": "Python",
            "test_category": "live_simple",
            "subset": "live_simple",
            "ground_truth": [
                {
                    "get_current_weather": {
                        "location": [
                            "Tel Aviv, Israel"
                        ],
                        "unit": [
                            "fahrenheit",
                            ""
                        ]
                    }
                }
            ],
            "should_execute_tool_calls": false,
            "missing_functions": {},
            "is_fc_model": true,
            "generation": [
                [
                    {
                        "get_current_weather": {
                            "location": "Tel Aviv, Israel",
                            "unit": "fahrenheit"
                        }
                    }
                ]
            ]
        }
    }
}
```
主要是最后generation是
```
{
    "get_current_weather": {
        "location": "Tel Aviv, Israel",
        "unit": "fahrenheit"
    }
}
```
看起来和ground truth唯一的区别是[]的格式

## 运行环境

- 操作系统：MacOS
- Python版本：Python 3.13.5

## 其他信息

部署模型的参数如下
```
--served-model-name qwen/qwen3-vl-235b-a22b-instruct
--gpu-memory-utilization 0.9
--max-model-len 131072
--tensor-parallel-size 8
--enable-expert-parallel
--disable-log-requests
--mm-encoder-tp-mode data
--limit-mm-per-prompt.video 0
--enable-auto-tool-choice
--tool-call-parser hermes
```

BFCL-v3和BFCL-v4的支持已更新，请从源码安装最新版evalscope，并参考文档使用：https://evalscope.readthedocs.io/zh-cn/latest/third_party/bfcl_v3.html#

评测结果是使用的BFCL官方代码，这里没有做修改，也不支持修改

> 感谢你的反馈！我们将关闭此问题。如果您有任何疑问，请随时重新打开它。如果EvalScope对您有所帮助，欢迎给我们点个STAR以示支持，谢谢！