diff --git a/app/app/Services/Autopodbor/Agent/ChannelB/ChannelBSearch.php b/app/app/Services/Autopodbor/Agent/ChannelB/ChannelBSearch.php index 3014c863..32c5ce8d 100644 --- a/app/app/Services/Autopodbor/Agent/ChannelB/ChannelBSearch.php +++ b/app/app/Services/Autopodbor/Agent/ChannelB/ChannelBSearch.php @@ -44,7 +44,11 @@ TXT; if ($name === '') { continue; } - $seen[$this->key($name)] = true; + $k = $this->key($name); + if (isset($seen[$k])) { + continue; // чистим стоп-лист от дублей-филиалов: «Корунд» ×27 → один + } + $seen[$k] = true; $stop[] = $name; } diff --git a/app/tests/Unit/Autopodbor/ChannelB/ChannelBSearchTest.php b/app/tests/Unit/Autopodbor/ChannelB/ChannelBSearchTest.php index 676e1647..f52e5929 100644 --- a/app/tests/Unit/Autopodbor/ChannelB/ChannelBSearchTest.php +++ b/app/tests/Unit/Autopodbor/ChannelB/ChannelBSearchTest.php @@ -78,6 +78,25 @@ it('пустой ответ прохода не падает и не добав expect($out)->toHaveCount(1)->and($out[0]['name'])->toBe('Cashmotor'); }); +it('чистый стоп-лист для ИИ: дубли-филиалы схлопнуты — каждое имя один раз', function () { + // Канал А отдал филиалы: «Корунд» ×3 (в т.ч. другой регистр), «КрасЛомбард» ×2. + // В промпт ИИ должно уйти по одному — иначе «- Корунд» повторится 27 раз (реальный случай). + $fake = new FakeResearcher(['[]']); + $search = new ChannelBSearch($fake, new ResearcherParser); + + $search->harvest( + profile: 'займы под залог авто', + region: 'Красноярский край', + clientSite: 'lkomega.ru', + known: ['Корунд', 'Корунд', 'корунд', 'КрасЛомбард', 'КрасЛомбард'], + passes: 1, + ); + + $prompt = $fake->userPrompts[0]; + expect(substr_count($prompt, '- Корунд'))->toBe(1) + ->and(substr_count($prompt, '- КрасЛомбард'))->toBe(1); +}); + it('системный промт просит ТОЛЬКО названия (§11.3)', function () { expect(ChannelBSearch::SYSTEM_PROMPT)->toContain('только НАЗВАНИЯ') ->and(ChannelBSearch::SYSTEM_PROMPT)->toContain('строго JSON');