synaptic_memory/
history.rs1use std::sync::Arc;
2
3use async_trait::async_trait;
4use synaptic_core::{MemoryStore, Message, RunnableConfig, SynapticError};
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(
32 &self,
33 input: String,
34 config: &RunnableConfig,
35 ) -> Result<String, SynapticError> {
36 let session_id = config
38 .metadata
39 .get("session_id")
40 .and_then(|v| v.as_str())
41 .unwrap_or("default")
42 .to_string();
43
44 let mut messages = self.memory.load(&session_id).await?;
46
47 let human_msg = Message::human(&input);
49 messages.push(human_msg.clone());
50 self.memory.append(&session_id, human_msg).await?;
51
52 let output = self.inner.invoke(messages, config).await?;
54
55 let ai_msg = Message::ai(&output);
57 self.memory.append(&session_id, ai_msg).await?;
58
59 Ok(output)
60 }
61}