Streaming: ответ в реальном времени
Вместо ожидания полного ответа — потоковая передача.
Проблема
Route::post('/coach', function (Request $request) {
$response = (new SalesCoach)->prompt('Анализ...');
return response()->json(['reply' => (string) $response]);
});
Пользователь ждёт 10+ секунд, глядя на спиннер.
Решение: stream()
Route::get('/coach', function () {
return (new SalesCoach)->stream('Проанализируй транскрипт...');
});
Возвращает SSE (Server-Sent Events). Ответ приходит по мере генерации.
Коллбэк после завершения
use Laravel\Ai\Responses\StreamedAgentResponse;
return (new SalesCoach)
->stream('Анализ...')
->then(function (StreamedAgentResponse $response) {
// $response->text, $response->events, $response->usage
});
Vercel AI SDK Protocol
Для Next.js/React фронтенда:
return (new SalesCoach)
->stream('Анализ...')
->usingVercelDataProtocol();
Ручная итерация
$stream = (new SalesCoach)->stream('Анализ...');
foreach ($stream as $event) {
// обработка каждого чанка
}
Broadcasting
Поток в канал:
use Illuminate\Broadcasting\Channel;
$stream = (new SalesCoach)->stream('Анализ...');
foreach ($stream as $event) {
$event->broadcast(new Channel('channel-name'));
}
Или автоматически:
(new SalesCoach)->broadcastOnQueue(
'Анализ...',
new Channel('channel-name'),
);
Queue + Streaming
Тяжёлый запрос в фон, стриминг — при готовности:
(new SalesCoach)->queue($transcript)
->then(function ($response) {
// уведомить пользователя
});
Когда использовать
- Streaming — для UI в реальном времени
- Queue — для фоновых задач
- Broadcast — для чатов, live-updates
- Vercel Protocol — для Next.js/React
Итоги
stream()для SSEusingVercelDataProtocol()для Vercel AI SDKbroadcastOnQueue()для каналовthen()для коллбэка- Queue для фоновых