Prhub

#49846 [Bugfix] Fix VLLM_ENFORCE_STRICT_TOOL_CALLING mutation in tests

原始 PR 作者 yzong-rh 合并时间 2026-07-28 00:12 文件变更 3 提交数 2 评论 1 代码增减 +26 / -44

执行摘要

修复测试中环境变量突变导致其他用例失败

原有代码在模块顶部 os.environ['VLLM_ENFORCE_STRICT_TOOL_CALLING'] = '0' 全局修改环境变量,导致依赖 VLLM_ENFORCE_STRICT_TOOL_CALLING=1 的测试(如 PR#45560)执行失败。PR body 指出要修复这个 code smell/latent bug。

建议团队成员了解这种通过 monkeypatch 替代环境变量的测试模式,未来类似场景应优先使用 monkeypatch 或 unittest.mock 来隔离环境依赖,避免模块级副作用。PR 本身值得精读的代码量很少,但方法值得借鉴。

讨论亮点

无 review 讨论。PR 由作者提交后直接获得 maintainer sfeng33 的 Approved。

实现拆解

  1. 移除全局环境变量修改:在 tests/parser/test_parse.py 和 tests/parser/test_include_reasoning.py 中,删除模块级别的 _STRICT_TOOL_CALLING_ENV / _STRICT_TOOL_CALLING_ENV_VALUE 读取与 os.environ[_STRICT_TOOL_CALLING_ENV] = '0' 写入,以及对应的清理 fixture restore_strict_tool_calling_env。
  2. 改用 monkeypatch 设置属性:在这三个测试文件中新增 enable_hermes_required_named_parsing 函数,通过 monkeypatch.setattr(Hermes2ProToolParser, 'supports_required_and_named', True) 模拟非严格模式下的行为,作用域限制在每个测试用例内,不会污染全局环境。
  3. 简化解锁导入:将原来被环境变量设置强制分隔、带 # noqa: E402 的导入块改为顶格常规导入,提高代码可读性。
  4. 测试验证:执行 pytest tests/parser 全部通过(3822 passed, 16 warnings)。
文件 模块 状态 重要度
tests/parser/test_parse.py 解析器 modified 6.1
tests/parser/test_include_reasoning.py 推理 modified 5.0
tests/parser/test_streaming.py 流式 modified 4.03

关键符号

enable_hermes_required_named_parsing

关键源码片段

tests/parser/test_parse.py test-coverage

主要变更文件,移除模块级环境变量设置和清理,新增 `enable_hermes_required_named_parsing` 函数并简化导入,是理解修复核心的入口。

# -*- coding: utf-8 -*-
import json
from types import SimpleNamespace
​
import pytest
​
from vllm.entrypoints.openai.chat_completion.protocol import ChatCompletionRequest
from vllm.entrypoints.openai.responses.protocol import ResponsesRequest
from vllm.parser.abstract_parser import DelegatingParser
from vllm.parser.utils import count_history_tool_calls
from vllm.reasoning.basic_parsers import BaseThinkingReasoningParser
from vllm.tool_parsers.hermes_tool_parser import Hermes2ProToolParser
​
​
@pytest.fixture(autouse=True)
def enable_hermes_required_named_parsing(monkeypatch):
    # 当 VLLM_ENFORCE_STRICT_TOOL_CALLING 默认开启时,Hermes2ProToolParser 会将
    # supports_required_and_named 设置为 False,转而使用结构标签引导的 tool calling。
    # 这里通过 monkeypatch 强制设为 True,以测试非引导的 JSON 解析路径。
    monkeypatch.setattr(Hermes2ProToolParser, "supports_required_and_named", True)
​
​
class ThinkReasoningParser(BaseThinkingReasoningParser):
    @property
    def start_token(self) -> str:
        return "<think>"
​
    @property
    def end_token(self) -> str:
        return "</think>"

可见原有模块级 os.environ 操作和 restore_strict_tool_calling_env fixture 已被删除,改为更清爽的 enable_hermes_required_named_parsing。

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

无显著风险。变更仅限于测试文件,不涉及生产代码。新增的 fixture 依赖 monkeypatch,若 Hermes2ProToolParser 类路径或属性名变更,需同步更新这里(但这是测试正确性要求)。

影响范围仅限于三项 parser 测试文件:test_parse.py、test_include_reasoning.py、test_streaming.py。修复了因环境变量全局突变导致的跨测试模块干扰问题,提升了测试隔离性。对用户功能和系统性能无影响。

仅测试文件变更 无生产代码影响

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论