Skip to main content

memory_basic/
memory_basic.rs

1//! Open a memory, remember text, recall it, then invalidate.
2//!
3//! Uses an in-memory store (no file, no encryption required) and a fake
4//! embedder that returns zero-vectors — no model files needed.
5//!
6//! Run: `cargo run --example memory_basic -p basemyai`
7
8use 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}