Skip to content

Memory

Memory determines how your agent remembers past conversations. TraitClaw provides three built-in implementations and a trait for building custom ones.

BackendPersistenceUse Case
InMemoryMemory❌ Process lifetimePrototyping, stateless APIs
SqliteMemory✅ DiskProduction single-node
CompressedMemory✅ + CompressionLong conversations, cost optimization

Zero-config, works out of the box:

// This is the default — no setup needed
let agent = Agent::builder()
.provider(provider)
.build()?;
// Explicit
let agent = Agent::builder()
.provider(provider)
.memory(InMemoryMemory::new())
.build()?;

Persistent conversations with full-text search:

use traitclaw_memory_sqlite::SqliteMemory;
let memory = SqliteMemory::new("./agent.db")?;
let agent = Agent::builder()
.provider(provider)
.memory(memory)
.session("user-123") // Session isolation
.build()?;
// Conversations persist across restarts
let output = agent.run("Remember: my name is Alice").await?;
// ... restart app ...
let output = agent.run("What's my name?").await?;
// "Your name is Alice!"

For long conversations, CompressedMemory automatically summarizes older messages to save tokens:

use traitclaw_core::CompressedMemory;
let memory = CompressedMemory::new(
inner_memory,
compression_provider, // LLM used for summarization
)
.max_tokens(4000) // Compress when context exceeds this
.keep_recent(5); // Always keep the 5 most recent messages

Build custom backends for Redis, PostgreSQL, DynamoDB, etc.:

#[async_trait]
pub trait Memory: Send + Sync {
/// Retrieve all messages for a session
async fn get_messages(&self, session_id: &str) -> Result<Vec<Message>>;
/// Add a message to a session
async fn add_message(&self, session_id: &str, message: Message) -> Result<()>;
/// Clear all messages for a session
async fn clear(&self, session_id: &str) -> Result<()>;
}