memory_basic/
memory_basic.rs1use basemyai::{AgentId, Memory, MemoryLayer};
9use basemyai_core::{Embedder, Store};
10
11struct FakeEmbedder;
12
13impl Embedder for FakeEmbedder {
14 fn embed(&self, _text: &str) -> basemyai_core::Result<Vec<f32>> {
15 Ok(vec![0.0; 384])
16 }
17 fn embed_batch(&self, texts: &[String]) -> basemyai_core::Result<Vec<Vec<f32>>> {
18 Ok(texts.iter().map(|_| vec![0.0; 384]).collect())
19 }
20 fn model_id(&self) -> &str {
21 "fake-384"
22 }
23 fn dim(&self) -> usize {
24 384
25 }
26}
27
28#[tokio::main]
29async fn main() -> Result<(), Box<dyn std::error::Error>> {
30 let store = Store::open_in_memory().await?;
31 let agent = AgentId::new("demo-agent").expect("non-empty id");
32 let memory = Memory::open(store, Box::new(FakeEmbedder), agent).await?;
33
34 memory
35 .remember("The Eiffel Tower is in Paris.", MemoryLayer::Semantic)
36 .await?;
37 memory
38 .remember("Paris is the capital of France.", MemoryLayer::Semantic)
39 .await?;
40 memory.remember("Bonjour!", MemoryLayer::ShortTerm).await?;
41
42 println!("=== recall (top 2) ===");
43 let results = memory.recall("What city is the Eiffel Tower in?", 2).await?;
44 for r in &results {
45 println!(
46 " [{layer}] {score:.3} {text}",
47 layer = r.layer.table(),
48 score = r.score,
49 text = r.text
50 );
51 }
52
53 let first_id = results[0].id.clone();
54 memory.invalidate(&first_id).await?;
55 println!("\nInvalidated id={first_id}");
56
57 let after = memory.recall("Eiffel Tower", 5).await?;
58 println!("Recall after invalidation: {} result(s)", after.len());
59
60 let stats = memory.stats().await?;
61 println!(
62 "\nStats: {} semantic, {} short-term (valid).",
63 stats.semantic, stats.short_term
64 );
65
66 Ok(())
67}