gemini_cache 0.0.7 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ba751abef4a7f8f6f6c856d782c9e43dfcc27cfb64e6d69a6b6b095522fba338
4
- data.tar.gz: 5dbef856507a550b7b739a5d972991ab822f36ca0aafef4bd5576df3b920c9c6
3
+ metadata.gz: ae4847ce3abf808c2779601462af28a47989301593355a8a39977a5df495f322
4
+ data.tar.gz: 71e72d0e2750d6b530d407f97a7490c65b6acbf342ad10803916b4b24d418b71
5
5
  SHA512:
6
- metadata.gz: 032fc3e2f78e791b55d82a63c15094eb325f5778ac4232dfb088e38b99bbd2402f9381ed79c12e03051768a2d488719f6be786cc815dd927927320942f2e8800
7
- data.tar.gz: 31944aa6d6cbe592fd98909b465a1521b2049772d9436d09ad1663c9088473e7aae954ad7e224e4393670ca7d4cb7791295adff9be40a0b1536ecb5ab3b3f3cb
6
+ metadata.gz: 8ab29a93e9555626f6d1eecb189351b5d62b28805e0e90e0ba9c29cb9e5bcf8698f72dadb0621ffbf196503d186a2c341b45c387bc25f940d055bb110455ff78
7
+ data.tar.gz: 50a917b60662ecd5bc1cef90c0a633febfcfbe294c297525d397f60863dfaa29977e43c0743c9f717452fa7d45ce5fe2da8f11f3816d0f65fa5e06f6632675ff
@@ -0,0 +1,46 @@
1
+ module ItemExtender
2
+ def delete = GeminiCache.delete(name: self['name'])
3
+
4
+ def ttl=(new_ttl)
5
+ GeminiCache.update(name: self['name'], content: { ttl: "#{new_ttl}s" })
6
+ GeminiCache.get_by_name(name: self['name'])
7
+ end
8
+
9
+ def generate_content(contents:, generation_config: nil)
10
+ conn = Faraday.new(
11
+ url: 'https://generativelanguage.googleapis.com',
12
+ headers: { 'Content-Type' => 'application/json' }
13
+ ) do |f|
14
+ f.options.timeout = 300 # timeout em segundos para a requisição completa
15
+ f.options.open_timeout = 300 # timeout em segundos para abrir a conexão
16
+ end
17
+
18
+ body = {
19
+ cached_content: self['name'],
20
+ contents:
21
+ }
22
+
23
+ body[:generation_config] = generation_config if !generation_config.nil?
24
+
25
+ response = conn.post("/v1beta/models/#{self['model'].split('/').last}:generateContent") do |req|
26
+ req.params['key'] = ENV.fetch('GEMINI_API_KEY')
27
+ req.body = body.to_json
28
+ end
29
+
30
+ if response.status == 200
31
+ resp = JSON.parse(response.body)
32
+ def resp.content = dig('candidates', 0, 'content', 'parts', 0, 'text')
33
+ return resp
34
+ end
35
+
36
+ raise "Erro ao gerar conteúdo: #{response.body}"
37
+ rescue Faraday::Error => e
38
+ raise "Erro na requisição: #{e.message}"
39
+ end
40
+
41
+ def single_prompt(prompt:, generation_config: :accurate_mode)
42
+ # accurate_mode: less creative, more accurate
43
+ generation_config = { temperature: 0, topP: 0, topK: 1 } if generation_config.eql?(:accurate_mode)
44
+ generate_content(contents: [{ parts: [{ text: prompt }], role: 'user' }], generation_config:).content
45
+ end
46
+ end
data/lib/gemini_cache.rb CHANGED
@@ -2,19 +2,22 @@ require 'faraday'
2
2
  require 'open-uri'
3
3
  require 'nokogiri'
4
4
  require 'json'
5
+ require 'base64'
6
+
7
+ require 'gemini_cache/item_extender'
5
8
 
6
9
  module GeminiCache
