From 9a5d559e8ed3e32569e617010620d48bf66fffac Mon Sep 17 00:00:00 2001 From: Piotr Wilkin Date: Tue, 3 Feb 2026 02:27:01 +0100 Subject: [PATCH] Fix reasoning detection --- common/chat-auto-parser-helpers.cpp | 10 ++++++++++ common/chat-auto-parser-helpers.h | 5 ++++- common/chat-diff-analyzer.cpp | 8 ++++---- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/common/chat-auto-parser-helpers.cpp b/common/chat-auto-parser-helpers.cpp index 9c345d6f6e..4bf27f1dcb 100644 --- a/common/chat-auto-parser-helpers.cpp +++ b/common/chat-auto-parser-helpers.cpp @@ -374,3 +374,13 @@ std::vector segmentize_markers(const std::string & text) { return retval; } +std::vector prune_whitespace_segments(const std::vector & segments) { + std::vector result; + for (const auto & seg : segments) { + if (!trim_whitespace(seg.value).empty()) { + result.push_back(seg); + } + } + return result; +} + diff --git a/common/chat-auto-parser-helpers.h b/common/chat-auto-parser-helpers.h index e9534d6715..445119be8e 100644 --- a/common/chat-auto-parser-helpers.h +++ b/common/chat-auto-parser-helpers.h @@ -19,4 +19,7 @@ std::string until_common_prefix(const std::string & full, const std::string & le std::string after_common_suffix(const std::string & full, const std::string & left, const std::string & right); // Segmentize text into markers and non-marker fragments -std::vector segmentize_markers(const std::string & text); \ No newline at end of file +std::vector segmentize_markers(const std::string & text); + +// Prune whitespace-only segments from a vector of segments +std::vector prune_whitespace_segments(const std::vector & segments); \ No newline at end of file diff --git a/common/chat-diff-analyzer.cpp b/common/chat-diff-analyzer.cpp index 11aa9e3175..0082e3ab77 100644 --- a/common/chat-diff-analyzer.cpp +++ b/common/chat-diff-analyzer.cpp @@ -287,7 +287,7 @@ void differential_analyzer::compare_reasoning_presence(const common_chat_templat const std::string reasoning_content = "Let me think about this."; if (!diff.right.empty() && diff.right.find(reasoning_content) != std::string::npos) { - auto seg = segmentize_markers(diff.right); + auto seg = prune_whitespace_segments(segmentize_markers(diff.right)); if (seg.size() >= 3 && trim_whitespace(seg[1].value) == reasoning_content) { // easy one: opening marker - reasoning - closing marker (possibly with trailing whitespace) result.reasoning = reasoning_mode::TAG_BASED; @@ -312,10 +312,10 @@ void differential_analyzer::compare_reasoning_presence(const common_chat_templat // right: reasoning_content // suffix: content // prefix: ... - auto suf_seg = segmentize_markers(diff.suffix); + auto suf_seg = prune_whitespace_segments(segmentize_markers(diff.suffix)); if (trim_whitespace(diff.left).empty() && suf_seg.size() >= 2 && suf_seg[0].type == segment_type::MARKER && trim_whitespace(suf_seg[1].value).substr(0, 11) == "I can help.") { - auto pre_seg = segmentize_markers(diff.prefix); + auto pre_seg = prune_whitespace_segments(segmentize_markers(diff.prefix)); if (pre_seg[pre_seg.size() - 1].type == segment_type::MARKER || (pre_seg.size() > 1 && trim_whitespace(pre_seg[pre_seg.size() - 1].value).empty() && pre_seg[pre_seg.size() - 2].type == segment_type::MARKER)) { @@ -577,7 +577,7 @@ void differential_analyzer::compare_content_values(const common_chat_template & LOG_DBG("C1: No content markers\n"); result.content = content_mode::PLAIN; found_plain_content = true; - } else if (result.reasoning == reasoning_mode::FORCED_CLOSED && + } else if (result.reasoning != reasoning_mode::NONE && !result.markers.reasoning_end.empty() && diff_reasoning.left.find(result.markers.reasoning_end) != std::string::npos) { std::string post_closed_reasoning = diff_reasoning.left.substr( diff_reasoning.left.find(result.markers.reasoning_end) + result.markers.reasoning_end.length());