Skip to main content

nuro_memory/
conversation.rs

1use nuro_core::message::Message;
2
3/// 简单的对话记忆:仅按消息条数做 FIFO 截断,不涉及 token 计算。
4#[derive(Debug, Clone)]
5pub struct ConversationMemory {
6    max_messages: usize,
7    messages: Vec<Message>,
8}
9
10impl ConversationMemory {
11    /// 创建一个新的对话记忆实例。
12    pub fn new(max_messages: usize) -> Self {
13        Self {
14            max_messages,
15            messages: Vec::new(),
16        }
17    }
18
19    /// 当前配置的最大消息条数。
20    pub fn max_messages(&self) -> usize {
21        self.max_messages
22    }
23
24    /// 追加一条消息,并在必要时从头部丢弃旧消息以满足 `max_messages` 约束。
25    pub fn push(&mut self, message: Message) {
26        self.messages.push(message);
27        self.truncate_if_needed();
28    }
29
30    fn truncate_if_needed(&mut self) {
31        if self.messages.len() > self.max_messages {
32            let overflow = self.messages.len() - self.max_messages;
33            self.messages.drain(0..overflow);
34        }
35    }
36
37    /// 以切片形式返回当前所有记忆中的消息(按时间顺序)。
38    pub fn messages(&self) -> &[Message] {
39        &self.messages
40    }
41}