use serde::{Deserialize, Serialize};
use std::time::Duration;
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct MemoryConfig {
pub stm: StmConfig,
pub ltm: LtmConfig,
pub consolidation: ConsolidationConfig,
}
impl MemoryConfig {
pub fn iot_mode() -> Self {
Self {
stm: StmConfig {
max_entries: 50,
max_memory_bytes: 64 * 1024, decay_interval: Duration::from_secs(60),
decay_factor: 0.9,
min_attention_threshold: 0.1,
},
ltm: LtmConfig {
max_entities: 100,
max_links: 200,
max_memory_bytes: 128 * 1024, enable_embeddings: false, embedding_dim: 32, },
consolidation: ConsolidationConfig {
auto_consolidate: true,
importance_threshold: 0.7,
min_access_count: 2,
min_age_secs: 30,
max_stm_before_consolidate: 40,
batch_size: 5,
},
}
}
pub fn agent_mode() -> Self {
Self {
stm: StmConfig {
max_entries: 500,
max_memory_bytes: 1024 * 1024, decay_interval: Duration::from_secs(300),
decay_factor: 0.95,
min_attention_threshold: 0.05,
},
ltm: LtmConfig {
max_entities: 10_000,
max_links: 50_000,
max_memory_bytes: 10 * 1024 * 1024, enable_embeddings: true,
embedding_dim: 128,
},
consolidation: ConsolidationConfig {
auto_consolidate: true,
importance_threshold: 0.5,
min_access_count: 3,
min_age_secs: 60,
max_stm_before_consolidate: 400,
batch_size: 20,
},
}
}
pub fn server_mode() -> Self {
Self {
stm: StmConfig {
max_entries: 5000,
max_memory_bytes: 10 * 1024 * 1024, decay_interval: Duration::from_secs(600),
decay_factor: 0.98,
min_attention_threshold: 0.01,
},
ltm: LtmConfig {
max_entities: 1_000_000,
max_links: 10_000_000,
max_memory_bytes: 1024 * 1024 * 1024, enable_embeddings: true,
embedding_dim: 256,
},
consolidation: ConsolidationConfig {
auto_consolidate: true,
importance_threshold: 0.3,
min_access_count: 5,
min_age_secs: 300,
max_stm_before_consolidate: 4000,
batch_size: 100,
},
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StmConfig {
pub max_entries: usize,
pub max_memory_bytes: usize,
pub decay_interval: Duration,
pub decay_factor: f32,
pub min_attention_threshold: f32,
}
impl Default for StmConfig {
fn default() -> Self {
Self {
max_entries: 200,
max_memory_bytes: 512 * 1024, decay_interval: Duration::from_secs(120),
decay_factor: 0.95,
min_attention_threshold: 0.05,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LtmConfig {
pub max_entities: usize,
pub max_links: usize,
pub max_memory_bytes: usize,
pub enable_embeddings: bool,
pub embedding_dim: usize,
}
impl Default for LtmConfig {
fn default() -> Self {
Self {
max_entities: 1000,
max_links: 5000,
max_memory_bytes: 2 * 1024 * 1024, enable_embeddings: true,
embedding_dim: 64,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConsolidationConfig {
pub auto_consolidate: bool,
pub importance_threshold: f32,
pub min_access_count: u32,
pub min_age_secs: u64,
pub max_stm_before_consolidate: usize,
pub batch_size: usize,
}
impl Default for ConsolidationConfig {
fn default() -> Self {
Self {
auto_consolidate: true,
importance_threshold: 0.6,
min_access_count: 2,
min_age_secs: 60,
max_stm_before_consolidate: 150,
batch_size: 10,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_config() {
let config = MemoryConfig::default();
assert!(config.stm.max_entries > 0);
assert!(config.ltm.max_entities > 0);
}
#[test]
fn test_iot_config() {
let config = MemoryConfig::iot_mode();
assert!(config.stm.max_entries <= 100);
assert!(config.stm.max_memory_bytes <= 128 * 1024);
}
#[test]
fn test_agent_config() {
let config = MemoryConfig::agent_mode();
assert!(config.ltm.enable_embeddings);
}
}