Commit e22a21a

mo khan <mo@mokhan.ca>
2026-01-20 20:44:28
refactor: merge net/llm into elelem/net
1 parent 19debde
exe/elelem
@@ -6,10 +6,10 @@ require "elelem"
 Signal.trap("INT") { exit 1 }
 
 PROVIDERS = {
-  "ollama" => -> (model) { Net::Llm::Ollama.new(model: model || "gpt-oss:latest") },
-  "anthropic" => -> (model) { Net::Llm::Claude.anthropic(model: model || "claude-opus-4-5-20250514") },
-  "vertex" => -> (model) { Net::Llm::Claude.vertex(model: model || "claude-opus-4-5@20251101") },
-  "openai" => -> (model) { Net::Llm::OpenAI.new(model: model || "gpt-4o") }
+  "ollama" => -> (model) { Elelem::Net::Ollama.new(model: model || "gpt-oss:latest") },
+  "anthropic" => -> (model) { Elelem::Net::Claude.anthropic(model: model || "claude-opus-4-5-20250514") },
+  "vertex" => -> (model) { Elelem::Net::Claude.vertex(model: model || "claude-opus-4-5@20251101") },
+  "openai" => -> (model) { Elelem::Net::OpenAI.new(model: model || "gpt-4o") }
 }.freeze
 
 def parse_args(args)
lib/net/llm/claude.rb → lib/elelem/net/claude.rb
@@ -1,19 +1,19 @@
 # frozen_string_literal: true
 
-module Net
-  module Llm
+module Elelem
+  module Net
     class Claude
-      def initialize(endpoint:, headers:, model: nil, version: nil, http: Net::Llm.http)
+      def initialize(endpoint:, headers:, model: nil, version: nil, http: Elelem::Net.http)
         @endpoint, @headers_src, @model, @version, @http = endpoint, headers, model, version, http
       end
 
-      def self.anthropic(model:, api_key: ENV.fetch("ANTHROPIC_API_KEY"), http: Net::Llm.http)
+      def self.anthropic(model:, api_key: ENV.fetch("ANTHROPIC_API_KEY"), http: Elelem::Net.http)
         new(endpoint: "https://api.anthropic.com/v1/messages",
             headers: { "x-api-key" => api_key, "anthropic-version" => "2023-06-01" },
             model:, http:)
       end
 
-      def self.vertex(model:, project: ENV.fetch("GOOGLE_CLOUD_PROJECT"), region: ENV.fetch("GOOGLE_CLOUD_REGION", "us-east5"), http: Net::Llm.http)
+      def self.vertex(model:, project: ENV.fetch("GOOGLE_CLOUD_PROJECT"), region: ENV.fetch("GOOGLE_CLOUD_REGION", "us-east5"), http: Elelem::Net.http)
         new(endpoint: "https://#{region}-aiplatform.googleapis.com/v1/projects/#{project}/locations/#{region}/publishers/anthropic/models/#{model}:rawPredict",
             headers: -> { { "Authorization" => "Bearer #{`gcloud auth application-default print-access-token`.strip}" } },
             version: "vertex-2023-10-16", http:)
@@ -63,7 +63,7 @@ module Net
         body[:tools] = tools.map { |t| t[:function] ? { name: t[:function][:name], description: t[:function][:description], input_schema: t[:function][:parameters] } : t } unless tools.empty?
 
         @http.post(@endpoint, headers:, body:) do |res|
-          raise "HTTP #{res.code}: #{res.body}" unless res.is_a?(Net::HTTPSuccess)
+          raise "HTTP #{res.code}: #{res.body}" unless res.is_a?(::Net::HTTPSuccess)
           buf = ""
           res.read_body do |chunk|
             buf += chunk
@@ -106,9 +106,5 @@ module Net
         end
       end
     end
-
-    # Convenience aliases
-    Anthropic = Claude
-    VertexAI = Claude
   end
 end
lib/net/llm/ollama.rb → lib/elelem/net/ollama.rb
@@ -1,9 +1,9 @@
 # frozen_string_literal: true
 
