Реальні запити до LLM у тестах - повільні, платні, недетерміновані й потребують ключа API в CI. AI SDK має вбудовані підробки, як Mail::fake() чи Http::fake().
Підробка агента:
use App\Ai\Agents\SupportAssistant;
use Laravel\Ai\Prompts\AgentPrompt;
SupportAssistant::fake(); // фіксована відповідь на будь-який промпт
SupportAssistant::fake(['Перша відповідь', 'Друга відповідь']); // по черзі
SupportAssistant::fake(fn (AgentPrompt $prompt) => str_contains($prompt->prompt, 'повернення')
? 'Повернення можливе протягом 14 днів.'
: 'Не можу допомогти з цим питанням.');
Структурований вивід - масиви як відповіді:
ReviewClassifier::fake([
['sentiment' => 'negative', 'topics' => ['delivery'], 'needs_reply' => true, 'score' => 2],
]);
Твердження:
SupportAssistant::assertPrompted(fn (AgentPrompt $prompt) => str_contains($prompt->prompt, '№1042'));
SupportAssistant::assertNotPrompted('...');
SupportAssistant::assertNeverPrompted();
// якщо агента запускали через ->queue()
ReviewClassifier::assertQueued(fn (AgentPrompt $prompt) => ...);
Інші можливості SDK мають свої підробки: Embeddings::fake(), Image::fake(), Audio::fake(), Transcription::fake(), Files::fake(), Stores::fake().
Що варто тестувати:
| Що | Як |
|---|---|
| що код реагує на відповідь моделі (зберігає, відповідає, ескалює) | fake з різними відповідями, зокрема з неочікуваними |
| що в промпт потрапляють потрібні дані й не потрапляють зайві (персональні дані) | assertPrompted з перевіркою тексту |
| інструменти агента | окремо, як звичайні класи: виклик handle з різними аргументами й користувачами |
| обробка збоїв провайдера | fake із замиканням, що кидає виняток |
Що підробки не перевіряють: якість відповідей самої моделі. Для цього потрібні оцінювальні набори (evals) - окремий набір запитів з очікуваними властивостями відповіді, який запускається проти реальної моделі вручну чи за розкладом, а не в кожному прогоні тестів.
Захист від випадкових реальних запитів: у phpunit.xml задати порожні чи фіктивні ключі провайдерів - тест, який забув підробку, впаде на автентифікації, а не витратить гроші.