rexis_rag/agent/
legacy_memory.rs

1//! Conversation memory management (legacy in-memory implementation)
2
3use rexis_llm::{ChatMessage, MessageRole};
4
5/// Manages conversation history for the agent
6#[derive(Debug, Clone)]
7pub struct ConversationMemory {
8    messages: Vec<ChatMessage>,
9    max_length: usize,
10}
11
12impl ConversationMemory {
13    /// Create a new conversation memory
14    pub fn new() -> Self {
15        Self {
16            messages: Vec::new(),
17            max_length: 50,
18        }
19    }
20
21    /// Create with custom max length
22    pub fn with_max_length(max_length: usize) -> Self {
23        Self {
24            messages: Vec::new(),
25            max_length,
26        }
27    }
28
29    /// Add a message to history
30    pub fn add_message(&mut self, message: ChatMessage) {
31        self.messages.push(message);
32
33        // Trim if exceeds max length (keep system message)
34        if self.messages.len() > self.max_length {
35            let system_msg = self.messages.first().cloned();
36            self.messages
37                .drain(1..self.messages.len() - self.max_length + 1);
38            if let Some(sys_msg) = system_msg {
39                if matches!(sys_msg.role, MessageRole::System) {
40                    // System message was removed, restore it
41                    if !matches!(self.messages.first().unwrap().role, MessageRole::System) {
42                        self.messages.insert(0, sys_msg);
43                    }
44                }
45            }
46        }
47    }
48
49    /// Get all messages
50    pub fn get_messages(&self) -> &[ChatMessage] {
51        &self.messages
52    }
53
54    /// Get messages as owned Vec
55    pub fn to_messages(&self) -> Vec<ChatMessage> {
56        self.messages.clone()
57    }
58
59    /// Clear all messages except system
60    pub fn clear(&mut self) {
61        let system_msg = self
62            .messages
63            .iter()
64            .find(|m| matches!(m.role, MessageRole::System))
65            .cloned();
66
67        self.messages.clear();
68
69        if let Some(msg) = system_msg {
70            self.messages.push(msg);
71        }
72    }
73
74    /// Get number of messages
75    pub fn len(&self) -> usize {
76        self.messages.len()
77    }
78
79    /// Check if empty
80    pub fn is_empty(&self) -> bool {
81        self.messages.is_empty()
82    }
83}
84
85impl Default for ConversationMemory {
86    fn default() -> Self {
87        Self::new()
88    }
89}