rexis_rag/agent/
legacy_memory.rs1use rexis_llm::{ChatMessage, MessageRole};
4
5#[derive(Debug, Clone)]
7pub struct ConversationMemory {
8 messages: Vec<ChatMessage>,
9 max_length: usize,
10}
11
12impl ConversationMemory {
13 pub fn new() -> Self {
15 Self {
16 messages: Vec::new(),
17 max_length: 50,
18 }
19 }
20
21 pub fn with_max_length(max_length: usize) -> Self {
23 Self {
24 messages: Vec::new(),
25 max_length,
26 }
27 }
28
29 pub fn add_message(&mut self, message: ChatMessage) {
31 self.messages.push(message);
32
33 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 if !matches!(self.messages.first().unwrap().role, MessageRole::System) {
42 self.messages.insert(0, sys_msg);
43 }
44 }
45 }
46 }
47 }
48
49 pub fn get_messages(&self) -> &[ChatMessage] {
51 &self.messages
52 }
53
54 pub fn to_messages(&self) -> Vec<ChatMessage> {
56 self.messages.clone()
57 }
58
59 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 pub fn len(&self) -> usize {
76 self.messages.len()
77 }
78
79 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}