diff --git a/src/llm/episodic_memory.rs b/src/llm/episodic_memory.rs index 531595b7..94b08e5f 100644 --- a/src/llm/episodic_memory.rs +++ b/src/llm/episodic_memory.rs @@ -44,9 +44,9 @@ async fn process_episodic_memory( let history_to_keep = config_manager .get_config(&session.bot_id, "history-limit", Some("20")) // Respect history-limit if present - .unwrap_or_else(|_| "20".to_string()) + .unwrap_or_else(|_| "120".to_string()) .parse::() - .unwrap_or(20); + .unwrap_or(120); if threshold == 0 { continue; // Skip this session, episodic memory is disabled for this bot diff --git a/src/llm/llm_models/deepseek_r3.rs b/src/llm/llm_models/deepseek_r3.rs index a6009801..ca04b31a 100644 --- a/src/llm/llm_models/deepseek_r3.rs +++ b/src/llm/llm_models/deepseek_r3.rs @@ -6,11 +6,24 @@ static THINK_TAG_REGEX: LazyLock> = LazyLock::new(|| Regex::new(r"(?s).*?")); pub fn strip_think_tags(content: &str) -> String { - if let Ok(re) = &*THINK_TAG_REGEX { - re.replace_all(content, "").to_string() - } else { - content.to_string() + // We want to strip ... OR until end of string (streaming) + let mut result = content.to_string(); + if let Some(start_idx) = result.find("") { + if let Some(end_idx) = result[start_idx..].find("") { + // Case 1: Fully enclosed + result = format!( + "{}{}", + &result[..start_idx], + &result[start_idx + end_idx + 8..] + ); + // Recursive call to catch multiple blocks + return strip_think_tags(&result); + } else { + // Case 2: Unclosed (streaming) + result = result[..start_idx].to_string(); + } } + result } #[derive(Debug)] diff --git a/src/llm/llm_models/minimax.rs b/src/llm/llm_models/minimax.rs index 8026e070..761bdec9 100644 --- a/src/llm/llm_models/minimax.rs +++ b/src/llm/llm_models/minimax.rs @@ -3,7 +3,7 @@ use super::ModelHandler; pub fn strip_think_tags(content: &str) -> String { let mut result = content.to_string(); - // Chinese: (分析)...(/分析) + // Chinese: (分析)...(/分析) or unclosed (分析)... while let Some(start_idx) = result.find("(分析)") { if let Some(end_idx) = result[start_idx..].find("(/分析)") { result = format!( @@ -12,11 +12,13 @@ pub fn strip_think_tags(content: &str) -> String { &result[start_idx + end_idx + 4..] ); } else { + // Unclosed - strip to the end + result = result[..start_idx].to_string(); break; } } - // English: ... + // English: ... or unclosed ... while let Some(start_idx) = result.find("") { if let Some(end_idx) = result[start_idx..].find("") { result = format!( @@ -25,11 +27,13 @@ pub fn strip_think_tags(content: &str) -> String { &result[start_idx + end_idx + 8..] ); } else { + // Unclosed - strip to the end + result = result[..start_idx].to_string(); break; } } - // Chinese alternative: 【分析】...【/分析】 + // Chinese alternative: 【分析】...【/分析】 or unclosed 【分析】... while let Some(start_idx) = result.find("【分析】") { if let Some(end_idx) = result[start_idx..].find("【/分析】") { result = format!( @@ -38,6 +42,8 @@ pub fn strip_think_tags(content: &str) -> String { &result[start_idx + end_idx + 5..] ); } else { + // Unclosed - strip to the end + result = result[..start_idx].to_string(); break; } } diff --git a/src/llm/llm_models/mod.rs b/src/llm/llm_models/mod.rs index 28c9977c..965adb99 100644 --- a/src/llm/llm_models/mod.rs +++ b/src/llm/llm_models/mod.rs @@ -35,7 +35,7 @@ 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") { + } else if path.contains("minimax") || path.contains("minimax-m") || path.contains("kimi") { Box::new(minimax::MinimaxHandler::new()) } else { Box::new(PassthroughHandler)