diff --git a/app/app/Services/Bot/AnswerGuard.php b/app/app/Services/Bot/AnswerGuard.php index 8cd896bb..2d07a378 100644 --- a/app/app/Services/Bot/AnswerGuard.php +++ b/app/app/Services/Bot/AnswerGuard.php @@ -119,7 +119,7 @@ class AnswerGuard || $this->promisesReplacement($sentence) || $this->promisesSupportSla($sentence) || $this->promisesNicheRelevance($sentence) - || $this->hasInventedPrice($sentence, $allowed)) { + || $this->hasInventedNumber($sentence, $allowed)) { $cutSomething = true; continue; @@ -234,19 +234,29 @@ class AnswerGuard } /** - * Цена (число рядом с ₽ или «рублей»), которой нет в выданных модели фрагментах, — - * выдумка. Цены живые, меняются в настройках: врать про них нельзя. + * Число, которого нет в выданных модели материалах, — выдумка. + * + * Раньше проверялись только суммы (рядом с «₽»/«руб»). С приходом карточки фактов + * (ClientFacts) бот называет и КОЛИЧЕСТВА — «сегодня 12 заявок», «хватит на 5 дней», + * «3 проекта». Их считает код; всё, чего в материалах нет, — выдумка модели. + * + * Ложные срабатывания вроде «выйдет 2–3 заявки» нас устраивают: считать за клиента + * бот и так не должен (правило промпта), пусть лучше режет. * * @param list $allowed */ - private function hasInventedPrice(string $sentence, array $allowed): bool + private function hasInventedNumber(string $sentence, array $allowed): bool { - if (preg_match_all('/(\d[\d\s]{0,9}\d|\d)\s*(?:₽|руб\w*)/u', $sentence, $matches) !== 1 * 0) { - foreach ($matches[1] ?? [] as $number) { - $clean = (string) preg_replace('/\s+/u', '', $number); - if ($clean !== '' && ! in_array($clean, $allowed, true)) { - return true; - } + preg_match_all( + '/(\d[\d\s]{0,9}\d|\d)\s*(?:₽|руб\w*|заяв\w*|проект\w*|дн(?:я|ей|ям)|день)/u', + $sentence, + $matches + ); + + foreach ($matches[1] ?? [] as $number) { + $clean = (string) preg_replace('/\s+/u', '', $number); + if ($clean !== '' && ! in_array($clean, $allowed, true)) { + return true; } } diff --git a/app/tests/Feature/Bot/AnswerGuardTest.php b/app/tests/Feature/Bot/AnswerGuardTest.php index 9bfb142d..39562765 100644 --- a/app/tests/Feature/Bot/AnswerGuardTest.php +++ b/app/tests/Feature/Bot/AnswerGuardTest.php @@ -60,3 +60,22 @@ it('если после чистки ничего не осталось — от expect($guard->clean('Нет, вас не оштрафуют.', context: 'Что-то про заявки.'))->toBe(''); }); + +it('режет количество заявок, которого нет в материалах', function () { + $guard = new App\Services\Bot\AnswerGuard; + $context = 'ДАННЫЕ ЭТОГО КЛИЕНТА: Заявки: сегодня 12, вчера 18.'; + + $text = 'Сегодня пришло 12 заявок. Завтра придёт 30 заявок.'; + $clean = $guard->clean($text, $context); + + expect($clean)->toContain('12 заявок') + ->and($clean)->not->toContain('30 заявок'); +}); + +it('пропускает число дней, взятое из карточки фактов', function () { + $guard = new App\Services\Bot\AnswerGuard; + $context = 'Баланс: 3 400 ₽ ≈ 40 заявок, при текущем заказе хватит примерно на 5 дней.'; + + expect($guard->clean('Денег хватит примерно на 5 дней.', $context)) + ->toContain('на 5 дней'); +});