Repository: modelscope/evalscope
Issue: [Bug] BFCL-v3 评测时触发 context length overflow（max_model_len=32000，但 EvalScope 请求 32161 tokens）
Root cause: Validation Gap


## 🐛 **问题描述**

使用 EvalScope **v1.2.0** 对模型进行评测时，在运行 **BFCL-v3（2025.06.16 版本）** 数据集的过程中，出现如下错误：

> **模型最大上下文长度为 32000 tokens，但 EvalScope 请求了 32161 tokens（message 23969 + completion 8192）。**

错误发生在：

```
Predicting[bfcl_v3@multi_turn_base]: 94%
```

说明是在 **multi_turn_base** 流程中构造的 prompt 超过了模型最大 context length，似乎 EvalScope 在构造对话 prompt 时没有正确做裁剪或溢出检查。

其他数据集（ifeval、gpqa_diamond、truthful_qa、needle_haystack）均正常运行，只有 bfcl_v3 会报错。

---

## 🧩 **EvalScope 版本（必填）**

```
v1.2.0
```

---

## 🔧 **使用的工具**

* [x] Native / 原生框架
* [ ] Opencompass backend
* [ ] VLMEvalKit backend
* [ ] RAGEval backend
* [ ] Perf
* [ ] Arena

---

## 📜 **执行的代码或指令**

### **EvalScope 调用指令**

```bash
evalscope eval \
  --model Qwen3-0.6B213123sdsd123123123123123 \
  --datasets ifeval gpqa_diamond truthful_qa bfcl_v3 needle_haystack truthfulzjq111_qa \
  --eval-backend Native \
  --eval-type openai_api \
  --api-url http://xxx:8000/v1 \
  --api-key EMPTY \
  --work-dir xxxpath \
  --generation-config '{"max_tokens": 8192}' \
  --judge-strategy llm \
  --judge-worker-num 5 \
  --judge-model-args '{"model_id": "qwen3-32bsdadasdadada", "api_url": "http://xxx:8001/v1", "api_key": "EMPTY"}' \
  --dataset-args '{...（包含 bfcl_v3 路径与 subset 配置）...}'
```

---

### **被测模型 API Server（vLLM）**

```bash
CUDA_VISIBLE_DEVICES=0,1 python3 -m vllm.entrypoints.openai.api_server \
  --model /path/to/model \
  --host 0.0.0.0 \
  --port 8000 \
  --served-model-name Qwen3-0.6B213123sdsd123123123123123 \
  --tensor-parallel-size 2 \
  --max-model-len 32000 \
  --enable-auto-tool-choice \
  --tool-call-parser hermes
```

### **裁判模型 API Server**

```bash
CUDA_VISIBLE_DEVICES=2,3 python3 -m vllm.entrypoints.openai.api_server \
  --model /path/to/Qwen3-32B \
  --host 0.0.0.0 \
  --port 8001 \
  --served-model-name qwen3-32bsdadasdadada \
  --tensor-parallel-size 2 \
  --max-model-len 32000
```

---

## ❌ **错误日志**

```text
openai.BadRequestError: Error code: 400 - {
  'object': 'error',
  'message': "This model's maximum context length is 32000 tokens. However, you requested 32161 tokens (23969 in the messages, 8192 in the completion). Please reduce the length of the messages or completion.",
  'type': 'BadRequestError',
  'param': None,
  'code': 400
}

Predicting[bfcl_v3@multi_turn_base]: 94%|█████████▍| 188/200 [50:01<03:11, 15.96s/it]
```

看起来是 BFCL-v3 的 multi-turn prompt 在累积后超长，但 EvalScope 没有做自动截断。

---

## 💻 **运行环境**

* 操作系统：Linux（企业内部 GPU 服务器）
* Python 版本：3.10
* vLLM：0.8.5
* BFCL-v3 数据集版本：2025.06.16

---

## 📎 **其他信息**

* 其它数据集暂时没不会触发溢出，只有 BFCL-v3 会在 multi_turn_base 报错。
* 模型服务端已明确设置 `--max-model-len 32000`。
* EvalScope 请求了超过限制的 `23969 + 8192 = 32161 tokens`。

希望确认：

