[Bugfix] Load reasoning parser plugins before headless engine config (#53124)
Signed-off-by: alexliluz <49665315+alexliluz@users.noreply.github.com> Co-authored-by: Jiangyun Zhu <riverclouds.zhu@qq.com>
ALEX LILUZ committed
Sep 15, 2026 at 18:31 UTC
5be911ee871604895c5a950ac1a5675c71896fd2
2 files changed
+46
tests/entrypoints/cli/test_serve.py
new
+42
@@ -0,0 +1,42 @@
1
+# SPDX-License-Identifier: Apache-2.0
2
+# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
+"""Unit tests for the ``vllm serve`` CLI subcommand."""
4
+
5
+import argparse
6
+from unittest.mock import MagicMock, patch
7
+
8
+import pytest
9
+
10
+from vllm.entrypoints.cli.serve import run_headless
11
+
12
+
13
+class _StopAfterEngineConfig(Exception):
14
+ pass
15
+
16
+
17
+def test_headless_imports_reasoning_parser_plugin_before_engine_config():
18
+ plugin_path = "/tmp/custom_reasoning_parser.py"
19
+ args = argparse.Namespace(
20
+ api_server_count=0,
21
+ reasoning_parser_plugin=plugin_path,
22
+ )
23
+ engine_args = MagicMock()
24
+
25
+ with (
26
+ patch(
27
+ "vllm.entrypoints.cli.serve.vllm.AsyncEngineArgs.from_cli_args",
28
+ return_value=engine_args,
29
+ ),
30
+ patch(
31
+ "vllm.reasoning.ReasoningParserManager.import_reasoning_parser"
32
+ ) as import_plugin,
33
+ ):
34
+
35
+ def create_engine_config(**kwargs):
36
+ import_plugin.assert_called_once_with(plugin_path)
37
+ raise _StopAfterEngineConfig
38
+
39
+ engine_args.create_engine_config.side_effect = create_engine_config
40
+
41
+ with pytest.raises(_StopAfterEngineConfig):
42
+ run_headless(args)
vllm/entrypoints/cli/serve.py
+4
@@ -18,6 +18,7 @@ from vllm.entrypoints.launchers.cli_args import (
18
from vllm.entrypoints.launchers.dp_supervisor import run_dp_supervisor
19
from vllm.entrypoints.serve.utils.api_utils import VLLM_SUBCMD_PARSER_EPILOG
20
from vllm.logger import init_logger
21
+from vllm.reasoning import ReasoningParserManager
22
from vllm.usage.usage_lib import UsageContext
23
from vllm.utils.argparse_utils import FlexibleArgumentParser
24
from vllm.utils.network_utils import get_tcp_uri
@@ -179,6 +180,9 @@ def run_headless(args: argparse.Namespace):
180
if args.api_server_count > 1:
181
raise ValueError("api_server_count can't be set in headless mode")
182
183
+ if args.reasoning_parser_plugin and len(args.reasoning_parser_plugin) > 3:
184
+ ReasoningParserManager.import_reasoning_parser(args.reasoning_parser_plugin)
185
+
186
# Create the EngineConfig.
187
engine_args = vllm.AsyncEngineArgs.from_cli_args(args)
188
usage_context = UsageContext.OPENAI_API_SERVER