From a5d1ff664027b79af869c3a5d186ba999ee76ce5 Mon Sep 17 00:00:00 2001 From: shuwudow Date: Wed, 15 Jul 2026 18:44:17 +0300 Subject: [PATCH] fix(tool_parsing): `\|?end\|?` (Qwen bare-marker regex strips) make `\nend\n` disappear Chat messages that have end statements, for example in the context of coding languages, cut off the "\nend\n" part which is not seen in front-end. Changed similar function parsing lines in both tool_parsing.py and in chatRenderer.js. Fix: require the pipes (`|end|`) so only Qwen's actual turn marker matches. The `|end|` and `/|end|` cases still strip correctly, so Qwen artifact cleanup SHOULD be left unchanged. --- src/tool_parsing.py | 2 +- static/js/chatRenderer.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tool_parsing.py b/src/tool_parsing.py index df60881fdc..21251b28f3 100644 --- a/src/tool_parsing.py +++ b/src/tool_parsing.py @@ -188,7 +188,7 @@ def _strip_executed_fence(m) -> str: _FUNCTION_MODEL_PARAMS_CLOSE_RE = re.compile(r"", re.IGNORECASE) _QWEN_ROLE_MARKER_RE = re.compile(r"?|?", re.IGNORECASE) _QWEN_BARE_MARKER_RE = re.compile( - r"(?:^|[\t\r\n ])(?:\|?end\|?|/?\|end\|)(?=[\t\r\n ]|$)|" + r"(?:^|[\t\r\n ])(?:\|end\||/?\|end\|)(?=[\t\r\n ]|$)|" r"(?:^|[\t\r\n ])assistan(?:t)?(?=[\t\r\n ]|$)", re.IGNORECASE, ) diff --git a/static/js/chatRenderer.js b/static/js/chatRenderer.js index 82e4c2b5b5..9466b23c94 100644 --- a/static/js/chatRenderer.js +++ b/static/js/chatRenderer.js @@ -477,7 +477,7 @@ const DSML_STRAY_RE = /<\s*\/?\s*[||]+\s*DSML\s*[||]+[^>]*>/gi; const DSML_INVOKE_RE = /<\s*[||]+\s*DSML\s*[||]+\s*invoke\b[^>]*>[\s\S]*?(?:<\s*\/\s*[||]+\s*DSML\s*[||]+\s*invoke\s*>|$)/gi; const RAW_OPENAI_TOOL_JSON_RE = /(?:\[\s*)?\{\s*"function"\s*:\s*\{[\s\S]*?\}\s*,\s*"id"\s*:\s*"[^"]*"\s*,\s*"type"\s*:\s*"function"\s*\}\s*\]?/gi; const QWEN_ROLE_MARKER_RE = /<\/?\|(?:assistant|assistan|user|system|tool)\|>?|<\/\|end\|>?/gi; -const QWEN_BARE_MARKER_RE = /(?:^|[\t\r\n ])(?:\|?end\|?|\/?\|end\|)(?=[\t\r\n ]|$)|(?:^|[\t\r\n ])assistan(?:t)?(?=[\t\r\n ]|$)/gi; +const QWEN_BARE_MARKER_RE = /(?:^|[\t\r\n ])(?:\|end\||\/?\|end\|)(?=[\t\r\n ]|$)|(?:^|[\t\r\n ])assistan(?:t)?(?=[\t\r\n ]|$)/gi; // Self-narration about tool results (model echoing stdout/exit_code) const TOOL_NARRATION_RE = /(?:The (?:result|output) shows?:?\s*)?-?\s*(?:stdout|stderr|exit_code):\s*.+/gi;