Gemini Provider

The Gemini provider connects to Google’s Gemini models via the Gemini REST API.

Configuration

Configure your Gemini API key:

Riffer.configure do |config|
  config.gemini.api_key = ENV['GEMINI_API_KEY']
end

Or per-agent:

class MyAgent < Riffer::Agent
  model 'gemini/gemini-2.5-flash-lite'
  provider_options api_key: ENV['GEMINI_API_KEY']
end

Supported Models

Use Gemini model IDs in the gemini/model format:

model 'gemini/gemini-2.5-flash-lite'
model 'gemini/gemini-2.5-pro'
model 'gemini/gemini-2.5-flash'

Model Options

temperature

Controls randomness:

model_options temperature: 0.7

maxOutputTokens

Maximum tokens in response:

model_options maxOutputTokens: 4096

topP

Nucleus sampling:

model_options topP: 0.9

Usage

Basic Generation

provider = Riffer::Providers::Gemini.new(api_key: ENV['GEMINI_API_KEY'])

response = provider.generate_text(
  prompt: "Hello!",
  model: "gemini-2.5-flash-lite"
)
puts response.content

Streaming

provider.stream_text(prompt: "Tell me a story", model: "gemini-2.5-flash-lite").each do |event|
  case event
  when Riffer::StreamEvents::TextDelta
    print event.content
  when Riffer::StreamEvents::TextDone
    puts "\n---"
  end
end

Structured Output

params = Riffer::Params.new
params.required(:sentiment, String)
params.required(:score, Float)
structured_output = Riffer::StructuredOutput.new(params)

response = provider.generate_text(
  prompt: "Analyze: 'This is great!'",
  model: "gemini-2.5-flash-lite",
  structured_output: structured_output
)
puts response.structured_output

Tool Calling

class WeatherTool < Riffer::Tool
  description "Gets weather"
  params do
    required :city, String
  end
  def call(context:, city:)
    text("Sunny in #{city}")
  end
end

response = provider.generate_text(
  prompt: "What's the weather in Tokyo?",
  model: "gemini-2.5-flash-lite",
  tools: [WeatherTool]
)

File Support

Gemini supports inline base64-encoded files (images and documents):

file = Riffer::FilePart.new(data: base64_data, media_type: "image/png")
response = provider.generate_text(
  prompt: "Describe this image",
  model: "gemini-2.5-flash-lite",
  files: [file]
)

Note: URL-based file references are not supported. Provide base64-encoded data instead.

Limitations