memory

package
v0.0.0-...-140e820 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 4, 2026 License: Apache-2.0 Imports: 11 Imported by: 0

Documentation

Overview

Package memory provides memory systems for agent conversation history.

This package defines interfaces and implementations for storing and retrieving agent conversation history, enabling context management beyond raw message lists.

Design principles:

  • Minimal: Only essential methods
  • Flexible: Support multiple storage backends
  • Composable: Combine with strategies
  • Production-ready: Built for real-world use

Implementations:

  • InMemoryMemory: Simple in-memory storage with LRU eviction
  • RedisMemory: Redis-backed with TTL and pub/sub
  • VectorMemory: Vector database for semantic retrieval
  • EndlessMemory: Integration with endless project for infinite context

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type EmbeddingProvider

type EmbeddingProvider interface {
	// Embed generates an embedding for text.
	Embed(ctx context.Context, text string) ([]float64, error)

	// Dimension returns the embedding dimension.
	Dimension() int
}

EmbeddingProvider is the interface for embedding providers.

type EndlessClient

type EndlessClient interface {
	// StoreContext stores messages in endless compressed context.
	StoreContext(ctx context.Context, sessionID string, messages []map[string]interface{}, metadata map[string]interface{}) error

	// RetrieveContext retrieves compressed context from endless.
	RetrieveContext(ctx context.Context, sessionID string, query string, limit int) ([]map[string]interface{}, error)

	// SummarizeContext gets summary of compressed context.
	SummarizeContext(ctx context.Context, sessionID string) (string, error)

	// ClearContext clears context for session.
	ClearContext(ctx context.Context, sessionID string) error
}

EndlessClient is the interface for endless project clients.

Users must provide a client implementing this interface. See: https://github.com/jxnl/endless (user installs separately)

type EndlessMemory

type EndlessMemory struct {
	// contains filtered or unexported fields
}

EndlessMemory provides integration with endless project for infinite context.

Features:

  • Infinite context through compression
  • Semantic retrieval from compressed context
  • Automatic context management
  • Cross-session knowledge accumulation

Limitations:

  • Requires endless client (user provides)
  • Compression may lose some details
  • Additional latency for compression/decompression

Use cases:

  • Very long conversations (> 200K tokens)
  • Knowledge accumulation over time
  • Multi-session knowledge sharing
  • 30-hour autonomous agents

Example:

// User installs endless separately
import "github.com/jxnl/endless"

endlessClient := endless.NewClient("api-key")
memory := NewEndlessMemory(endlessClient)
err := memory.Store(ctx, "session-123", message, nil)
messages, err := memory.Retrieve(ctx, "session-123",
    RetrieveOptions{Query: "pricing discussion"})

func NewEndlessMemory

func NewEndlessMemory(endlessClient EndlessClient) *EndlessMemory

NewEndlessMemory creates a new EndlessMemory instance.

Args:

endlessClient: Client implementing EndlessClient interface
              (user installs endless separately)

Example:

import "github.com/jxnl/endless"
client := endless.NewClient("sk-...")
memory := NewEndlessMemory(client)

func (*EndlessMemory) Capabilities

func (e *EndlessMemory) Capabilities() []string

Capabilities returns the memory capabilities.

func (*EndlessMemory) Clear

func (e *EndlessMemory) Clear(ctx context.Context, sessionID string) error

Clear removes endless context for session.

Args:

ctx: Context for cancellation
sessionID: Session identifier

func (*EndlessMemory) Retrieve

func (e *EndlessMemory) Retrieve(ctx context.Context, sessionID string, opts RetrieveOptions) ([]agenkit.Message, error)

Retrieve fetches messages from endless compressed context.

Supports semantic retrieval via query parameter.

Args:

ctx: Context for cancellation
sessionID: Session identifier
opts: Retrieval options

Returns:

List of messages from compressed context

func (*EndlessMemory) Store

func (e *EndlessMemory) Store(ctx context.Context, sessionID string, message agenkit.Message, metadata map[string]interface{}) error

Store saves a message in endless compressed context.

Args:

ctx: Context for cancellation
sessionID: Session identifier
message: Message to store
metadata: Optional metadata (importance, tags, etc.)

func (*EndlessMemory) Summarize

