Class: Legion::Extensions::MicrosoftTeams::Helpers::SessionManager
- Inherits:
-
Object
- Object
- Legion::Extensions::MicrosoftTeams::Helpers::SessionManager
- Includes:
- Helpers::Lex, PromptResolver
- Defined in:
- lib/legion/extensions/microsoft_teams/helpers/session_manager.rb
Constant Summary collapse
- DEFAULT_FLUSH_THRESHOLD =
20- DEFAULT_IDLE_TIMEOUT =
900- DEFAULT_MAX_RECENT =
5
Instance Method Summary collapse
- #active_sessions ⇒ Object
- #add_message(conversation_id:, role:, content:) ⇒ Object
- #flush_idle(timeout: nil) ⇒ Object
- #get_or_create(conversation_id:, owner_id:, mode:) ⇒ Object
-
#initialize(flush_threshold: nil, idle_timeout: nil, max_recent: nil) ⇒ SessionManager
constructor
A new instance of SessionManager.
- #persist(conversation_id:) ⇒ Object
- #recent_messages(conversation_id:, count: nil) ⇒ Object
- #refresh_prompt(conversation_id:) ⇒ Object
- #should_flush?(conversation_id:) ⇒ Boolean
- #shutdown ⇒ Object
- #touch(conversation_id:) ⇒ Object
Methods included from PromptResolver
#resolve_llm_config, #resolve_prompt
Constructor Details
#initialize(flush_threshold: nil, idle_timeout: nil, max_recent: nil) ⇒ SessionManager
Returns a new instance of SessionManager.
18 19 20 21 22 23 |
# File 'lib/legion/extensions/microsoft_teams/helpers/session_manager.rb', line 18 def initialize(flush_threshold: nil, idle_timeout: nil, max_recent: nil) @sessions = {} @flush_threshold = flush_threshold || settings_val(:flush_threshold, DEFAULT_FLUSH_THRESHOLD) @idle_timeout = idle_timeout || settings_val(:idle_timeout, DEFAULT_IDLE_TIMEOUT) @max_recent = max_recent || settings_val(:max_recent_messages, DEFAULT_MAX_RECENT) end |
Instance Method Details
#active_sessions ⇒ Object
109 110 111 |
# File 'lib/legion/extensions/microsoft_teams/helpers/session_manager.rb', line 109 def active_sessions @sessions.size end |
#add_message(conversation_id:, role:, content:) ⇒ Object
61 62 63 64 65 |
# File 'lib/legion/extensions/microsoft_teams/helpers/session_manager.rb', line 61 def (conversation_id:, role:, content:) return unless @sessions.key?(conversation_id) @sessions[conversation_id][:messages] << { role: role, content: content, at: Time.now } end |
#flush_idle(timeout: nil) ⇒ Object
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
# File 'lib/legion/extensions/microsoft_teams/helpers/session_manager.rb', line 88 def flush_idle(timeout: nil) timeout ||= @idle_timeout cutoff = Time.now - timeout flushed = [] @sessions.each do |conv_id, session| next unless session[:last_active] < cutoff persist(conversation_id: conv_id) flushed << conv_id end flushed.each { |conv_id| @sessions.delete(conv_id) } flushed end |
#get_or_create(conversation_id:, owner_id:, mode:) ⇒ Object
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# File 'lib/legion/extensions/microsoft_teams/helpers/session_manager.rb', line 25 def get_or_create(conversation_id:, owner_id:, mode:) return @sessions[conversation_id] if @sessions.key?(conversation_id) session = { owner_id: owner_id, mode: mode, message_count: 0, last_active: Time.now, messages: [], system_prompt: resolve_prompt(mode: mode, conversation_id: conversation_id, owner_id: owner_id), llm_config: resolve_llm_config(mode: mode, conversation_id: conversation_id, owner_id: owner_id) } seed = trace_seed_for(owner_id: owner_id) session[:trace_seed] = seed if seed @sessions[conversation_id] = session end |
#persist(conversation_id:) ⇒ Object
80 81 82 83 84 85 86 |
# File 'lib/legion/extensions/microsoft_teams/helpers/session_manager.rb', line 80 def persist(conversation_id:) return unless @sessions.key?(conversation_id) session = @sessions[conversation_id] store_session_to_memory(conversation_id: conversation_id, session: session) session[:message_count] = 0 end |
#recent_messages(conversation_id:, count: nil) ⇒ Object
67 68 69 70 71 72 |
# File 'lib/legion/extensions/microsoft_teams/helpers/session_manager.rb', line 67 def (conversation_id:, count: nil) return [] unless @sessions.key?(conversation_id) msgs = @sessions[conversation_id][:messages] msgs.last(count || @max_recent) end |
#refresh_prompt(conversation_id:) ⇒ Object
44 45 46 47 48 49 50 51 52 |
# File 'lib/legion/extensions/microsoft_teams/helpers/session_manager.rb', line 44 def refresh_prompt(conversation_id:) return nil unless @sessions.key?(conversation_id) session = @sessions[conversation_id] session[:system_prompt] = resolve_prompt( mode: session[:mode], conversation_id: conversation_id, owner_id: session[:owner_id] ) session[:system_prompt] end |
#should_flush?(conversation_id:) ⇒ Boolean
74 75 76 77 78 |
# File 'lib/legion/extensions/microsoft_teams/helpers/session_manager.rb', line 74 def should_flush?(conversation_id:) return false unless @sessions.key?(conversation_id) @sessions[conversation_id][:message_count] >= @flush_threshold end |
#shutdown ⇒ Object
104 105 106 107 |
# File 'lib/legion/extensions/microsoft_teams/helpers/session_manager.rb', line 104 def shutdown @sessions.each_key { |conv_id| persist(conversation_id: conv_id) } @sessions.clear end |
#touch(conversation_id:) ⇒ Object
54 55 56 57 58 59 |
# File 'lib/legion/extensions/microsoft_teams/helpers/session_manager.rb', line 54 def touch(conversation_id:) return unless @sessions.key?(conversation_id) @sessions[conversation_id][:message_count] += 1 @sessions[conversation_id][:last_active] = Time.now end |