Урок 05

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() для SSE
  • usingVercelDataProtocol() для Vercel AI SDK
  • broadcastOnQueue() для каналов
  • then() для коллбэка
  • Queue для фоновых