use std::collections::HashMap;
use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use serde_json;
use crate::core::{ScopeIdentifiers, StoredFact};
use crate::error::Result;
use crate::vector_store::base::Filters;
pub mod semantic;
#[async_trait]
pub trait ResultReranker: Send + Sync {
async fn rerank(
&self,
query: &str,
facts: Vec<StoredFact>,
limit: Option<usize>,
) -> Result<Vec<StoredFact>>;
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum MemoryKind {
Semantic,
Episodic,
Procedural,
}
#[derive(Debug, Clone)]
pub struct SearchRequest {
pub query: String,
pub scope: ScopeIdentifiers,
pub limit: usize,
pub filters: Option<Filters>,
pub rerank: bool,
pub kind: MemoryKind,
}
impl SearchRequest {
pub fn new(query: impl Into<String>, scope: ScopeIdentifiers, limit: usize) -> Self {
Self {
query: query.into(),
scope,
limit,
filters: None,
rerank: false,
kind: MemoryKind::Semantic,
}
}
pub fn with_filters(mut self, filters: HashMap<String, serde_json::Value>) -> Self {
self.filters = Some(filters);
self
}
pub fn with_rerank(mut self, rerank: bool) -> Self {
self.rerank = rerank;
self
}
pub fn with_kind(mut self, kind: MemoryKind) -> Self {
self.kind = kind;
self
}
}
#[derive(Debug, Clone)]
pub struct SearchResult {
pub facts: Vec<StoredFact>,
}
impl SearchResult {
pub fn new(facts: Vec<StoredFact>) -> Self {
Self { facts }
}
pub fn truncate(&mut self, limit: usize) {
self.facts.truncate(limit);
}
}
#[async_trait]
pub trait MemorySearch: Send + Sync {
async fn search(&self, request: SearchRequest) -> Result<SearchResult>;
}