Module: Rogalik::Plugins::GeminiEmbeddings::EmbeddingsMethods

Defined in:
lib/rogalik/plugins/gemini_embeddings.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#api_keyString (readonly)

Returns Gemini API key.

Returns:

  • (String)

    Gemini API key



14
15
16
# File 'lib/rogalik/plugins/gemini_embeddings.rb', line 14

def api_key
  @api_key
end

#base_urlString (readonly)

Returns base URL for the Gemini API.

Returns:

  • (String)

    base URL for the Gemini API



20
21
22
# File 'lib/rogalik/plugins/gemini_embeddings.rb', line 20

def base_url
  @base_url
end

#modelString (readonly)

Returns embedding model name.

Returns:

  • (String)

    embedding model name



17
18
19
# File 'lib/rogalik/plugins/gemini_embeddings.rb', line 17

def model
  @model
end

Instance Method Details

#clientFaraday::Connection

Returns a memoized Faraday client configured for the Gemini API.

Returns:

  • (Faraday::Connection)


36
37
38
39
40
41
42
43
# File 'lib/rogalik/plugins/gemini_embeddings.rb', line 36

def client
  @client ||= Faraday.new(url: base_url) do |con|
    con.request :json
    con.response :json
    con.headers["Content-Type"] = "application/json"
    con.headers["x-goog-api-key"] = api_key
  end
end

#embed_documents(documents) ⇒ Array<Pipeline::Document>

Generates embeddings for each document and assigns them in place. Uses the batchEmbedContents endpoint to embed all documents in a single request.

Parameters:

  • documents (Array<Pipeline::Document>)

    documents whose page_content will be embedded

Returns:

  • (Array<Pipeline::Document>)

    the same documents with embeddings populated

Raises:

  • (StandardError)


50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/rogalik/plugins/gemini_embeddings.rb', line 50

def embed_documents(documents)
  response = client.post(batch_endpoint) do |req|
    req.body = {
      requests: documents.map do |doc|
        { model: "models/#{model}", content: { parts: [ { text: doc.page_content } ] } }
      end
    }
  end

  raise StandardError, "Gemini embedding request failed (HTTP #{response.status})" unless response.success?

  response.body.fetch("embeddings").each_with_index do |embedding, i|
    documents[i].embeddings = embedding["values"]
  end

  documents
end

#embed_text(text) ⇒ Array<Float>

Generates an embedding vector for a single string.

Parameters:

  • text (String)

    the text to embed

Returns:

  • (Array<Float>)

    the embedding vector

Raises:

  • (StandardError)


72
73
74
75
76
77
78
79
80
# File 'lib/rogalik/plugins/gemini_embeddings.rb', line 72

def embed_text(text)
  response = client.post(embed_endpoint) do |req|
    req.body = { model: "models/#{model}", content: { parts: [ { text: text } ] } }
  end

  raise StandardError, "Gemini embedding request failed (HTTP #{response.status})" unless response.success?

  response.body.dig("embedding", "values")
end

#initialize(config: Rogalik.configuration.embeddings) ⇒ Object

Parameters:

Raises:

  • (ArgumentError)


23
24
25
26
27
28
29
30
31
# File 'lib/rogalik/plugins/gemini_embeddings.rb', line 23

def initialize(config: Rogalik.configuration.embeddings)
  api_key = config.api_key || ENV["GEMINI_API_KEY"]
  raise ArgumentError, "Gemini API key is required, set through env GEMINI_API_KEY or config" if api_key.nil?
  raise ArgumentError, "Gemini model name is required" if config.model.nil?

  @api_key = api_key
  @model = config.model
  @base_url = config.base_url || ENV["GEMINI_BASE_URL"] || BASE_URL
end