Class: Gemini::Live::Session

Inherits:
Object
  • Object
show all
Defined in:
lib/gemini/live/session.rb

Overview

Live API session manager

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(api_key:, configuration:) ⇒ Session

Returns a new instance of Session.



12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/gemini/live/session.rb', line 12

def initialize(api_key:, configuration:)
  @api_key = api_key
  @configuration = configuration
  @event_handlers = Hash.new { |h, k| h[k] = [] }
  @connected = false
  @setup_complete = false
  @last_resumption_token = nil
  @usage_metadata = nil
  @connection = nil

  setup_connection
end

Instance Attribute Details

#configurationObject (readonly)

Returns the value of attribute configuration.



10
11
12
# File 'lib/gemini/live/session.rb', line 10

def configuration
  @configuration
end

#last_resumption_tokenObject (readonly)

Returns the value of attribute last_resumption_token.



10
11
12
# File 'lib/gemini/live/session.rb', line 10

def last_resumption_token
  @last_resumption_token
end

#usage_metadataObject (readonly)

Returns the value of attribute usage_metadata.



10
11
12
# File 'lib/gemini/live/session.rb', line 10

def 
  @usage_metadata
end

Instance Method Details

#activity_endObject

Manual VAD control - signal activity end



104
105
106
107
# File 'lib/gemini/live/session.rb', line 104

def activity_end
  ensure_setup_complete!
  @connection.send(MessageBuilder.activity_end)
end

#activity_startObject

Manual VAD control - signal activity start



98
99
100
101
# File 'lib/gemini/live/session.rb', line 98

def activity_start
  ensure_setup_complete!
  @connection.send(MessageBuilder.activity_start)
end

#closeObject

Close the session



110
111
112
113
114
# File 'lib/gemini/live/session.rb', line 110

def close
  @connection&.close
  @connected = false
  @setup_complete = false
end

#connected?Boolean

Returns:

  • (Boolean)


116
117
118
# File 'lib/gemini/live/session.rb', line 116

def connected?
  @connected && @connection&.connected?
end

#on(event, &block) ⇒ Object

Register event handler Supported events:

:setup_complete - Session setup completed
:text           - Text response received (text)
:audio          - Audio data received (base64_data, mime_type)
:data           - Other inline data received (base64_data, mime_type)
:tool_call      - Tool call requested (function_calls)
:interrupted    - User interrupted the model
:turn_complete  - Model turn completed
:generation_complete - Generation completed
:usage_metadata - Token usage info received (metadata)
:session_resumption - Session resumption token updated (update)
:go_away        - Connection will close soon (info)
:error          - Error occurred (error)
:close          - Connection closed (code, reason)


40
41
42
43
# File 'lib/gemini/live/session.rb', line 40

def on(event, &block)
  @event_handlers[event.to_sym] << block
  self
end

#send_audio(audio_data, mime_type: "audio/pcm;rate=16000") ⇒ Object

Send audio data (Base64 encoded PCM)



67
68
69
70
71
72
73
74
75
76
# File 'lib/gemini/live/session.rb', line 67

def send_audio(audio_data, mime_type: "audio/pcm;rate=16000")
  ensure_setup_complete!
  encoded_data = audio_data.is_a?(String) && audio_data.encoding == Encoding::BINARY ?
    Base64.strict_encode64(audio_data) : audio_data
  message = MessageBuilder.realtime_input(
    audio_data: encoded_data,
    mime_type: mime_type
  )
  @connection.send(message)
end

#send_realtime_text(text) ⇒ Object

Send text input via realtimeInput.text (universal form). Works with every currently-deployed Live model, including gemini-3.1-flash-live-preview and native-audio variants.



61
62
63
64
# File 'lib/gemini/live/session.rb', line 61

def send_realtime_text(text)
  ensure_setup_complete!
  @connection.send(MessageBuilder.realtime_text(text))
end

#send_text(text, turn_complete: true) ⇒ Object

Send text message via clientContent.turns. This is the legacy form used by native-audio Live models. Newer models such as gemini-3.1-flash-live-preview reject this payload — use #send_realtime_text instead, which works on every Live model.



49
50
51
52
53
54
55
56
# File 'lib/gemini/live/session.rb', line 49

def send_text(text, turn_complete: true)
  ensure_setup_complete!
  message = MessageBuilder.client_content(
    text: text,
    turn_complete: turn_complete
  )
  @connection.send(message)
end

#send_tool_response(function_responses) ⇒ Object

Send tool response



91
92
93
94
95
# File 'lib/gemini/live/session.rb', line 91

def send_tool_response(function_responses)
  ensure_setup_complete!
  message = MessageBuilder.tool_response(function_responses)
  @connection.send(message)
end

#send_video(image_data, mime_type: "image/jpeg") ⇒ Object

Send video/image data (Base64 encoded)



79
80
81
82
83
84
85
86
87
88
# File 'lib/gemini/live/session.rb', line 79

def send_video(image_data, mime_type: "image/jpeg")
  ensure_setup_complete!
  encoded_data = image_data.is_a?(String) && image_data.encoding == Encoding::BINARY ?
    Base64.strict_encode64(image_data) : image_data
  message = MessageBuilder.realtime_input(
    video_data: encoded_data,
    mime_type: mime_type
  )
  @connection.send(message)
end

#setup_complete?Boolean

Returns:

  • (Boolean)


120
121
122
# File 'lib/gemini/live/session.rb', line 120

def setup_complete?
  @setup_complete
end