EnhancedMemoryEntry

Struct EnhancedMemoryEntry 

Source
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: MemoryEntry

Base memory entry

§memory_type: MemoryType

Type of memory

§importance: ImportanceLevel

Importance 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_memories: Vec<String>

Related memory IDs

§last_accessed: u64

Last accessed timestamp

§access_count: u32

Access count

§decay_factor: f32

Decay factor (0.0 to 1.0, 1.0 = fresh, 0.0 = fully decayed)

Implementations§

Source§

impl EnhancedMemoryEntry

Source

pub fn new(entry: MemoryEntry, memory_type: MemoryType) -> Self

Create a new enhanced memory entry

Source

pub fn mark_accessed(&mut self)

Update access information

Source

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

Source§

fn clone(&self) -> EnhancedMemoryEntry

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for EnhancedMemoryEntry

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for EnhancedMemoryEntry

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Serialize for EnhancedMemoryEntry

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromRef<T> for T
where T: Clone,

Source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

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
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

impl<A, B, T> HttpServerConnExec<A, B> for T
where B: Body,