func (e *EndlessMemory) Summarize(ctx context.Context, sessionID string, opts SummarizeOptions) (agenkit.Message, error)

Summarize gets summary of compressed context from endless.

Args:

ctx: Context for cancellation
sessionID: Session identifier
opts: Summarization options

Returns:

Message containing summary

type HierarchyConfig

type HierarchyConfig struct {
	// WorkingCapacity is the max messages in working memory (default: 10).
	// Increase for longer context windows.
	WorkingCapacity int

	// ShortTermCapacity is the max messages in short-term memory (default: 100).
	// Increase for longer session history.
	ShortTermCapacity int

	// ShortTermTTLSeconds is time-to-live for short-term entries (default: 3600 = 1 hour).
	// Increase to retain history longer.
	ShortTermTTLSeconds int

	// LongTermMinImportance is minimum importance for long-term storage (default: 0.7).
	// Lower to store more, higher for only critical info.
	LongTermMinImportance float64

	// EnableLongTerm enables long-term memory (default: true).
	// Disable for testing or simple use cases.
	EnableLongTerm bool
}

HierarchyConfig contains configuration for HierarchyMemory.

func DefaultHierarchyConfig

func DefaultHierarchyConfig() HierarchyConfig

DefaultHierarchyConfig returns the default hierarchy configuration.

type HierarchyMemory

type HierarchyMemory struct {
	// contains filtered or unexported fields
}

HierarchyMemory is a backward-compatible adapter wrapping MemoryHierarchy.

Implements the session-based Memory interface while using the 3-tier hierarchy internally for improved performance and scalability.

Benefits over InMemoryMemory:

  • Automatic importance-based tier routing
  • FIFO/LRU/TTL eviction strategies
  • Better memory management for long sessions
  • Semantic retrieval across tiers
  • Proven architecture (used in Rust/C++/Zig/Python)

Architecture:

  • Working Memory: Current conversation (FIFO, 10-20 msgs)
  • Short-Term Memory: Recent sessions (LRU+TTL, 100-1000 msgs)
  • Long-Term Memory: Important facts (importance threshold, unlimited)

Example:

memory, err := NewHierarchyMemory(HierarchyConfig{
    WorkingCapacity:        10,
    ShortTermCapacity:      100,
    ShortTermTTLSeconds:    3600,
    LongTermMinImportance:  0.7,
})
err = memory.Store(ctx, "session-123", message, nil)
limit := 10
messages, err := memory.Retrieve(ctx, "session-123", RetrieveOptions{Limit: &limit})

func NewDefaultHierarchyMemory

func NewDefaultHierarchyMemory() (*HierarchyMemory, error)

NewDefaultHierarchyMemory creates a HierarchyMemory with default configuration.

func NewHierarchyMemory

func NewHierarchyMemory(config HierarchyConfig) (*HierarchyMemory, error)

NewHierarchyMemory creates a new HierarchyMemory with the given configuration.

func (*HierarchyMemory) Capabilities

func (h *HierarchyMemory) Capabilities() []string

Capabilities returns the memory capabilities.

func (*HierarchyMemory) Clear

func (h *HierarchyMemory) Clear(ctx context.Context, sessionID string) error

Clear removes all messages for a session from all tiers.

Note: Deletion is permanent and cannot be undone.

func (*HierarchyMemory) GetStats

func (h *HierarchyMemory) GetStats() map[string]interface{}

GetStats returns memory usage statistics from hierarchy.

func (*HierarchyMemory) Retrieve

func (h *HierarchyMemory) Retrieve(
	ctx context.Context,
	sessionID string,
	opts RetrieveOptions,
) ([]agenkit.Message, error)

Retrieve retrieves messages from hierarchy filtered by session.

Note: Unlike InMemoryMemory, this searches semantically across all tiers when query is provided. For chronological order, use query="".

func (*HierarchyMemory) Store

func (h *HierarchyMemory) Store(
	ctx context.Context,
	sessionID string,
	message agenkit.Message,
	metadata map[string]interface{},
) error

Store stores a message in the hierarchy with session association.

Importance Routing:

  • System messages: 0.3 (working + short-term only)
  • User messages: 0.5 (working + short-term, possibly long-term)
  • Assistant messages: 0.4 (working + short-term only)
  • High importance (0.7+): Stored in long-term memory

