Module: Legion::LLM::Cache

Extended by:
Cache::Helper, Legion::Logging::Helper
Defined in:
lib/legion/llm/cache.rb,
lib/legion/llm/cache/response.rb

Defined Under Namespace

Modules: Response

Constant Summary collapse

DEFAULT_TTL =
300

Class Method Summary collapse

Class Method Details

.cache_namespaceObject



17
# File 'lib/legion/llm/cache.rb', line 17

def cache_namespace = ''

.enabled?Boolean

Returns true if response caching is enabled in settings and Legion::Cache is loaded.

Returns:

  • (Boolean)


61
62
63
64
65
# File 'lib/legion/llm/cache.rb', line 61

def enabled?
  return false unless available?

  Legion::LLM::Settings.value(:prompt_caching, :response_cache, :enabled, default: true) != false
end

.get(cache_key) ⇒ Object

Returns the cached response hash, or nil on miss / cache unavailable.



33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/legion/llm/cache.rb', line 33

def get(cache_key)
  return nil unless available?

  raw = cache_backend_get(cache_key)
  if raw.nil?
    log.debug("LLM cache miss key=#{cache_key}")
    return nil
  end

  Legion::JSON.load(raw)
rescue StandardError => e
  handle_exception(e, level: :warn, handled: true, operation: 'llm.cache.get', key: cache_key)
  nil
end

.key(model:, provider:, messages:, temperature: nil, tools: nil, schema: nil) ⇒ Object

Generates a deterministic SHA256 cache key from request parameters.



20
21
22
23
24
25
26
27
28
29
30
# File 'lib/legion/llm/cache.rb', line 20

def key(model:, provider:, messages:, temperature: nil, tools: nil, schema: nil)
  payload = Legion::JSON.dump({
                                model:       model.to_s,
                                provider:    provider.to_s,
                                messages:    messages,
                                temperature: temperature,
                                tools:       tools,
                                schema:      schema
                              })
  Digest::SHA256.hexdigest(payload)
end

.set(cache_key, response, ttl: DEFAULT_TTL) ⇒ Object

Stores a response in the cache with the given TTL.



49
50
51
52
53
54
55
56
57
58
# File 'lib/legion/llm/cache.rb', line 49

def set(cache_key, response, ttl: DEFAULT_TTL)
  return false unless available?

  cache_backend_set(cache_key, Legion::JSON.dump(response), ttl: ttl)
  log.debug("LLM cache write key=#{cache_key} ttl=#{ttl}")
  true
rescue StandardError => e
  handle_exception(e, level: :warn, handled: true, operation: 'llm.cache.set', key: cache_key)
  false
end