-module Net
-  module Llm
+module Elelem
+  module Net
     class Ollama
-      def initialize(model:, host: ENV.fetch("OLLAMA_HOST", "localhost:11434"), http: Net::Llm.http)
+      def initialize(model:, host: ENV.fetch("OLLAMA_HOST", "localhost:11434"), http: Elelem::Net.http)
         @url = "#{host.start_with?('http') ? host : "http://#{host}"}/api/chat"
         @model, @http = model, http
       end
@@ -27,7 +27,7 @@ module Net
 
       def stream(body, &block)
         @http.post(@url, body:) do |res|
-          raise "HTTP #{res.code}: #{res.body}" unless res.is_a?(Net::HTTPSuccess)
+          raise "HTTP #{res.code}: #{res.body}" unless res.is_a?(::Net::HTTPSuccess)
           buf = ""
           res.read_body do |chunk|
             buf += chunk
lib/net/llm/openai.rb → lib/elelem/net/openai.rb
@@ -1,9 +1,9 @@
 # frozen_string_literal: true
 
-module Net
-  module Llm
+module Elelem
+  module Net
     class OpenAI
-      def initialize(model:, api_key: ENV.fetch("OPENAI_API_KEY"), base_url: ENV.fetch("OPENAI_BASE_URL", "https://api.openai.com/v1"), http: Net::Llm.http)
+      def initialize(model:, api_key: ENV.fetch("OPENAI_API_KEY"), base_url: ENV.fetch("OPENAI_BASE_URL", "https://api.openai.com/v1"), http: Elelem::Net.http)
         @url = "#{base_url}/chat/completions"
         @model, @api_key, @http = model, api_key, http
       end
@@ -39,7 +39,7 @@ module Net
 
       def stream(body, &block)
         @http.post(@url, headers: { "Authorization" => "Bearer #{@api_key}" }, body:) do |res|
-          raise "HTTP #{res.code}: #{res.body}" unless res.is_a?(Net::HTTPSuccess)
+          raise "HTTP #{res.code}: #{res.body}" unless res.is_a?(::Net::HTTPSuccess)
           buf = ""
           res.read_body do |chunk|
             buf += chunk
lib/elelem/net.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require "net/hippie"
+require "json"
+
+require_relative "net/ollama"
+require_relative "net/openai"
+require_relative "net/claude"
+
+module Elelem
+  module Net
+    def self.http
+      @http ||= ::Net::Hippie::Client.new(read_timeout: 3600, open_timeout: 10)
+    end
+  end
+end
lib/net/llm/version.rb
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-module Net
-  module Llm
-    VERSION = "0.6.1"
-  end
-end
lib/net/llm.rb
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-require "net/hippie"
-require "json"
-
-require_relative "llm/ollama"
-require_relative "llm/openai"
-require_relative "llm/claude"
-
-module Net
-  module Llm
-    def self.http
-      @http ||= Net::Hippie::Client.new(read_timeout: 3600, open_timeout: 10)
-    end
-  end
-end
lib/elelem.rb
@@ -3,16 +3,16 @@
 require "date"
 require "fileutils"
 require "json"
-require "net/llm"
 require "open3"
 require "pathname"
 require "reline"
 require "stringio"
 require "tempfile"
 
-require_relative "elelem/plugins"
 require_relative "elelem/agent"
 require_relative "elelem/mcp"
+require_relative "elelem/net"
+require_relative "elelem/plugins"
 require_relative "elelem/terminal"
 require_relative "elelem/toolbox"
 require_relative "elelem/version"
elelem.gemspec
@@ -28,6 +28,10 @@ Gem::Specification.new do |spec|
     "lib/elelem.rb",
     "lib/elelem/agent.rb",
     "lib/elelem/mcp.rb",
+    "lib/elelem/net.rb",
+    "lib/elelem/net/claude.rb",
+    "lib/elelem/net/ollama.rb",
+    "lib/elelem/net/openai.rb",
     "lib/elelem/plugins.rb",
     "lib/elelem/plugins/verify.rb",
     "lib/elelem/terminal.rb",