Memory Providers
Memory providers define where and how BindAI stores and retrieves memory. BindAI separates memory operations from storage through theMemoryProvider abstraction. A Memory instance delegates storage and retrieval operations to its configured provider.
This allows application code to use a consistent memory API while choosing an appropriate storage implementation.
Why Memory Providers?
Different applications require different persistence and retrieval characteristics. For example:- In-memory storage is useful for development and testing.
- SQLite provides local persistent storage.
- PostgreSQL provides persistent relational storage.
- Vector memory supports vector-oriented retrieval.
- Pinecone provides managed vector storage.
- Chroma provides vector-oriented storage and retrieval.
Memory abstraction rather than depending directly on a storage backend.
Architecture
Memory class provides the application-facing API.
The configured provider implements the storage and retrieval behavior.
Available Providers
BindAI currently provides the following memory providers:InMemoryProviderSQLiteMemoryProviderPostgreSQLMemoryProviderVectorMemoryProviderPineconeMemoryProviderChromaMemoryProvider
MemoryProvider abstraction.
A provider can be selected directly:
In-Memory Provider
InMemoryProvider stores memory records in the running Python process.
- Development
- Testing
- Examples
- Temporary application state
SQLite Provider
SQLiteMemoryProvider provides persistent local storage using SQLite.
- Local applications
- Desktop applications
- Prototypes
- Small deployments
- Development environments requiring persistence
PostgreSQL Provider
PostgreSQLMemoryProvider stores memory records in PostgreSQL.
For example:
- Persistent server-side storage
- Shared storage across application processes
- Relational database infrastructure
- Structured metadata storage
- Namespace-aware memory persistence
Vector Memory Provider
VectorMemoryProvider is designed for vector-oriented memory storage and retrieval.
- Semantic memory
- Similarity search
- Embedding-based retrieval
- Applications working with collections of vectorized memories
Pinecone Provider
PineconeMemoryProvider provides managed vector-backed memory using Pinecone.
PINECONE_API_KEY environment variable for authentication.
For example:
- Semantic memory
- Similarity search
- Managed vector storage
- Larger memory collections
- Cloud-based retrieval infrastructure
Chroma Provider
ChromaMemoryProvider provides Chroma-backed vector memory.
- Local vector memory
- Semantic retrieval
- Development and experimentation
- Applications using embedding-based memory
Namespaces
Memory records can be separated using namespaces.- Users
- Conversations
- Tenants
- Agents
- Projects
- Applications
Searching Memory
TheMemory abstraction exposes a common search() operation.
For example:
InMemoryProviderperforms provider-specific in-memory retrieval.SQLiteMemoryProvidersearches locally persisted records.PostgreSQLMemoryProviderperforms database-backed retrieval.VectorMemoryProviderprovides vector-oriented retrieval.PineconeMemoryProviderprovides managed vector search.ChromaMemoryProviderprovides Chroma-backed vector retrieval.
Metadata Filtering
Memory searches can optionally provide metadata filters where supported. For example:Memory Provider Interface
Memory providers implement the commonMemoryProvider abstraction.
The core memory operations include:
Memory abstraction exposes these operations to application code.
For example:
Memory Records
Providers storeMemoryRecord objects.
A record contains a key, value, namespace, and additional memory information.
- Memory type
- Metadata
- Importance
- Access count
- Expiration
- Tags
- Source
- Relationships
- Timestamps
- Embeddings
- Search score
MemoryRecord.
Persistence Comparison
The distinction between persistence and retrieval is important.
A provider can be persistent while using a particular retrieval strategy, such as relational or vector search.
Choosing a Provider
InMemoryProvider
UseInMemoryProvider when memory only needs to exist during the current process.
Good for:
- Development
- Testing
- Examples
- Temporary state
SQLiteMemoryProvider
UseSQLiteMemoryProvider when persistent local storage is required.
Good for:
- Local applications
- Desktop applications
- Prototypes
- Small persistent deployments
PostgreSQLMemoryProvider
UsePostgreSQLMemoryProvider when persistent server-side relational storage is required.
Good for:
- Server applications
- Multi-process applications
- Existing PostgreSQL infrastructure
- Persistent metadata-rich memory
VectorMemoryProvider
UseVectorMemoryProvider when vector-oriented memory storage or similarity-based retrieval is required.
Good for:
- Semantic memory
- Similarity search
- Embedding-based retrieval
PineconeMemoryProvider
UsePineconeMemoryProvider when managed vector storage and semantic retrieval are required.
Good for:
- Semantic memory
- Larger memory collections
- Cloud applications
- Embedding-based retrieval
- Managed vector infrastructure
ChromaMemoryProvider
UseChromaMemoryProvider when Chroma-backed vector memory is appropriate.
Good for:
- Local vector applications
- Semantic retrieval
- Prototyping
- Embedding-based memory
Switching Providers
Because providers implement the same memory abstraction, application-level memory code can generally remain the same when changing storage backends. For example:Memory API:
Provider Registry
BindAI includesMemoryRegistry for provider registration and lookup.
For example:
Custom Providers
Applications can implement custom memory providers by implementing theMemoryProvider abstraction.
A provider needs to support the core memory operations required by the interface:
Memory API.
A custom provider should preserve the expected semantics of MemoryRecord, namespaces, search parameters, and result handling.
Provider-Specific Behavior
Although providers share a common interface, they do not necessarily implement identical storage internals. For example:Embeddings and Vector Providers
Vector-oriented providers depend on compatible embedding representations. Conceptually:Memory Providers and Agents
Memory providers can be used through an agent’s memory configuration. For example:Memory abstraction rather than needing to know which storage provider is underneath.
Resource Management
Providers that own external resources should be closed appropriately. TheMemory abstraction supports closing its underlying provider:
Security and Configuration
Persistent memory can contain sensitive application information. Provider configuration should therefore follow normal application security practices. Avoid:Best Practices
- Choose the provider based on required persistence and retrieval behavior.
- Use
InMemoryProviderfor temporary development and testing state. - Use
SQLiteMemoryProviderfor local persistent storage. - Use
PostgreSQLMemoryProviderfor shared relational persistence. - Use
VectorMemoryProviderfor vector-oriented memory. - Use
PineconeMemoryProviderfor managed semantic vector retrieval. - Use
ChromaMemoryProviderfor Chroma-backed vector memory. - Keep application code dependent on
Memoryrather than provider-specific implementations where possible. - Use namespaces to isolate logical groups of memory.
- Use metadata for structured record information.
- Use tags and relationships when records require additional organization.
- Keep embedding dimensions compatible with vector storage.
- Treat provider-specific search behavior as provider-dependent.
- Use
MemoryRegistrywhen custom or dynamically selected providers are required. - Keep credentials out of source code.
- Protect memory access with appropriate authorization.
- Close providers when they own external resources.
- Test providers independently from model-provider behavior.
Summary
BindAI currently provides six memory provider implementations:InMemoryProviderSQLiteMemoryProviderPostgreSQLMemoryProviderVectorMemoryProviderPineconeMemoryProviderChromaMemoryProvider
MemoryProvider abstraction.
Applications interact primarily with Memory, while the configured provider handles storage and retrieval.
This separation allows the same application-level memory API to work with local, relational, and vector-oriented storage systems.
Provider-specific capabilities can differ, particularly for search, metadata filtering, persistence, and vector retrieval. Applications should therefore rely on the common API for portable behavior and use provider-specific features deliberately when needed.