32 lines
1.2 KiB
Ruby
32 lines
1.2 KiB
Ruby
class Captain::Conversation::DebounceResponseJob < ApplicationJob
|
|
queue_as :default
|
|
|
|
def perform(conversation_id, assistant_id, scheduled_timestamp)
|
|
current_timestamp = Redis::Alfred.get(debounce_key(conversation_id))
|
|
return if current_timestamp.blank?
|
|
|
|
# If the key has been updated since we were scheduled, it means a newer message arrived.
|
|
# We let the newer job handle it.
|
|
if current_timestamp.to_f > scheduled_timestamp
|
|
Rails.logger.info "[Captain][Debounce] Skipping job for Conv #{conversation_id} (Timestamp mismatch: #{current_timestamp} > #{scheduled_timestamp})"
|
|
return
|
|
end
|
|
|
|
conversation = Conversation.find_by(id: conversation_id)
|
|
assistant = Captain::Assistant.find_by(id: assistant_id)
|
|
|
|
if conversation && assistant
|
|
Rails.logger.info "[Captain][Debounce] Processing response for Conv #{conversation_id}"
|
|
Captain::Conversation::ResponseBuilderJob.perform_now(conversation, assistant)
|
|
else
|
|
Rails.logger.warn "[Captain][Debounce] Conversation or Assistant not found for Conv #{conversation_id}"
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def debounce_key(conversation_id)
|
|
"captain:debounce:conversation:#{conversation_id}"
|
|
end
|
|
end
|