Skip to main content

feox_vector/
model.rs

1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5
6pub type VectorMetadata = BTreeMap<String, Value>;
7
8#[derive(Debug, Clone, Serialize, Deserialize)]
9#[serde(rename_all = "camelCase")]
10pub struct VectorRecord {
11    pub id: String,
12    pub values: Vec<f32>,
13    #[serde(default)]
14    pub metadata: VectorMetadata,
15    pub created_at_ms: u64,
16    pub updated_at_ms: u64,
17}
18
19#[derive(Debug, Clone, Deserialize)]
20#[serde(rename_all = "camelCase")]
21pub struct VectorUpsertRecord {
22    pub id: String,
23    pub values: Vec<f32>,
24    #[serde(default)]
25    pub metadata: VectorMetadata,
26}
27
28#[derive(Debug, Clone, Deserialize)]
29#[serde(rename_all = "camelCase")]
30pub struct VectorUpsertInput {
31    pub records: Vec<VectorUpsertRecord>,
32}
33
34#[derive(Debug, Clone, Serialize)]
35#[serde(rename_all = "camelCase")]
36pub struct VectorUpsertResult {
37    pub upserted: usize,
38}
39
40#[derive(Debug, Clone, Deserialize)]
41#[serde(rename_all = "camelCase")]
42pub struct VectorQueryInput {
43    pub vector: Vec<f32>,
44    pub top_k: Option<usize>,
45    #[serde(default)]
46    pub filter: VectorMetadata,
47    pub min_score: Option<f32>,
48    pub mode: Option<VectorQueryMode>,
49    pub ef_search: Option<usize>,
50    pub candidate_limit: Option<usize>,
51}
52
53#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize)]
54#[serde(rename_all = "camelCase")]
55pub enum VectorQueryMode {
56    Exact,
57    Ann,
58}
59
60#[derive(Debug, Clone, Serialize)]
61#[serde(rename_all = "camelCase")]
62pub struct VectorMatch {
63    pub id: String,
64    pub score: f32,
65    #[serde(default)]
66    pub metadata: VectorMetadata,
67}
68
69#[derive(Debug, Clone, Serialize)]
70#[serde(rename_all = "camelCase")]
71pub struct VectorQueryResult {
72    pub matches: Vec<VectorMatch>,
73}
74
75#[derive(Debug, Clone, Deserialize)]
76#[serde(rename_all = "camelCase")]
77pub struct VectorDeleteInput {
78    pub ids: Vec<String>,
79}
80
81#[derive(Debug, Clone, Serialize)]
82#[serde(rename_all = "camelCase")]
83pub struct VectorDeleteResult {
84    pub deleted: usize,
85}
86
87#[derive(Debug, thiserror::Error)]
88pub enum VectorError {
89    #[error("store error: {0}")]
90    Store(#[from] crate::storage::StoreError),
91    #[error("ann error: {0}")]
92    Ann(#[from] feox_ann::AnnError),
93    #[error("json error: {0}")]
94    Json(#[from] serde_json::Error),
95    #[error("invalid vector operation: {0}")]
96    Invalid(String),
97}