feat(bot): личный вопрос вошедшего отвечается по карточке, гостю — вход в кабинет

This commit is contained in:
Дмитрий
2026-07-13 11:48:39 +03:00
parent 8da2e8c219
commit d5ad30b3dc
5 changed files with 121 additions and 24 deletions
+12 -11
View File
@@ -22,24 +22,25 @@ beforeEach(function () {
]);
});
it('стоп-тема (мой баланс) → эскалация без похода в LLM', function () {
it('личный вопрос (мой баланс) без карточки фактов → приглашение в кабинет, без похода в LLM', function () {
// Правило изменено 13.07.2026: личный вопрос теперь НЕ уходит к живому специалисту —
// это дорого и медленно. Вошедшему клиенту отвечает карточка фактов (см.
// PersonalAnswersTest); а здесь answer() зовётся по-старому, без карточки — то есть
// как гость с лендинга: специалиста звать незачем, зовём в кабинет.
Http::fake();
$answer = app(BotAnswerService::class)->answer('какой у меня баланс?');
// Текст именно стоп-эскалации («лучше разберёт живой специалист»), а не «в инструкции
// нет ответа»: до фикса 12.07.2026 вопрос проскакивал стоп-гейт и эскалировал лишь
// пустым поиском. Эскалация просит телефон (правило владельца), а не зовёт оператора.
expect($answer->escalate)->toBeTrue()
->and($answer->text)->toContain('лучше разберёт живой специалист')
->and($answer->text)->toContain('номер телефона');
expect($answer->escalate)->toBeFalse()
->and($answer->text)->toBe(BotAnswerService::LOGIN_TEXT);
Http::assertNothingSent();
});
it('стоп-тема со словами между «у меня» и «баланс» → эскалация ДО поиска и LLM', function () {
it('личный вопрос со словами между «у меня» и «баланс» без карточки → тоже приглашение в кабинет, ДО поиска и LLM', function () {
// Живой баг 12.07.2026: «какой у меня сейчас баланс?» проскакивал мимо стоп-темы,
// поиск находил статью про пополнение и бот отвечал общими словами вместо передачи
// человеку. Статья про баланс в базе ЕСТЬ — эскалация обязана сработать раньше поиска.
// человеку. Правило 13.07.2026 сменило адресата: без карточки фактов — не специалист,
// а кабинет (см. комментарий к тесту выше). Приглашение обязано сработать раньше поиска.
KnowledgeChunk::create([
'source_path' => 'help/b.md', 'title' => 'Как пополнить баланс', 'tour' => 'top-up-balance',
'topics' => 'пополнить, баланс', 'chunk_index' => 0,
@@ -49,8 +50,8 @@ it('стоп-тема со словами между «у меня» и «бал
$answer = app(BotAnswerService::class)->answer('какой у меня сейчас баланс?');
expect($answer->escalate)->toBeTrue()
->and($answer->text)->toContain('лучше разберёт живой специалист');
expect($answer->escalate)->toBeFalse()
->and($answer->text)->toBe(BotAnswerService::LOGIN_TEXT);
Http::assertNothingSent();
});