Class: LittleGhost::Providers::Gemini
- 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
Defined Under Namespace
Classes: CatalogSource, Normalizer
Constant Summary collapse
- DEFAULT_BASE_URL =
:nodoc:
"https://generativelanguage.googleapis.com/v1beta/"
Instance Attribute Summary collapse
-
#model ⇒ Object
readonly
Provider-owned model identifier.
Class Method Summary collapse
-
.request_options ⇒ Object
Request policy supported by Gemini and Vertex AI HTTP clients.
Instance Method Summary collapse
- #capabilities(metadata: {}) ⇒ Object
-
#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
constructor
Creates a Gemini generateContent client for
model. - #stream(request) ⇒ Object
Methods inherited from Base
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.
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
#model ⇒ Object (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_options ⇒ Object
Request policy supported by Gemini and Vertex AI HTTP clients.
15 |
# File 'lib/little_ghost/providers/gemini.rb', line 15 def self. = %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.}" end |