advanced_memory/
advanced_memory.rs

1//! Advanced Memory Management Example
2//!
3//! This example demonstrates the advanced memory features including:
4//! - Working memory (recent context)
5//! - Episodic memory (past conversations)
6//! - Semantic memory (facts and knowledge)
7//! - Automatic summarization
8//! - Memory consolidation
9
10use ceylon_next::llm::types::Message;
11use ceylon_next::memory::advanced::{
12    AdvancedMemoryManager, ConsolidationTask, MemoryConfig, TimeRange,
13};
14use ceylon_next::memory::{MemoryEntry, SqliteStore};
15use std::sync::Arc;
16
17#[tokio::main]
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}