Skip to content

Commit a03d0d5

Browse files
committed
fix: treat --tool-call-parser and --dyn--tool-call-parser as independent flags
Signed-off-by: Krishnan Prashanth <[email protected]>
1 parent 6c27809 commit a03d0d5

File tree

2 files changed

+27
-51
lines changed

2 files changed

+27
-51
lines changed

components/src/dynamo/sglang/args.py

Lines changed: 20 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -212,31 +212,18 @@ def _preprocess_for_encode_config(
212212
}
213213

214214

215-
def _set_parser(
216-
sglang_str: Optional[str],
217-
dynamo_str: Optional[str],
218-
arg_name: str = "tool-call-parser",
219-
) -> Optional[str]:
220-
"""Resolve parser name from SGLang and Dynamo arguments.
221-
222-
Args:
223-
sglang_str: Parser value from SGLang argument.
224-
dynamo_str: Parser value from Dynamo argument.
225-
arg_name: Name of the parser argument for logging.
226-
227-
Returns:
228-
Resolved parser name, preferring Dynamo's value if both set.
229-
"""
230-
if sglang_str is not None and dynamo_str is not None:
231-
logging.warning(
232-
f"--dyn-{arg_name} and --{arg_name} are both set. Giving preference to --dyn-{arg_name}"
215+
def _validate_parser(
216+
sglang_val: Optional[str], dynamo_val: Optional[str], name: str, valid: list
217+
) -> None:
218+
"""Validate --{name} (SGLang) and --dyn-{name} (Dynamo) parser flags."""
219+
if sglang_val and dynamo_val:
220+
logging.error(f"Cannot use both --{name} and --dyn-{name}.")
221+
sys.exit(1)
222+
if dynamo_val and dynamo_val not in valid:
223+
logging.error(
224+
f"--dyn-{name} '{dynamo_val}' is not supported. Valid choices: {valid}"
233225
)
234-
return dynamo_str
235-
elif sglang_str is not None:
236-
logging.warning(f"--dyn-{arg_name} is not set. Using --{arg_name}.")
237-
return sglang_str
238-
else:
239-
return dynamo_str
226+
sys.exit(1)
240227

241228

242229
def _extract_config_section(
@@ -453,33 +440,23 @@ async def parse_args(args: list[str]) -> Config:
453440

454441
parsed_namespace, parsed_component_name, parsed_endpoint_name = endpoint_parts
455442

456-
tool_call_parser = _set_parser(
443+
# Validate parser flags: error if both --{name} and --dyn-{name} are set,
444+
# and validate --dyn-{name} against Dynamo's supported parsers.
445+
# SGLang's --{name} is validated by SGLang's own argparse choices.
446+
_validate_parser(
457447
parsed_args.tool_call_parser,
458448
parsed_args.dyn_tool_call_parser,
459449
"tool-call-parser",
450+
get_tool_parser_names(),
460451
)
461-
reasoning_parser = _set_parser(
452+
_validate_parser(
462453
parsed_args.reasoning_parser,
463454
parsed_args.dyn_reasoning_parser,
464455
"reasoning-parser",
456+
get_reasoning_parser_names(),
465457
)
466-
467-
# Validate parser names when using Dynamo's tokenizer (not SGLang's)
468-
if not parsed_args.use_sglang_tokenizer:
469-
if tool_call_parser and tool_call_parser not in get_tool_parser_names():
470-
logging.error(
471-
f"Tool call parser '{tool_call_parser}' is not valid when using Dynamo's tokenizer. "
472-
f"Valid parsers are: {get_tool_parser_names()}. "
473-
f"Use --use-sglang-tokenizer to delegate tool parsing to SGLang."
474-
)
475-
sys.exit(1)
476-
if reasoning_parser and reasoning_parser not in get_reasoning_parser_names():
477-
logging.error(
478-
f"Reasoning parser '{reasoning_parser}' is not valid when using Dynamo's tokenizer. "
479-
f"Valid parsers are: {get_reasoning_parser_names()}. "
480-
f"Use --use-sglang-tokenizer to delegate reasoning parsing to SGLang."
481-
)
482-
sys.exit(1)
458+
tool_call_parser = parsed_args.dyn_tool_call_parser
459+
reasoning_parser = parsed_args.dyn_reasoning_parser
483460

484461
if parsed_args.custom_jinja_template and parsed_args.use_sglang_tokenizer:
485462
logging.error(

components/src/dynamo/sglang/tests/test_sglang_unit.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -107,17 +107,16 @@ async def test_tool_call_parser_invalid_with_dynamo_tokenizer(mock_sglang_cli):
107107

108108

109109
@pytest.mark.asyncio
110-
async def test_tool_call_parser_invalid_with_sglang_tokenizer(mock_sglang_cli):
111-
"""Invalid Dynamo parser name is allowed when using SGLang's tokenizer."""
110+
async def test_tool_call_parser_both_flags_error(mock_sglang_cli):
111+
"""Setting both --dyn-tool-call-parser and --tool-call-parser exits with error."""
112112
mock_sglang_cli(
113113
"--model",
114114
"Qwen/Qwen3-0.6B",
115115
"--dyn-tool-call-parser",
116-
"sglang_only_parser",
117-
"--use-sglang-tokenizer",
116+
"hermes",
117+
"--tool-call-parser",
118+
"qwen25",
118119
)
119120

120-
config = await parse_args(sys.argv[1:])
121-
122-
assert config.dynamo_args.tool_call_parser == "sglang_only_parser"
123-
assert config.dynamo_args.use_sglang_tokenizer is True
121+
with pytest.raises(SystemExit):
122+
await parse_args(sys.argv[1:])

0 commit comments

Comments
 (0)