Prhub

#48523 [Bugfix] Skip minimax_m3 tool parser tests when Rust extension is absent

原始 PR 作者 mwoodson 合并时间 2026-07-14 12:43 文件变更 1 提交数 1 评论 4 代码增减 +4 / -0

执行摘要

MiniMax-M3 Rust 工具解析器测试跳过防护

PR body 明确指出:test_minimax_m3_tool_parser.py 在 Rust 扩展未编译到 wheel 时(例如 CPU-only wheels)会因 RuntimeError: Rust tool parsing requires the vllm._rust_tool_parser PyO3 extension 而失败,需要添加与 test_rust_tool_parser.py 一致的 importorskip 守卫以优雅跳过。

值得直接合并。这是一个微小但正确的测试健壮性修复,符合项目已有模式,无任何副作用。可作为同类问题的参考案例。

讨论亮点

PR 作者 mwoodson 在评论中明确引用了两个证据:test_rust_tool_parser.py 已在第 17 行使用 pytest.importorskip,以及 MinimaxM3ToolParser 继承自 RustToolParser,因此需要相同的守卫。审核者 BugenZhao 表示 Thanks! 并批准合并,无进一步讨论。

实现拆解

  1. 在 tests/tool_parsers/test_minimax_m3_tool_parser.py 的 import 之后、pytestmark 之前插入 pytest.importorskip("vllm._rust_tool_parser"),并在上方添加注释说明其与 test_rust_tool_parser.py 的守卫模式一致。
  2. 无其他文件改动。变更仅 4 行新增、0 行删除,不涉及任何源码逻辑修改。
文件 模块 状态 重要度
tests/tool_parsers/test_minimax_m3_tool_parser.py 测试 modified 3.03

关键源码片段

tests/tool_parsers/test_minimax_m3_tool_parser.py test-coverage

唯一变更文件,添加了 pytest.importorskip 守卫以在 Rust 扩展缺失时跳过测试。

# SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
​
import json
from typing import Any
​
import pytest
​
from vllm.entrypoints.openai.chat_completion.protocol import (
    ChatCompletionToolsParam,
    FunctionDefinition,
)
from vllm.entrypoints.openai.engine.protocol import DeltaMessage
from vllm.tool_parsers import ToolParserManager
from vllm.tool_parsers.minimax_m3_tool_parser import MinimaxM3ToolParser
​
# MinimaxM3ToolParser 继承自 RustToolParser;
# 当 PyO3 扩展缺失时跳过测试(与 test_rust_tool_parser.py 的守卫模式一致)
pytest.importorskip("vllm._rust_tool_parser")
​
pytestmark = [pytest.mark.cpu_test, pytest.mark.skip_global_cleanup]
​
NS = "]<]minimax[>["
EOS_ID = 99
​
​
class FakeTokenizer:
    """用于单元测试的最小化假 tokenizer"""
​
    def __init__(self):
        self.model_tokenizer = True
        self.vocab: dict[str, int] = {}
​
    def get_vocab(self) -> dict[str, int]:
        return self.vocab
​
​
def sample_tools() -> list[ChatCompletionToolsParam]:
    return [
        ChatCompletionToolsParam(
            function=FunctionDefinition(
                name="create_order",
                parameters={
                    "type": "object",
                    "properties": {
                        "user_id": {"type": "integer"},
                        "urgent": {"type": "boolean"},
                        "note": {"type": "string"},
                        "shipping": {
                            "type": "object",
                            "properties": {

评论区精华

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

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

风险与影响

风险极低。变更仅为测试文件添加了 import 跳过守卫,不会影响任何生产代码或测试通过率。唯一潜在风险是如果未来 Rust 扩展被彻底移除但该守卫未及时清理,会导致测试被跳过而无人察觉,但此类情况属于长期维护问题。

影响范围有限:仅影响 tests/tool_parsers/test_minimax_m3_tool_parser.py 的测试执行流程。对用户无影响;对开发者:在未编译 Rust 扩展的环境中(如 CPU-only 构建),该测试将显示 SKIPPED 而非 FAILED,避免 CI 误报或下游构建中断。

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论