To control routing, pass importance in metadata:

metadata := map[string]interface{}{"importance": 0.9}
err := memory.Store(ctx, "session-123", message, metadata)

func (*HierarchyMemory) Summarize

func (h *HierarchyMemory) Summarize(
	ctx context.Context,
	sessionID string,
	opts SummarizeOptions,
) (agenkit.Message, error)

Summarize creates a summary of conversation history for session.

Note: This is a simple implementation using concatenation. Production use should use LLM-based summarization.

type InMemoryMemory

type InMemoryMemory struct {
	// contains filtered or unexported fields
}

InMemoryMemory provides simple in-memory storage with LRU eviction.

Features:

  • Fast access (no I/O)
  • LRU eviction when max_size reached
  • Per-session storage
  • Optional metadata support

Limitations:

  • No persistence (data lost on restart)
  • No semantic search
  • Memory limited

Use cases:

  • Testing
  • Simple applications
  • Prototypes
  • When persistence not needed

Example:

memory := NewInMemoryMemory(1000)
err := memory.Store(ctx, "session-123", message, nil)
limit := 10
messages, err := memory.Retrieve(ctx, "session-123", RetrieveOptions{Limit: &limit})

func NewInMemoryMemory

func NewInMemoryMemory(maxSize int) *InMemoryMemory

NewInMemoryMemory creates a new in-memory memory instance.

Args:

maxSize: Maximum number of messages to store per session before LRU eviction

Example:

memory := NewInMemoryMemory(1000)

func (*InMemoryMemory) Capabilities

func (m *InMemoryMemory) Capabilities() []string

Capabilities returns the memory capabilities.

func (*InMemoryMemory) Clear

func (m *InMemoryMemory) Clear(ctx context.Context, sessionID string) error

Clear removes all memory for a session.

func (*InMemoryMemory) GetAllSessions

func (m *InMemoryMemory) GetAllSessions() []string

GetAllSessions returns a list of all session IDs.

func (*InMemoryMemory) GetMemoryUsage

func (m *InMemoryMemory) GetMemoryUsage() map[string]interface{}

GetMemoryUsage returns memory usage statistics.

func (*InMemoryMemory) GetSessionCount

func (m *InMemoryMemory) GetSessionCount(sessionID string) int

GetSessionCount returns the number of messages stored for a session.

func (*InMemoryMemory) Retrieve

func (m *InMemoryMemory) Retrieve(ctx context.Context, sessionID string, opts RetrieveOptions) ([]agenkit.Message, error)

Retrieve fetches messages from memory.

Supports filtering by:

  • TimeRange: Filter by time range
  • ImportanceThreshold: Filter by importance score (requires metadata with "importance")
  • Tags: Filter by tags (requires metadata with "tags")

func (*InMemoryMemory) Store

func (m *InMemoryMemory) Store(ctx context.Context, sessionID string, message agenkit.Message, metadata map[string]interface{}) error

Store saves a message to memory with optional metadata.

func (*InMemoryMemory) Summarize

func (m *InMemoryMemory) Summarize(ctx context.Context, sessionID string, opts SummarizeOptions) (agenkit.Message, error)

Summarize creates a summary of conversation history.

Simple implementation: Returns a message with concatenated content. Production use should use LLM-based summarization.

type InMemoryVectorStore

type InMemoryVectorStore struct {
	// contains filtered or unexported fields
}

InMemoryVectorStore is a simple in-memory vector store using cosine similarity.

Good for testing and small datasets. For production, use specialized vector databases (Pinecone, Weaviate, Qdrant, etc.).

func NewInMemoryVectorStore

func NewInMemoryVectorStore() *InMemoryVectorStore

NewInMemoryVectorStore creates a new in-memory vector store.

func (*InMemoryVectorStore) Add

func (s *InMemoryVectorStore) Add(ctx context.Context, sessionID, messageID string, embedding []float64, message agenkit.Message, metadata map[string]interface{}, timestamp float64) error

Add adds a message with embedding to the store.

func (*InMemoryVectorStore) Clear

func (s *InMemoryVectorStore) Clear(ctx context.Context, sessionID string) error

