Commit e22a21a
Changed files (9)
exe
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",