chatwoot-develop/enterprise/app/services/captain/tools/react_to_message_tool.rb
2026-01-20 13:16:32 -03:00

81 lines
2.8 KiB
Ruby

module Captain
module Tools
class ReactToMessageTool < BaseTool
def name
'react_to_message'
end
def description
'Envia uma reação de emoji à última mensagem do cliente no WhatsApp. Use SEMPRE quando o cliente enviar agradecimentos, elogios ou emojis.'
end
def tool_parameters_schema
{
type: 'object',
properties: {
emoji: {
type: 'string',
description: 'O emoji para reagir. Use ❤️ para agradecimentos, 👍 para confirmações, 😊 para saudações.'
}
},
required: ['emoji']
}
end
def initialize(assistant, user: nil, conversation: nil)
super(assistant, user: user, conversation: conversation)
end
def execute(*args, **params)
actual_params = resolve_params(args, params)
emoji = actual_params[: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
if last_customer_message.blank?
Rails.logger.warn "[ReactToMessageTool] Failure: No incoming message found for conversation #{@conversation.id}"
return error_response('No customer message to react to')
end
# Get the external message ID (source_id) - required for WhatsApp reactions
message_external_id = last_customer_message.source_id
if message_external_id.blank?
Rails.logger.warn "[ReactToMessageTool] Failure: Message #{last_customer_message.id} has no source_id"
return error_response('Message has no external ID for reaction')
end
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' => external_id,
'is_reaction' => true
}
)
end
def error_response(message)
{ success: false, error: message }.to_json
end
end
end
end