Class: Langfuse::PromptCache

Inherits:
Object
  • Object
show all
Includes:
StaleWhileRevalidate
Defined in:
lib/langfuse/prompt_cache.rb

Overview

Simple in-memory cache for prompt data with TTL

Thread-safe cache implementation for storing prompt responses with time-to-live expiration.

Examples:

cache = Langfuse::PromptCache.new(ttl: 60)
cache.set("greeting:1", prompt_data)
cache.get("greeting:1") # => prompt_data

Defined Under Namespace

Classes: CacheEntry

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from StaleWhileRevalidate

#fetch_with_stale_while_revalidate, #initialize_swr, #shutdown, #swr_enabled?

Constructor Details

#initialize(ttl: 60, max_size: 1000, stale_ttl: 0, refresh_threads: 5, logger: default_logger) ⇒ PromptCache

Initialize a new cache

Parameters:

  • ttl (Integer) (defaults to: 60)

    Time-to-live in seconds (default: 60)

  • max_size (Integer) (defaults to: 1000)

    Maximum cache size (default: 1000)

  • stale_ttl (Integer) (defaults to: 0)

    Stale TTL for SWR in seconds (default: 0, SWR disabled). Note: :indefinite is normalized to 1000 years by Config before being passed here.

  • refresh_threads (Integer) (defaults to: 5)

    Number of background refresh threads (default: 5)

  • logger (Logger, nil) (defaults to: default_logger)

    Logger instance for error reporting (default: nil, creates new logger)



76
77
78
79
80
81
82
83
84
85
# File 'lib/langfuse/prompt_cache.rb', line 76

def initialize(ttl: 60, max_size: 1000, stale_ttl: 0, refresh_threads: 5, logger: default_logger)
  @ttl = ttl
  @max_size = max_size
  @stale_ttl = stale_ttl
  @logger = logger
  @cache = {}
  @monitor = Monitor.new
  @locks = {} # Track locks for in-memory locking
  initialize_swr(refresh_threads: refresh_threads) if swr_enabled?
end

Instance Attribute Details

#loggerLogger (readonly)

Returns Logger instance for error reporting.

Returns:

  • (Logger)

    Logger instance for error reporting



66
67
68
# File 'lib/langfuse/prompt_cache.rb', line 66

def logger
  @logger
end

#max_sizeInteger (readonly)

Returns Maximum number of cache entries.

Returns:

  • (Integer)

    Maximum number of cache entries



60
61
62
# File 'lib/langfuse/prompt_cache.rb', line 60

def max_size
  @max_size
end

#stale_ttlInteger (readonly)

Returns Stale TTL for SWR in seconds.

Returns:

  • (Integer)

    Stale TTL for SWR in seconds



63
64
65
# File 'lib/langfuse/prompt_cache.rb', line 63

def stale_ttl
  @stale_ttl
end

#ttlInteger (readonly)

Returns Time-to-live in seconds.

Returns:

  • (Integer)

    Time-to-live in seconds



57
58
59
# File 'lib/langfuse/prompt_cache.rb', line 57

def ttl
  @ttl
end

Class Method Details

.build_key(name, version: nil, label: nil) ⇒ String

Build a cache key from prompt name and options

Parameters:

  • name (String)

    Prompt name

  • version (Integer, nil) (defaults to: nil)

    Optional version

  • label (String, nil) (defaults to: nil)

    Optional label

Returns:

  • (String)

    Cache key



163
164
165
166
167
168
169
# File 'lib/langfuse/prompt_cache.rb', line 163

def self.build_key(name, version: nil, label: nil)
  key = name.to_s
  key += ":v#{version}" if version
  key += ":#{label}" if label
  key += ":production" unless version || label
  key
end

Instance Method Details

#cleanup_expiredInteger

Remove expired entries from cache

Returns:

  • (Integer)

    Number of entries removed



131
132
133
134
135
136
137
# File 'lib/langfuse/prompt_cache.rb', line 131

def cleanup_expired
  @monitor.synchronize do
    initial_size = @cache.size
    @cache.delete_if { |_key, entry| entry.expired? }
    initial_size - @cache.size
  end
end

#clearvoid

This method returns an undefined value.

Clear the entire cache



122
123
124
125
126
# File 'lib/langfuse/prompt_cache.rb', line 122

def clear
  @monitor.synchronize do
    @cache.clear
  end
end

#empty?Boolean

Check if cache is empty

Returns:

  • (Boolean)


151
152
153
154
155
# File 'lib/langfuse/prompt_cache.rb', line 151

def empty?
  @monitor.synchronize do
    @cache.empty?
  end
end

#get(key) ⇒ Object?

Get a value from the cache

Parameters:

  • key (String)

    Cache key

Returns:

  • (Object, nil)

    Cached value or nil if not found/expired



91
92
93
94
95
96
97
98
99
# File 'lib/langfuse/prompt_cache.rb', line 91

def get(key)
  @monitor.synchronize do
    entry = @cache[key]
    return nil unless entry
    return nil if entry.expired?

    entry.data
  end
end

#set(key, value) ⇒ Object

Set a value in the cache

Parameters:

  • key (String)

    Cache key

  • value (Object)

    Value to cache

Returns:

  • (Object)

    The cached value



106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/langfuse/prompt_cache.rb', line 106

def set(key, value)
  @monitor.synchronize do
    # Evict oldest entry if at max size
    evict_oldest if @cache.size >= max_size

    now = Time.now
    fresh_until = now + ttl
    stale_until = fresh_until + stale_ttl
    @cache[key] = CacheEntry.new(value, fresh_until, stale_until)
    value
  end
end

#sizeInteger

Get current cache size

Returns:

  • (Integer)

    Number of entries in cache



142
143
144
145
146
# File 'lib/langfuse/prompt_cache.rb', line 142

def size
  @monitor.synchronize do
    @cache.size
  end
end