Clear clears all messages for a session.

func (*InMemoryVectorStore) GetRecent

func (s *InMemoryVectorStore) GetRecent(ctx context.Context, sessionID string, limit int, opts RetrieveOptions) ([]MessageWithMetadata, error)

GetRecent gets recent messages without search.

func (*InMemoryVectorStore) Search

func (s *InMemoryVectorStore) Search(ctx context.Context, sessionID string, queryEmbedding []float64, limit int, opts RetrieveOptions) ([]MessageSearchResult, error)

Search searches for similar messages using cosine similarity.

type Memory

type Memory interface {
	// Store saves a message to memory with optional metadata.
	//
	// Args:
	//   ctx: Context for cancellation
	//   sessionID: Unique session identifier
	//   message: Message to store
	//   metadata: Optional metadata (importance score, tags, etc.)
	//
	// Example:
	//   err := memory.Store(ctx, "session-123",
	//       Message{Role: "user", Content: "Hello"},
	//       map[string]interface{}{"importance": 0.8, "tags": []string{"greeting"}})
	Store(ctx context.Context, sessionID string, message agenkit.Message, metadata map[string]interface{}) error

	// Retrieve fetches messages from memory.
	//
	// Args:
	//   ctx: Context for cancellation
	//   sessionID: Session identifier
	//   opts: Retrieval options (query, limit, filters)
	//
	// Returns:
	//   List of messages (most recent first by default)
	//
	// Example:
	//   // Basic retrieval (most recent)
	//   // Basic retrieval with limit
	//   limit := 10
	//   messages, err := memory.Retrieve(ctx, "session-123", RetrieveOptions{Limit: &limit})
	//
	//   // Use default limit (10) by passing nil
	//   messages, err := memory.Retrieve(ctx, "session-123", RetrieveOptions{})
	//
	//   // Semantic retrieval (if supported)
	//   limit = 5
	//   messages, err := memory.Retrieve(ctx, "session-123",
	//       RetrieveOptions{Query: "What did we discuss about pricing?", Limit: &limit})
	//
	//   // Time-filtered retrieval
	//   limit = 20
	//   messages, err := memory.Retrieve(ctx, "session-123",
	//       RetrieveOptions{TimeRange: &TimeRange{Start: start, End: end}, Limit: &limit})
	Retrieve(ctx context.Context, sessionID string, opts RetrieveOptions) ([]agenkit.Message, error)

	// Summarize creates a summary of conversation history.
	//
	// Args:
	//   ctx: Context for cancellation
	//   sessionID: Session identifier
	//   opts: Summarization options
	//
	// Returns:
	//   Message containing summary
	//
	// Example:
	//   summary, err := memory.Summarize(ctx, "session-123", SummarizeOptions{})
	//   fmt.Println(summary.Content) // "Discussed pricing strategy, decided on $50/month tier..."
	Summarize(ctx context.Context, sessionID string, opts SummarizeOptions) (agenkit.Message, error)

	// Clear removes all memory for a session.
	//
	// Args:
	//   ctx: Context for cancellation
	//   sessionID: Session identifier
	//
	// Example:
	//   err := memory.Clear(ctx, "session-123")
	Clear(ctx context.Context, sessionID string) error

	// Capabilities returns the memory capabilities.
	//
	// Possible capabilities:
	//   - "basic_retrieval": Supports simple Retrieve()
	//   - "semantic_search": Supports query-based retrieval
	//   - "summarization": Supports Summarize()
	//   - "persistence": Data survives restarts
	//   - "ttl": Supports automatic expiry
	//   - "importance_weighting": Supports importance-based retrieval
	//   - "time_travel": Supports point-in-time queries
	//
	// Example:
	//   caps := memory.Capabilities()
	//   // []string{"basic_retrieval", "persistence", "ttl"}
	Capabilities() []string
}

Memory is the minimal interface for agent memory systems.

Memory systems store and retrieve agent conversation history, enabling context management beyond raw message lists. Different implementations support various storage backends and retrieval strategies.

Example:

memory := NewInMemoryMemory(1000)
err := memory.Store(ctx, "session-123", message, nil)
messages, err := memory.Retrieve(ctx, "session-123", RetrieveOptions{Limit: 10})

