use anyhow::Result;
use async_trait::async_trait;
use crate::types::{BenchmarkQuestion, ConversationSession, IngestStats, RetrievalResult};
#[async_trait]
pub trait MemorySystem: Send + Sync {
fn name(&self) -> &str;
fn version(&self) -> &str;
async fn reset(&self) -> Result<()>;
async fn ingest_session(&self, session: &ConversationSession) -> Result<IngestStats>;
async fn retrieve_context(
&self,
query: &str,
query_date: Option<&str>,
token_budget: usize,
) -> Result<RetrievalResult>;
}
#[async_trait]
pub trait LLMClient: Send + Sync {
fn name(&self) -> &str;
async fn generate(&self, prompt: &str, max_tokens: usize) -> Result<String>;
async fn generate_with_seed(
&self,
prompt: &str,
max_tokens: usize,
seed: u64,
) -> Result<String> {
let _ = seed;
self.generate(prompt, max_tokens).await
}
}
pub trait BenchmarkDataset: Send + Sync {
fn name(&self) -> &str;
fn variant(&self) -> &str;
fn description(&self) -> &str;
fn questions(&self) -> &[BenchmarkQuestion];
fn question_types(&self) -> Vec<String>;
}
#[cfg(test)]
mod tests {
use super::*;
fn _assert_memory_system_object_safety(_: &dyn MemorySystem) {}
fn _assert_llm_client_object_safety(_: &dyn LLMClient) {}
fn _assert_dataset_object_safety(_: &dyn BenchmarkDataset) {}
fn _assert_boxable(
_ms: Box<dyn MemorySystem>,
_llm: Box<dyn LLMClient>,
_ds: Box<dyn BenchmarkDataset>,
) {}
}