Class: ImageGeneration::GeminiService

Inherits:
Object
  • Object
show all
Defined in:
app/services/image_generation/gemini_service.rb

Overview

Internal: Gemini generateContent REST API client for image-to-image generation
with reference images. Not intended for direct use — call
+ImageGeneration::Service#generate+ instead.

This exists as a separate class because RubyLLM.paint does not support
passing inline reference images. The Gemini multimodal generateContent
endpoint does, via base64-encoded +inline_data+ parts.

Error classes here are re-raised as +ImageGeneration::Service::Error+
variants by the calling service.

Defined Under Namespace

Classes: AuthenticationError, ContentPolicyError, Error, NoImageReturnedError, Result

Constant Summary collapse

BASE_URL =
'https://generativelanguage.googleapis.com'

Instance Method Summary collapse

Constructor Details

#initialize(api_key:, model:) ⇒ GeminiService

Returns a new instance of GeminiService.



23
24
25
26
27
28
# File 'app/services/image_generation/gemini_service.rb', line 23

def initialize(api_key:, model:)
  raise AuthenticationError, 'Gemini API key not configured' if api_key.blank?

  @api_key = api_key
  @model   = model
end

Instance Method Details

#generate_with_references(prompt, reference_images, aspect_ratio, image_size) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'app/services/image_generation/gemini_service.rb', line 45

def generate_with_references(prompt, reference_images, aspect_ratio, image_size)
  parts    = build_parts(prompt, reference_images)
  body     = build_request_body(parts, aspect_ratio, image_size)
  response = call_api(body)

  jpeg     = extract_image_data(response)
  usage    = extract_usage(response)

  Result.new(
    jpeg_data:     jpeg,
    input_tokens:  usage[:input_tokens],
    output_tokens: usage[:output_tokens]
  )
end