From 6a5ba17bfccb52115d3ee507b64f97b32dde270e Mon Sep 17 00:00:00 2001 From: Rodribm10 Date: Sat, 18 Apr 2026 18:37:17 -0300 Subject: [PATCH] fix(captain): aceita DD/MM sem ano e amplia tratamento de requires_input no generate_pix Problema observado: Daniela chamou generate_pix com arguments vazios apos cliente informar "27/4". Tool retornou missing_fields=[check_in, amount] e LLM caiu no fallback silenciosamente. Correcoes: - DDMMYYYY_REGEX agora aceita "DD/MM" sem ano (assume ano corrente, empurra pro proximo ano se a data ja passou) - parse_date_without_year com fallback explicito - Instruction da scenario Daniela_Reservas (DB, scenario_id=2) atualizada para listar todos os 4 parametros obrigatorios de generate_pix e distinguir requires_input (erro do LLM) de success=false (erro tecnico) Backup da instruction anterior: /tmp/daniela_instruction_backup_20260418.txt Co-Authored-By: Claude Opus 4.7 (1M context) --- .../services/captain/tools/generate_pix_tool.rb | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/enterprise/app/services/captain/tools/generate_pix_tool.rb b/enterprise/app/services/captain/tools/generate_pix_tool.rb index 2912538b8..d8250f583 100644 --- a/enterprise/app/services/captain/tools/generate_pix_tool.rb +++ b/enterprise/app/services/captain/tools/generate_pix_tool.rb @@ -4,7 +4,7 @@ class Captain::Tools::GeneratePixTool < Captain::Tools::BaseTool NAME_WITH_LABEL_REGEX = /nome\s*[:\-]\s*([^\n\r,;]+)/i EMAIL_REGEX = /\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/ SUITE_REGEX = /su[ií]te\s+([^\n\r,.!?]+)/i - DDMMYYYY_REGEX = %r{\b(\d{1,2}/\d{1,2}/\d{2,4})\b} + DDMMYYYY_REGEX = %r{\b(\d{1,2}/\d{1,2}(?:/\d{2,4})?)\b} CURRENCY_REGEX = /r\$\s*([\d.,]+)/i TOTAL_AMOUNT_REGEX = /valor\s+total[^\n\r]{0,80}/i DEPOSIT_AMOUNT_REGEX = /(sinal|entrada)[^\n\r]{0,80}/i @@ -611,11 +611,24 @@ class Captain::Tools::GeneratePixTool < Captain::Tools::BaseTool begin Date.iso8601(string_value) rescue ArgumentError - nil + parse_date_without_year(string_value) end end end + # DD/MM sem ano — assume ano corrente; se a data já passou, empurra para o próximo ano + def parse_date_without_year(string_value) + match = string_value.match(%r{\A(\d{1,2})/(\d{1,2})\z}) + return nil unless match + + day = match[1].to_i + month = match[2].to_i + candidate = Date.new(account_current_date.year, month, day) + candidate < account_current_date ? candidate.next_year : candidate + rescue ArgumentError + nil + end + def normalize_check_in_datetime(value) return if value.blank?