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