Class: ClaudeMemory::Embeddings::FastembedAdapter

Inherits:
Object
  • Object
show all
Defined in:
lib/claude_memory/embeddings/fastembed_adapter.rb

Overview

Adapter wrapping fastembed-rb for high-quality local embeddings. Supports any model available in fastembed-rb’s SUPPORTED_MODELS.

Model selection (in priority order):

1. Explicit model_name parameter
2. CLAUDE_MEMORY_EMBEDDING_MODEL env var
3. Default: BAAI/bge-small-en-v1.5 (384-dim, ~67MB ONNX)

Dimensions are resolved from the ModelRegistry for known models, or probed from fastembed’s ModelInfo for unknown models.

Usage:

adapter = FastembedAdapter.new
query_vec = adapter.generate("What database?")         # query encoding
passage_vec = adapter.generate_passage("Uses PostgreSQL") # passage encoding

# Use a larger model:
adapter = FastembedAdapter.new(model_name: "BAAI/bge-base-en-v1.5")
adapter.dimensions  # => 768

Constant Summary collapse

DEFAULT_MODEL =
"BAAI/bge-small-en-v1.5"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(model_name: nil, env: ENV) ⇒ FastembedAdapter

Returns a new instance of FastembedAdapter.



32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/claude_memory/embeddings/fastembed_adapter.rb', line 32

def initialize(model_name: nil, env: ENV)
  @model_name = model_name || env["CLAUDE_MEMORY_EMBEDDING_MODEL"] || DEFAULT_MODEL
  @dimensions = resolve_dimensions(@model_name)

  require "fastembed"
  @model = Fastembed::TextEmbedding.new(model_name: @model_name)

  # If dimensions weren't known from registry, probe from fastembed
  @dimensions ||= probe_dimensions_from_fastembed
rescue LoadError
  raise LoadError,
    "fastembed gem is required for FastembedAdapter. Add `gem 'fastembed'` to your Gemfile."
end

Instance Attribute Details

#dimensionsObject (readonly)

Returns the value of attribute dimensions.



28
29
30
# File 'lib/claude_memory/embeddings/fastembed_adapter.rb', line 28

def dimensions
  @dimensions
end

#model_nameObject (readonly)

Returns the value of attribute model_name.



28
29
30
# File 'lib/claude_memory/embeddings/fastembed_adapter.rb', line 28

def model_name
  @model_name
end

Instance Method Details

#generate(text) ⇒ Array<Float>

Generate query embedding (optimized for search queries)

Parameters:

  • text (String)

    query text to embed

Returns:

  • (Array<Float>)

    normalized embedding vector



49
50
51
52
53
# File 'lib/claude_memory/embeddings/fastembed_adapter.rb', line 49

def generate(text)
  return zero_vector if text.nil? || text.empty?

  @model.query_embed(text).first.to_a
end

#generate_passage(text) ⇒ Array<Float>

Generate passage embedding (optimized for document/fact indexing)

Parameters:

  • text (String)

    passage text to embed

Returns:

  • (Array<Float>)

    normalized embedding vector



58
59
60
61
62
# File 'lib/claude_memory/embeddings/fastembed_adapter.rb', line 58

def generate_passage(text)
  return zero_vector if text.nil? || text.empty?

  @model.passage_embed(text).first.to_a
end

#nameObject



30
# File 'lib/claude_memory/embeddings/fastembed_adapter.rb', line 30

def name = "fastembed"