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#[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}