@tduncan / Nvidia-Optimization-Stack-VLLM Mirror · read-only / commits / c662b4359e
Fork 0

A high-throughput and memory-efficient inference and serving engine for LLMs

Mirrored from https://github.com/tduncan-lum/Nvidia-Optimization-Stack---VLLM.git

Synced Nov 4, 17:30 UTC

[Bugfix] Avoid mutating `chat_template_kwargs` in `HYV3ReasoningParser` initialization (#40713)

Signed-off-by: Bugen Zhao <i@bugenzhao.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

Bugen Zhao committed Apr 24, 2026 at 13:08 UTC c662b4359e307f422e507230d2e20e2303610b6a
2 files changed +37 -2
tests/reasoning/test_hy_v3_reasoning_parser.py
+31
@@ -4,6 +4,7 @@ import pytest
4
5 from tests.reasoning.utils import run_reasoning_extraction
6 from vllm.reasoning import ReasoningParser, ReasoningParserManager
7 +from vllm.reasoning.hy_v3_reasoning_parser import HYV3ReasoningParser
8 from vllm.tokenizers import get_tokenizer
9
10 parser_name = "hy_v3"
@@ -241,3 +242,33 @@ def test_is_reasoning_end_full_prompt(
242 token_ids = hy_v3_tokenizer.convert_tokens_to_ids(tokens)
243 check_is_reasoning_end = parser.is_reasoning_end(token_ids)
244 assert check_is_reasoning_end == is_reasoning_end
245 +
246 +
247 +def test_constructor_does_not_mutate_shared_chat_template_kwargs(hy_v3_tokenizer):
248 + parser_cls = ReasoningParserManager.get_reasoning_parser(parser_name)
249 + chat_template_kwargs = {"reasoning_effort": "low"}
250 +
251 + first_parser: ReasoningParser = parser_cls(
252 + hy_v3_tokenizer,
253 + chat_template_kwargs=chat_template_kwargs,
254 + )
255 + second_parser: ReasoningParser = parser_cls(
256 + hy_v3_tokenizer,
257 + chat_template_kwargs=chat_template_kwargs,
258 + )
259 +
260 + assert chat_template_kwargs == {"reasoning_effort": "low"}
261 + assert isinstance(first_parser, HYV3ReasoningParser)
262 + assert isinstance(second_parser, HYV3ReasoningParser)
263 + assert first_parser._identity_parser is None
264 + assert second_parser._identity_parser is None
265 +
266 +
267 +def test_constructor_falls_back_to_outer_reasoning_effort(hy_v3_tokenizer):
268 + parser: ReasoningParser = ReasoningParserManager.get_reasoning_parser(parser_name)(
269 + hy_v3_tokenizer,
270 + reasoning_effort="low",
271 + )
272 +
273 + assert isinstance(parser, HYV3ReasoningParser)
274 + assert parser._identity_parser is None
vllm/reasoning/hy_v3_reasoning_parser.py
+6 -2
@@ -34,8 +34,12 @@ class HYV3ReasoningParser(BaseThinkingReasoningParser):
34 # at the outer level of the chat message.
35 # Otherwise, If both are empty, assign "no_think".
36
37 - chat_kwargs = kwargs.pop("chat_template_kwargs", {}) or {}
38 - reasoning_effort = chat_kwargs.pop("reasoning_effort", "no_think")
37 + chat_kwargs = kwargs.get("chat_template_kwargs", {}) or {}
38 + reasoning_effort = (
39 + chat_kwargs.get("reasoning_effort")
40 + or kwargs.get("reasoning_effort")
41 + or "no_think"
42 + )
43
44 logger.debug("reasoning_effort for choosing parser: %s", reasoning_effort)
45