Class: LlmGateway::Agents::InMemorySessionManager
- Defined in:
- lib/llm_gateway/agents/in_memory_session_manager.rb
Direct Known Subclasses
Constant Summary collapse
- MESSAGE_QUEUED =
:queued- MESSAGE_STARTED =
:started- QUEUES =
[ :steer, :follow_up, :next_turn ].freeze
- DRAIN_MODES =
[ :one_at_a_time, :all ].freeze
Instance Attribute Summary collapse
-
#session_id ⇒ Object
readonly
Returns the value of attribute session_id.
-
#session_start ⇒ Object
readonly
Returns the value of attribute session_start.
Instance Method Summary collapse
- #active_messages ⇒ Object
- #build_model_input_messages ⇒ Object
- #busy! ⇒ Object
- #busy? ⇒ Boolean
- #compaction(adapter) ⇒ Object
- #drain_message_queue(queue = :next_turn, mode: :all) ⇒ Object
- #events ⇒ Object
- #events_until(event_id) ⇒ Object
- #idle! ⇒ Object
-
#initialize(session_id = nil) ⇒ InMemorySessionManager
constructor
A new instance of InMemorySessionManager.
- #last_assistant_message_at ⇒ Object
- #last_message_id ⇒ Object
- #last_model_used ⇒ Object
- #last_reasoning_level_used ⇒ Object
- #push_entry(entry) ⇒ Object
- #push_message(payload) ⇒ Object
- #push_message_to_queue(message, queue = :next_turn) ⇒ Object
- #queued_messages?(queue = :next_turn) ⇒ Boolean
- #start_or_enqueue_user_message(payload, queue: :next_turn) ⇒ Object
- #total_tokens ⇒ Object
- #validate_drain_mode!(mode) ⇒ Object
- #validate_queue!(queue) ⇒ Object
Constructor Details
#initialize(session_id = nil) ⇒ InMemorySessionManager
Returns a new instance of InMemorySessionManager.
16 17 18 19 20 |
# File 'lib/llm_gateway/agents/in_memory_session_manager.rb', line 16 def initialize(session_id = nil) @state = :idle @session_id = session_id @message_queues = Hash.new { |hash, key| hash[key] = [] } end |
Instance Attribute Details
#session_id ⇒ Object (readonly)
Returns the value of attribute session_id.
14 15 16 |
# File 'lib/llm_gateway/agents/in_memory_session_manager.rb', line 14 def session_id @session_id end |
#session_start ⇒ Object (readonly)
Returns the value of attribute session_start.
14 15 16 |
# File 'lib/llm_gateway/agents/in_memory_session_manager.rb', line 14 def session_start @session_start end |
Instance Method Details
#active_messages ⇒ Object
97 98 99 |
# File 'lib/llm_gateway/agents/in_memory_session_manager.rb', line 97 def .map { |event| event[:data] } end |
#build_model_input_messages ⇒ Object
124 125 126 127 128 |
# File 'lib/llm_gateway/agents/in_memory_session_manager.rb', line 124 def return unless last_compaction_entry [ last_compaction_entry[:data], * ] end |
#busy! ⇒ Object
22 23 24 |
# File 'lib/llm_gateway/agents/in_memory_session_manager.rb', line 22 def busy! @state = :busy end |
#busy? ⇒ Boolean
44 45 46 |
# File 'lib/llm_gateway/agents/in_memory_session_manager.rb', line 44 def busy? @state == :busy end |
#compaction(adapter) ⇒ Object
140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
# File 'lib/llm_gateway/agents/in_memory_session_manager.rb', line 140 def compaction(adapter) response = adapter.stream( , system: "Summarize the conversation so far for future context.", tools: [] ) = response.to_h push_entry( type: "compaction", usage: (), data: ) end |
#drain_message_queue(queue = :next_turn, mode: :all) ⇒ Object
30 31 32 33 34 |
# File 'lib/llm_gateway/agents/in_memory_session_manager.rb', line 30 def (queue = :next_turn, mode: :all) = (queue, mode) .each { || () } end |
#events ⇒ Object
120 121 122 |
# File 'lib/llm_gateway/agents/in_memory_session_manager.rb', line 120 def events @events ||= [ new_session_event ] end |
#events_until(event_id) ⇒ Object
113 114 115 116 117 118 |
# File 'lib/llm_gateway/agents/in_memory_session_manager.rb', line 113 def events_until(event_id) index = events.index { |event| event[:id] == event_id } raise ArgumentError, "Event not found in session: #{event_id}" unless index events[0..index] end |
#idle! ⇒ Object
26 27 28 |
# File 'lib/llm_gateway/agents/in_memory_session_manager.rb', line 26 def idle! @state = :idle end |
#last_assistant_message_at ⇒ Object
135 136 137 138 |
# File 'lib/llm_gateway/agents/in_memory_session_manager.rb', line 135 def entry = .reverse.find { |event| event.dig(:data, :role) == "assistant" } Time.parse(entry[:timestamp]) if entry end |
#last_message_id ⇒ Object
101 102 103 |
# File 'lib/llm_gateway/agents/in_memory_session_manager.rb', line 101 def .last&.dig(:id) end |
#last_model_used ⇒ Object
105 106 107 |
# File 'lib/llm_gateway/agents/in_memory_session_manager.rb', line 105 def last_model_used events.reverse.find { |event| event[:type] == "model_change" }&.dig(:model_id) end |
#last_reasoning_level_used ⇒ Object
109 110 111 |
# File 'lib/llm_gateway/agents/in_memory_session_manager.rb', line 109 def last_reasoning_level_used events.reverse.find { |event| event[:type] == "reasoning_change" }&.dig(:reasoning) end |
#push_entry(entry) ⇒ Object
84 85 86 87 88 89 90 91 92 93 94 95 |
# File 'lib/llm_gateway/agents/in_memory_session_manager.rb', line 84 def push_entry(entry) id = SecureRandom.uuid new_entry = { id: id, parent_id: parent_id_for_new_entry, timestamp: Time.now.iso8601, **entry } persist_entry(new_entry) new_entry end |
#push_message(payload) ⇒ Object
74 75 76 77 78 79 80 81 82 |
# File 'lib/llm_gateway/agents/in_memory_session_manager.rb', line 74 def (payload) payload = payload.deep_symbolize_keys push_entry( type: "message", usage: (payload), data: payload, ) end |
#push_message_to_queue(message, queue = :next_turn) ⇒ Object
40 41 42 |
# File 'lib/llm_gateway/agents/in_memory_session_manager.rb', line 40 def (, queue = :next_turn) @message_queues[validate_queue!(queue)] << end |
#queued_messages?(queue = :next_turn) ⇒ Boolean
36 37 38 |
# File 'lib/llm_gateway/agents/in_memory_session_manager.rb', line 36 def (queue = :next_turn) @message_queues[validate_queue!(queue)].any? end |
#start_or_enqueue_user_message(payload, queue: :next_turn) ⇒ Object
62 63 64 65 66 67 68 69 70 71 72 |
# File 'lib/llm_gateway/agents/in_memory_session_manager.rb', line 62 def (payload, queue: :next_turn) if busy? (payload, queue) MESSAGE_QUEUED else yield if block_given? (payload) busy! MESSAGE_STARTED end end |
#total_tokens ⇒ Object
130 131 132 133 |
# File 'lib/llm_gateway/agents/in_memory_session_manager.rb', line 130 def total_tokens entry = .reverse.find { |event| event.dig(:usage, :total_tokens) } entry&.dig(:usage, :total_tokens) || 0 end |
#validate_drain_mode!(mode) ⇒ Object
55 56 57 58 59 60 |
# File 'lib/llm_gateway/agents/in_memory_session_manager.rb', line 55 def validate_drain_mode!(mode) mode = mode.to_sym raise ArgumentError, "Invalid queue drain mode: #{mode}" unless DRAIN_MODES.include?(mode) mode end |