synaptic_memory/
history.rs1use std::sync::Arc;
2
3use async_trait::async_trait;
4use synaptic_core::{MemoryStore, Message, RunnableConfig, SynapseError};
5use synaptic_runnables::{BoxRunnable, Runnable};
6
7pub struct RunnableWithMessageHistory {
18 inner: BoxRunnable<Vec<Message>, String>,
19 memory: Arc<dyn MemoryStore>,
20}
21
22impl RunnableWithMessageHistory {
23 pub fn new(inner: BoxRunnable<Vec<Message>, String>, memory: Arc<dyn MemoryStore>) -> Self {
25 Self { inner, memory }
26 }
27}
28
29#[async_trait]
30impl Runnable<String, String> for RunnableWithMessageHistory {
31 async fn invoke(&self, input: String, config: &RunnableConfig) -> Result<String, SynapseError> {
32 let session_id = config
34 .metadata
35 .get("session_id")
36 .and_then(|v| v.as_str())
37 .unwrap_or("default")
38 .to_string();
39
40 let mut messages = self.memory.load(&session_id).await?;
42
43 let human_msg = Message::human(&input);
45 messages.push(human_msg.clone());
46 self.memory.append(&session_id, human_msg).await?;
47
48 let output = self.inner.invoke(messages, config).await?;
50
51 let ai_msg = Message::ai(&output);
53 self.memory.append(&session_id, ai_msg).await?;
54
55 Ok(output)
56 }
57}