use async_trait::async_trait;
use crate::attribute::AttributeValue;
use crate::error::Result;
use crate::memory::{MemoryId, MemoryKind};
use crate::partition::PartitionPath;
use crate::summarizer::SummaryStyle;
use crate::summary::SummaryId;
#[non_exhaustive]
#[derive(Debug, Clone)]
pub enum VectorScope {
Tenant,
Partition(PartitionPath),
PartitionPrefix(String),
}
#[non_exhaustive]
#[derive(Debug, Clone)]
pub struct VectorFilter {
pub key: String,
pub value: AttributeValue,
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DistanceMetric {
CosineDistance,
L2Distance,
}
#[non_exhaustive]
#[derive(Debug, Clone)]
pub struct VectorIndexCapabilities {
pub knn_filtered: bool,
pub max_dimensions: usize,
pub distance_metric: DistanceMetric,
}
impl Default for VectorIndexCapabilities {
fn default() -> Self {
Self {
knn_filtered: false,
max_dimensions: 4096,
distance_metric: DistanceMetric::CosineDistance,
}
}
}
#[async_trait]
pub trait VectorIndex: Send + Sync + std::fmt::Debug + 'static {
async fn upsert_memory(
&self,
id: &MemoryId,
partition_path: &PartitionPath,
kind: Option<&MemoryKind>,
embedding: &[f32],
) -> Result<()>;
async fn upsert_summary(
&self,
id: &SummaryId,
parent_path: &str,
style: &SummaryStyle,
embedding: &[f32],
) -> Result<()>;
async fn delete_memory(&self, id: &MemoryId) -> Result<()>;
async fn delete_summary(&self, id: &SummaryId) -> Result<()>;
async fn knn_memory(
&self,
query: &[f32],
k: u32,
scope: VectorScope,
filter: Option<&VectorFilter>,
) -> Result<Vec<(MemoryId, f32)>>;
async fn knn_summary(
&self,
query: &[f32],
k: u32,
parent_path_prefix: &str,
) -> Result<Vec<(SummaryId, f32)>>;
fn id(&self) -> &str;
fn capabilities(&self) -> VectorIndexCapabilities;
}