Commit aef6142

mo khan <mo@mokhan.ca>
2025-08-16 20:15:26
chore: add TODO to implement ollama.com token generation
1 parent 622864f
Changed files (1)
lib
elelem
lib/elelem/api.rb
@@ -10,15 +10,13 @@ module Elelem
     end
 
     def chat(messages, &block)
-      Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
-        http.read_timeout = 3_600
-        http.open_timeout = 10
-
+      Net::HTTP.start(uri.hostname, uri.port, http_options) do |http|
         http.request(build_request(messages)) do |response|
           if response.is_a?(Net::HTTPSuccess)
             response.read_body(&block)
           else
             configuration.logger.error(response.inspect)
+            raise response.inspect
           end
         end
       end
@@ -26,6 +24,14 @@ module Elelem
 
     private
 
+    def http_options
+      {
+        open_timeout: 10,
+        read_timeout: 3_600,
+        use_ssl: uri.scheme == 'https',
+      }
+    end
+
     def build_uri(raw_host)
       if raw_host =~ %r{^https?://}
         host = raw_host
@@ -47,12 +53,38 @@ module Elelem
 
     def build_request(messages)
       Net::HTTP::Post.new(uri).tap do |request|
+        request["Accept"] = "application/json"
         request["Content-Type"] = "application/json"
-        request["Authorization"] = "Bearer #{configuration.token}" if configuration.token && !configuration.token.empty?
+        request["User-Agent"] = "ollama/0.11.3 (amd64 linux) Go/go1.24.6"
+        build_token do |token|
+          request["Authorization"] = token
+        end
         request.body = build_payload(messages).to_json
       end
     end
 
+    def build_token
+      if uri.host == "ollama.com"
+        raise "Not Implemented"
+
+        # if File.exist?("~/.ollama/id_ed25519")
+          # TODO:: return signature
+          # now := strconv.FormatInt(time.Now().Unix(), 10)
+          # challenge := fmt.Sprintf("%s,%s?ts=%s", method, path, now)
+          # token, err := auth.Sign(ctx, []byte(challenge))
+          # q := requestURL.Query()
+          # q.Set("ts", now)
+          # requestURL.RawQuery = q.Encode()
+          #
+          # request["Authorization"] = token
+        # end
+      end
+
+      if configuration.token && !configuration.token.empty?
+        yield "Bearer #{configuration.token}"
+      end
+    end
+
     def build_payload(messages)
       {
         messages: messages,