1. **EvalScope 对 multi-turn prompt 是否缺少 length trimming？**
2. **BFCL-v3 是否需要额外配置以限制 prompt 长度？**
3. **eval指令要如何修改呢？加什么参数可以截断？**


模型请求不支持截断，multiturn中历史的上下文是会进行累积的，你可以降低`--generation-config '{"max_tokens": 8192}'`参数

@Yunnglin 辛苦毛哥看一下，我昨天改掉这个max_tokens参数为512后，依旧报错了，报错依旧一样：

openai.BadRequestError: Error code: 400 - {'object': 'error', 'message': "This model's maximum context length is 32000 tokens. However, you requested 32105 tokens (31593 in the messages, 512 in the completion). Please reduce the length of the messages or completion.", 'type': 'BadRequestError', 'param': None, 'code': 400}
Predicting[bfcl_v3@multi_turn_miss_func]:  88%|████████▊ | 175/200 [1:13:01<10:25, 25.04s/it]

我想问的是：

- 要如何修改这个指令呢？
- 是因为数据集自身有问题吗？
- 其余人在用这个bfcl-v3进行评测的时候出现问题没？（我这边是把bfcl-v3这个评测集下载下来后，评测时本地加载的）
- 或者说，是不是因为api部署的原因，vllm的限制，所以导致出现了这个错误？用本地加载ckpt的方式，会不会避免这个问题？
- vllm部署模型那里，我把  --max-model-len 32000改为64000可以吗？（最新测试：不能是64000，报错了：ValueError: User-specified max_model_len (64000) is greater than the derived max_model_len (max_position_embeddings=40960 or model_max_length=None in model's config.json). This may lead to incorrect model outputs or CUDA errors. To allow overriding this maximum, set the env var VLLM_ALLOW_LONG_MAX_MODEL_LEN=1，我设置了40000在重新跑）

api部署被测试模型的vllm指令和部署裁判模型的vllm指令和上面的一样，eval指令如下：

`evalscope eval \
  --model "<HIDDEN_MODEL_NAME>" \
  --datasets ifeval gpqa_diamond truthful_qa bfcl_v3 needle_haystack truthfulzjq111_qa \
  --eval-backend Native \
  --eval-type openai_api \
  --api-url "<HIDDEN_URL_1>" \
  --api-key "EMPTY" \
  --work-dir "<HIDDEN_PATH_1>" \
  --generation-config '{
    "max_tokens": 512
  }' \
  --dataset-args '{
    "ifeval": {
      "local_path": "<HIDDEN_PATH_IFEVAL>"
    },
    "gpqa_diamond": {
      "local_path": "<HIDDEN_PATH_GPQA>"
    },
    "truthful_qa": {
      "local_path": "<HIDDEN_PATH_TRUTHFUL>",
      "subset_list": ["multiple_choice"]
    },
    "bfcl_v3": {
      "local_path": "<HIDDEN_PATH_BFCL>"
    },
    "needle_haystack": {
      "local_path": "<HIDDEN_PATH_NEEDLE>",
      "subset_list": ["english", "chinese"],
      "extra_params": {
        "tokenizer_path": "<HIDDEN_TOKENIZER_PATH>",
        "context_lengths_min": 1000,
        "context_lengths_max": 32000,
        "context_lengths_num_intervals": 10,
        "document_depth_percent_min": 0,
        "document_depth_percent_max": 100,
        "document_depth_percent_intervals": 10
      }
    }
  }' \
  --judge-strategy llm \
  --judge-worker-num 5 \
  --judge-model-args '{
    "model_id": "<HIDDEN_JUDGE_MODEL>",
    "api_url": "<HIDDEN_URL_2>",
    "api_key": "EMPTY"
  }'
`

vllm部署的两个指令类似为：
`CUDA_VISIBLE_DEVICES=0,1 python3 -m vllm.entrypoints.openai.api_server \
  --model /path/to/model \
  --host 0.0.0.0 \
  --port 8000 \
  --served-model-name Qwen3-0.6B213123sdsd123123123123123 \
  --tensor-parallel-size 2 \
  --max-model-len 32000 \
  --enable-auto-tool-choice \
  --tool-call-parser hermes`


那就是这个例子上下文太长了，BFCL支持最大20步交互，你的模型支持不了这么长的上下文，可以设置 --ignore-errors 参数来跳过出错的样例

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