use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use std::fmt::Debug;
use crate::error::{EmbedError, StoreError};
use crate::types::{MetadataFilter, SearchResult, StoreStats, VectorEntry};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum TruncationStrategy {
Error,
TruncateStart,
TruncateEnd,
TruncateBoth,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EmbedPricing {
pub input_per_million: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EmbedModelInfo {
pub name: String,
pub display_name: String,
pub supported_dimensions: Option<Vec<usize>>,
pub current_dimension: usize,
pub max_input_tokens: usize,
pub max_batch_size: usize,
pub pricing: EmbedPricing,
}
#[async_trait]
pub trait EmbeddingModel: Send + Sync + Debug {
async fn embed(&self, input: &[&str]) -> Result<Vec<Vec<f32>>, EmbedError>;
async fn embed_single(&self, text: &str) -> Result<Vec<f32>, EmbedError> {
let mut results = self.embed(&[text]).await?;
if results.is_empty() {
return Err(EmbedError::Model("embed_single 返回空结果".into()));
}
Ok(results.remove(0))
}
fn model_info(&self) -> &EmbedModelInfo;
fn max_batch_size(&self) -> usize;
fn dimensions(&self) -> usize;
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum DimensionReducer {
Native(usize),
Truncate(usize),
}
impl DimensionReducer {
pub fn reduce(&self, vectors: &mut [Vec<f32>]) {
match self {
DimensionReducer::Native(_) => {
}
DimensionReducer::Truncate(n) => {
for v in vectors.iter_mut() {
v.truncate(*n);
}
}
}
}
}
#[async_trait]
pub trait VectorStore: Send + Sync + Debug {
async fn insert(&self, entry: VectorEntry) -> Result<(), StoreError>;
async fn insert_batch(&self, entries: Vec<VectorEntry>) -> Result<(), StoreError>;
async fn search(&self, query: &[f32], limit: usize) -> Result<Vec<SearchResult>, StoreError>;
async fn search_with_filter(
&self,
query: &[f32],
filter: &MetadataFilter,
limit: usize,
) -> Result<Vec<SearchResult>, StoreError>;
async fn delete(&self, ids: &[String]) -> Result<usize, StoreError>;
async fn delete_by_filter(&self, filter: &MetadataFilter) -> Result<usize, StoreError>;
async fn clear(&self) -> Result<(), StoreError>;
async fn count(&self) -> Result<usize, StoreError>;
async fn rebuild_index(&self) -> Result<(), StoreError>;
async fn stats(&self) -> Result<StoreStats, StoreError>;
}
#[async_trait]
pub trait StoreLifecycle: VectorStore {
async fn initialize(&self) -> Result<(), StoreError>;
async fn close(&self) -> Result<(), StoreError>;
async fn checkpoint(&self) -> Result<(), StoreError>;
async fn health_check(&self) -> Result<bool, StoreError>;
}
pub trait KeywordSearch: Send + Sync {
fn search(&self, query: &str, limit: usize) -> Vec<(String, f32)>;
}