feat(jivo-bot): память разговора + статья про ручное добавление конкурентов
Живой урок владельца 12.07.2026 («а сам руками я могу?» — бот талдычил про ИИ за 300₽): - ProcessJivoMessageJob: последние 6 реплик чата → история для LLM (хвосты «👉 Показать…» срезаются), только СВОЙ чат - BotAnswerService/YandexGptClient: история между system и текущим вопросом; пустой поиск досыпается прошлой репликой клиента - статья konkurentnoe-pole: ручное добавление конкурента/точек/источников — бесплатно, кнопка «+ Добавить вручную» (фича существует, бот о ней не знал) - TDD: 3 новых теста, все 37 зелёные Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -52,6 +52,36 @@ it('стоп-тема со словами между «у меня» и «бал
|
||||
Http::assertNothingSent();
|
||||
});
|
||||
|
||||
it('вопрос-продолжение: история разговора спасает пустой поиск и уходит в LLM', function () {
|
||||
// «а можно самому, руками?» сам по себе не находит ничего — с прошлой репликой
|
||||
// клиента поиск должен найти статью, а LLM получить переписку целиком.
|
||||
KnowledgeChunk::create([
|
||||
'source_path' => 'help/k.md', 'title' => 'Конкурентное поле', 'tour' => null,
|
||||
'topics' => 'конкурентное поле, добавить вручную', 'chunk_index' => 0,
|
||||
'content' => 'Конкурентное поле: конкурентов можно добавить вручную бесплатно.',
|
||||
]);
|
||||
Http::fake([
|
||||
'llm.api.cloud.yandex.net/*' => Http::response([
|
||||
'result' => ['alternatives' => [['message' => ['role' => 'assistant', 'text' => 'Да, можно вручную.']]]],
|
||||
]),
|
||||
]);
|
||||
|
||||
$history = [
|
||||
['role' => 'user', 'text' => 'что за конкурентное поле?'],
|
||||
['role' => 'assistant', 'text' => 'Конкурентное поле — раздел, где ИИ находит конкурентов.'],
|
||||
];
|
||||
$answer = app(BotAnswerService::class)->answer('а можно самому, руками?', $history);
|
||||
|
||||
expect($answer->escalate)->toBeFalse()
|
||||
->and($answer->text)->toContain('Да, можно вручную');
|
||||
Http::assertSent(function ($request) {
|
||||
$texts = array_column($request['messages'], 'text');
|
||||
|
||||
return in_array('что за конкурентное поле?', $texts, true)
|
||||
&& end($texts) === 'а можно самому, руками?';
|
||||
});
|
||||
});
|
||||
|
||||
it('просьба позвать человека → эскалация', function () {
|
||||
Http::fake();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user