tiny_agent/transcript/
mod.rs1use 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}