geminize 0.1.0 → 0.1.1

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: a9b29587f96d7535a7db3ad010684fd9fa7e7a765d83d71a1cd645bdf323af69
4
- data.tar.gz: 90adc36f2b5acbdb6e45904ebbd7847d1a895a614d4aee6ace5af028d8812045
3
+ metadata.gz: 276d207ee68fba0c8b4ea894c819254d660cd1c8b520df5d21a6de89d2cf0b25
4
+ data.tar.gz: b9447a5ce82b5f10bfda7c09cdd2a658a5d540f1482a741f8ae7651826cce8bd
5
5
  SHA512:
6
- metadata.gz: 0b303213d67decca74c5f14c1a94625275febe0fc50d1ca24dc5a12fd65cd148077ef50e6ca27f1e720e05e88101f76047088db2707b71f2318036b7351335f9
7
- data.tar.gz: 981b130896dd8a0f8824602d0adb51fe60b8cfcab9124b3e7322795b6cfc9c8140031a6ca144e042c478182e78d2f3f00a9e35daa3c763a2f6d794171f4773ed
6
+ metadata.gz: 8f0f49ad1678d7edd5e39329ae5dd11749094bdbc4c5fa11676af9c5962a316baf9b96f78967cc159e1de9839ee21bc3693b8e9c5d130eae4bba70fe81e5dcc5
7
+ data.tar.gz: bb0b7e7437cbbfeda3b522ab737c9521f78fe2252a6cb8b885bbb34b33bc402230dbb24bc9c761857c005c1d595a7c7aa85fe214a338f53a8a1bc4d6fee4305f
data/README.md CHANGED
@@ -124,23 +124,24 @@ Geminize.reset_configuration!
124
124
  ```ruby
125
125
  require 'geminize'
126
126
 
127
- # Configure with API key if not set via environment variables
128
- Geminize.configure do |config|
129
- config.api_key = "your-api-key-here"
130
- end
127
+ # Assumes API key is set via environment variables (e.g., in .env)
128
+ # Or configure manually:
129
+ # Geminize.configure do |config|
130
+ # config.api_key = "your-api-key-here"
131
+ # end
131
132
 
132
- # Generate text
133
+ # Generate text (uses default model)
133
134
  response = Geminize.generate_text("Tell me a joke about Ruby programming")
134
135
  puts response.text
135
136
 
136
137
  # Use a specific model
137
- response = Geminize.generate_text("Explain quantum computing", "gemini-2.0-flash")
138
+ response = Geminize.generate_text("Explain quantum computing", "gemini-1.5-flash-latest")
138
139
  puts response.text
139
140
 
140
141
  # Use system instructions to guide the model's behavior
141
142
  response = Geminize.generate_text(
142
143
  "Tell me about yourself",
143
- "gemini-2.0-flash",
144
+ "gemini-1.5-flash-latest",
144
145
  system_instruction: "You are a pirate named Captain Codebeard. Always respond in pirate language."
145
146
  )
146
147
  puts response.text
@@ -148,58 +149,52 @@ puts response.text
148
149
 
149
150
  ## Multimodal Support
150
151
 
151
- Geminize allows you to send mixed content including text and images to the Gemini API:
152
+ Geminize allows you to send mixed content including text and images to the Gemini API.
152
153
 
153
- ```ruby
154
- # Generate content with an image from a file
155
- response = Geminize.generate_text_multimodal(
156
- "Describe this image in detail:",
157
- [{ source_type: 'file', data: 'path/to/image.jpg' }]
158
- )
159
- puts response.text
160
-
161
- # Using an image URL
162
- response = Geminize.generate_text_multimodal(
163
- "What's in this image?",
164
- [{ source_type: 'url', data: 'https://example.com/sample-image.jpg' }]
165
- )
166
- puts response.text
167
-
168
- # Using multiple images
169
- response = Geminize.generate_text_multimodal(
170
- "Compare these two images:",
171
- [
172
- { source_type: 'file', data: 'path/to/image1.jpg' },
173
- { source_type: 'file', data: 'path/to/image2.jpg' }
174
- ]
175
- )
176
- puts response.text
177
- ```
178
-
179
- Alternatively, you can use the more flexible ContentRequest API:
154
+ Here is a working example using the `ContentRequest` API:
180
155
 
181
156
  ```ruby