type MessageSearchResult

type MessageSearchResult struct {
	Message  agenkit.Message
	Metadata map[string]interface{}
	Score    float64
}

MessageSearchResult represents a search result with score.

type MessageWithMetadata

type MessageWithMetadata struct {
	Timestamp float64                // Unix timestamp with microsecond precision
	Message   agenkit.Message        // The message
	Metadata  map[string]interface{} // Associated metadata
}

MessageWithMetadata wraps a message with its timestamp and metadata.

type RedisMemory

type RedisMemory struct {
	// contains filtered or unexported fields
}

RedisMemory provides Redis-backed memory with TTL and pub/sub.

Features:

  • Persistent storage (survives restarts)
  • TTL support (automatic expiry)
  • Multi-instance agents (shared memory)
  • Fast access (in-memory Redis)
  • Scalable (Redis cluster support)

Use cases:

  • Production deployments
  • Multi-instance agents
  • When persistence needed
  • Shared memory across agents

Example:

memory := NewRedisMemory("redis://localhost:6379", 86400, "agenkit:memory")
err := memory.Store(ctx, "session-123", message, nil)
limit := 10
messages, err := memory.Retrieve(ctx, "session-123", RetrieveOptions{Limit: &limit})

Redis Data Structure:

  • Key: "agenkit:memory:{session_id}:messages"
  • Type: Sorted Set (ZSET)
  • Score: Timestamp (for ordering)
  • Value: JSON(message, metadata)

func NewRedisMemory

func NewRedisMemory(redisURL string, ttlSeconds int, keyPrefix string) (*RedisMemory, error)

NewRedisMemory creates a new Redis-backed memory instance.

Args:

redisURL: Redis connection URL
ttlSeconds: Time-to-live in seconds (0 = no expiry)
keyPrefix: Prefix for Redis keys

Example:

memory := NewRedisMemory("redis://localhost:6379", 86400, "agenkit:memory")

func (*RedisMemory) Capabilities

func (r *RedisMemory) Capabilities() []string

Capabilities returns the memory capabilities.

func (*RedisMemory) Clear

func (r *RedisMemory) Clear(ctx context.Context, sessionID string) error

Clear removes all memory for a session.

func (*RedisMemory) Close

func (r *RedisMemory) Close() error

Close closes the Redis connection.

func (*RedisMemory) GetAllSessions

func (r *RedisMemory) GetAllSessions(ctx context.Context) ([]string, error)

GetAllSessions returns a list of all session IDs.

func (*RedisMemory) GetMemoryUsage

func (r *RedisMemory) GetMemoryUsage(ctx context.Context) (map[string]interface{}, error)

GetMemoryUsage returns memory usage statistics.

func (*RedisMemory) GetSessionCount

func (r *RedisMemory) GetSessionCount(ctx context.Context, sessionID string) (int64, error)

GetSessionCount returns the number of messages stored for a session.

func (*RedisMemory) Retrieve

func (r *RedisMemory) Retrieve(ctx context.Context, sessionID string, opts RetrieveOptions) ([]agenkit.Message, error)

Retrieve fetches messages from Redis.

Supports filtering by:

  • TimeRange: Filter by time range
  • ImportanceThreshold: Filter by importance score
  • Tags: Filter by tags

func (*RedisMemory) Store

func (r *RedisMemory) Store(ctx context.Context, sessionID string, message agenkit.Message, metadata map[string]interface{}) error

Store saves a message to Redis with optional metadata.

func (*RedisMemory) Summarize

func (r *RedisMemory) Summarize(ctx context.Context, sessionID string, opts SummarizeOptions) (agenkit.Message, error)

Summarize creates a summary of conversation history.

Simple implementation: Returns a message with concatenated content. Production use should use LLM-based summarization.

type RetrieveOptions

type RetrieveOptions struct {
	// Query is an optional semantic query for retrieval (if supported)
	Query string

	// Limit is the maximum number of messages to return (nil = default of 10)
	Limit *int

	// TimeRange filters messages by time (optional)
	TimeRange *TimeRange

	// ImportanceThreshold filters messages by importance score (optional)
	ImportanceThreshold *float64

	// Tags filters messages that have any of these tags (optional)
	Tags []string
}

