[Bugfix][Frontend] Run the serve arg checks for `vllm launch` too (#52825)

Signed-off-by: Vineeth Sai <vineethsai4444@gmail.com>

Vineeth Sai Varikuntla committed Aug 18, 2026 at 21:48 UTC 86a89a93486d3bd4bd1c94149066c992cb7e2f09
2 files changed +47 -1
tests/entrypoints/openai/test_cli_args.py
+44
@@ -214,6 +214,50 @@ def test_per_request_metrics_requires_log_stats(serve_parser):
214 validate_parsed_serve_args(args)
215
216
217 +def _build_launch_render_parser():
218 + """Mirror `vllm launch render`.
219 +
220 + `vllm/entrypoints/cli/main.py` parses subcommands with ``dest="subparser"``,
221 + and `LaunchSubcommandBase.add_cli_args` builds the component parser with
222 + `make_arg_parser`, so a launch component carries serve args under
223 + ``args.subparser == "launch"``.
224 + """
225 + vllm_parser = FlexibleArgumentParser()
226 + subparsers = vllm_parser.add_subparsers(required=False, dest="subparser")
227 + launch_parser = subparsers.add_parser("launch")
228 + launch_subparsers = launch_parser.add_subparsers(
229 + required=True, dest="launch_component"
230 + )
231 + render_parser = launch_subparsers.add_parser("render")
232 + make_arg_parser(render_parser)
233 + return vllm_parser
234 +
235 +
236 +@pytest.fixture
237 +def launch_render_parser():
238 + return _build_launch_render_parser()
239 +
240 +
241 +def test_launch_render_validates_serve_args(launch_render_parser):
242 + """`vllm launch render` reuses the serve parser, so it gets the serve checks"""
243 + args = launch_render_parser.parse_args(
244 + args=["launch", "render", "--enable-auto-tool-choice"]
245 + )
246 + assert args.subparser == "launch"
247 + with pytest.raises(TypeError):
248 + validate_parsed_serve_args(args)
249 +
250 +
251 +def test_subcommand_without_serve_args_skips_validation():
252 + """A subcommand that does not use the serve parser is still skipped"""
253 + vllm_parser = FlexibleArgumentParser()
254 + subparsers = vllm_parser.add_subparsers(required=False, dest="subparser")
255 + subparsers.add_parser("chat")
256 + args = vllm_parser.parse_args(args=["chat"])
257 +
258 + validate_parsed_serve_args(args)
259 +
260 +
261 @pytest.mark.parametrize(
262 "cli_args, expected_middleware",
263 [
vllm/entrypoints/openai/cli_args.py
+3 -1
@@ -412,7 +412,9 @@ def make_arg_parser(parser: FlexibleArgumentParser) -> FlexibleArgumentParser:
412
413 def validate_parsed_serve_args(args: argparse.Namespace):
414 """Quick checks for model serve args that raise prior to loading."""
415 - if hasattr(args, "subparser") and args.subparser != "serve":
415 + # `vllm launch <component>` builds its parser with make_arg_parser too (see
416 + # LaunchSubcommandBase.add_cli_args), so its args are serve args as well.
417 + if hasattr(args, "subparser") and args.subparser not in ("serve", "launch"):
418 return
419
420 # Ensure that the chat template is valid; raises if it likely isn't