Class: Llmemory::LongTerm::Episodic::Storages::MemoryStorage

Inherits:
Base
  • Object
show all
Defined in:
lib/llmemory/long_term/episodic/storages/memory_storage.rb

Instance Method Summary collapse

Constructor Details

#initializeMemoryStorage

Returns a new instance of MemoryStorage.



10
11
12
13
# File 'lib/llmemory/long_term/episodic/storages/memory_storage.rb', line 10

def initialize
  @episodes = Hash.new { |h, k| h[k] = [] }
  @seq = 0
end

Instance Method Details

#archive_episodes(user_id, ids) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
# File 'lib/llmemory/long_term/episodic/storages/memory_storage.rb', line 50

def archive_episodes(user_id, ids)
  ids = Array(ids).map(&:to_s)
  count = 0
  @episodes[user_id].each do |e|
    next unless ids.include?(e[:id].to_s)
    next if e[:archived_at]
    e[:archived_at] = Time.now
    count += 1
  end
  count
end

#count_episodes(user_id) ⇒ Object



39
40
41
# File 'lib/llmemory/long_term/episodic/storages/memory_storage.rb', line 39

def count_episodes(user_id)
  active_episodes(user_id).size
end

#delete_episodes(user_id, ids) ⇒ Object



43
44
45
46
47
48
# File 'lib/llmemory/long_term/episodic/storages/memory_storage.rb', line 43

def delete_episodes(user_id, ids)
  ids = Array(ids).map(&:to_s)
  before = @episodes[user_id].size
  @episodes[user_id].reject! { |e| ids.include?(e[:id].to_s) }
  before - @episodes[user_id].size
end

#expired_episode_ids(user_id, cutoff:) ⇒ Object



62
63
64
65
66
# File 'lib/llmemory/long_term/episodic/storages/memory_storage.rb', line 62

def expired_episode_ids(user_id, cutoff:)
  active_episodes(user_id)
    .select { |e| as_time(e[:created_at]) < cutoff }
    .map { |e| e[:id].to_s }
end

#get_episode(user_id, id) ⇒ Object



24
25
26
# File 'lib/llmemory/long_term/episodic/storages/memory_storage.rb', line 24

def get_episode(user_id, id)
  @episodes[user_id].find { |e| e[:id] == id }
end

#list_episodes(user_id, limit: nil, offset: nil) ⇒ Object



28
29
30
31
32
# File 'lib/llmemory/long_term/episodic/storages/memory_storage.rb', line 28

def list_episodes(user_id, limit: nil, offset: nil)
  sorted = active_episodes(user_id).sort_by { |e| as_time(e[:created_at]) }.reverse
  sorted = sorted.drop(offset.to_i) if offset && offset.to_i.positive?
  limit && limit.to_i.positive? ? sorted.first(limit.to_i) : sorted
end

#list_usersObject



68
69
70
# File 'lib/llmemory/long_term/episodic/storages/memory_storage.rb', line 68

def list_users
  @episodes.keys
end

#save_episode(user_id, episode) ⇒ Object



15
16
17
18
19
20
21
22
# File 'lib/llmemory/long_term/episodic/storages/memory_storage.rb', line 15

def save_episode(user_id, episode)
  @seq += 1
  id = episode[:id] || episode["id"] || "ep_#{@seq}"
  record = symbolize(episode).merge(id: id, user_id: user_id)
  record[:created_at] ||= Time.now
  @episodes[user_id] << record
  id
end

#search_episodes(user_id, query) ⇒ Object



34
35
36
37
# File 'lib/llmemory/long_term/episodic/storages/memory_storage.rb', line 34

def search_episodes(user_id, query)
  return list_episodes(user_id) if query.to_s.strip.empty?
  active_episodes(user_id).select { |e| Llmemory::Tokenizer.matches?(episode_text(e), query) }
end