pub struct EnhancedMemoryEntry {
pub entry: MemoryEntry,
pub memory_type: MemoryType,
pub importance: ImportanceLevel,
pub summary: Option<String>,
pub key_points: Vec<String>,
pub entities: Vec<String>,
pub related_memories: Vec<String>,
pub last_accessed: u64,
pub access_count: u32,
pub decay_factor: f32,
}Expand description
Enhanced memory entry with metadata
Fields§
§entry: MemoryEntryBase memory entry
memory_type: MemoryTypeType of memory
importance: ImportanceLevelImportance level
summary: Option<String>Summary of the conversation
key_points: Vec<String>Extracted key points
entities: Vec<String>Extracted entities (people, places, things mentioned)
Related memory IDs
last_accessed: u64Last accessed timestamp
access_count: u32Access count
decay_factor: f32Decay factor (0.0 to 1.0, 1.0 = fresh, 0.0 = fully decayed)
Implementations§
Source§impl EnhancedMemoryEntry
impl EnhancedMemoryEntry
Sourcepub fn new(entry: MemoryEntry, memory_type: MemoryType) -> Self
pub fn new(entry: MemoryEntry, memory_type: MemoryType) -> Self
Create a new enhanced memory entry
Sourcepub fn mark_accessed(&mut self)
pub fn mark_accessed(&mut self)
Update access information
Sourcepub fn relevance_score(&self) -> f32
pub fn relevance_score(&self) -> f32
Calculate relevance score based on importance, recency, and access frequency
Examples found in repository?
examples/advanced_memory.rs (line 167)
18async fn main() -> Result<(), String> {
19 println!("🧠 Ceylon AI Framework - Advanced Memory Management Demo\n");
20
21 // 1. Setup Advanced Memory Manager
22 println!("1️⃣ Setting up Advanced Memory Manager...");
23 let backend = Arc::new(SqliteStore::new("advanced_memory_demo.db").await?);
24
25 let config = MemoryConfig {
26 working_memory_limit: 5,
27 episodic_memory_limit: 100,
28 auto_summarize: true,
29 min_summary_length: 2,
30 auto_consolidate: false, // Manual for demo
31 consolidation_interval: 3600,
32 duplicate_threshold: 0.85,
33 enable_decay: true,
34 decay_rate: 0.05,
35 ..Default::default()
36 };
37
38 let memory = AdvancedMemoryManager::new(backend, config).await?;
39 println!(" ✓ Memory manager initialized\n");
40
41 // 2. Store Multiple Conversations
42 println!("2️⃣ Storing conversations...");
43
44 let conversations = vec![
45 (
46 "What is Rust?",
47 "Rust is a systems programming language focused on safety, concurrency, and performance.",
48 ),
49 (
50 "Tell me about Alice",
51 "Alice is a software engineer who works at Google on cloud infrastructure projects.",
52 ),
53 (
54 "What projects is Alice working on?",
55 "Alice is currently working on Kubernetes optimization and distributed systems.",
56 ),
57 (
58 "How does Rust ensure memory safety?",
59 "Rust ensures memory safety through its ownership system, borrowing rules, and lifetimes.",
60 ),
61 (
62 "What is the capital of France?",
63 "The capital of France is Paris, a major European city known for art and culture.",
64 ),
65 ];
66
67 for (i, (user_msg, assistant_msg)) in conversations.iter().enumerate() {
68 let messages = vec![
69 Message {
70 role: "user".to_string(),
71 content: user_msg.to_string(),
72 },
73 Message {
74 role: "assistant".to_string(),
75 content: assistant_msg.to_string(),
76 },
77 ];
78
79 let entry = MemoryEntry::new(
80 "demo-agent".to_string(),
81 format!("task-{}", i),
82 messages,
83 );
84
85 let id = memory.store_conversation(entry).await?;
86 println!(" ✓ Stored conversation {} (ID: {})", i + 1, &id[..8]);
87 }
88 println!();
89
90 // 3. Query Working Memory
91 println!("3️⃣ Querying Working Memory (recent context)...");
92 let working = memory.get_working_memory(None).await;
93 println!(" Working memory contains {} conversations", working.len());
94 for (i, mem) in working.iter().enumerate() {
95 if let Some(summary) = &mem.summary {
96 println!(" {}. {}", i + 1, summary);
97 } else {
98 println!(" {}. {} messages", i + 1, mem.entry.messages.len());
99 }
100 }
101 println!();
102
103 // 4. Query Episodic Memory by Time Range
104 println!("4️⃣ Querying Episodic Memory...");
105 let recent = memory
106 .get_episodic_by_time("demo-agent", TimeRange::LastDays(7))
107 .await?;
108 println!(" Found {} conversations in the last 7 days", recent.len());
109
110 let all = memory
111 .get_episodic_by_time("demo-agent", TimeRange::All)
112 .await?;
113 println!(" Total conversations: {}", all.len());
114 println!();
115
116 // 5. Search Memories
117 println!("5️⃣ Searching memories for 'Alice'...");
118 let search_results = memory.search("demo-agent", "Alice").await?;
119 println!(" Found {} results:", search_results.len());
120 for (i, mem) in search_results.iter().enumerate() {
121 if let Some(summary) = &mem.summary {
122 println!(" {}. {}", i + 1, summary);
123 }
124 }
125 println!();
126
127 // 6. Query Semantic Memory
128 println!("6️⃣ Querying Semantic Memory...");
129 let stats = memory.get_semantic_stats().await;
130 println!(" Entities tracked: {}", stats.total_entities);
131 println!(" Facts stored: {}", stats.total_facts);
132 println!(" Relationships: {}", stats.total_relationships);
133
134 // Query facts about Alice (if extracted)
135 if stats.total_facts > 0 {
136 println!("\n Facts about 'Alice':");
137 let alice_facts = memory.get_facts_about("Alice").await;
138 for fact in alice_facts {
139 println!(
140 " - {} {} {} (confidence: {:.2})",
141 fact.subject, fact.predicate, fact.object, fact.confidence
142 );
143 }
144 }
145 println!();
146
147 // 7. Generate Agent Context
148 println!("7️⃣ Generating comprehensive agent context...");
149 let context = memory
150 .create_agent_context("demo-agent", Some(1000), true)
151 .await?;
152 println!(" Context length: {} characters", context.len());
153 println!(" Preview:");
154 let preview: String = context.lines().take(10).collect::<Vec<_>>().join("\n");
155 println!("{}\n", preview);
156
157 // 8. Get Relevant Memories
158 println!("8️⃣ Getting most relevant memories...");
159 let relevant = memory
160 .get_relevant_memories("demo-agent", 0.0, 3)
161 .await?;
162 println!(" Top 3 most relevant memories:");
163 for (i, mem) in relevant.iter().enumerate() {
164 println!(
165 " {}. Relevance: {:.2} - {} messages",
166 i + 1,
167 mem.relevance_score(),
168 mem.entry.messages.len()
169 );
170 }
171 println!();
172
173 // 9. Run Consolidation
174 println!("9️⃣ Running memory consolidation...");
175 let result = memory.consolidate(ConsolidationTask::All).await?;
176 println!(" Consolidation results:");
177 println!(" - Memories processed: {}", result.memories_processed);
178 println!(" - Memories merged: {}", result.memories_merged);
179 println!(" - Memories deleted: {}", result.memories_deleted);
180 println!(" - Duration: {}ms", result.duration_ms);
181 println!();
182
183 // 10. Memory Statistics
184 println!("🔟 Overall Memory Statistics:");
185 let final_stats = memory.get_statistics().await;
186 println!(" Working memory:");
187 println!(" - Count: {}", final_stats.working_memory_count);
188 println!(" - Tokens: {}", final_stats.working_memory_tokens);
189 println!(" Semantic memory:");
190 println!(" - Entities: {}", final_stats.semantic_entities);
191 println!(" - Facts: {}", final_stats.semantic_facts);
192 println!(" - Relationships: {}", final_stats.semantic_relationships);
193 println!();
194
195 println!("✅ Advanced Memory Management Demo Complete!");
196 println!("\n💡 Key Features Demonstrated:");
197 println!(" • Working memory for recent context");
198 println!(" • Episodic memory for past conversations");
199 println!(" • Semantic memory for facts and knowledge");
200 println!(" • Automatic summarization");
201 println!(" • Time-based and relevance-based retrieval");
202 println!(" • Memory consolidation and optimization");
203 println!(" • Comprehensive context generation");
204
205 Ok(())
206}Trait Implementations§
Source§impl Clone for EnhancedMemoryEntry
impl Clone for EnhancedMemoryEntry
Source§fn clone(&self) -> EnhancedMemoryEntry
fn clone(&self) -> EnhancedMemoryEntry
Returns a duplicate of the value. Read more
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl Debug for EnhancedMemoryEntry
impl Debug for EnhancedMemoryEntry
Source§impl<'de> Deserialize<'de> for EnhancedMemoryEntry
impl<'de> Deserialize<'de> for EnhancedMemoryEntry
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read more
Auto Trait Implementations§
impl Freeze for EnhancedMemoryEntry
impl RefUnwindSafe for EnhancedMemoryEntry
impl Send for EnhancedMemoryEntry
impl Sync for EnhancedMemoryEntry
impl Unpin for EnhancedMemoryEntry
impl UnwindSafe for EnhancedMemoryEntry
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more