Skip to main content

synaptic_memory/
lib.rs

1mod buffer;
2mod file_history;
3mod history;
4mod summary;
5mod summary_buffer;
6mod token_buffer;
7mod window;
8
9pub use buffer::ConversationBufferMemory;
10pub use file_history::FileChatMessageHistory;
11pub use history::RunnableWithMessageHistory;
12pub use summary::ConversationSummaryMemory;
13pub use summary_buffer::ConversationSummaryBufferMemory;
14pub use token_buffer::ConversationTokenBufferMemory;
15pub use window::ConversationWindowMemory;
16
17use std::{collections::HashMap, sync::Arc};
18
19use async_trait::async_trait;
20use synaptic_core::{MemoryStore, Message, SynapticError};
21use tokio::sync::RwLock;
22
23/// In-memory implementation of `MemoryStore`, storing messages keyed by session ID.
24#[derive(Default, Clone)]
25pub struct InMemoryStore {
26    sessions: Arc<RwLock<HashMap<String, Vec<Message>>>>,
27}
28
29impl InMemoryStore {
30    pub fn new() -> Self {
31        Self::default()
32    }
33}
34
35#[async_trait]
36impl MemoryStore for InMemoryStore {
37    async fn append(&self, session_id: &str, message: Message) -> Result<(), SynapticError> {
38        let mut sessions = self.sessions.write().await;
39        let session = sessions.entry(session_id.to_string()).or_default();
40        session.push(message);
41        Ok(())
42    }
43
44    async fn load(&self, session_id: &str) -> Result<Vec<Message>, SynapticError> {
45        let sessions = self.sessions.read().await;
46        Ok(sessions.get(session_id).cloned().unwrap_or_default())
47    }
48
49    async fn clear(&self, session_id: &str) -> Result<(), SynapticError> {
50        let mut sessions = self.sessions.write().await;
51        sessions.remove(session_id);
52        Ok(())
53    }
54}