memory

package
v1.55.0 Latest Latest
Warning

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

Go to latest
Published: Mar 20, 2026 License: MIT Imports: 20 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 CohereEmbeddingProvider added in v1.33.41

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

CohereEmbeddingProvider uses Cohere's embedding API

func NewCohereEmbeddingProvider added in v1.33.41

func NewCohereEmbeddingProvider(model string) (*CohereEmbeddingProvider, error)

NewCohereEmbeddingProvider creates a new Cohere embedding provider

func (*CohereEmbeddingProvider) GenerateBatchEmbeddings added in v1.33.41

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

GenerateBatchEmbeddings uses Cohere's batch embedding endpoint

func (*CohereEmbeddingProvider) GenerateEmbedding added in v1.33.41

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

func (*CohereEmbeddingProvider) Name added in v1.33.41

func (p *CohereEmbeddingProvider) Name() string

type CompletionRequest

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

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 Supports: openai, gemini, jina, voyage, cohere, huggingface, ollama Provider MUST be explicitly configured - no auto-selection

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 GeminiEmbeddingProvider added in v1.33.41

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

GeminiEmbeddingProvider uses Google's Gemini embedding API

func NewGeminiEmbeddingProvider added in v1.33.41

func NewGeminiEmbeddingProvider(model string, dimensions int) (*GeminiEmbeddingProvider, error)

NewGeminiEmbeddingProvider creates a new Gemini embedding provider dimensions controls output_dimensionality (0 = use model default: 3072 for gemini-embedding-2)

func (*GeminiEmbeddingProvider) GenerateBatchEmbeddings added in v1.33.41

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

GenerateBatchEmbeddings uses Gemini's batch embedding endpoint

func (*GeminiEmbeddingProvider) GenerateEmbedding added in v1.33.41

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

func (*GeminiEmbeddingProvider) Name added in v1.33.41

func (p *GeminiEmbeddingProvider) Name() string

type HuggingFaceEmbeddingProvider added in v1.33.41

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

HuggingFaceEmbeddingProvider uses HuggingFace's Inference API

func NewHuggingFaceEmbeddingProvider added in v1.33.41

func NewHuggingFaceEmbeddingProvider(model string) (*HuggingFaceEmbeddingProvider, error)

NewHuggingFaceEmbeddingProvider creates a new HuggingFace embedding provider

func (*HuggingFaceEmbeddingProvider) GenerateBatchEmbeddings added in v1.33.41

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

GenerateBatchEmbeddings generates embeddings using HuggingFace Inference API HuggingFace supports batch inputs as an array

func (*HuggingFaceEmbeddingProvider) GenerateEmbedding added in v1.33.41

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

func (*HuggingFaceEmbeddingProvider) Name added in v1.33.41

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 JinaEmbeddingProvider added in v1.33.41

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

JinaEmbeddingProvider uses Jina AI's embedding API

func NewJinaEmbeddingProvider added in v1.33.41

func NewJinaEmbeddingProvider(model string) (*JinaEmbeddingProvider, error)

NewJinaEmbeddingProvider creates a new Jina embedding provider

func (*JinaEmbeddingProvider) GenerateBatchEmbeddings added in v1.33.41

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

GenerateBatchEmbeddings uses Jina's batch embedding endpoint

func (*JinaEmbeddingProvider) GenerateEmbedding added in v1.33.41

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

func (*JinaEmbeddingProvider) Name added in v1.33.41

func (p *JinaEmbeddingProvider) Name() string

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) ShouldRememberDifferential added in v1.33.41

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

ShouldRememberDifferential uses pure RAG-based novelty detection without LLM calls It extracts sentences from messages and checks if they're novel compared to existing memories

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

type VoyageEmbeddingProvider added in v1.33.41

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

VoyageEmbeddingProvider uses Voyage AI's embedding API

func NewVoyageEmbeddingProvider added in v1.33.41

func NewVoyageEmbeddingProvider(model string) (*VoyageEmbeddingProvider, error)

NewVoyageEmbeddingProvider creates a new Voyage embedding provider

func (*VoyageEmbeddingProvider) GenerateBatchEmbeddings added in v1.33.41

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

GenerateBatchEmbeddings uses Voyage's batch embedding endpoint

func (*VoyageEmbeddingProvider) GenerateEmbedding added in v1.33.41

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

func (*VoyageEmbeddingProvider) Name added in v1.33.41

func (p *VoyageEmbeddingProvider) Name() string

Jump to

Keyboard shortcuts

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