Class: Gemini::Documents

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

Instance Method Summary collapse

Constructor Details

#initialize(client:) ⇒ Documents

Returns a new instance of Documents.



3
4
5
# File 'lib/gemini/documents.rb', line 3

def initialize(client:)
  @client = client
end

Instance Method Details

#cache(file: nil, file_path: nil, system_instruction: nil, ttl: "86400s", **parameters) ⇒ Object

ドキュメントをキャッシュに保存するメソッド



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/gemini/documents.rb', line 51

def cache(file: nil, file_path: nil, system_instruction: nil, ttl: "86400s", **parameters)
  # ファイルパスが指定されている場合はファイルを開く
  if file_path && !file
    file = File.open(file_path, "rb")
    close_file = true
  else
    close_file = false
  end

  begin
    # ファイルが指定されていない場合はエラー
    raise ArgumentError, "file or file_path parameter is required" unless file

    # MIMEタイプを判定
    mime_type = parameters[:mime_type] || determine_document_mime_type(file)
    
    # ファイルをアップロード
    upload_result = @client.files.upload(file: file)
    file_uri = upload_result["file"]["uri"]
    file_name = upload_result["file"]["name"]
    
    # モデル名の取得と調整
    model = parameters[:model] || "gemini-2.5-flash"
    model = "models/#{model}" unless model.start_with?("models/")
    
    # キャッシュに保存(パラメータの名前に注意)
    cache_result = @client.cached_content.create(
      file_uri: file_uri,
      mime_type: mime_type,
      system_instruction: system_instruction,
      model: model,
      ttl: ttl,
      **parameters.reject { |k, _| [:mime_type, :model].include?(k) }
    )
    
    # 結果とファイル情報を返す
    {
      cache: cache_result,
      file_uri: file_uri,
      file_name: file_name
    }
  ensure
    file.close if file && close_file
  end
end

#process(file: nil, file_path: nil, prompt:, model: "gemini-2.5-flash", **parameters) ⇒ Object

ドキュメントをアップロードして質問する基本メソッド



8
9
10
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
# File 'lib/gemini/documents.rb', line 8

def process(file: nil, file_path: nil, prompt:, model: "gemini-2.5-flash", **parameters)
  # ファイルパスが指定されている場合はファイルを開く
  if file_path && !file
    file = File.open(file_path, "rb")
    close_file = true
  else
    close_file = false
  end

  begin
    # ファイルが指定されていない場合はエラー
    raise ArgumentError, "file or file_path parameter is required" unless file

    # MIMEタイプを判定
    mime_type = parameters[:mime_type] || determine_document_mime_type(file)
    
    # ファイルをアップロード
    upload_result = @client.files.upload(file: file)
    file_uri = upload_result["file"]["uri"]
    file_name = upload_result["file"]["name"]
    
    # コンテンツを生成
    response = @client.generate_content(
      [
        { text: prompt },
        { file_data: { mime_type: mime_type, file_uri: file_uri } }
      ],
      model: model,
      **parameters.reject { |k, _| [:mime_type].include?(k) }
    )
    
    # レスポンスと一緒にファイル情報も返す
    {
      response: response,
      file_uri: file_uri,
      file_name: file_name
    }
  ensure
    file.close if file && close_file
  end
end