nodedb_types/
vector_model.rs1use serde::{Deserialize, Serialize};
10
11#[derive(
16 Debug, Clone, Serialize, Deserialize, zerompk::ToMessagePack, zerompk::FromMessagePack,
17)]
18pub struct VectorModelMetadata {
19 pub model: String,
21 pub dimensions: usize,
23 pub created_at: String,
25 #[serde(default)]
28 pub strict_dimensions: bool,
29}
30
31#[derive(
36 Debug, Clone, Serialize, Deserialize, zerompk::ToMessagePack, zerompk::FromMessagePack,
37)]
38pub struct VectorModelEntry {
39 pub database_id: u64,
41 pub tenant_id: u64,
43 pub collection: String,
45 pub column: String,
47 pub metadata: VectorModelMetadata,
49}
50
51#[cfg(test)]
52mod tests {
53 use super::*;
54
55 #[test]
56 fn serde_roundtrip() {
57 let entry = VectorModelEntry {
58 database_id: 5,
59 tenant_id: 1,
60 collection: "chunks".into(),
61 column: "embedding".into(),
62 metadata: VectorModelMetadata {
63 model: "text-embedding-3-large".into(),
64 dimensions: 1536,
65 created_at: "2026-03-01".into(),
66 strict_dimensions: false,
67 },
68 };
69 let bytes = zerompk::to_msgpack_vec(&entry).unwrap();
70 let restored: VectorModelEntry = zerompk::from_msgpack(&bytes).unwrap();
71 assert_eq!(restored.database_id, 5);
72 assert_eq!(restored.metadata.model, "text-embedding-3-large");
73 assert_eq!(restored.metadata.dimensions, 1536);
74 assert!(!restored.metadata.strict_dimensions);
75 }
76
77 #[test]
78 fn strict_dimensions_default_false() {
79 let meta = VectorModelMetadata {
81 model: "test".into(),
82 dimensions: 128,
83 created_at: "2026-01-01".into(),
84 strict_dimensions: false,
85 };
86 let bytes = zerompk::to_msgpack_vec(&meta).unwrap();
87 let restored: VectorModelMetadata = zerompk::from_msgpack(&bytes).unwrap();
88 assert!(!restored.strict_dimensions);
89 }
90}