[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