tiny-agent 0.1.0

一个小而完整的 Rust LLM Agent 运行时:可中断、可恢复、可观测、可插拔的 agent loop / A small but complete LLM agent runtime in Rust — an interruptible, resumable, observable, pluggable agent loop.
Documentation
use crate::{error::StorageError, shared::Message};
use async_trait::async_trait;
use serde::{Deserialize, Serialize};

#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct Transcript {
    pub session_id: String,
    pub messages: Vec<Message>,
}

impl Transcript {
    pub fn new(session_id: &str) -> Self {
        Self {
            session_id: String::from(session_id),
            messages: Vec::new(),
        }
    }

    pub fn append(&mut self, message: Message) {
        self.messages.push(message);
    }
}

#[async_trait]
pub trait TranscriptStorage: Send + Sync {
    async fn save_transcript(
        &self,
        session_id: &str,
        transcript: &Transcript,
    ) -> Result<(), StorageError>;
    async fn get_transcript(&self, session_id: &str) -> Result<Option<Transcript>, StorageError>;
    async fn append_message(&self, session_id: &str, message: Message) -> Result<(), StorageError> {
        self.append_messages(session_id, vec![message]).await
    }
    async fn append_messages(
        &self,
        session_id: &str,
        messages: Vec<Message>,
    ) -> Result<(), StorageError> {
        let mut transcript = self
            .get_transcript(session_id)
            .await?
            .unwrap_or_else(|| Transcript::new(session_id));
        for message in messages {
            transcript.append(message);
        }
        self.save_transcript(session_id, &transcript).await
    }
    async fn delete_transcript(&self, session_id: &str) -> Result<(), StorageError>;
}