memory

package
v0.2.0 Latest Latest
Warning

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

Go to latest
Published: Jan 30, 2026 License: MIT Imports: 19 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func ConvertJSONToProse

func ConvertJSONToProse(content string, resourceName string) string

ConvertJSONToProse flattens ANY JSON to readable text lines Universal - works on any JSON structure without pattern matching

func FormatMemoryContext

func FormatMemoryContext(memories []*Memory) string

func IsJSON

func IsJSON(content string) bool

IsJSON checks if content appears to be JSON

func PreprocessContent

func PreprocessContent(content, mimeType, resourceName string) (string, bool)

PreprocessContent converts JSON to plain text for chunking Returns the flattened text and true if conversion happened

Types

type Chunk

type Chunk struct {
	Content  string
	Index    int
	StartPos int
	EndPos   int
}

Chunk represents a piece of a document

type CompletionRequest

type CompletionRequest struct {
	Model       string    `json:"model"`
	Messages    []Message `json:"messages"`
	Temperature float64   `json:"temperature"`
}

type CompletionResponse

type CompletionResponse struct {
	Choices []struct {
		Message struct {
			Content string `json:"content"`
		} `json:"message"`
	} `json:"choices"`
}

type DocumentChunker

type DocumentChunker struct {
	MaxChunkSize int // Max characters per chunk
	ChunkOverlap int // Overlap between chunks
	MinChunkSize int // Minimum chunk size (skip smaller)
}

DocumentChunker splits documents into overlapping chunks for memory storage

func NewDocumentChunker

func NewDocumentChunker(maxSize, overlap int) *DocumentChunker

NewDocumentChunker creates a new chunker with the given settings

func (*DocumentChunker) ChunkText

func (dc *DocumentChunker) ChunkText(content string) []Chunk

ChunkText splits text into overlapping chunks Uses paragraph-aware splitting when possible

type EmbeddingProvider

type EmbeddingProvider interface {
	// GenerateEmbedding generates an embedding vector for the given text
	GenerateEmbedding(ctx context.Context, text string) ([]float32, error)

	// GenerateBatchEmbeddings generates embeddings for multiple texts at once
	// Returns embeddings in the same order as input texts
	GenerateBatchEmbeddings(ctx context.Context, texts []string) ([][]float32, error)

	// Name returns the provider name
	Name() string
}

EmbeddingProvider generates embeddings for text

func NewEmbeddingProvider

func NewEmbeddingProvider(cfg *config.MemoryConfig) (EmbeddingProvider, error)

NewEmbeddingProvider creates an embedding provider based on config

type EmbeddingRequest

type EmbeddingRequest struct {
	Model string   `json:"model"`
	Input []string `json:"input"`
}

OpenAI API structures

type EmbeddingResponse

type EmbeddingResponse struct {
	Data []struct {
		Embedding []float32 `json:"embedding"`
	} `json:"data"`
}

type ExtractResult

type ExtractResult struct {
	Content  string                 // Extracted text content
	Title    string                 // Document title if detected
	Metadata map[string]interface{} // Additional metadata
}

ExtractResult contains extracted text and metadata

type IngestFileResult

type IngestFileResult struct {
	FileID      string `json:"file_id"`
	FileName    string `json:"file_name"`
	ChunksCount int    `json:"chunks_count"`
	ParentID    string `json:"parent_id"`
}

IngestFileResult contains the result of file ingestion

type Memory

type Memory struct {
	ID           string                 `json:"id"`
	Content      string                 `json:"content"`
	Summary      string                 `json:"summary"`
	Embedding    []float32              `json:"-"` // Don't expose embeddings in JSON
	ThreadID     string                 `json:"thread_id"`
	MessageID    string                 `json:"message_id,omitempty"`
	Importance   float64                `json:"importance"`
	Category     string                 `json:"category"` // fact, preference, instruction, context, document
	Metadata     map[string]interface{} `json:"metadata,omitempty"`
	CreatedAt    time.Time              `json:"created_at"`
	LastAccessed *time.Time             `json:"last_accessed,omitempty"`
	AccessCount  int                    `json:"access_count"`

	// Source tracking for RAG
	Source     MemorySource `json:"source"`                // chat, file, manual
	SourceID   string       `json:"source_id,omitempty"`   // file_id for file source
	SourceName string       `json:"source_name,omitempty"` // filename for attribution

	// Chunking info for document memories
	ParentID    string `json:"parent_id,omitempty"`    // Groups chunks from same document
	ChunkIndex  int    `json:"chunk_index,omitempty"`  // Position in document
	TotalChunks int    `json:"total_chunks,omitempty"` // Total chunks in document

	// MCP resource tracking
	MCPServerID   int    `json:"mcp_server_id,omitempty"`
	MCPServerName string `json:"mcp_server_name,omitempty"`
	ResourceURI   string `json:"resource_uri,omitempty"`
}

type MemoryCandidate

type MemoryCandidate struct {
	Content    string                 `json:"content"`
	Summary    string                 `json:"summary,omitempty"`
	Importance float64                `json:"importance"`
	Category   string                 `json:"category"`
	Metadata   map[string]interface{} `json:"metadata,omitempty"`
}

type MemoryManager

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

func NewMemoryManager

