Skip to content

Commit 175bda6

Browse files
authored
[Feat] Add deprecated=True to CLI args (#17426)
Signed-off-by: Aaron Pham <[email protected]>
1 parent cba31c4 commit 175bda6

File tree

2 files changed

+77
-2
lines changed

2 files changed

+77
-2
lines changed

vllm/engine/arg_utils.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,7 @@ def add_cli_args(parser: FlexibleArgumentParser) -> FlexibleArgumentParser:
531531
guided_decoding_group.add_argument(
532532
"--enable-reasoning",
533533
action=argparse.BooleanOptionalAction,
534+
deprecated=True,
534535
help="[DEPRECATED] The `--enable-reasoning` flag is deprecated as "
535536
"of v0.8.6. Use `--reasoning-parser` to specify the reasoning "
536537
"parser backend insteadThis flag (`--enable-reasoning`) will be "

vllm/utils.py

Lines changed: 76 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,15 @@
3333
import warnings
3434
import weakref
3535
from argparse import (Action, ArgumentDefaultsHelpFormatter, ArgumentParser,
36-
ArgumentTypeError)
36+
ArgumentTypeError, _ArgumentGroup)
3737
from asyncio import FIRST_COMPLETED, AbstractEventLoop, Task
3838
from collections import UserDict, defaultdict
3939
from collections.abc import (AsyncGenerator, Awaitable, Generator, Hashable,
4040
Iterable, Iterator, KeysView, Mapping)
4141
from concurrent.futures.process import ProcessPoolExecutor
4242
from dataclasses import dataclass, field
4343
from functools import cache, lru_cache, partial, wraps
44+
from gettext import gettext as _gettext
4445
from types import MappingProxyType
4546
from typing import (TYPE_CHECKING, Any, Callable, Generic, Literal, NamedTuple,
4647
Optional, Sequence, Tuple, Type, TypeVar, Union, cast,
@@ -70,6 +71,8 @@
7071
from vllm.logger import enable_trace_function_call, init_logger
7172

7273
if TYPE_CHECKING:
74+
from argparse import Namespace
75+
7376
from vllm.config import ModelConfig, VllmConfig
7477

7578
logger = init_logger(__name__)
@@ -1323,16 +1326,78 @@ def add_arguments(self, actions):
13231326
super().add_arguments(actions)
13241327

13251328

1329+
class _FlexibleArgumentGroup(_ArgumentGroup):
1330+
1331+
def __init__(self, parser: FlexibleArgumentParser, *args, **kwargs):
1332+
self._parser = parser
1333+
super().__init__(*args, **kwargs)
1334+
1335+
def add_argument(self, *args: Any, **kwargs: Any):
1336+
if sys.version_info < (3, 13):
1337+
deprecated = kwargs.pop('deprecated', False)
1338+
action = super().add_argument(*args, **kwargs)
1339+
object.__setattr__(action, 'deprecated', deprecated)
1340+
if deprecated and action.dest not in \
1341+
self._parser.__class__._deprecated:
1342+
self._parser._deprecated.add(action)
1343+
return action
1344+
1345+
# python>3.13
1346+
return super().add_argument(*args, **kwargs)
1347+
1348+
13261349
class FlexibleArgumentParser(ArgumentParser):
13271350
"""ArgumentParser that allows both underscore and dash in names."""
13281351

1352+
_deprecated: set[Action] = set()
1353+
_seen: set[str] = set()
1354+
13291355
def __init__(self, *args, **kwargs):
13301356
# Set the default 'formatter_class' to SortedHelpFormatter
13311357
if 'formatter_class' not in kwargs:
13321358
kwargs['formatter_class'] = SortedHelpFormatter
13331359
super().__init__(*args, **kwargs)
13341360

1335-
def parse_args(self, args=None, namespace=None):
1361+
if sys.version_info < (3, 13):
1362+
1363+
def parse_known_args( # type: ignore[override]
1364+
self,
1365+
args: Sequence[str] | None = None,
1366+
namespace: Namespace | None = None,
1367+
) -> tuple[Namespace | None, list[str]]:
1368+
namespace, args = super().parse_known_args(args, namespace)
1369+
for action in FlexibleArgumentParser._deprecated:
1370+
if action.dest not in FlexibleArgumentParser._seen and getattr(
1371+
namespace, action.dest,
1372+
None) != action.default: # noqa: E501
1373+
self._warning(
1374+
_gettext("argument '%(argument_name)s' is deprecated")
1375+
% {'argument_name': action.dest})
1376+
FlexibleArgumentParser._seen.add(action.dest)
1377+
return namespace, args
1378+
1379+
def add_argument(self, *args: Any, **kwargs: Any):
1380+
# add a deprecated=True compatibility
1381+
# for python < 3.13
1382+
deprecated = kwargs.pop('deprecated', False)
1383+
action = super().add_argument(*args, **kwargs)
1384+
object.__setattr__(action, 'deprecated', deprecated)
1385+
if deprecated and \
1386+
action not in FlexibleArgumentParser._deprecated:
1387+
self._deprecated.add(action)
1388+
1389+
return action
1390+
1391+
def _warning(self, message: str):
1392+
self._print_message(
1393+
_gettext('warning: %(message)s\n') % {'message': message},
1394+
sys.stderr)
1395+
1396+
def parse_args( # type: ignore[override]
1397+
self,
1398+
args: list[str] | None = None,
1399+
namespace: Namespace | None = None,
1400+
):
13361401
if args is None:
13371402
args = sys.argv[1:]
13381403

@@ -1503,6 +1568,15 @@ def _load_config_file(self, file_path: str) -> list[str]:
15031568

15041569
return processed_args
15051570

1571+
def add_argument_group(
1572+
self,
1573+
*args: Any,
1574+
**kwargs: Any,
1575+
) -> _FlexibleArgumentGroup:
1576+
group = _FlexibleArgumentGroup(self, self, *args, **kwargs)
1577+
self._action_groups.append(group)
1578+
return group
1579+
15061580

15071581
async def _run_task_with_lock(task: Callable, lock: asyncio.Lock, *args,
15081582
**kwargs):

0 commit comments

Comments
 (0)