Class: Legion::Extensions::MicrosoftTeams::Helpers::SessionManager

Inherits:
Object
  • Object
show all
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

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_sessionsObject



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 add_message(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 recent_messages(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

Returns:

  • (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

#shutdownObject



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