Class: HTM::Jobs::GenerateEmbeddingJob

Inherits:
Object
  • Object
show all
Defined in:
lib/htm/jobs/generate_embedding_job.rb

Overview

Background job to generate and store vector embeddings for nodes

This job is enqueued after a node is saved to avoid blocking the main request path. It generates embeddings asynchronously and updates the node record with the embedding vector.

See Also:

  • Async Embedding and Tag Generation

Class Method Summary collapse

Class Method Details

.perform(node_id:) ⇒ Object

Generate embedding for a node

Uses the configured embedding generator (HTM.embed) which delegates to the application-provided or default RubyLLM implementation.

Parameters:

  • node_id (Integer)

    ID of the node to process



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/htm/jobs/generate_embedding_job.rb', line 25

def self.perform(node_id:)
  node = HTM::Models::Node.find_by(id: node_id)

  unless node
    HTM.logger.warn "GenerateEmbeddingJob: Node #{node_id} not found"
    return
  end

  # Skip if already has embedding
  if node.embedding.present?
    HTM.logger.debug "GenerateEmbeddingJob: Node #{node_id} already has embedding, skipping"
    return
  end

  begin
    HTM.logger.debug "GenerateEmbeddingJob: Generating embedding for node #{node_id}"

    # Generate and process embedding using EmbeddingService
    result = HTM::EmbeddingService.generate(node.content)

    # Update node with processed embedding
    node.update!(
      embedding: result[:storage_embedding],
      embedding_dimension: result[:dimension]
    )

    HTM.logger.info "GenerateEmbeddingJob: Successfully generated embedding for node #{node_id} (#{result[:dimension]} dimensions)"

  rescue HTM::EmbeddingError => e
    # Log embedding-specific errors
    HTM.logger.error "GenerateEmbeddingJob: Embedding generation failed for node #{node_id}: #{e.message}"

  rescue StandardError => e
    # Log unexpected errors
    HTM.logger.error "GenerateEmbeddingJob: Unexpected error for node #{node_id}: #{e.class.name} - #{e.message}"
    HTM.logger.debug e.backtrace.first(5).join("\n")
  end
end