func NewMemoryManager(db *sql.DB, cfg *config.MemoryConfig, eventBus *events.EventBus) (*MemoryManager, error)

func (*MemoryManager) ClearAllMemories

func (m *MemoryManager) ClearAllMemories() error

func (*MemoryManager) DeleteFileMemories

func (m *MemoryManager) DeleteFileMemories(fileID string) error

DeleteFileMemories removes all memories associated with a file

func (*MemoryManager) DeleteMCPResource

func (m *MemoryManager) DeleteMCPResource(uri string) (int, error)

DeleteMCPResource removes all memories associated with an MCP resource

func (*MemoryManager) DeleteMemoriesBySourceID

func (m *MemoryManager) DeleteMemoriesBySourceID(sourceID string) (int, error)

DeleteMemoriesBySourceID deletes all memories associated with a source (e.g., file_id)

func (*MemoryManager) DeleteMemory

func (m *MemoryManager) DeleteMemory(id string) error

func (*MemoryManager) GetAllMemories

func (m *MemoryManager) GetAllMemories(threadID string) ([]*Memory, error)

func (*MemoryManager) IngestFile

func (m *MemoryManager) IngestFile(fileID, fileName, mimeType string, data []byte) (*IngestFileResult, error)

IngestFile processes a file and stores its content as memories

func (*MemoryManager) IngestMCPResource

func (m *MemoryManager) IngestMCPResource(serverID int, serverName, uri, name, content, mimeType, contentChecksum string) (*IngestFileResult, error)

IngestMCPResource processes an MCP resource and stores its content as memories

func (*MemoryManager) LoadMCPChecksums

func (m *MemoryManager) LoadMCPChecksums() (map[string]string, error)

LoadMCPChecksums loads all MCP resource checksums from the database Returns a map of resource_uri -> content_checksum for efficient lookup

func (*MemoryManager) RetrieveRelevant

func (m *MemoryManager) RetrieveRelevant(query string, threadID string, limit int) ([]*Memory, error)

func (*MemoryManager) ShouldRemember

func (m *MemoryManager) ShouldRemember(messages []interface{}, threadID string) ([]MemoryCandidate, error)

func (*MemoryManager) StoreMemories

func (m *MemoryManager) StoreMemories(candidates []MemoryCandidate, threadID, messageID string) error

type MemorySource

type MemorySource string

MemorySource indicates where a memory originated from

const (
	SourceChat   MemorySource = "chat"   // Extracted from conversations
	SourceFile   MemorySource = "file"   // Chunked from uploaded documents
	SourceManual MemorySource = "manual" // Explicitly added by user/agent
	SourceMCP    MemorySource = "mcp"    // Synced from MCP resources
)

type Message

type Message struct {
	Role    string `json:"role"`
	Content string `json:"content"`
}

type OllamaEmbeddingProvider

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

OllamaEmbeddingProvider uses Ollama's embedding API

func NewOllamaEmbeddingProvider

func NewOllamaEmbeddingProvider(baseURL, model string) *OllamaEmbeddingProvider

NewOllamaEmbeddingProvider creates a new Ollama embedding provider

func (*OllamaEmbeddingProvider) GenerateBatchEmbeddings

func (p *OllamaEmbeddingProvider) GenerateBatchEmbeddings(ctx context.Context, texts []string) ([][]float32, error)

GenerateBatchEmbeddings for Ollama falls back to sequential calls since Ollama doesn't support batch embedding natively

func (*OllamaEmbeddingProvider) GenerateEmbedding

func (p *OllamaEmbeddingProvider) GenerateEmbedding(ctx context.Context, text string) ([]float32, error)

func (*OllamaEmbeddingProvider) Name

func (p *OllamaEmbeddingProvider) Name() string

type OpenAIEmbeddingProvider

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

OpenAIEmbeddingProvider uses OpenAI's embedding API

func NewOpenAIEmbeddingProvider

func NewOpenAIEmbeddingProvider(model string) (*OpenAIEmbeddingProvider, error)

NewOpenAIEmbeddingProvider creates a new OpenAI embedding provider

func (*OpenAIEmbeddingProvider) GenerateBatchEmbeddings

func (p *OpenAIEmbeddingProvider) GenerateBatchEmbeddings(ctx context.Context, texts []string) ([][]float32, error)

GenerateBatchEmbeddings generates embeddings for multiple texts in a single API call OpenAI supports up to 2048 inputs per request, we use batches of 100 to be safe

func (*OpenAIEmbeddingProvider) GenerateEmbedding

func (p *OpenAIEmbeddingProvider) GenerateEmbedding(ctx context.Context, text string) ([]float32, error)

func (*OpenAIEmbeddingProvider) Name

func (p *OpenAIEmbeddingProvider) Name() string

type TextExtractor

type TextExtractor struct{}

TextExtractor extracts text content from various file formats

func NewTextExtractor

func NewTextExtractor() *TextExtractor

NewTextExtractor creates a new text extractor

func (*TextExtractor) CanExtract

func (te *TextExtractor) CanExtract(mimeType string) bool

CanExtract checks if a MIME type is supported for extraction

func (*TextExtractor) Extract

func (te *TextExtractor) Extract(data []byte, mimeType string) (*ExtractResult, error)

Extract extracts text from file data based on MIME type

Jump to

Keyboard shortcuts

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