Class: Gemini::Files

Inherits:
Object
  • Object
show all
Defined in:
lib/gemini/files.rb

Constant Summary collapse

FILE_API_BASE_PATH =

Base URL for File API

"files".freeze

Instance Method Summary collapse

Constructor Details

#initialize(client:) ⇒ Files

Returns a new instance of Files.



6
7
8
# File 'lib/gemini/files.rb', line 6

def initialize(client:)
  @client = client
end

Instance Method Details

#delete(name:) ⇒ Object

Method to delete a file



92
93
94
95
# File 'lib/gemini/files.rb', line 92

def delete(name:)
  path = name.start_with?("files/") ? name : "files/#{name}"
  @client.delete(path: path)
end

#get(name:) ⇒ Object

Method to get file metadata



74
75
76
77
# File 'lib/gemini/files.rb', line 74

def get(name:)
  path = name.start_with?("files/") ? name : "files/#{name}"
  @client.get(path: path)
end

#list(page_size: nil, page_token: nil) ⇒ Object

Method to get list of uploaded files



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

def list(page_size: nil, page_token: nil)
  parameters = {}
  parameters[:pageSize] = page_size if page_size
  parameters[:pageToken] = page_token if page_token

  @client.get(
    path: FILE_API_BASE_PATH,
    parameters: parameters
  )
end

#upload(file:, display_name: nil) ⇒ Object

Method to upload a file

Raises:

  • (ArgumentError)


11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/gemini/files.rb', line 11

def upload(file:, display_name: nil)
  # Check if file is valid
  raise ArgumentError, "No file specified" unless file

  # Get MIME type and size of the file
  mime_type = determine_mime_type(file)
  file.rewind
  file_size = file.size

  # Use filename as display_name if not specified
  display_name ||= File.basename(file.path) if file.respond_to?(:path)
  display_name ||= "uploaded_file"

  # Headers for initial upload request (metadata definition)
  headers = {
    "X-Goog-Upload-Protocol" => "resumable",
    "X-Goog-Upload-Command" => "start",
    "X-Goog-Upload-Header-Content-Length" => file_size.to_s,
    "X-Goog-Upload-Header-Content-Type" => mime_type,
    "Content-Type" => "application/json"
  }

  # Add debug output
  if ENV["DEBUG"]
    puts "Request URL: https://generativelanguage.googleapis.com/upload/v1beta/files"
    puts "Headers: #{headers.inspect}"
    puts "API Key: #{@client.api_key[0..5]}..." if @client.api_key
  end

  # Send initial request to get upload URL
  response = @client.conn.post("https://generativelanguage.googleapis.com/upload/v1beta/files") do |req|
    req.headers = headers
    req.params = { key: @client.api_key }
    req.body = { file: { display_name: display_name } }.to_json
  end

  # Get upload URL from response headers
  upload_url = response.headers["x-goog-upload-url"]
  raise "Failed to obtain upload URL" unless upload_url

  # Upload the file
  file.rewind
  file_data = file.read
  upload_response = @client.conn.post(upload_url) do |req|
    req.headers = {
      "Content-Length" => file_size.to_s,
      "X-Goog-Upload-Offset" => "0",
      "X-Goog-Upload-Command" => "upload, finalize"
    }
    req.body = file_data
  end

  # Parse response as JSON
  if upload_response.body.is_a?(String)
    JSON.parse(upload_response.body)
  elsif upload_response.body.is_a?(Hash)
    upload_response.body
  else
    raise "Invalid response format: #{upload_response.body.class}"
  end
end