Class: EvalRuby::Judges::OpenAI
- Defined in:
- lib/eval_ruby/judges/openai.rb
Overview
OpenAI-based LLM judge using the Chat Completions API. Requires an API key set via Configuration#api_key.
Constant Summary collapse
- API_URL =
"https://api.openai.com/v1/chat/completions"
Instance Method Summary collapse
-
#call(prompt) ⇒ Hash?
Parsed JSON response.
-
#initialize(config) ⇒ OpenAI
constructor
A new instance of OpenAI.
Constructor Details
#initialize(config) ⇒ OpenAI
Returns a new instance of OpenAI.
16 17 18 19 |
# File 'lib/eval_ruby/judges/openai.rb', line 16 def initialize(config) super raise EvalRuby::Error, "API key is required. Set via EvalRuby.configure { |c| c.api_key = '...' }" if @config.api_key.nil? || @config.api_key.empty? end |
Instance Method Details
#call(prompt) ⇒ Hash?
Returns parsed JSON response.
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 |
# File 'lib/eval_ruby/judges/openai.rb', line 25 def call(prompt) retries = 0 begin uri = URI(API_URL) request = Net::HTTP::Post.new(uri) request["Authorization"] = "Bearer #{@config.api_key}" request["Content-Type"] = "application/json" request.body = JSON.generate({ model: @config.judge_model, messages: [{role: "user", content: prompt}], temperature: 0.0, response_format: {type: "json_object"} }) 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 Error, "OpenAI API error: #{response.code} - #{response.body}" end body = JSON.parse(response.body) content = body.dig("choices", 0, "message", "content") parse_json_response(content) rescue Net::OpenTimeout, Net::ReadTimeout, Errno::ECONNRESET => e retries += 1 if retries <= @config.max_retries sleep(2 ** (retries - 1)) retry end raise EvalRuby::TimeoutError, "Judge API failed after #{@config.max_retries} retries: #{e.}" end end |