From 5af2f541a1b97c4ff8a27efe51d9bab197d4db56 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 29 Jun 2023 13:12:15 +0530 Subject: [PATCH] feat: allow caching of response --- lib/integrations/openai_processor_service.rb | 27 +++++++++++++++++++- lib/redis/redis_keys.rb | 1 + 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/lib/integrations/openai_processor_service.rb b/lib/integrations/openai_processor_service.rb index 4f5170f0f..e169e1b6b 100644 --- a/lib/integrations/openai_processor_service.rb +++ b/lib/integrations/openai_processor_service.rb @@ -4,6 +4,7 @@ class Integrations::OpenaiProcessorService GPT_MODEL = 'gpt-3.5-turbo'.freeze ALLOWED_EVENT_NAMES = %w[rephrase summarize reply_suggestion suggest_label].freeze + CACHEABLE_EVENTS = %w[suggest_label].freeze pattr_initialize [:hook!, :event!] @@ -11,11 +12,35 @@ class Integrations::OpenaiProcessorService event_name = event['name'] return nil unless valid_event_name?(event_name) - send("#{event_name}_message") + return value_from_cache if CACHEABLE_EVENTS.include?(event_name) && value_from_cache.present? + + response = send("#{event_name}_message") + save_to_cache(response) if CACHEABLE_EVENTS.include?(event_name) + + response end private + def cache_key + conversation = find_conversation + return nil unless conversation + + format(::Redis::Alfred::OPENAI_CONVERSATION_KEY, event_name: event['name'], conversation_id: conversation.id, + updated_at: conversation.updated_at.to_i) + end + + def value_from_cache + # since the value from cache depends on the conversation last_updated_at, it will always be fresh + return nil if cache_key.blank? + + Redis::Alfred.get(cache_key) + end + + def save_to_cache(response) + Redis::Alfred.set(cache_key, response) + end + def find_conversation hook.account.conversations.find_by(display_id: event['data']['conversation_display_id']) end diff --git a/lib/redis/redis_keys.rb b/lib/redis/redis_keys.rb index 0de5ff9ca..bf024b349 100644 --- a/lib/redis/redis_keys.rb +++ b/lib/redis/redis_keys.rb @@ -32,4 +32,5 @@ module Redis::RedisKeys # Check if a message create with same source-id is in progress? MESSAGE_SOURCE_KEY = 'MESSAGE_SOURCE_KEY::%s'.freeze CUSTOM_FILTER_RECORDS_COUNT_KEY = 'CUSTOM_FILTER::%d::%d::%d'.freeze + OPENAI_CONVERSATION_KEY = 'OPEN_AI_CONVERSATION_KEY::%s::%d::%d'.freeze end