use crate::error::ModelResult;
use hippmem_core::ids::MemoryId;
use hippmem_core::model::understanding::{
CausalClaim, ContradictionHint, DecisionFrame, EmotionFrame, EntityMention, GoalFrame,
PreferenceFrame, TopicTag,
};
use hippmem_core::model::unit::{ContentType, Language, MemoryContent};
use hippmem_core::score::UnitScore;
#[async_trait::async_trait]
pub trait Embedder: Send + Sync {
fn dim(&self) -> usize;
async fn embed(&self, texts: &[String]) -> ModelResult<Vec<Vec<f32>>>;
fn embed_sync(&self, texts: &[String]) -> ModelResult<Vec<Vec<f32>>>;
fn backend_id(&self) -> &str;
}
#[async_trait::async_trait]
pub trait Extractor: Send + Sync {
async fn extract_immediate(&self, content: &MemoryContent) -> ModelResult<ImmediateExtraction>;
async fn extract_strong(&self, content: &MemoryContent) -> ModelResult<StrongExtraction>;
fn backend_id(&self) -> &str;
}
#[async_trait::async_trait]
pub trait Reranker: Send + Sync {
async fn rerank(&self, query: &str, candidates: &[String]) -> ModelResult<Vec<f32>>;
fn backend_id(&self) -> &str;
}
#[async_trait::async_trait]
pub trait Summarizer: Send + Sync {
async fn summarize(&self, sources: &[SummarizeInput]) -> ModelResult<SummaryOutput>;
fn backend_id(&self) -> &str;
}
#[derive(Debug, Clone)]
pub struct ImmediateExtraction {
pub entities: Vec<EntityMention>,
pub topics: Vec<TopicTag>,
pub explicit_causals: Vec<CausalClaim>,
pub language: Language,
pub content_type: Option<ContentType>,
pub importance: UnitScore,
}
#[derive(Debug, Clone)]
pub struct StrongExtraction {
pub goals: Vec<GoalFrame>,
pub preferences: Vec<PreferenceFrame>,
pub emotions: Vec<EmotionFrame>,
pub decisions: Vec<DecisionFrame>,
pub implicit_causals: Vec<CausalClaim>,
pub contradictions: Vec<ContradictionHint>,
pub confidence: UnitScore,
}
#[derive(Debug, Clone)]
pub struct SummarizeInput {
pub id: MemoryId,
pub text: String,
}
#[derive(Debug, Clone)]
pub struct SummaryOutput {
pub summary: String,
pub covers: Vec<MemoryId>,
pub confidence: UnitScore,
}