Class: Mistri::Providers::Gemini
- Inherits:
-
Object
- Object
- Mistri::Providers::Gemini
- Defined in:
- lib/mistri/providers/gemini.rb,
lib/mistri/providers/gemini/assembler.rb,
lib/mistri/providers/gemini/serializer.rb
Overview
The Gemini API (v1beta generateContent), streamed over SSE and stateless: the full history replays every turn.
Thinking is deliberately unconstrained: no budget, no level, only includeThoughts so summaries stream for the UI. The model's own defaults decide how much to think, and a host override passes through verbatim. maxOutputTokens is omitted for the same reason: the API defaults to the model's ceiling.
Defined Under Namespace
Modules: Serializer Classes: Assembler
Constant Summary collapse
- DEFAULT_ORIGIN =
"https://generativelanguage.googleapis.com"- DEFAULT_THINKING =
{ includeThoughts: true }.freeze
Instance Attribute Summary collapse
-
#model ⇒ Object
readonly
Returns the value of attribute model.
Instance Method Summary collapse
- #close ⇒ Object
-
#initialize(api_key:, model: "gemini-2.5-flash", origin: DEFAULT_ORIGIN, thinking: DEFAULT_THINKING, service_tier: nil, catalog_pricing: nil, **transport_options) ⇒ Gemini
constructor
A new instance of Gemini.
- #native_output_schema(schema) ⇒ Object
- #prices_usage? ⇒ Boolean
- #stream(messages:, system: nil, tools: [], signal: nil, **overrides, &emit) ⇒ Object
Constructor Details
#initialize(api_key:, model: "gemini-2.5-flash", origin: DEFAULT_ORIGIN, thinking: DEFAULT_THINKING, service_tier: nil, catalog_pricing: nil, **transport_options) ⇒ Gemini
Returns a new instance of Gemini.
19 20 21 22 23 24 25 26 27 28 |
# File 'lib/mistri/providers/gemini.rb', line 19 def initialize(api_key:, model: "gemini-2.5-flash", origin: DEFAULT_ORIGIN, thinking: DEFAULT_THINKING, service_tier: nil, catalog_pricing: nil, **) @api_key = api_key @model = model @thinking = thinking @service_tier = service_tier @catalog_pricing = catalog_pricing.nil? ? official_origin?(origin) : catalog_pricing @transport = Transport.new(origin: origin, **) end |
Instance Attribute Details
#model ⇒ Object (readonly)
Returns the value of attribute model.
30 31 32 |
# File 'lib/mistri/providers/gemini.rb', line 30 def model @model end |
Instance Method Details
#close ⇒ Object
64 |
# File 'lib/mistri/providers/gemini.rb', line 64 def close = @transport.close |
#native_output_schema(schema) ⇒ Object
37 38 39 40 41 |
# File 'lib/mistri/providers/gemini.rb', line 37 def native_output_schema(schema) return unless Models.find(model)&.provider == :gemini SchemaCapabilities.derive(schema, :gemini) end |
#prices_usage? ⇒ Boolean
32 33 34 35 |
# File 'lib/mistri/providers/gemini.rb', line 32 def prices_usage? tier_known = @service_tier.nil? || %w[unspecified standard].include?(@service_tier.to_s) @catalog_pricing && Models.priced?(model) && tier_known end |
#stream(messages:, system: nil, tools: [], signal: nil, **overrides, &emit) ⇒ Object
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/mistri/providers/gemini.rb', line 43 def stream(messages:, system: nil, tools: [], signal: nil, **overrides, &emit) delivery = EventDelivery.wrap(emit) model = overrides.fetch(:model, @model) service_tier = overrides.fetch(:service_tier, @service_tier) assembler = Gemini::Assembler.new(model: model, catalog_pricing: @catalog_pricing, service_tier:) assembler.start(&delivery) body = build_body(, system, tools, overrides) path = "/v1beta/models/#{model}:streamGenerateContent?alt=sse" outcome = @transport.stream_post(path, body: body, headers: headers, signal: signal) do |record| assembler.feed(record, &delivery) end outcome == :aborted ? assembler.abort(&delivery) : assembler.finish(&delivery) rescue EventDelivery::Failure => e raise EventDelivery.unwrap(e, delivery) rescue Error => e assembler.fail_stream(e, &emit) end |