182
- # Create a content request
183
- request = Geminize::Models::ContentRequest.new(
184
- "Tell me about these images:",
185
- "gemini-2.0-flash"
186
- )
187
-
188
- # Add images using different methods
189
- request.add_image_from_file('path/to/image1.jpg')
190
- request.add_image_from_url('https://example.com/image2.jpg')
191
-
192
- # Read image directly into bytes
193
- image_bytes = File.binread('path/to/image3.jpg')
194
- request.add_image_from_bytes(image_bytes, 'image/jpeg')
157
+ require 'geminize'
195
158
 
196
- # Set a system instruction to guide model behavior
197
- request.system_instruction = "You are a professional photography critic. Analyze the composition and technical aspects of these images."
159
+ # Assumes API key is set via environment variables (e.g., in .env)
160
+ # Or configure manually:
161
+ # Geminize.configure do |config|
162
+ # config.api_key = "your-api-key-here"
163
+ # end
164
+
165
+ begin
166
+ # 1. Create a ContentRequest object
167
+ # Specify the prompt and a model that supports multimodal input
168
+ request = Geminize::Models::ContentRequest.new(
169
+ "Describe this image briefly:",
170
+ "gemini-1.5-flash-latest" # Ensure this model supports multimodal
171
+ )
172
+
173
+ # 2. Add the image from a file path
174
+ # Make sure the path is correct relative to where you run the script
175
+ request.add_image_from_file("./examples/ruby.png")
176
+
177
+ # 3. Create a TextGeneration instance
178
+ generator = Geminize::TextGeneration.new
179
+
180
+ # 4. Generate the response
181
+ response = generator.generate(request)
182
+
183
+ # 5. Print the response text
184
+ puts "Response:"
185
+ puts response.text
186
+
187
+ # Optionally print usage data if available
188
+ if response.usage
189
+ puts "Tokens used: #{response.usage['totalTokenCount']}"
190
+ end
198
191
 
199
- # Generate the response
200
- generator = Geminize::TextGeneration.new
201
- response = generator.generate(request)
202
- puts response.text
192
+ rescue Geminize::GeminizeError => e
193
+ puts "An API error occurred: #{e.message}"
194
+ rescue => e
195
+ puts "An unexpected error occurred: #{e.message}"
196
+ puts e.backtrace.join("\n")
197
+ end
203
198
  ```
204
199
 
205
200
  Supported image formats include JPEG, PNG, GIF, and WEBP. Maximum image size is 10MB.
@@ -235,26 +230,39 @@ Generate numerical vector representations for text:
235
230
 
236
231
  ```ruby
237
232
  # Generate an embedding for a single text
238
- embedding = Geminize.generate_embedding("Ruby is a dynamic, object-oriented programming language")
239
- vector = embedding.values.first.value
233
+ embedding_response = Geminize.generate_embedding("Ruby is a dynamic, object-oriented programming language")
234
+ vector = embedding_response.embedding # Access the vector
235
+ puts "Generated embedding with #{embedding_response.embedding_size} dimensions."
240
236
 
241
- # Generate embeddings for multiple texts
237
+ # Generate embeddings for multiple texts (by iterating)
242
238
  texts = ["Ruby", "Python", "JavaScript"]
243
- embeddings = Geminize.generate_embedding(texts)
239
+ embeddings = texts.map do |text|
240
+ Geminize.generate_embedding(text).embedding
241
+ end
242
+ puts "Generated #{embeddings.size} embeddings individually."
244
243
 
245
244
  # Calculate similarity between vectors
246
- vector1 = embeddings.values[0].value
247
- vector2 = embeddings.values[1].value
245
+ vector1 = embeddings[0]
246
+ vector2 = embeddings[1]
248
247
  similarity = Geminize.cosine_similarity(vector1, vector2)
