Class: LlmOptimizer::ConversationStore

Inherits:
Object
  • Object
show all
Defined in:
lib/llm_optimizer/conversation_store.rb

Constant Summary collapse

KEY_NAMESPACE =
"llm_optimizer:conversation:"

Instance Method Summary collapse

Constructor Details

#initialize(redis_client, ttl:, logger:, debug_logging: false, system_prompt: nil) ⇒ ConversationStore

Returns a new instance of ConversationStore.



7
8
9
10
11
12
13
# File 'lib/llm_optimizer/conversation_store.rb', line 7

def initialize(redis_client, ttl:, logger:, debug_logging: false, system_prompt: nil)
  @redis         = redis_client
  @ttl           = ttl
  @logger        = logger
  @debug_logging = debug_logging
  @system_prompt = system_prompt
end

Instance Method Details

#load(conversation_id) ⇒ Object

Loads and returns the messages array for conversation_id. Returns [] if no key exists or on Redis error (logs warning).



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/llm_optimizer/conversation_store.rb', line 17

def load(conversation_id)
  key = redis_key(conversation_id)
  raw = @redis.get(key)

  if raw.nil?
    messages = seed_messages
    @logger.info("[llm_optimizer] ConversationStore load: conversation_id=#{conversation_id}, count=#{messages.size}")
    log_debug_history(conversation_id, messages)
    return messages
  end

  messages = JSON.parse(raw, symbolize_names: true)
  @logger.info("[llm_optimizer] ConversationStore load: conversation_id=#{conversation_id}, count=#{messages.size}")
  log_debug_history(conversation_id, messages)
  messages
rescue Redis::BaseError => e
  @logger.warn("[llm_optimizer] ConversationStore load failed: conversation_id=#{conversation_id}, error=#{e.message}")
  []
end

#save(conversation_id, messages, prompt, response) ⇒ Object

Appends user + assistant messages to history and persists to Redis. Silently logs warning on Redis error; never raises.



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/llm_optimizer/conversation_store.rb', line 39

def save(conversation_id, messages, prompt, response)
  updated_messages = messages + [
    { role: "user", content: prompt },
    { role: "assistant", content: response }
  ]

  key = redis_key(conversation_id)
  json = JSON.generate(updated_messages)

  if @ttl.zero?
    @redis.set(key, json)
  else
    @redis.set(key, json, ex: @ttl)
  end

  @logger.info("[llm_optimizer] ConversationStore save: conversation_id=#{conversation_id}, count=#{updated_messages.size}")
  log_debug_history(conversation_id, updated_messages)
  updated_messages
rescue Redis::BaseError => e
  @logger.warn("[llm_optimizer] ConversationStore save failed: conversation_id=#{conversation_id}, error=#{e.message}")
  nil
end