20 def embed(text, options)
21 api_key = options.api_key || ENV["OPENAI_API_KEY"]
22 raise Rager::Errors::CredentialsError.new("OpenAI", env_var: ["OPENAI_API_KEY"]) if api_key.nil?
23
24 base_url = options.url || ENV["OPENAI_URL"] || "https://api.openai.com/v1"
25
26 headers = {"Content-Type" => "application/json"}
27 headers["Authorization"] = "Bearer #{api_key}" if api_key
28
29 body = {
30 model: options.model || "text-embedding-3-large",
31 input: text
32 }
33
34 request = Rager::Http::Request.new(
35 verb: Rager::Http::Verb::Post,
36 url: "#{base_url}/embeddings",
37 headers: headers,
38 body: body.to_json,
39 timeout: options.timeout || Rager.config.timeout
40 )
41
42 response = Rager.config.http_adapter.make_request(request)
43 response_body = T.cast(T.must(response.body), String)
44
45 raise Rager::Errors::HttpError.new(Rager.config.http_adapter, request.url, response.status, body: response_body) if response.status != 200
46
47 parsed_response = JSON.parse(response_body)
48 parsed_response["data"].map { |item| item["embedding"] }
49 end