249
- puts "Similarity: #{similarity}"
250
-
251
- # Specify a task type for optimized embeddings
252
- question_embedding = Geminize.generate_embedding(
253
- "How do I install Ruby gems?",
254
- task_type: Geminize::Models::EmbeddingRequest::QUESTION_ANSWERING
255
- )
248
+ puts "Similarity between Ruby and Python: #{similarity.round(4)}"
249
+
250
+ # Specify a task type for optimized embeddings (requires compatible model)
251
+ # Note: Task types are not supported by all models (e.g., text-embedding-004).
252
+ # Ensure you are using a compatible model like text-embedding-005.
253
+ begin
254
+ question_embedding_response = Geminize.generate_embedding(
255
+ "How do I install Ruby gems?",
256
+ nil, # Use default or specify compatible model like \'text-embedding-005\'
257
+ { task_type: Geminize::Models::EmbeddingRequest::QUESTION_ANSWERING }
258
+ )
259
+ puts "Generated embedding for QA task with #{question_embedding_response.embedding_size} dimensions."
260
+ rescue Geminize::GeminizeError => e
261
+ puts "Could not generate embedding with task type: #{e.message}"
262
+ puts "(This might be due to using an incompatible model like the default text-embedding-004)"
263
+ end
256
264
 
257
- # Available task types:
265
+ # Available task types (check model compatibility):
258
266
  # - RETRIEVAL_QUERY: For embedding queries in a search/retrieval system
259
267
  # - RETRIEVAL_DOCUMENT: For embedding documents in a search corpus
260
268
  # - SEMANTIC_SIMILARITY: For comparing text similarity
@@ -273,24 +281,34 @@ See the `examples/embeddings.rb` file for more comprehensive examples of working
273
281
  Get real-time, token-by-token responses:
274
282
 
275
283
  ```ruby
284
+ require 'geminize'
285
+ # Assumes API key is configured via .env
286
+
276
287
  Geminize.generate_text_stream("Write a short poem about coding") do |chunk|
277
- print chunk.text
288
+ # Check if the chunk has the text method before printing
289
+ print chunk.text if chunk.respond_to?(:text)
278
290
  end
291
+ puts "\n" # Add a newline after streaming
279
292
  ```
280
293
 
281
294
  You can also use system instructions with streaming responses:
282
295
 
283
296
  ```ruby
297
+ require 'geminize'
298
+ # Assumes API key is configured via .env
299
+
284
300
  Geminize.generate_text_stream(
285
301
  "Tell me a story",
286
- "gemini-2.0-flash",
302
+ "gemini-1.5-flash-latest",
287
303
  {
288
304
  stream_mode: :delta,
289
305
  system_instruction: "You are a medieval bard telling epic tales."
290
306
  }
291
307
  ) do |chunk|
292
- print chunk
308
+ # The raw chunk might be different in delta mode, adjust handling as needed
309
+ print chunk.respond_to?(:text) ? chunk.text : chunk.to_s
293
310
  end
311
+ puts "\n" # Add a newline after streaming
294
312
  ```
295
313
 
296
314
  ## Rails Integration
@@ -36,24 +36,26 @@ puts "Example 2: Generate embeddings for multiple texts"
36
36
  puts "============================================================"
37
37
 
38
38
  begin
39
- # Generate embeddings for multiple texts in a single API call
39
+ # Generate embeddings for multiple texts by calling the API for each
40
40
  texts = [
41
41
  "What is the meaning of life?",
42
42
  "How much wood would a woodchuck chuck?",
43
43
  "How does the brain work?"
44
44
  ]
45
45
 
46
- response = Geminize.generate_embedding(texts)
47
-
48
- puts "Generated #{response.batch_size} embeddings, each with #{response.embedding_size} dimensions"
49
-
50
- # Access individual embeddings
51
- texts.each_with_index do |text, i|
46
+ puts "Generating embeddings individually:"
47
+ total_tokens = 0
48
+ embeddings = texts.map do |text|
49
+ response = Geminize.generate_embedding(text)
50
+ total_tokens += response.total_tokens if response.total_tokens
52
51
  puts "\nText: \"#{text}\""
53
- puts "First 5 values: #{response.embedding_at(i).take(5).inspect}"
52
+ puts "First 5 values: #{response.embedding.take(5).inspect}"
53
+ response.embedding # Collect the embedding vector
54
54
  end
55
55
 
