1use async_trait::async_trait;
2use serde::{Deserialize, Serialize};
3use std::fmt::Debug;
4
5use crate::error::{EmbedError, StoreError};
6use crate::types::{MetadataFilter, SearchResult, StoreStats, VectorEntry};
7
8#[derive(Debug, Clone, Serialize, Deserialize)]
10pub enum TruncationStrategy {
11 Error,
13 TruncateStart,
15 TruncateEnd,
17 TruncateBoth,
19}
20
21#[derive(Debug, Clone, Serialize, Deserialize)]
23pub struct EmbedPricing {
24 pub input_per_million: f64,
26}
27
28#[derive(Debug, Clone, Serialize, Deserialize)]
30pub struct EmbedModelInfo {
31 pub name: String,
32 pub display_name: String,
33 pub supported_dimensions: Option<Vec<usize>>,
35 pub current_dimension: usize,
37 pub max_input_tokens: usize,
39 pub max_batch_size: usize,
41 pub pricing: EmbedPricing,
43}
44
45#[async_trait]
47pub trait EmbeddingModel: Send + Sync + Debug {
48 async fn embed(&self, input: &[&str]) -> Result<Vec<Vec<f32>>, EmbedError>;
50
51 async fn embed_single(&self, text: &str) -> Result<Vec<f32>, EmbedError> {
53 let mut results = self.embed(&[text]).await?;
54 if results.is_empty() {
55 return Err(EmbedError::Model("embed_single 返回空结果".into()));
56 }
57 Ok(results.remove(0))
58 }
59
60 fn model_info(&self) -> &EmbedModelInfo;
62
63 fn max_batch_size(&self) -> usize;
65
66 fn dimensions(&self) -> usize;
68}
69
70#[derive(Debug, Clone, Serialize, Deserialize)]
72pub enum DimensionReducer {
73 Native(usize),
75 Truncate(usize),
77}
78
79impl DimensionReducer {
80 pub fn reduce(&self, vectors: &mut [Vec<f32>]) {
82 match self {
83 DimensionReducer::Native(_) => {
84 }
86 DimensionReducer::Truncate(n) => {
87 for v in vectors.iter_mut() {
88 v.truncate(*n);
89 }
90 }
91 }
92 }
93}
94
95#[async_trait]
97pub trait VectorStore: Send + Sync + Debug {
98 async fn insert(&self, entry: VectorEntry) -> Result<(), StoreError>;
100
101 async fn insert_batch(&self, entries: Vec<VectorEntry>) -> Result<(), StoreError>;
103
104 async fn search(&self, query: &[f32], limit: usize) -> Result<Vec<SearchResult>, StoreError>;
106
107 async fn search_with_filter(
109 &self,
110 query: &[f32],
111 filter: &MetadataFilter,
112 limit: usize,
113 ) -> Result<Vec<SearchResult>, StoreError>;
114
115 async fn delete(&self, ids: &[String]) -> Result<usize, StoreError>;
117
118 async fn delete_by_filter(&self, filter: &MetadataFilter) -> Result<usize, StoreError>;
120
121 async fn clear(&self) -> Result<(), StoreError>;
123
124 async fn count(&self) -> Result<usize, StoreError>;
126
127 async fn rebuild_index(&self) -> Result<(), StoreError>;
129
130 async fn stats(&self) -> Result<StoreStats, StoreError>;
132}
133
134#[async_trait]
136pub trait StoreLifecycle: VectorStore {
137 async fn initialize(&self) -> Result<(), StoreError>;
139
140 async fn close(&self) -> Result<(), StoreError>;
142
143 async fn checkpoint(&self) -> Result<(), StoreError>;
145
146 async fn health_check(&self) -> Result<bool, StoreError>;
148}
149
150pub trait KeywordSearch: Send + Sync {
152 fn search(&self, query: &str, limit: usize) -> Vec<(String, f32)>;
154}