Class: LittleGhost::Providers::Gemini

Inherits:
Base
  • Object
show all
Defined in:
lib/little_ghost/providers/gemini.rb,
lib/little_ghost/providers/gemini/catalog_source.rb

Overview

Zero-dependency Gemini generateContent adapter.

Direct Known Subclasses

VertexAI

Defined Under Namespace

Classes: CatalogSource, Normalizer

Constant Summary collapse

DEFAULT_BASE_URL =

:nodoc:

"https://generativelanguage.googleapis.com/v1beta/"

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Base

#prepare_request

Constructor Details

#initialize(api_key:, model:, base_url: DEFAULT_BASE_URL, open_timeout: 10, read_timeout: 120, max_response_bytes: Support::HTTPClient::DEFAULT_MAX_RESPONSE_BYTES, transport: nil) ⇒ Gemini

Creates a Gemini generateContent client for model.

Raises:



23
24
25
26
27
28
29
30
# File 'lib/little_ghost/providers/gemini.rb', line 23

def initialize(api_key:, model:, base_url: DEFAULT_BASE_URL, open_timeout: 10, read_timeout: 120,
  max_response_bytes: Support::HTTPClient::DEFAULT_MAX_RESPONSE_BYTES, transport: nil, **)
  raise CredentialError, "Gemini api_key is required" if api_key.to_s.empty?

  @api_key = api_key
  @model = model
  @transport = transport || Support::HTTPClient.new(base_url:, open_timeout:, read_timeout:, max_response_bytes:)
end

Instance Attribute Details

#modelObject (readonly)

Provider-owned model identifier.



20
21
22
# File 'lib/little_ghost/providers/gemini.rb', line 20

def model
  @model
end

Class Method Details

.request_optionsObject

Request policy supported by Gemini and Vertex AI HTTP clients.



15
# File 'lib/little_ghost/providers/gemini.rb', line 15

def self.request_options = %i[max_response_bytes open_timeout read_timeout].freeze

Instance Method Details

#capabilities(metadata: {}) ⇒ Object



52
53
54
55
# File 'lib/little_ghost/providers/gemini.rb', line 52

def capabilities(metadata: {})
  ModelCapabilities.new(native_structured_output: true, tools: true, tool_choice: true,
    supported_parameters: [:supported_parameters])
end

#stream(request) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/little_ghost/providers/gemini.rb', line 32

def stream(request)
  return enum_for(__method__, request) unless block_given?

  parser = Support::SSEParser.new
  normalizer = Normalizer.new(model:)
  @transport.stream(
    path: endpoint,
    headers: request_headers(request),
    body: JSON.generate(request_body(request)),
    cancellation_token: request.cancellation_token,
    deadline: request.deadline
  ) do |chunk|
    parser.<<(chunk).each { |data| normalizer.consume(JSON.parse(data)).each { |event| yield event } }
  end
  parser.finish.each { |data| normalizer.consume(JSON.parse(data)).each { |event| yield event } }
  normalizer.finish.each { |event| yield event }
rescue JSON::ParserError => error
  raise ProtocolError, "Google returned invalid JSON: #{error.message}"
end