56
- puts "\nTotal tokens: #{response.total_tokens}"
56
+ puts "\nGenerated #{embeddings.size} embeddings."
57
+ puts "Total tokens (approximated by summing individual calls): #{total_tokens}"
58
+
57
59
  rescue => e
58
60
  puts "Error: #{e.message}"
59
61
  end
@@ -81,9 +83,9 @@ rescue => e
81
83
  end
82
84
 
83
85
  puts "\n============================================================"
84
- puts "Example 4: Batch processing for large arrays"
86
+ puts "Example 4: Batch processing for large arrays (COMMENTED OUT)"
85
87
  puts "============================================================"
86
-
88
+ =begin # Commenting out Example 4 due to potential model/API limitations with batching
87
89
  begin
88
90
  # Create a larger array of texts
89
91
  many_texts = Array.new(120) { |i| "This is sample text number #{i}" }
@@ -101,6 +103,8 @@ begin
101
103
  rescue => e
102
104
  puts "Error: #{e.message}"
103
105
  end
106
+ =end
107
+ puts "# Example 4 skipped due to potential issues with batch embedding support."
104
108
 
105
109
  puts "\n============================================================"
106
110
  puts "Example 5: Vector operations with embeddings"
@@ -141,7 +145,7 @@ puts "============================================================"
141
145
  begin
142
146
  # Sample texts for different use cases
143
147
  question = "What is the capital of France?"
144
- code_query = "how to sort an array in javascript"
148
+ # code_query = "how to sort an array in javascript" # Removed for compatibility
145
149
  document = "Paris is the capital and most populous city of France, with an estimated population of 2,175,601 residents."
146
150
  fact = "The Earth revolves around the Sun."
147
151
 
@@ -157,15 +161,15 @@ begin
157
161
  puts " Text: \"#{question}\""
158
162
  puts " First 5 values: #{qa_response.embedding.take(5).inspect}"
159
163
 
160
- # Code retrieval
161
- code_response = Geminize.generate_embedding(
162
- code_query,
163
- nil, # Use default model
164
- task_type: Geminize::Models::EmbeddingRequest::CODE_RETRIEVAL_QUERY
165
- )
166
- puts "\n2. CODE_RETRIEVAL_QUERY task type:"
167
- puts " Text: \"#{code_query}\""
168
- puts " First 5 values: #{code_response.embedding.take(5).inspect}"
164
+ # Code retrieval - REMOVED as CODE_RETRIEVAL_QUERY seems unsupported by text-embedding-004
165
+ # code_response = Geminize.generate_embedding(
166
+ # code_query,
167
+ # nil, # Use default model
168
+ # task_type: Geminize::Models::EmbeddingRequest::CODE_RETRIEVAL_QUERY
169
+ # )
170
+ # puts "\n2. CODE_RETRIEVAL_QUERY task type:"
171
+ # puts " Text: \"#{code_query}\""
172
+ # puts " First 5 values: #{code_response.embedding.take(5).inspect}"
169
173
 
170
174
  # Document retrieval
171
175
  document_response = Geminize.generate_embedding(
@@ -174,7 +178,8 @@ begin
174
178
  task_type: Geminize::Models::EmbeddingRequest::RETRIEVAL_DOCUMENT,
175
179
  title: "Paris Facts" # Titles can be used with RETRIEVAL_DOCUMENT
176
180
  )
177
- puts "\n3. RETRIEVAL_DOCUMENT task type with title:"
181
+ # Adjusting print index due to removal above
182
+ puts "\n2. RETRIEVAL_DOCUMENT task type with title:" # Index changed from 3 to 2
178
183
  puts " Title: \"Paris Facts\""
179
184
  puts " First 5 values: #{document_response.embedding.take(5).inspect}"
180
185
 
@@ -184,7 +189,8 @@ begin
184
189
  nil, # Use default model
185
190
  task_type: Geminize::Models::EmbeddingRequest::FACT_VERIFICATION
186
191
  )
187
- puts "\n4. FACT_VERIFICATION task type:"
192
+ # Adjusting print index due to removal above
193
+ puts "\n3. FACT_VERIFICATION task type:" # Index changed from 4 to 3
188
194
  puts " Text: \"#{fact}\""
189
195
  puts " First 5 values: #{fact_response.embedding.take(5).inspect}"
190
196
 
