class Ollama::Client

def self.user_agent

def self.user_agent
  '%s/%s' % [ self, Ollama::VERSION ]
end

def commands

def commands
  doc_annotations.sort_by(&:first).transpose.last
end

def excon(url)

def excon(url)
  params = {
    connect_timeout: @connect_timeout,
    read_timeout:    @read_timeout,
    write_timeout:   @write_timeout,
    ssl_verify_peer: @ssl_verify_peer,
    debug:           @debug,
  }.compact
  Excon.new(url, params)
end

def headers

def headers
  {
    'User-Agent'   => @user_agent || self.class.user_agent,
    'Content-Type' => 'application/json; charset=utf-8',
  }
end

def help

def help
  @output.puts "Commands: %s" % commands.join(?,)
end

def initialize(base_url: nil, output: $stdout, connect_timeout: nil, read_timeout: nil, write_timeout: nil, debug: nil, user_agent: nil)

def initialize(base_url: nil, output: $stdout, connect_timeout: nil, read_timeout: nil, write_timeout: nil, debug: nil, user_agent: nil)
  base_url.nil? and base_url = ENV.fetch('OLLAMA_URL') do
    raise ArgumentError,
      'missing :base_url parameter or OLLAMA_URL environment variable'
  end
  base_url.is_a? URI or base_url = URI.parse(base_url)
  base_url.is_a?(URI::HTTP) || base_url.is_a?(URI::HTTPS) or
    raise ArgumentError, "require #{base_url.inspect} to be http/https-URI"
  @ssl_verify_peer = base_url.query.to_s.split(?&).inject({}) { |h, l|
    h.merge Hash[*l.split(?=)]
  }['ssl_verify_peer'] != 'false'
  @base_url, @output, @connect_timeout, @read_timeout, @write_timeout, @debug, @user_agent =
    base_url, output, connect_timeout, read_timeout, write_timeout, debug, user_agent
end

def inspect

def inspect
  "#<#{self.class}@#{@base_url.to_s}>"
end

def parse_json(string)

def parse_json(string)
  JSON.parse(string, object_class: Ollama::Response)
rescue JSON::ParserError
  return
end

def request(method:, path:, handler:, body: nil, stream: nil)

def request(method:, path:, handler:, body: nil, stream: nil)
  url = @base_url + path
  responses = Enumerator.new do |yielder|
    if stream
      response_block = -> chunk, remaining_bytes, total_bytes do
        response_line = parse_json(chunk)
        response_line and yielder.yield response_line
      end
      response = excon(url).send(method, headers:, body:, response_block:)
    else
      response = excon(url).send(method, headers:, body:)
    end
    case response.status
    when 200
      response.body.each_line do |l|
        response_line = parse_json(l)
        response_line and yielder.yield response_line
      end
    when 404
      raise Ollama::Errors::NotFoundError, "#{response.status} #{response.body.inspect}"
    else
      raise Ollama::Errors::Error, "#{response.status} #{response.body.inspect}"
    end
  end
  responses.each { |response| handler.call(response) }
  self
rescue Excon::Errors::SocketError => e
  raise Ollama::Errors::SocketError, "Caught #{e.class} #{e.message.inspect} for #{url.to_s.inspect}"
rescue Excon::Errors::Timeout => e
  raise Ollama::Errors::TimeoutError, "Caught #{e.class} #{e.message.inspect} for #{url.to_s.inspect}"
rescue Excon::Error => e
  raise Ollama::Errors::Error, "Caught #{e.class} #{e.message.inspect} for #{url.to_s.inspect}"
end

def ssl_verify_peer?

def ssl_verify_peer?
  !!@ssl_verify_peer
end