chatwoot-develop/app/jobs/jasmine/response_job.rb
2026-01-20 13:16:32 -03:00

62 lines
1.9 KiB
Ruby

module Jasmine
class ResponseJob < ApplicationJob
queue_as :default
retry_on StandardError, wait: :polynomially_longer, attempts: 2
def perform(message_id)
message = Message.find_by(id: message_id)
return unless message
conversation = message.conversation
inbox = message.inbox
config = inbox.jasmine_inbox_config
# Double-check conditions (in case they changed since job was enqueued)
Rails.logger.info "[Jasmine::ResponseJob] Started for Message #{message_id}, Channel Class: #{inbox.channel.class.name}"
return unless config&.is_enabled?
return if conversation.assignee.present?
# Send typing indicator
inbox.channel.toggle_typing_status('typing_on', conversation: conversation)
begin
# Sleep for verification (optimized to 1.5s per recommendation)
sleep 1.5
# Get response from BrainService
response_text = BrainService.new(
inbox: inbox,
conversation: conversation,
message: message
).respond
return if response_text.blank?
# Send response as outgoing message
send_response(conversation, response_text)
ensure
# Ensure typing is turned off even if errors occur or no response
# Wait a bit to ensure the message "send" signal propagates before sending "paused"
sleep 0.5
inbox.channel.toggle_typing_status('typing_off', conversation: conversation)
end
end
private
def send_response(conversation, content)
conversation.messages.create!(
message_type: :outgoing,
account_id: conversation.account_id,
inbox_id: conversation.inbox_id,
content: content,
sender: nil, # No agent, it's from Jasmine
content_type: :text
)
rescue StandardError => e
Rails.logger.error "[Jasmine::ResponseJob] Failed to send response: #{e.message}"
end
end
end