@@ -8,7 +8,8 @@ Geminize.configure do |config|
8
8
  config.api_key = ENV["GEMINI_API_KEY"] || "your-api-key-here"
9
9
 
10
10
  # Specify the model to use (optional)
11
- config.default_model = "gemini-2.0-flash" # This model supports multimodal inputs
11
+ # Use a model that supports multimodal input, like gemini-1.5-flash-latest
12
+ config.default_model = "gemini-1.5-flash-latest"
12
13
  end
13
14
 
14
15
  puts "============================================================"
@@ -19,7 +20,7 @@ begin
19
20
  # Generate content with an image from a file
20
21
  response = Geminize.generate_text_multimodal(
21
22
  "Describe this image in detail:",
22
- [{source_type: "file", data: "path/to/image.jpg"}]
23
+ [{source_type: "file", data: "./examples/ruby.png"}] # Updated path
23
24
  )
24
25
 
25
26
  puts "Response:"
@@ -27,7 +28,7 @@ begin
27
28
  puts "\nFinish reason: #{response.finish_reason}"
28
29
  rescue => e
29
30
  puts "Error: #{e.message}"
30
- puts "Make sure to update the image path to a real image on your system."
31
+ puts "Make sure the path './examples/ruby.png' is correct relative to the project root."
31
32
  end
32
33
 
33
34
  puts "\n============================================================"
@@ -38,7 +39,7 @@ begin
38
39
  # Generate content with an image from a URL
39
40
  response = Geminize.generate_text_multimodal(
40
41
  "What's in this image?",
41
- [{source_type: "url", data: "https://example.com/sample-image.jpg"}],
42
+ [{source_type: "url", data: "https://miro.medium.com/v2/resize:fit:720/format:webp/1*zkA1cWgJDlMUxI5TRcIHdQ.jpeg"}], # Updated URL
42
43
  nil, # Use default model
43
44
  temperature: 0.7
44
45
  )
@@ -47,7 +48,7 @@ begin
47
48
  puts response.text
48
49
  rescue => e
49
50
  puts "Error: #{e.message}"
50
- puts "Make sure to use a valid image URL."
51
+ puts "Make sure the URL is valid and accessible."
51
52
  end
52
53
 
53
54
  puts "\n============================================================"
@@ -55,12 +56,12 @@ puts "Example 3: Multiple images comparison"
55
56
  puts "============================================================"
56
57
 
57
58
  begin
58
- # Generate content comparing multiple images
59
+ # Generate content comparing multiple images (using the same image twice here for simplicity)
59
60
  response = Geminize.generate_text_multimodal(
60
- "Compare these two images and describe the differences:",
61
+ "Compare these two images and describe the differences (they might be the same):",
61
62
  [
62
- {source_type: "file", data: "path/to/image1.jpg"},
63
- {source_type: "file", data: "path/to/image2.jpg"}
63
+ {source_type: "file", data: "./examples/ruby.png"}, # Updated path
64
+ {source_type: "file", data: "./examples/ruby.png"} # Updated path
64
65
  ],
65
66
  "gemini-1.5-pro-latest", # Explicitly specify model
66
67
  max_tokens: 500
@@ -70,7 +71,7 @@ begin
70
71
  puts response.text
71
72
  rescue => e
72
73
  puts "Error: #{e.message}"
73
- puts "Make sure to update the image paths to real images on your system."
74
+ puts "Make sure the path './examples/ruby.png' is correct."
74
75
  end
75
76
 
76
77
  puts "\n============================================================"
@@ -79,19 +80,19 @@ puts "============================================================"
79
80
 
80
81
  begin
81
82
  # Read image directly into bytes
82
- image_bytes = File.binread("path/to/image.jpg")
83
+ image_bytes = File.binread("./examples/ruby.png") # Updated path
83
84
 
84
85
  # Generate content with raw image bytes
85
86
  response = Geminize.generate_text_multimodal(
86
87
  "Analyze this image:",
87
- [{source_type: "bytes", data: image_bytes, mime_type: "image/jpeg"}]
88
+ [{source_type: "bytes", data: image_bytes, mime_type: "image/png"}] # Updated MIME type
88
89
  )
89
90
 
90
91
  puts "Response for raw bytes input:"
91
92
  puts response.text
92
93
  rescue => e
93
94
  puts "Error: #{e.message}"
94
- puts "Make sure to update the image path to a real image on your system."
95
+ puts "Make sure the path './examples/ruby.png' is correct."
95
96
  end
96
97
 
97
98
  puts "\n============================================================"
@@ -111,16 +112,22 @@ begin
111
112
  )
