zeph_config/memory/
session.rs1use crate::defaults::default_true;
10use crate::providers::ProviderName;
11use serde::{Deserialize, Serialize};
12
13use super::default_embed_timeout_secs;
14
15fn default_max_history() -> usize {
16 100
17}
18
19fn default_title_max_chars() -> usize {
20 60
21}
22
23fn default_document_collection() -> String {
24 "zeph_documents".into()
25}
26
27fn default_document_chunk_size() -> usize {
28 1000
29}
30
31fn default_document_chunk_overlap() -> usize {
32 100
33}
34
35fn default_document_top_k() -> usize {
36 3
37}
38
39fn default_temporal_decay_half_life_days() -> u32 {
40 30
41}
42
43fn default_mmr_lambda() -> f32 {
44 0.7
45}
46
47fn default_semantic_enabled() -> bool {
48 true
49}
50
51fn default_recall_limit() -> usize {
52 5
53}
54
55fn default_vector_weight() -> f64 {
56 0.7
57}
58
59fn default_keyword_weight() -> f64 {
60 0.3
61}
62
63fn validate_importance_weight<'de, D>(deserializer: D) -> Result<f64, D::Error>
64where
65 D: serde::Deserializer<'de>,
66{
67 let value = <f64 as serde::Deserialize>::deserialize(deserializer)?;
68 if value.is_nan() || value.is_infinite() {
69 return Err(serde::de::Error::custom(
70 "importance_weight must be a finite number",
71 ));
72 }
73 if value < 0.0 {
74 return Err(serde::de::Error::custom(
75 "importance_weight must be non-negative",
76 ));
77 }
78 if value > 1.0 {
79 return Err(serde::de::Error::custom("importance_weight must be <= 1.0"));
80 }
81 Ok(value)
82}
83
84fn default_importance_weight() -> f64 {
85 0.15
86}
87
88#[derive(Debug, Clone, Copy, Default, Deserialize, Serialize, PartialEq, Eq)]
90#[serde(rename_all = "snake_case")]
91#[non_exhaustive]
92pub enum ContextStrategy {
93 #[default]
96 FullHistory,
97 MemoryFirst,
100 Adaptive,
103}
104
105#[derive(Debug, Clone, Deserialize, Serialize)]
107#[serde(default)]
108pub struct SessionsConfig {
109 #[serde(default = "default_max_history")]
111 pub max_history: usize,
112 #[serde(default = "default_title_max_chars")]
114 pub title_max_chars: usize,
115}
116
117impl Default for SessionsConfig {
118 fn default() -> Self {
119 Self {
120 max_history: default_max_history(),
121 title_max_chars: default_title_max_chars(),
122 }
123 }
124}
125
126#[derive(Debug, Clone, Deserialize, Serialize)]
128pub struct DocumentConfig {
129 #[serde(default = "default_document_collection")]
130 pub collection: String,
131 #[serde(default = "default_document_chunk_size")]
132 pub chunk_size: usize,
133 #[serde(default = "default_document_chunk_overlap")]
134 pub chunk_overlap: usize,
135 #[serde(default = "default_document_top_k")]
137 pub top_k: usize,
138 #[serde(default)]
140 pub rag_enabled: bool,
141}
142
143impl Default for DocumentConfig {
144 fn default() -> Self {
145 Self {
146 collection: default_document_collection(),
147 chunk_size: default_document_chunk_size(),
148 chunk_overlap: default_document_chunk_overlap(),
149 top_k: default_document_top_k(),
150 rag_enabled: false,
151 }
152 }
153}
154
155#[derive(Debug, Deserialize, Serialize)]
171#[allow(clippy::struct_excessive_bools)] pub struct SemanticConfig {
173 #[serde(default = "default_semantic_enabled")]
175 pub enabled: bool,
176 #[serde(default = "default_recall_limit")]
177 pub recall_limit: usize,
178 #[serde(default = "default_vector_weight")]
179 pub vector_weight: f64,
180 #[serde(default = "default_keyword_weight")]
181 pub keyword_weight: f64,
182 #[serde(default = "default_true")]
183 pub temporal_decay_enabled: bool,
184 #[serde(default = "default_temporal_decay_half_life_days")]
185 pub temporal_decay_half_life_days: u32,
186 #[serde(default = "default_true")]
187 pub mmr_enabled: bool,
188 #[serde(default = "default_mmr_lambda")]
189 pub mmr_lambda: f32,
190 #[serde(default = "default_true")]
191 pub importance_enabled: bool,
192 #[serde(
193 default = "default_importance_weight",
194 deserialize_with = "validate_importance_weight"
195 )]
196 pub importance_weight: f64,
197 #[serde(default)]
202 pub embedding_provider: Option<ProviderName>,
203 #[serde(default = "default_embed_timeout_secs")]
210 pub embed_timeout_secs: u64,
211}
212
213impl Default for SemanticConfig {
214 fn default() -> Self {
215 Self {
216 enabled: default_semantic_enabled(),
217 recall_limit: default_recall_limit(),
218 vector_weight: default_vector_weight(),
219 keyword_weight: default_keyword_weight(),
220 temporal_decay_enabled: true,
221 temporal_decay_half_life_days: default_temporal_decay_half_life_days(),
222 mmr_enabled: true,
223 mmr_lambda: default_mmr_lambda(),
224 importance_enabled: true,
225 importance_weight: default_importance_weight(),
226 embedding_provider: None,
227 embed_timeout_secs: default_embed_timeout_secs(),
228 }
229 }
230}