Commit 135291e
Changed files (4)
lib
elelem
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"