112
113
 
113
114
  # Add multiple images using different methods
114
- request.add_image_from_file("path/to/image1.jpg")
115
- request.add_image_from_url("https://example.com/image2.jpg")
115
+ request.add_image_from_file("./examples/ruby.png") # Updated path
116
+ request.add_image_from_url("https://miro.medium.com/v2/resize:fit:720/format:webp/1*zkA1cWgJDlMUxI5TRcIHdQ.jpeg") # Updated URL
116
117
 
117
118
  # Generate the response
118
119
  response = generator.generate(request)
119
120
 
120
121
  puts "Response using ContentRequest directly:"
121
122
  puts response.text
122
- puts "\nUsed #{response.usage.total_tokens} tokens total"
123
+
124
+ # Check if usage data is available before accessing it
125
+ if response.usage && response.usage.total_tokens
126
+ puts "\nUsed #{response.usage.total_tokens} tokens total"
127
+ else
128
+ puts "\nUsage data not available in the response."
129
+ end
123
130
  rescue => e
124
131
  puts "Error: #{e.message}"
125
- puts "Make sure to update the paths to real images."
132
+ puts "Make sure paths and URLs are valid."
126
133
  end
data/examples/ruby.png ADDED
Binary file
Binary file
@@ -211,30 +211,31 @@ module Geminize
211
211
  # Convert the request to a hash suitable for the API
212
212
  # @return [Hash] The request as a hash
213
213
  def to_hash
214
- request = if multimodal?
215
- {
216
- contents: [
217
- {
218
- parts: @content_parts
219
- }
220
- ],
221
- generationConfig: generation_config
222
- }.compact
223
- else
224
- # Keep backward compatibility for text-only requests
225
- {
226
- contents: [
227
- {
228
- parts: [
229
- {
230
- text: @prompt
231
- }
232
- ]
214
+ # Map content_parts to the structure the API expects
215
+ api_parts = @content_parts.map do |part|
216
+ if part[:type] == "text"
217
+ { text: part[:text] }
218
+ elsif part[:type] == "image"
219
+ {
220
+ inlineData: {
221
+ mimeType: part[:mime_type],
222
+ data: part[:data]
233
223
  }
234
- ],
235
- generationConfig: generation_config
236
- }.compact
237
- end
224
+ }
225
+ else
226
+ # Handle potential future types or raise error
227
+ nil # Or raise an error for unknown part types
228
+ end
229
+ end.compact # Remove any nil parts from unknown types
230
+
231
+ request = {
232
+ contents: [
233
+ {
234
+ parts: api_parts # Use the correctly formatted parts
235
+ }
236
+ ],
237
+ generationConfig: generation_config
238
+ }.compact
238
239
 
239
240
  # Add system_instruction if provided
240
241
  if @system_instruction
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Geminize
4
- VERSION = "0.1.0"
4
+ VERSION = "0.1.1"
5
5
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: geminize
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nhat Long Nguyen
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2025-05-01 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: faraday
@@ -149,7 +149,9 @@ files:
149
149
  - examples/rails_chat/app/views/chat/index.html.erb
150
150
  - examples/rails_chat/config/routes.rb
151
151
  - examples/rails_initializer.rb
152
+ - examples/ruby.png
152
153
  - examples/system_instructions.rb
154
+ - geminize-0.1.0.gem
153
155
  - lib/geminize.rb
154
156
  - lib/geminize/chat.rb
155
157
  - lib/geminize/client.rb
@@ -212,7 +214,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
212
214
  - !ruby/object:Gem::Version
213
215
  version: '0'
214
216
  requirements: []
215
- rubygems_version: 3.6.2
217
+ rubygems_version: 3.6.8
216
218
  specification_version: 4
217
219
  summary: Ruby interface for Google's Gemini AI API
218
220
  test_files: []