Class: EvalRuby::Embedders::OpenAI

Inherits:
Base
  • Object
show all
Defined in:
lib/eval_ruby/embedders/openai.rb

Overview

OpenAI embeddings backend. Requires an API key via Configuration#embedder_api_key (or falls back to Configuration#api_key). The default model is text-embedding-3-small (1536 dimensions).

Constant Summary collapse

API_URL =
"https://api.openai.com/v1/embeddings"

Instance Method Summary collapse

Constructor Details

#initialize(config) ⇒ OpenAI

Returns a new instance of OpenAI.

Parameters:

Raises:



18
19
20
21
22
23
24
# File 'lib/eval_ruby/embedders/openai.rb', line 18

def initialize(config)
  super
  @api_key = @config.embedder_api_key || @config.api_key
  if @api_key.nil? || @api_key.empty?
    raise EvalRuby::Error, "API key is required for embedder. Set via EvalRuby.configure { |c| c.embedder_api_key = '...' } or c.api_key = '...'"
  end
end

Instance Method Details

#call(texts) ⇒ Array<Array<Float>>

Returns vectors in input order.

Parameters:

  • texts (Array<String>)

    inputs to embed

Returns:

  • (Array<Array<Float>>)

    vectors in input order

Raises:



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/eval_ruby/embedders/openai.rb', line 35

def call(texts)
  retries = 0
  begin
    uri = URI(API_URL)
    request = Net::HTTP::Post.new(uri)
    request["Authorization"] = "Bearer #{@api_key}"
    request["Content-Type"] = "application/json"
    request.body = JSON.generate({input: texts, model: model})

    response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true,
                               read_timeout: @config.timeout) do |http|
      http.request(request)
    end

    unless response.is_a?(Net::HTTPSuccess)
      raise APIError, "OpenAI embeddings API error: #{response.code} - #{response.body}"
    end

    parse_vectors(response.body)
  rescue Net::OpenTimeout, Net::ReadTimeout, Errno::ECONNRESET => e
    retries += 1
    if retries <= @config.max_retries
      sleep(2**(retries - 1))
      retry
    end
    raise EvalRuby::TimeoutError, "Embedder API failed after #{@config.max_retries} retries: #{e.message}"
  end
end

#modelString

Returns configured embedder model.

Returns:

  • (String)

    configured embedder model



27
28
29
# File 'lib/eval_ruby/embedders/openai.rb', line 27

def model
  @config.embedder_model
end