chatwoot-develop/enterprise/app/services/captain/tools/react_to_message_tool.rb

61 lines
2.2 KiB
Ruby

module Captain
module Tools
class ReactToMessageTool < BaseTool
def self.name
'react_to_message'
end
description 'React to the last customer message with an emoji reaction. Use this to acknowledge messages positively (e.g., 👍, ❤️, 😊). Only use when appropriate to show engagement.'
param :emoji, type: 'string', desc: 'The emoji to react with, e.g. 👍, ❤️, 😊, 👏, 🙏'
def initialize(assistant, user: nil, conversation: nil)
@conversation = conversation
super(assistant, user: user)
end
def execute(emoji:)
return error_response('Conversation not found') unless @conversation.present?
return error_response('Emoji is required') if emoji.blank?
# Get the last incoming message from the customer
last_customer_message = @conversation.messages.incoming.last
return error_response('No customer message to react to') unless last_customer_message.present?
# Get the external message ID (source_id) - required for WhatsApp reactions
message_external_id = last_customer_message.source_id
return error_response('Message has no external ID for reaction') if message_external_id.blank?
Rails.logger.info "[ReactToMessageTool] Reacting to message #{last_customer_message.id} (source: #{message_external_id}) with #{emoji}"
create_reaction_message(last_customer_message, emoji, message_external_id)
{ success: true, message: "Reacted with #{emoji}" }.to_json
rescue StandardError => e
Rails.logger.error "[ReactToMessageTool] Failed: #{e.message}"
error_response(e.message)
end
private
def create_reaction_message(_target_message, emoji, external_id)
@conversation.messages.create!(
account_id: @conversation.account_id,
inbox_id: @conversation.inbox_id,
sender: @assistant,
message_type: :outgoing,
content: emoji,
content_attributes: {
'in_reply_to' => external_id,
'is_reaction' => true
}
)
end
def error_response(message)
{ success: false, error: message }.to_json
end
end
end
end