From aff94b81a5fd379fea09d0732407ffddc9e17ebb Mon Sep 17 00:00:00 2001 From: ayushag Date: Sun, 7 Sep 2025 20:15:14 +0000 Subject: [PATCH 1/2] chore: disabled default sglang tool parser args Signed-off-by: ayushag --- components/backends/sglang/src/dynamo/sglang/args.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/components/backends/sglang/src/dynamo/sglang/args.py b/components/backends/sglang/src/dynamo/sglang/args.py index f3c5af31ee..8716a9848f 100644 --- a/components/backends/sglang/src/dynamo/sglang/args.py +++ b/components/backends/sglang/src/dynamo/sglang/args.py @@ -106,6 +106,16 @@ def parse_args(args: list[str]) -> Config: parsed_args = parser.parse_args(args) + # Disable sglang based parser arguments + if parsed_args.tool_call_parser is not None: + raise ValueError( + "tool_call_parser is not supported for SGLang backend. Please use --dyn-tool-call-parser instead to enable tool calling." + ) + if parsed_args.reasoning_parser is not None: + raise ValueError( + "reasoning_parser is not supported for SGLang backend. Please use --dyn-reasoning-parser instead to enable reasoning." + ) + # Auto-set bootstrap port if not provided if not any(arg.startswith("--disaggregation-bootstrap-port") for arg in args): args_dict = vars(parsed_args) From 4d3d5319d55e1006e4d8ffc387e930235bf054d0 Mon Sep 17 00:00:00 2001 From: ayushag Date: Mon, 8 Sep 2025 15:44:21 +0000 Subject: [PATCH 2/2] chore: added preference logic for using sglang and dyn parsers Signed-off-by: ayushag --- .../backends/sglang/src/dynamo/sglang/args.py | 58 +++++++++++++++---- 1 file changed, 46 insertions(+), 12 deletions(-) diff --git a/components/backends/sglang/src/dynamo/sglang/args.py b/components/backends/sglang/src/dynamo/sglang/args.py index 8716a9848f..4fa9fcfd3f 100644 --- a/components/backends/sglang/src/dynamo/sglang/args.py +++ b/components/backends/sglang/src/dynamo/sglang/args.py @@ -15,8 +15,11 @@ from sglang.srt.server_args import ServerArgs from dynamo._core import get_reasoning_parser_names, get_tool_parser_names +from dynamo.runtime.logging import configure_dynamo_logging from dynamo.sglang import __version__ +configure_dynamo_logging() + DEFAULT_ENDPOINT = "dyn://dynamo.backend.generate" DYNAMO_ARGS: Dict[str, Dict[str, Any]] = { "endpoint": { @@ -80,6 +83,36 @@ def _set_serving_strategy(self): return DisaggregationMode.DECODE +def _set_parser( + sglang_str: Optional[str], + dynamo_str: Optional[str], + arg_name: str = "tool-call-parser", +) -> Optional[str]: + # If both are present, give preference to dynamo_str + if sglang_str is not None and dynamo_str is not None: + logging.warning( + f"--dyn-{arg_name} and --{arg_name} are both set. Giving preference to --dyn-{arg_name}" + ) + return dynamo_str + # If dynamo_str is not set, use try to use sglang_str if it matches with the allowed parsers + elif sglang_str is not None: + logging.warning(f"--dyn-{arg_name} is not set. Using --{arg_name}.") + if arg_name == "tool-call-parser" and sglang_str not in get_tool_parser_names(): + raise ValueError( + f"--{arg_name} is not a valid tool call parser. Valid parsers are: {get_tool_parser_names()}" + ) + elif ( + arg_name == "reasoning-parser" + and sglang_str not in get_reasoning_parser_names() + ): + raise ValueError( + f"--{arg_name} is not a valid reasoning parser. Valid parsers are: {get_reasoning_parser_names()}" + ) + return sglang_str + else: + return dynamo_str + + def parse_args(args: list[str]) -> Config: """ Parse all arguments and return Config with server_args and dynamo_args @@ -106,16 +139,6 @@ def parse_args(args: list[str]) -> Config: parsed_args = parser.parse_args(args) - # Disable sglang based parser arguments - if parsed_args.tool_call_parser is not None: - raise ValueError( - "tool_call_parser is not supported for SGLang backend. Please use --dyn-tool-call-parser instead to enable tool calling." - ) - if parsed_args.reasoning_parser is not None: - raise ValueError( - "reasoning_parser is not supported for SGLang backend. Please use --dyn-reasoning-parser instead to enable reasoning." - ) - # Auto-set bootstrap port if not provided if not any(arg.startswith("--disaggregation-bootstrap-port") for arg in args): args_dict = vars(parsed_args) @@ -148,13 +171,24 @@ def parse_args(args: list[str]) -> Config: parsed_namespace, parsed_component_name, parsed_endpoint_name = endpoint_parts + tool_call_parser = _set_parser( + parsed_args.tool_call_parser, + parsed_args.dyn_tool_call_parser, + "tool-call-parser", + ) + reasoning_parser = _set_parser( + parsed_args.reasoning_parser, + parsed_args.dyn_reasoning_parser, + "reasoning-parser", + ) + dynamo_args = DynamoArgs( namespace=parsed_namespace, component=parsed_component_name, endpoint=parsed_endpoint_name, migration_limit=parsed_args.migration_limit, - tool_call_parser=parsed_args.dyn_tool_call_parser, - reasoning_parser=parsed_args.dyn_reasoning_parser, + tool_call_parser=tool_call_parser, + reasoning_parser=reasoning_parser, ) logging.debug(f"Dynamo args: {dynamo_args}")