Skip to main content

tiny_agent/transcript/
mod.rs

1use crate::{error::StorageError, shared::Message};
2use async_trait::async_trait;
3use serde::{Deserialize, Serialize};
4
5#[derive(Deserialize, Serialize, Debug, Clone)]
6pub struct Transcript {
7    pub session_id: String,
8    pub messages: Vec<Message>,
9}
10
11impl Transcript {
12    pub fn new(session_id: &str) -> Self {
13        Self {
14            session_id: String::from(session_id),
15            messages: Vec::new(),
16        }
17    }
18
19    pub fn append(&mut self, message: Message) {
20        self.messages.push(message);
21    }
22}
23
24#[async_trait]
25pub trait TranscriptStorage: Send + Sync {
26    async fn save_transcript(
27        &self,
28        session_id: &str,
29        transcript: &Transcript,
30    ) -> Result<(), StorageError>;
31    async fn get_transcript(&self, session_id: &str) -> Result<Option<Transcript>, StorageError>;
32    async fn append_message(&self, session_id: &str, message: Message) -> Result<(), StorageError> {
33        self.append_messages(session_id, vec![message]).await
34    }
35    async fn append_messages(
36        &self,
37        session_id: &str,
38        messages: Vec<Message>,
39    ) -> Result<(), StorageError> {
40        let mut transcript = self
41            .get_transcript(session_id)
42            .await?
43            .unwrap_or_else(|| Transcript::new(session_id));
44        for message in messages {
45            transcript.append(message);
46        }
47        self.save_transcript(session_id, &transcript).await
48    }
49    async fn delete_transcript(&self, session_id: &str) -> Result<(), StorageError>;
50}