Commit 135291e

mo khan <mo@mokhan.ca>
2025-08-10 07:13:51
refactor: extract class to make API requests
1 parent 0880f85
lib/elelem/agent.rb
@@ -13,30 +13,27 @@ module Elelem
     def repl
       loop do
         print "\n> "
-        user = $stdin.gets&.chomp
-        break if user.nil? || user.empty? || user == "exit"
+        input = $stdin.gets&.chomp
+        break if input.nil? || input.empty? || input == "exit"
 
-        process_input(user)
+        process(input)
       end
     end
 
     private
 
-    def process_input(text)
+    def process(text)
       conversation.add(role: "user", content: text)
 
       done = false
       loop do
-        call_api(conversation.history) do |chunk|
-          debug_print(chunk)
-
+        configuration.api.chat(conversation.history, tools) do |chunk|
           response = JSON.parse(chunk)
           done = response["done"]
           message = response["message"] || {}
 
           if message["thinking"]
             print message["thinking"]
-            $stdout.flush
           elsif message["tool_calls"]&.any?
             message["tool_calls"].each do |t|
               conversation.add(role: "tool", content: tools.execute(t))
@@ -44,48 +41,14 @@ module Elelem
             done = false
           elsif message["content"].to_s.strip
             print message["content"]
-            $stdout.flush
           else
             raise chunk.inspect
           end
+          $stdout.flush
         end
 
         break if done
       end
-
-      puts
-    end
-
-    def call_api(messages)
-      body = {
-        messages: messages,
-        model: configuration.model,
-        stream: true,
-        keep_alive: "5m",
-        options: { temperature: 0.1 },
-        tools: tools.to_h
-      }
-      json_body = body.to_json
-      debug_print(json_body)
-
-      req = Net::HTTP::Post.new(configuration.uri)
-      req["Content-Type"] = "application/json"
-      req.body = json_body
-      req["Authorization"] = "Bearer #{configuration.token}" if configuration.token
-
-      configuration.http.request(req) do |response|
-        raise response.inspect unless response.code == "200"
-
-        response.read_body do |chunk|
-          debug_print(chunk)
-          yield(chunk) if block_given?
-          $stdout.flush
-        end
-      end
-    end
-
-    def debug_print(body = nil)
-      configuration.logger.debug(body) if configuration.debug && body
     end
   end
 end
lib/elelem/api.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+module Elelem
+  class Api
+    attr_reader :configuration
+
+    def initialize(configuration)
+      @configuration = configuration
+    end
+
+    def chat(messages, tools)
+      body = {
+        messages: messages,
+        model: configuration.model,
+        stream: true,
+        keep_alive: "5m",
+        options: { temperature: 0.1 },
+        tools: tools.to_h
+      }
+      json_body = body.to_json
+
+      req = Net::HTTP::Post.new(configuration.uri)
+      req["Content-Type"] = "application/json"
+      req.body = json_body
+      req["Authorization"] = "Bearer #{configuration.token}" if configuration.token
+
+      configuration.http.request(req) do |response|
+        raise response.inspect unless response.code == "200"
+
+        response.read_body do |chunk|
+          yield(chunk) if block_given?
+          $stdout.flush
+        end
+      end
+    end
+  end
+end
lib/elelem/configuration.rb
@@ -18,6 +18,10 @@ module Elelem
       end
     end
 
+    def api
+      @api ||= Api.new(self)
+    end
+
     def logger
       @logger ||= Logger.new(debug ? $stderr : "/dev/null").tap do |logger|
         logger.formatter = ->(_, _, _, msg) { msg }
lib/elelem.rb
@@ -8,6 +8,7 @@ require "thor"
 require "uri"
 
 require_relative "elelem/agent"
+require_relative "elelem/api"
 require_relative "elelem/application"
 require_relative "elelem/configuration"
 require_relative "elelem/conversation"