From 2f78f273dafff92e66cbbe66d851e39a193ea441 Mon Sep 17 00:00:00 2001 From: Rodrigo Borba Date: Thu, 22 Jan 2026 19:17:39 -0300 Subject: [PATCH] ajuste fluxo de msgs --- lib/integrations/captain/processor_service.rb | 19 ++++++---- progresso/correcao_loop_captain.md | 35 +++++++++++++++++++ 2 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 progresso/correcao_loop_captain.md diff --git a/lib/integrations/captain/processor_service.rb b/lib/integrations/captain/processor_service.rb index 85428fd..1020a01 100755 --- a/lib/integrations/captain/processor_service.rb +++ b/lib/integrations/captain/processor_service.rb @@ -50,14 +50,21 @@ class Integrations::Captain::ProcessorService < Integrations::BotProcessorServic end def previous_messages - previous_messages = [] - conversation.messages.where(message_type: [:outgoing, :incoming]).where(private: false).offset(1).find_each do |message| - next if message.content_type != 'text' + current_message_id = event_data[:message].id - role = determine_role(message) - previous_messages << { message: message.content, type: role } + # Fetch last 20 messages before the current one + messages = conversation.messages + .where(message_type: [:outgoing, :incoming]) + .where(private: false) + .where(content_type: 'text') + .where('id < ?', current_message_id) # Exclude current message + .reorder(created_at: :desc) # Get latest first + .limit(20) + + # Reverse to chronological order and map + messages.to_a.reverse.map do |message| + { message: message.content, type: determine_role(message) } end - previous_messages end def determine_role(message) diff --git a/progresso/correcao_loop_captain.md b/progresso/correcao_loop_captain.md new file mode 100644 index 0000000..40a0317 --- /dev/null +++ b/progresso/correcao_loop_captain.md @@ -0,0 +1,35 @@ +# Correção de Loop de Resposta no Captain + +**Objetivo:** +Corrigir o comportamento onde o bot entrava em loop ("responder tudo errado" ou repetir boas-vindas) por receber o input do usuário duplicado no histórico. + +**Contexto:** +O método `previous_messages` utilizava `offset(1)` para pular a mensagem atual, mas a ordenação padrão (`created_at ASC`) fazia com que ele pulasse a _primeira_ mensagem da conversa em vez da última. Isso incluía a mensagem atual no histórico enviado para a IA. + +**Passos Realizados:** + +1. Análise do `processor_service.rb`. +2. Identificação da falha no uso de `offset(1)`. +3. Refatoração para consulta explícita excluindo o ID atual. + +**Arquivos Alterados:** + +- `lib/integrations/captain/processor_service.rb` + +**Código Principal (Diff):** + +```ruby +# Antes +conversation.messages.where(...).offset(1).find_each + +# Depois +conversation.messages.where('id < ?', current_message_id).reorder(created_at: :desc).limit(20) +``` + +**Como Validar:** + +- Monitorar logs em produção ou testar enviar mensagem para o bot. +- Verificar se a resposta não repete o input ou reseta o contexto. + +**Como Reverter:** +Voltar o arquivo `lib/integrations/captain/processor_service.rb` para o estado anterior.