Class: ClaudeMemory::Embeddings::ApiAdapter

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

Overview

Adapter for any OpenAI-compatible /v1/embeddings endpoint. Works with OpenAI, Voyage, Ollama, LiteLLM, etc.

Required ENV:

CLAUDE_MEMORY_EMBEDDING_API_KEY or OPENAI_API_KEY

Optional ENV:

CLAUDE_MEMORY_EMBEDDING_API_URL (default: https://api.openai.com/v1/embeddings)
CLAUDE_MEMORY_EMBEDDING_MODEL   (default: text-embedding-3-small)

Defined Under Namespace

Classes: ApiError

Constant Summary collapse

DEFAULT_API_URL =
"https://api.openai.com/v1/embeddings"
DEFAULT_MODEL =
"text-embedding-3-small"

Instance Method Summary collapse

Constructor Details

#initialize(model: nil, env: ENV) ⇒ ApiAdapter

Returns a new instance of ApiAdapter.

Raises:

  • (ArgumentError)


25
26
27
28
29
30
31
32
# File 'lib/claude_memory/embeddings/api_adapter.rb', line 25

def initialize(model: nil, env: ENV)
  @api_key = env["CLAUDE_MEMORY_EMBEDDING_API_KEY"] || env["OPENAI_API_KEY"]
  @api_url = env["CLAUDE_MEMORY_EMBEDDING_API_URL"] || DEFAULT_API_URL
  @model = model || env["CLAUDE_MEMORY_EMBEDDING_MODEL"] || DEFAULT_MODEL
  @known_dimensions = ModelRegistry.dimensions_for(@model)

  raise ArgumentError, "Set CLAUDE_MEMORY_EMBEDDING_API_KEY or OPENAI_API_KEY" unless @api_key
end

Instance Method Details

#dimensionsObject

Dimensions resolved from registry if known, otherwise lazy from first API response.



37
38
39
# File 'lib/claude_memory/embeddings/api_adapter.rb', line 37

def dimensions
  @dimensions ||= @known_dimensions || fetch_dimensions
end

#generate(text) ⇒ Array<Float> Also known as: generate_passage

Generate embedding for a query text.

Parameters:

  • text (String)

    input text to embed

Returns:

  • (Array<Float>)

    embedding vector

Raises:



44
45
46
47
48
49
50
51
52
53
54
# File 'lib/claude_memory/embeddings/api_adapter.rb', line 44

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

  response = call_api(text)
  embedding = response.dig("data", 0, "embedding")

  raise ApiError, "No embedding returned in API response" unless embedding

  @dimensions ||= embedding.size
  embedding
end

#nameObject



34
# File 'lib/claude_memory/embeddings/api_adapter.rb', line 34

def name = "api"