Documentation
¶
Overview ¶
Package memory provides a modular conversation memory system for AI agents. It supports both short-term session memory (via Redis) and long-term semantic memory (via Supabase pgvector).
Index ¶
- type CacheStats
- type Config
- type HybridMemory
- func (hm *HybridMemory) AddMessage(ctx context.Context, msg Message) error
- func (hm *HybridMemory) ClearCache(ctx context.Context, sessionID string) error
- func (hm *HybridMemory) ClearSession(ctx context.Context, sessionID string) error
- func (hm *HybridMemory) Close() error
- func (hm *HybridMemory) GetCacheStats(ctx context.Context) (*CacheStats, error)
- func (hm *HybridMemory) GetRecentMessages(ctx context.Context, sessionID string, limit int) ([]Message, error)
- func (hm *HybridMemory) GetStats(ctx context.Context, sessionID string) (*Stats, error)
- func (hm *HybridMemory) GetSummary(ctx context.Context, sessionID string) (*Summary, error)
- func (hm *HybridMemory) Search(ctx context.Context, query string, limit int, threshold float32) ([]SearchResult, error)
- func (hm *HybridMemory) SearchWithEmbedding(ctx context.Context, embedding []float32, limit int, threshold float32) ([]SearchResult, error)
- func (hm *HybridMemory) Store(ctx context.Context, msg Message) error
- func (hm *HybridMemory) Summarize(ctx context.Context, sessionID string, maxTokens int) (string, error)
- type Memory
- type MemoryMode
- type Message
- type Metadata
- type SearchResult
- type SessionOnlyMemory
- func (sm *SessionOnlyMemory) AddMessage(ctx context.Context, msg Message) error
- func (sm *SessionOnlyMemory) ClearSession(ctx context.Context, sessionID string) error
- func (sm *SessionOnlyMemory) Close() error
- func (sm *SessionOnlyMemory) GetRecentMessages(ctx context.Context, sessionID string, limit int) ([]Message, error)
- func (sm *SessionOnlyMemory) GetStats(ctx context.Context, sessionID string) (*Stats, error)
- func (sm *SessionOnlyMemory) GetSummary(ctx context.Context, sessionID string) (*Summary, error)
- func (sm *SessionOnlyMemory) Search(ctx context.Context, query string, limit int, threshold float32) ([]SearchResult, error)
- func (sm *SessionOnlyMemory) SearchWithEmbedding(ctx context.Context, embedding []float32, limit int, threshold float32) ([]SearchResult, error)
- func (sm *SessionOnlyMemory) Store(ctx context.Context, msg Message) error
- func (sm *SessionOnlyMemory) Summarize(ctx context.Context, sessionID string, maxTokens int) (string, error)
- type Stats
- type Summary
- type SupabaseMemory
- func (sm *SupabaseMemory) AddMessage(ctx context.Context, msg Message) error
- func (sm *SupabaseMemory) ClearSession(ctx context.Context, sessionID string) error
- func (sm *SupabaseMemory) Close() error
- func (sm *SupabaseMemory) GetRecentMessages(ctx context.Context, sessionID string, limit int) ([]Message, error)
- func (sm *SupabaseMemory) GetStats(ctx context.Context, sessionID string) (*Stats, error)
- func (sm *SupabaseMemory) GetSummary(ctx context.Context, sessionID string) (*Summary, error)
- func (sm *SupabaseMemory) Search(ctx context.Context, query string, limit int, threshold float32) ([]SearchResult, error)
- func (sm *SupabaseMemory) SearchWithEmbedding(ctx context.Context, embedding []float32, limit int, threshold float32) ([]SearchResult, error)
- func (sm *SupabaseMemory) Store(ctx context.Context, msg Message) error
- func (sm *SupabaseMemory) Summarize(ctx context.Context, sessionID string, maxTokens int) (string, error)
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type CacheStats ¶
CacheStats represents cache statistics
type Config ¶
type Config struct {
// Mode Selection
Mode MemoryMode `json:"mode,omitempty"` // SESSION_ONLY, PERSISTENT, HYBRID
// Feature Flags
EnablePersistence bool `json:"enable_persistence,omitempty"`
EnableSemanticSearch bool `json:"enable_semantic_search,omitempty"`
EnableAutoSummarize bool `json:"enable_auto_summarize,omitempty"`
// Database Configuration
SupabaseURL string `json:"supabase_url,omitempty"`
SupabaseKey string `json:"supabase_key,omitempty"`
DatabaseURL string `json:"database_url,omitempty"` // Direct PostgreSQL connection
// Redis Configuration (optional for fast session cache)
RedisAddr string `json:"redis_addr,omitempty"` // e.g., "localhost:6379"
RedisPassword string `json:"redis_password,omitempty"`
RedisDB int `json:"redis_db,omitempty"`
// OpenAI Configuration (for embeddings)
OpenAIKey string `json:"openai_key,omitempty"`
EmbeddingModel string `json:"embedding_model,omitempty"` // default: "text-embedding-3-small"
// Memory Settings
MaxSessionMessages int `json:"max_session_messages,omitempty"` // default: 50
SessionTTL time.Duration `json:"session_ttl,omitempty"` // default: 24h
AutoSummarize bool `json:"auto_summarize,omitempty"` // auto-summarize old messages
VectorDimension int `json:"vector_dimension,omitempty"` // default: 1536
// Summarization Settings
SummarizeThreshold int `json:"summarize_threshold,omitempty"` // Messages before summarization
SummarizeMaxTokens int `json:"summarize_max_tokens,omitempty"` // Target summary length
SummarizeModel string `json:"summarize_model,omitempty"` // Model for summarization
ArchiveOldMessages bool `json:"archive_old_messages,omitempty"` // Keep originals
// Search Settings
DefaultSearchLimit int `json:"default_search_limit,omitempty"`
DefaultSearchThreshold float32 `json:"default_search_threshold,omitempty"`
}
Config holds configuration for memory initialization
type HybridMemory ¶
type HybridMemory struct {
// contains filtered or unexported fields
}
HybridMemory combines Redis for fast session memory and Supabase for semantic search
func (*HybridMemory) AddMessage ¶
func (hm *HybridMemory) AddMessage(ctx context.Context, msg Message) error
AddMessage adds a message to both Redis (for fast access) and Supabase (for persistence)
func (*HybridMemory) ClearCache ¶
func (hm *HybridMemory) ClearCache(ctx context.Context, sessionID string) error
ClearCache clears Redis cache for a specific session
func (*HybridMemory) ClearSession ¶
func (hm *HybridMemory) ClearSession(ctx context.Context, sessionID string) error
ClearSession clears messages from both Redis and Supabase
func (*HybridMemory) GetCacheStats ¶
func (hm *HybridMemory) GetCacheStats(ctx context.Context) (*CacheStats, error)
GetCacheStats returns Redis cache statistics
func (*HybridMemory) GetRecentMessages ¶
func (hm *HybridMemory) GetRecentMessages(ctx context.Context, sessionID string, limit int) ([]Message, error)
GetRecentMessages retrieves recent messages from Redis first, falls back to Supabase
func (*HybridMemory) GetSummary ¶
GetSummary retrieves a summary for the session (delegates to Supabase)
func (*HybridMemory) Search ¶
func (hm *HybridMemory) Search(ctx context.Context, query string, limit int, threshold float32) ([]SearchResult, error)
Search performs semantic search (delegates to Supabase)
func (*HybridMemory) SearchWithEmbedding ¶
func (hm *HybridMemory) SearchWithEmbedding(ctx context.Context, embedding []float32, limit int, threshold float32) ([]SearchResult, error)
SearchWithEmbedding searches using a pre-computed embedding (delegates to Supabase)
type Memory ¶
type Memory interface {
// Session Memory (fast, recent messages)
AddMessage(ctx context.Context, msg Message) error
GetRecentMessages(ctx context.Context, sessionID string, limit int) ([]Message, error)
ClearSession(ctx context.Context, sessionID string) error
// Semantic Memory (long-term, searchable)
Store(ctx context.Context, msg Message) error
Search(ctx context.Context, query string, limit int, threshold float32) ([]SearchResult, error)
SearchWithEmbedding(ctx context.Context, embedding []float32, limit int, threshold float32) ([]SearchResult, error)
// Management
Summarize(ctx context.Context, sessionID string, maxTokens int) (string, error)
GetSummary(ctx context.Context, sessionID string) (*Summary, error)
GetStats(ctx context.Context, sessionID string) (*Stats, error)
Close() error
}
Memory interface defines the contract for memory implementations
func NewHybridMemory ¶
NewHybridMemory creates a memory system with both Redis and Supabase
func NewSessionOnlyMemory ¶
NewSessionOnlyMemory creates a new session-only memory instance
func NewSupabaseMemory ¶
NewSupabaseMemory creates a new Supabase-based memory instance
func NewWithConfig ¶
NewWithConfig creates a new memory instance with explicit configuration
type MemoryMode ¶
type MemoryMode string
MemoryMode represents the type of memory implementation
const ( SESSION_ONLY MemoryMode = "session_only" // In-memory only, no persistence PERSISTENT MemoryMode = "persistent" // PostgreSQL only HYBRID MemoryMode = "hybrid" // Redis + PostgreSQL )
Memory mode constants
type Message ¶
type Message struct {
ID string `json:"id"`
Role string `json:"role"` // "user", "assistant", "system"
Content string `json:"content"`
Metadata Metadata `json:"metadata"`
Timestamp time.Time `json:"timestamp"`
Embedding []float32 `json:"embedding,omitempty"`
}
Message represents a single conversation message
type Metadata ¶
type Metadata struct {
SessionID string `json:"session_id"`
UserID string `json:"user_id,omitempty"`
TokenCount int `json:"token_count,omitempty"`
Model string `json:"model,omitempty"`
Temperature float64 `json:"temperature,omitempty"`
Extra map[string]interface{} `json:"extra,omitempty"`
}
Metadata contains additional message information
type SearchResult ¶
type SearchResult struct {
Message Message `json:"message"`
Score float32 `json:"score"`
Distance float32 `json:"distance"`
}
SearchResult represents a semantic search result
type SessionOnlyMemory ¶
type SessionOnlyMemory struct {
// contains filtered or unexported fields
}
SessionOnlyMemory implements in-memory session storage with no persistence
func (*SessionOnlyMemory) AddMessage ¶
func (sm *SessionOnlyMemory) AddMessage(ctx context.Context, msg Message) error
AddMessage adds a message to the session
func (*SessionOnlyMemory) ClearSession ¶
func (sm *SessionOnlyMemory) ClearSession(ctx context.Context, sessionID string) error
ClearSession removes all messages from a session
func (*SessionOnlyMemory) Close ¶
func (sm *SessionOnlyMemory) Close() error
Close cleans up resources (no-op for session-only)
func (*SessionOnlyMemory) GetRecentMessages ¶
func (sm *SessionOnlyMemory) GetRecentMessages(ctx context.Context, sessionID string, limit int) ([]Message, error)
GetRecentMessages retrieves recent messages from the session
func (*SessionOnlyMemory) GetSummary ¶
GetSummary returns a basic summary structure
func (*SessionOnlyMemory) Search ¶
func (sm *SessionOnlyMemory) Search(ctx context.Context, query string, limit int, threshold float32) ([]SearchResult, error)
Search performs basic text search (no semantic search in session-only mode)
func (*SessionOnlyMemory) SearchWithEmbedding ¶
func (sm *SessionOnlyMemory) SearchWithEmbedding(ctx context.Context, embedding []float32, limit int, threshold float32) ([]SearchResult, error)
SearchWithEmbedding is not supported in session-only mode
type Stats ¶
type Stats struct {
SessionID string `json:"session_id"`
TotalMessages int `json:"total_messages"`
SessionMessages int `json:"session_messages"`
TotalTokens int `json:"total_tokens"`
ActiveTokens int `json:"active_tokens,omitempty"` // Tokens after summarization
OldestMessage *time.Time `json:"oldest_message,omitempty"`
LatestMessage *time.Time `json:"latest_message,omitempty"`
UniqueUsers int `json:"unique_users,omitempty"`
StorageSize int64 `json:"storage_size,omitempty"`
HasSummary bool `json:"has_summary,omitempty"` // Whether session has summary
}
Stats provides memory usage statistics
type Summary ¶
type Summary struct {
SessionID string `json:"session_id"`
Content string `json:"content"`
TokenCount int `json:"token_count"`
MessageCount int `json:"message_count"`
StartTime time.Time `json:"start_time"`
EndTime time.Time `json:"end_time"`
Created time.Time `json:"created"`
}
Summary represents a conversation summary
type SupabaseMemory ¶
type SupabaseMemory struct {
// contains filtered or unexported fields
}
SupabaseMemory implements Memory using Supabase PostgreSQL with pgvector
func (*SupabaseMemory) AddMessage ¶
func (sm *SupabaseMemory) AddMessage(ctx context.Context, msg Message) error
AddMessage adds a message to session memory
func (*SupabaseMemory) ClearSession ¶
func (sm *SupabaseMemory) ClearSession(ctx context.Context, sessionID string) error
ClearSession removes all messages for a session
func (*SupabaseMemory) Close ¶
func (sm *SupabaseMemory) Close() error
func (*SupabaseMemory) GetRecentMessages ¶
func (sm *SupabaseMemory) GetRecentMessages(ctx context.Context, sessionID string, limit int) ([]Message, error)
GetRecentMessages retrieves recent messages for a session
func (*SupabaseMemory) GetSummary ¶
Close closes database connections GetSummary retrieves a summary for the session
func (*SupabaseMemory) Search ¶
func (sm *SupabaseMemory) Search(ctx context.Context, query string, limit int, threshold float32) ([]SearchResult, error)
Search performs semantic search on messages
func (*SupabaseMemory) SearchWithEmbedding ¶
func (sm *SupabaseMemory) SearchWithEmbedding(ctx context.Context, embedding []float32, limit int, threshold float32) ([]SearchResult, error)
SearchWithEmbedding searches using a pre-computed embedding
Directories
¶
| Path | Synopsis |
|---|---|
|
01-session-only
command
Session-Only Memory Example This example demonstrates the simplest memory configuration with no external dependencies.
|
Session-Only Memory Example This example demonstrates the simplest memory configuration with no external dependencies. |
|
02-persistent-basic
command
Persistent Basic Memory Example Demonstrates database persistence with PostgreSQL for long-term memory storage.
|
Persistent Basic Memory Example Demonstrates database persistence with PostgreSQL for long-term memory storage. |
|
03-hybrid-mode
command
Hybrid Mode Memory Example Combines Redis for fast session caching with PostgreSQL for persistence.
|
Hybrid Mode Memory Example Combines Redis for fast session caching with PostgreSQL for persistence. |
|
04-semantic-search
command
Semantic Search Memory Example Demonstrates vector embeddings and similarity search using OpenAI and pgvector.
|
Semantic Search Memory Example Demonstrates vector embeddings and similarity search using OpenAI and pgvector. |
|
05-auto-summarization
command
Auto-Summarization Memory Example Demonstrates automatic conversation compression to optimize token usage.
|
Auto-Summarization Memory Example Demonstrates automatic conversation compression to optimize token usage. |
|
06-event-streaming
command
Event Streaming Memory Example Demonstrates Redis Streams for event sourcing and audit trails.
|
Event Streaming Memory Example Demonstrates Redis Streams for event sourcing and audit trails. |
|
07-agent-integration
command
Complete Agent Integration Example Production-ready AI agent with configurable memory system.
|
Complete Agent Integration Example Production-ready AI agent with configurable memory system. |