RetrieveOptions specifies options for retrieving messages.

type SummarizeOptions

type SummarizeOptions struct {
	// MaxLength is the maximum length of the summary (optional)
	MaxLength int

	// Style is the summary style: "brief" or "detailed" (optional)
	Style string
}

SummarizeOptions specifies options for summarization.

type TimeRange

type TimeRange struct {
	Start int64 // Unix timestamp in seconds
	End   int64 // Unix timestamp in seconds
}

TimeRange represents a time range filter.

type VectorMemory

type VectorMemory struct {
	// contains filtered or unexported fields
}

VectorMemory provides vector database for semantic retrieval.

Features:

  • Semantic search via embeddings
  • Relevance-based retrieval
  • Pluggable embedding providers
  • Pluggable vector stores

Use cases:

  • RAG (Retrieval-Augmented Generation)
  • Semantic memory
  • Large knowledge bases
  • Context-aware agents

Example:

embeddings := NewOpenAIEmbeddings(client)
memory := NewVectorMemory(embeddings, nil)
err := memory.Store(ctx, "session-123", message, nil)
limit := 5
messages, err := memory.Retrieve(ctx, "session-123",
    RetrieveOptions{Query: "What did we discuss about pricing?", Limit: &limit})

func NewVectorMemory

func NewVectorMemory(embeddingProvider EmbeddingProvider, vectorStore VectorStore) *VectorMemory

NewVectorMemory creates a new vector memory instance.

Args:

embeddingProvider: Provider for generating embeddings
vectorStore: Vector storage backend (defaults to in-memory)

Example:

embeddings := NewOpenAIEmbeddings(client)
memory := NewVectorMemory(embeddings, nil)

func (*VectorMemory) Capabilities

func (v *VectorMemory) Capabilities() []string

Capabilities returns the memory capabilities.

func (*VectorMemory) Clear

func (v *VectorMemory) Clear(ctx context.Context, sessionID string) error

Clear removes all memory for a session.

func (*VectorMemory) Retrieve

func (v *VectorMemory) Retrieve(ctx context.Context, sessionID string, opts RetrieveOptions) ([]agenkit.Message, error)

Retrieve fetches messages with semantic search.

If query provided, performs semantic search. Otherwise, returns most recent messages.

Supports filtering by:

  • TimeRange: Filter by time range
  • ImportanceThreshold: Filter by importance score
  • Tags: Filter by tags

func (*VectorMemory) RetrieveWithScores

func (v *VectorMemory) RetrieveWithScores(ctx context.Context, sessionID string, query string, limit *int) ([]MessageSearchResult, error)

RetrieveWithScores retrieves messages with similarity scores.

Args:

ctx: Context
sessionID: Session identifier
query: Search query
limit: Maximum results to return (nil = default of 10)

Returns:

List of (message, score) tuples

func (*VectorMemory) Store

func (v *VectorMemory) Store(ctx context.Context, sessionID string, message agenkit.Message, metadata map[string]interface{}) error

Store saves a message with embedding in vector store.

func (*VectorMemory) Summarize

func (v *VectorMemory) Summarize(ctx context.Context, sessionID string, opts SummarizeOptions) (agenkit.Message, error)

Summarize creates a summary of conversation history.

For vector memory, we can use semantic search to find key messages and summarize those.

type VectorStore

type VectorStore interface {
	// Add adds a message with embedding to the store.
	Add(ctx context.Context, sessionID, messageID string, embedding []float64, message agenkit.Message, metadata map[string]interface{}, timestamp float64) error

	// Search searches for similar messages.
	// Returns list of (message, metadata, score) tuples.
	Search(ctx context.Context, sessionID string, queryEmbedding []float64, limit int, opts RetrieveOptions) ([]MessageSearchResult, error)

	// GetRecent gets recent messages without search.
	GetRecent(ctx context.Context, sessionID string, limit int, opts RetrieveOptions) ([]MessageWithMetadata, error)

	// Clear clears all messages for a session.
	Clear(ctx context.Context, sessionID string) error
}

VectorStore is the interface for vector stores.

Directories

Path Synopsis
Package strategies provides memory selection strategies for context management.
Package strategies provides memory selection strategies for context management.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL