Commit f225b52

mo khan <mo@mokhan.ca>
2025-10-07 20:13:58
feat: add class to connect to OpenAI API
1 parent ff9c67d
Changed files (1)
lib
lib/net/llm.rb
@@ -5,6 +5,34 @@ require_relative "llm/version"
 module Net
   module Llm
     class Error < StandardError; end
-    # Your code goes here...
+    DEFAULT_TIMEOUT = 60 * 2
+
+    class OpenAI
+      attr_reader :api_key, :base_url, :model
+
+      def initialize(api_key:, base_url: "https://api.openai.com/v1", model: "gpt-4o-mini")
+        @api_key = api_key
+        @base_url = base_url
+        @model = model
+      end
+
+      def chat(messages, tools, timeout: DEFAULT_TIMEOUT)
+        uri = URI("#{base_url}/chat/completions")
+        request = Net::HTTP::Post.new(uri)
+        request["Authorization"] = "Bearer #{api_key}"
+        request["Content-Type"] = "application/json"
+        request.body = { model: model, messages: messages, tools: tools, tool_choice: "auto" }.to_json
+
+        http = Net::HTTP.new(uri.hostname, uri.port)
+        http.use_ssl = true
+        http.open_timeout = timeout
+        http.read_timeout = timeout
+        http.write_timeout = timeout if http.respond_to?(:write_timeout=)
+
+        response = http.start { |h| h.request(request) }
+        raise "HTTP #{response.code}: #{response.body}" unless response.is_a?(Net::HTTPSuccess)
+        JSON.parse(response.body)
+      end
+    end
   end
 end