[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