1use std::time::Duration;
8
9#[derive(Debug, Clone)]
30pub struct MemoryConfig {
31 pub core_memory_bytes: usize,
35
36 pub working_memory_bytes: usize,
40
41 pub working_memory_ttl: Duration,
45
46 pub generate_embeddings: bool,
50
51 pub embedding_batch_size: usize,
55
56 pub default_recall_limit: usize,
60
61 pub semantic_search_enabled: bool,
65
66 pub query_expansion_enabled: bool,
70}
71
72impl Default for MemoryConfig {
73 fn default() -> Self {
74 Self {
75 core_memory_bytes: 32 * 1024, working_memory_bytes: 1024 * 1024, working_memory_ttl: Duration::from_secs(3600), generate_embeddings: true,
79 embedding_batch_size: 100,
80 default_recall_limit: 10,
81 semantic_search_enabled: true,
82 query_expansion_enabled: true,
83 }
84 }
85}
86
87impl MemoryConfig {
88 #[must_use]
90 pub fn new() -> Self {
91 Self::default()
92 }
93
94 #[must_use]
99 pub fn with_core_memory_bytes(mut self, bytes: usize) -> Self {
100 self.core_memory_bytes = bytes;
101 self
102 }
103
104 #[must_use]
109 pub fn with_working_memory_bytes(mut self, bytes: usize) -> Self {
110 self.working_memory_bytes = bytes;
111 self
112 }
113
114 #[must_use]
119 pub fn with_working_memory_ttl(mut self, ttl: Duration) -> Self {
120 self.working_memory_ttl = ttl;
121 self
122 }
123
124 #[must_use]
129 pub fn with_recall_limit(mut self, limit: usize) -> Self {
130 self.default_recall_limit = limit;
131 self
132 }
133
134 #[must_use]
139 pub fn with_embedding_batch_size(mut self, size: usize) -> Self {
140 self.embedding_batch_size = size;
141 self
142 }
143
144 #[must_use]
146 pub fn without_embeddings(mut self) -> Self {
147 self.generate_embeddings = false;
148 self
149 }
150
151 #[must_use]
153 pub fn without_semantic_search(mut self) -> Self {
154 self.semantic_search_enabled = false;
155 self
156 }
157
158 #[must_use]
160 pub fn without_query_expansion(mut self) -> Self {
161 self.query_expansion_enabled = false;
162 self
163 }
164}
165
166#[cfg(test)]
171mod tests {
172 use super::*;
173
174 #[test]
175 fn test_default_values() {
176 let config = MemoryConfig::default();
177
178 assert_eq!(config.core_memory_bytes, 32 * 1024);
179 assert_eq!(config.working_memory_bytes, 1024 * 1024);
180 assert_eq!(config.default_recall_limit, 10);
181 assert_eq!(config.embedding_batch_size, 100);
182 assert!(config.generate_embeddings);
183 assert!(config.semantic_search_enabled);
184 assert!(config.query_expansion_enabled);
185 }
186
187 #[test]
188 fn test_builder_pattern() {
189 let config = MemoryConfig::default()
190 .with_core_memory_bytes(64 * 1024)
191 .with_recall_limit(20)
192 .without_embeddings();
193
194 assert_eq!(config.core_memory_bytes, 64 * 1024);
195 assert_eq!(config.default_recall_limit, 20);
196 assert!(!config.generate_embeddings);
197 }
198
199 #[test]
200 fn test_method_chaining() {
201 let config = MemoryConfig::new()
202 .with_core_memory_bytes(32 * 1024)
203 .with_working_memory_bytes(2 * 1024 * 1024)
204 .with_recall_limit(15)
205 .without_query_expansion();
206
207 assert_eq!(config.core_memory_bytes, 32 * 1024);
208 assert_eq!(config.working_memory_bytes, 2 * 1024 * 1024);
209 assert_eq!(config.default_recall_limit, 15);
210 assert!(!config.query_expansion_enabled);
211 }
212}