Class: LLM::Gemini::Files

Inherits:
Object
  • Object
show all
Includes:
Utils
Defined in:
lib/llm/providers/gemini/files.rb

Overview

The LLM::Gemini::Files class provides a files object for interacting with [Gemini’s Files API](ai.google.dev/gemini-api/docs/files). The files API allows a client to reference media files in prompts where they can be referenced by their URL.

The files API is intended to preserve bandwidth and latency, especially for large files but it can be helpful for smaller files as well because it does not require the client to include a file in the prompt over and over again (which could be the case in a multi-turn conversation).

Examples:

#!/usr/bin/env ruby
require "llm"

llm  = LLM.gemini(ENV["KEY"])
file = llm.files.create file: LLM::File("/audio/haiku.mp3")
bot = LLM::Chat.new(llm).lazy
bot.chat(file)
bot.chat("Describe the audio file I sent to you")
bot.chat("The audio file is the first message I sent to you.")
bot.messages.select(&:assistant?).each { print "[#{_1.role}]", _1.content, "\n" }
#!/usr/bin/env ruby
require "llm"

llm  = LLM.gemini(ENV["KEY"])
file = llm.files.create file: LLM::File("/audio/haiku.mp3")
bot = LLM::Chat.new(llm).lazy
bot.chat(["Describe the audio file I sent to you", file])
bot.messages.select(&:assistant?).each { print "[#{_1.role}]", _1.content, "\n" }

Instance Method Summary collapse

Methods included from Utils

#camelcase, #snakecase

Constructor Details

#initialize(provider) ⇒ LLM::Gemini::Files

Returns a new Files object

Parameters:



41
42
43
# File 'lib/llm/providers/gemini/files.rb', line 41

def initialize(provider)
  @provider = provider
end

Instance Method Details

#all(**params) ⇒ LLM::Response::FileList

List all files

Examples:

llm = LLM.gemini(ENV["KEY"])
res = llm.files.all
res.each do |file|
  print "name: ", file.name, "\n"
end

Parameters:

  • params (Hash)

    Other parameters (see Gemini docs)

Returns:

Raises:

See Also:



57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/llm/providers/gemini/files.rb', line 57

def all(**params)
  query = URI.encode_www_form(params.merge!(key: secret))
  req = Net::HTTP::Get.new("/v1beta/files?#{query}", headers)
  res = request(http, req)
  LLM::Response::FileList.new(res).tap { |filelist|
    files = filelist.body["files"]&.map do |file|
      file = file.transform_keys { snakecase(_1) }
      OpenStruct.from_hash(file)
    end || []
    filelist.files = files
  }
end

#create(file:, **params) ⇒ LLM::Response::File

Create a file

Examples:

llm = LLM.gemini(ENV["KEY"])
res = llm.files.create file: LLM::File("/audio/haiku.mp3"),

Parameters:

  • file (File)

    The file

  • params (Hash)

    Other parameters (see Gemini docs)

Returns:

Raises:

See Also:



80
81
82
83
84
85
86
87
88
# File 'lib/llm/providers/gemini/files.rb', line 80

def create(file:, **params)
  req = Net::HTTP::Post.new(request_upload_url(file:), {})
  req["content-length"] = file.bytesize
  req["X-Goog-Upload-Offset"] = 0
  req["X-Goog-Upload-Command"] = "upload, finalize"
  req.body = File.binread(file.path)
  res = request(http, req)
  LLM::Response::File.new(res)
end

#delete(file:, **params) ⇒ LLM::Response::File

Delete a file

Examples:

llm = LLM.gemini(ENV["KEY"])
res = llm.files.delete(file: "files/1234567890")

Parameters:

  • file (#name, String)

    The file to delete

  • params (Hash)

    Other parameters (see Gemini docs)

Returns:

Raises:

See Also:



119
120
121
122
123
124
# File 'lib/llm/providers/gemini/files.rb', line 119

def delete(file:, **params)
  file_id = file.respond_to?(:name) ? file.name : file.to_s
  query = URI.encode_www_form(params.merge!(key: secret))
  req = Net::HTTP::Delete.new("/v1beta/#{file_id}?#{query}", headers)
  request(http, req)
end

#downloadObject

Raises:

  • (NotImplementedError)

    This method is not implemented by Gemini



129
130
131
# File 'lib/llm/providers/gemini/files.rb', line 129

def download
  raise NotImplementedError
end

#get(file:, **params) ⇒ LLM::Response::File

Get a file

Examples:

llm = LLM.gemini(ENV["KEY"])
res = llm.files.get(file: "files/1234567890")
print "name: ", res.name, "\n"

Parameters:

  • file (#name, String)

    The file to get

  • params (Hash)

    Other parameters (see Gemini docs)

Returns:

Raises:

See Also:



101
102
103
104
105
106
107
# File 'lib/llm/providers/gemini/files.rb', line 101

def get(file:, **params)
  file_id = file.respond_to?(:name) ? file.name : file.to_s
  query = URI.encode_www_form(params.merge!(key: secret))
  req = Net::HTTP::Get.new("/v1beta/#{file_id}?#{query}", headers)
  res = request(http, req)
  LLM::Response::File.new(res)
end