Class: Gemini::Files
- Inherits:
-
Object
- Object
- Gemini::Files
- Defined in:
- lib/gemini/files.rb
Constant Summary collapse
- FILE_API_BASE_PATH =
Base URL for File API
"files".freeze
Instance Method Summary collapse
-
#delete(name:) ⇒ Object
Method to delete a file.
-
#get(name:) ⇒ Object
Method to get file metadata.
-
#initialize(client:) ⇒ Files
constructor
A new instance of Files.
-
#list(page_size: nil, page_token: nil) ⇒ Object
Method to get list of uploaded files.
-
#upload(file:, display_name: nil) ⇒ Object
Method to upload a file.
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
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 |