pub struct MemoryEntry {
pub id: String,
pub agent_id: String,
pub task_id: String,
pub messages: Vec<Message>,
pub created_at: u64,
}Expand description
A stored conversation between an agent and user.
Each memory entry represents a complete task execution, including all messages exchanged between the user and agent.
§Examples
use ceylon_next::memory::MemoryEntry;
use ceylon_next::llm::types::Message;
let messages = vec![
Message {
role: "user".to_string(),
content: "Hello!".to_string(),
},
Message {
role: "assistant".to_string(),
content: "Hi there!".to_string(),
},
];
let entry = MemoryEntry::new(
"agent-123".to_string(),
"task-456".to_string(),
messages,
);Fields§
§id: StringUnique identifier for this memory entry
agent_id: StringID of the agent that created this memory
task_id: StringID of the task this memory is associated with
messages: Vec<Message>The conversation messages
created_at: u64Unix timestamp when this memory was created
Implementations§
Source§impl MemoryEntry
impl MemoryEntry
Sourcepub fn new(agent_id: String, task_id: String, messages: Vec<Message>) -> Self
pub fn new(agent_id: String, task_id: String, messages: Vec<Message>) -> Self
Creates a new memory entry.
§Arguments
agent_id- The ID of the agent that created this memorytask_id- The ID of the task this memory is associated withmessages- The conversation messages to store
Examples found in repository?
examples/advanced_memory.rs (lines 79-83)
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 MemoryEntry
impl Clone for MemoryEntry
Source§fn clone(&self) -> MemoryEntry
fn clone(&self) -> MemoryEntry
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 MemoryEntry
impl Debug for MemoryEntry
Source§impl<'de> Deserialize<'de> for MemoryEntry
impl<'de> Deserialize<'de> for MemoryEntry
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 MemoryEntry
impl RefUnwindSafe for MemoryEntry
impl Send for MemoryEntry
impl Sync for MemoryEntry
impl Unpin for MemoryEntry
impl UnwindSafe for MemoryEntry
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