From b4f4c5e01374945b5ed87db123ea522cdf58b2a7 Mon Sep 17 00:00:00 2001 From: Ben Browning Date: Thu, 18 Jun 2026 11:04:02 +0000 Subject: [PATCH] [Bugfix] [Parser] Fix Qwen3 partial param regex dropping values containing < _PARTIAL_PARAM_RE used [^<]*$ to capture in-progress parameter content. When a value contained a literal < (HTML, code, math like x<5), the regex failed to match entirely, silently dropping the parameter during streaming. Fix by changing [^<]*$ to (.*)$ so the capture group accepts any character including <. Co-Authored-By: Claude Signed-off-by: Ben Browning --- tests/parser/engine/test_qwen3.py | 18 ++++++++++++++++++ vllm/parser/qwen3.py | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/tests/parser/engine/test_qwen3.py b/tests/parser/engine/test_qwen3.py index 7c2255ac7b2b..06784212e1b7 100644 --- a/tests/parser/engine/test_qwen3.py +++ b/tests/parser/engine/test_qwen3.py @@ -615,6 +615,24 @@ def test_partial_multiline(self): assert result["command"] == "ls -la" assert result["desc"] == "\npartial value" + def test_partial_value_with_angle_bracket(self): + from vllm.parser.qwen3 import ( + _qwen3_arg_converter, + ) + + raw = "x<5" + result = json.loads(_qwen3_arg_converter(raw, partial=True)) + assert result == {"expr": "x<5"} + + def test_partial_value_with_angle_bracket_and_complete_param(self): + from vllm.parser.qwen3 import ( + _qwen3_arg_converter, + ) + + raw = "Tokyo\nx<5" + result = json.loads(_qwen3_arg_converter(raw, partial=True)) + assert result == {"city": "Tokyo", "expr": "x<5"} + class TestSchemaAwareTypeCoercion: """Verify that _fix_arg_types corrects miscoerced values using the diff --git a/vllm/parser/qwen3.py b/vllm/parser/qwen3.py index ed47b1b9254d..45e3c7e43255 100644 --- a/vllm/parser/qwen3.py +++ b/vllm/parser/qwen3.py @@ -49,7 +49,7 @@ r"(?:<\s*/\s*parameter\s*>|(?=<\s*parameter\s*=))", re.DOTALL, ) -_PARTIAL_PARAM_RE = re.compile(r"<\s*parameter\s*=\s*([^>]+)>([^<]*)$", re.DOTALL) +_PARTIAL_PARAM_RE = re.compile(r"<\s*parameter\s*=\s*([^>]+)>(.*)$", re.DOTALL) def _qwen3_arg_converter(raw_args: str, partial: bool) -> str: