From 2c82a8bd2e1a688150fd6490dc0ace83c6ca907c Mon Sep 17 00:00:00 2001 From: "Rodrigo Rodriguez (Pragmatismo)" Date: Mon, 13 Apr 2026 21:17:01 -0300 Subject: [PATCH] fix: add MinimaxHandler to strip thinking tags from content --- src/llm/llm_models/minimax.rs | 47 +++++++++++++++++++++++++++++++++++ src/llm/llm_models/mod.rs | 3 +++ 2 files changed, 50 insertions(+) create mode 100644 src/llm/llm_models/minimax.rs diff --git a/src/llm/llm_models/minimax.rs b/src/llm/llm_models/minimax.rs new file mode 100644 index 00000000..02745648 --- /dev/null +++ b/src/llm/llm_models/minimax.rs @@ -0,0 +1,47 @@ +use super::ModelHandler; +use regex::Regex; +use std::sync::LazyLock; + +static THINK_REGEX: LazyLock> = + LazyLock::new(|| Regex::new(r"(?s)(分析).*?(/分析)")); +static THINK_REGEX2: LazyLock> = + LazyLock::new(|| Regex::new(r"(?s).*?")); +static THINK_REGEX3: LazyLock> = + LazyLock::new(|| Regex::new(r"(?s)【分析】.*?【/分析】")); + +pub fn strip_think_tags(content: &str) -> String { + let mut result = content.to_string(); + if let Ok(re) = &*THINK_REGEX { + result = re.replace_all(&result, "").to_string(); + } + if let Ok(re) = &*THINK_REGEX2 { + result = re.replace_all(&result, "").to_string(); + } + if let Ok(re) = &*THINK_REGEX3 { + result = re.replace_all(&result, "").to_string(); + } + result +} + +#[derive(Debug)] +pub struct MinimaxHandler; + +impl MinimaxHandler { + pub fn new() -> Self { + Self + } +} + +impl ModelHandler for MinimaxHandler { + fn is_analysis_complete(&self, buffer: &str) -> bool { + buffer.contains("(/分析)") || buffer.contains("") || buffer.contains("【/分析】") + } + + fn process_content(&self, content: &str) -> String { + strip_think_tags(content) + } + + fn has_analysis_markers(&self, buffer: &str) -> bool { + buffer.contains("(分析)") || buffer.contains("") || buffer.contains("【分析】") + } +} diff --git a/src/llm/llm_models/mod.rs b/src/llm/llm_models/mod.rs index 873316a1..28c9977c 100644 --- a/src/llm/llm_models/mod.rs +++ b/src/llm/llm_models/mod.rs @@ -1,6 +1,7 @@ pub mod deepseek_r3; pub mod gpt_oss_120b; pub mod gpt_oss_20b; +pub mod minimax; pub trait ModelHandler: Send + Sync { fn is_analysis_complete(&self, buffer: &str) -> bool; @@ -34,6 +35,8 @@ pub fn get_handler(model_path: &str) -> Box { Box::new(gpt_oss_120b::GptOss120bHandler::new()) } else if path.contains("20b") { Box::new(gpt_oss_20b::GptOss20bHandler) + } else if path.contains("minimax") || path.contains("minimax-m") { + Box::new(minimax::MinimaxHandler::new()) } else { Box::new(PassthroughHandler) }