7
- def self.read_local_file(file_path) = Base64.strict_encode64(File.read(file_path))
8
- def self.read_remote_file(file_url) = Base64.strict_encode64(URI.open(file_url).read)
9
- def self.read_html(url, default_remover: true)
10
+ def self.read_local_file(path:, mime_type:) = { inline_data: { mime_type:, data: Base64.strict_encode64(File.read(path)) } }
11
+ def self.read_remote_file(url:, mime_type:) = { inline_data: { mime_type:, data: Base64.strict_encode64(URI.open(url).read) } }
12
+ def self.read_html(url:, default_remover: true)
10
13
  doc = Nokogiri::HTML(URI.open(url))
11
14
  %w[script style].each { |element| doc.css(element).each(&:remove) } if default_remover
12
15
 
13
16
  doc
14
17
  end
15
18
 
16
- def self.create(parts:, display_name:, model: 'gemini-1.5-flash-8b', ttl: 600)
17
- raise "Cache name already exist: '#{display_name}'" if GeminiCache.get(display_name:)
19
+ def self.create(parts:, display_name:, model: 'gemini-1.5-flash-8b', ttl: 300)
20
+ raise "Cache name already exist: '#{display_name}'" if GeminiCache.get_by_display_name(display_name:)
18
21
 
19
22
  content = {
20
23
  model: "models/#{model}",
@@ -33,41 +36,32 @@ module GeminiCache
33
36
  req.body = content
34
37
  end
35
38
 
36
- return get(name: JSON.parse(response.body)['name']) if response.status == 200
39
+ return get_by_name(name: JSON.parse(response.body)['name']) if response.status == 200
37
40
 
38
41
  raise "Erro ao criar cache: #{response.status} - #{response.body}"
39
42
  rescue Faraday::Error => e
40
43
  raise "Erro na requisição: #{e.message}"
41
44
  end
42
45
 
43
- def self.get(name: nil, display_name: nil)
44
- raise 'Nome do cache ou display name é obrigatório' if name.nil? && display_name.nil?
45
- raise 'Nome do cache e display name não podem ser informados juntos' if !name.nil? && !display_name.nil?
46
-
47
- return GeminiCache.list.find { |item| item['name'].eql? name } if !name.nil?
48
- return GeminiCache.list.find { |item| item['displayName'].eql? display_name } if !display_name.nil?
49
- end
50
-
51
- def self.create_from_text(text:, display_name:, model: 'gemini-1.5-flash-8b', ttl: 600)
46
+ def self.create_from_text(text:, display_name:, model: 'gemini-1.5-flash-8b', ttl: 300)
52
47
  GeminiCache.create(parts: [{ text: }], display_name:, model:, ttl:)
53
48
  end
54
49
 
55
- def self.create_from_webpage(url:, display_name:, model: 'gemini-1.5-flash-8b', ttl: 600)
56
- GeminiCache.create(parts: [{ text: GeminiCache.read_html(url).inner_text }], display_name:, model:, ttl:)
50
+ def self.create_from_webpage(url:, display_name:, model: 'gemini-1.5-flash-8b', ttl: 300)
51
+ create_from_text(text: GeminiCache.read_html(url:).inner_text, display_name:, model:, ttl:)
57
52
  end
58
53
 
59
- def self.create_from_local_file(file_path:, mime_type:, display_name:, model: 'gemini-1.5-flash-8b', ttl: 600)
60
- parts = [{ inline_data: { mime_type:, data: GeminiCache.read_local_file(file_path) } }]
54
+ def self.create_from_local_file(path:, mime_type:, display_name:, model: 'gemini-1.5-flash-8b', ttl: 300)
55
+ GeminiCache.create(parts: GeminiCache.read_local_file(path:, mime_type:), display_name:, model:, ttl:)
56
+ end
61
57
 
62
- GeminiCache.create(parts:, display_name:, model:, ttl:)
58
+ def self.create_from_remote_file(url:, mime_type:, display_name:, model: 'gemini-1.5-flash-8b', ttl: 300)
59
+ GeminiCache.create(parts: GeminiCache.read_remote_file(url:, mime_type:), display_name:, model:, ttl:)
63
60
  end
64
61
 
65
- def self.create_from_remote_file(file_url:, mime_type:, display_name:, model: 'gemini-1.5-flash-8b', ttl: 600)
66
- parts = [{ inline_data: { mime_type:, data: GeminiCache.read_remote_file(file_url) } }]
62
+ def self.get_by_name(name: nil) = GeminiCache.list.find { |item| item['name'].eql? name }
63
+ def self.get_by_display_name(display_name: nil) = GeminiCache.list.find { |item| item['displayName'].eql? display_name }
67
64
 
68
- GeminiCache.create(parts:, display_name:, model:, ttl:)
69
- end
70
-
71
65
  def self.list
72
66
  conn = Faraday.new(
73
67
  url: 'https://generativelanguage.googleapis.com',
@@ -80,51 +74,7 @@ module GeminiCache
80
74
 
81
75
  return [] if JSON.parse(response.body).empty?
82
76
 
83
- JSON.parse(response.body)['cachedContents'].map do |item|
84
- def item.delete = GeminiCache.delete(name: self['name'])
85
- def item.set_ttl(ttl = 120) = GeminiCache.update(name: self['name'], content: { ttl: "#{ttl}s" })
86
-
87
- def item.generate_content(contents:, generation_config: nil)
88
- conn = Faraday.new(
89
- url: 'https://generativelanguage.googleapis.com',
90
- headers: { 'Content-Type' => 'application/json' }
91
- ) do |f|
92
- f.options.timeout = 300 # timeout em segundos para a requisição completa
93
- f.options.open_timeout = 300 # timeout em segundos para abrir a conexão
94
- end
95
-
96
- body = {
97
- cached_content: self['name'],
98
- contents:
99
- }
100
-
101
- body[:generation_config] = generation_config if !generation_config.nil?
102
-
103
- response = conn.post("/v1beta/models/#{self['model'].split('/').last}:generateContent") do |req|
104
- req.params['key'] = ENV.fetch('GEMINI_API_KEY')
105
- req.body = body.to_json
106
- end
107
-
108
- if response.status == 200
109
- resp = JSON.parse(response.body)
110
- def resp.content = dig('candidates', 0, 'content', 'parts', 0, 'text')
111
- return resp
112
- end
113
-
114
- raise "Erro ao gerar conteúdo: #{response.body}"
115
- rescue Faraday::Error => e
116
- raise "Erro na requisição: #{e.message}"
117
- end
118
-
119
- def item.single_prompt(prompt:, generation_config: :accurate_mode)
120
- # accurate_mode: less creative, more accurate
121
- generation_config = { temperature: 0, topP: 0, topK: 1 } if generation_config.eql?(:accurate_mode)
122
-
123
- generate_content(contents: [{ parts: [{ text: prompt }], role: 'user' }], generation_config:).content
124
- end
125
-
126
- item
127
- end
77
+ JSON.parse(response.body)['cachedContents'].map { |item| item.extend(ItemExtender) }
128
78
 
129
79
  rescue Faraday::Error => e
130
80
  raise "Erro na requisição: #{e.message}"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gemini_cache
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gedean Dias
@@ -24,6 +24,34 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: base64
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.2.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.2.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: nokogiri
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1'
27
55
  description: Ruby's Gemini Context Caching wrapper
28
56
  email: gedean.dias@gmail.com
29
57
  executables: []
@@ -31,6 +59,7 @@ extensions: []
31
59
  extra_rdoc_files: []
32
60
  files:
33
61
  - lib/gemini_cache.rb
62
+ - lib/gemini_cache/item_extender.rb
34
63
  homepage: https://github.com/gedean/gemini_cache
35
64
  licenses:
36
65
  - MIT