Потокова відповідь LLM: прогрес, скасування та чесні помилки
Показуйте отримані частини, але окремо перевіряйте завершення й зберігання.

Що бачить користувач
Після натискання кнопки порожнє вікно не пояснює, чи запит прийнято. Потік дозволяє показати текст раніше за повну відповідь, але не гарантує малої затримки. Запуск моделі, мережа та буферизація можуть затримати перші дані. Вимірюйте час до першого корисного тексту окремо від повного завершення. Мережевий фрагмент не обов’язково дорівнює токену або події протоколу.

Серверна межа
У схемі з постійним ключем API браузер звертається до вашого сервера, а сервер до провайдера. Секрет не потрапляє до клієнтського коду. Сервер перевіряє користувача й обмеження та передає потік без накопичення всієї відповіді. ReadableStream із getReader читає частини fetch; TextDecoder має зберігати правильність UTF-8 на межах. Для SSE потрібно збирати повні події, а не вважати кожен read готовим повідомленням.
Скасування і неповний результат
AbortController може скасувати fetch. Розрізняйте скасування, звичайне завершення та втрату мережі. Передайте сигнал далі через сервер, якщо це підтримується, і перевірте поведінку провайдера. Закриття браузерного з’єднання саме по собі не доводить зупинку обчислень чи оплати. Єдиний JSON-документ розбирайте після успішного завершення протоколу, потім перевіряйте схему. Обірваний потік не є завершеним документом.
Приватність і перевірка
Не зберігайте конфіденційний частковий текст автоматично. Визначте доступ, строк і межі сесії. Попросіть агента показати diff та обробку помилок. На синтетичних даних уповільніть мережу, розірвіть її посеред відповіді, натисніть Stop і розділіть багатобайтовий символ між частинами. Перевірте подвійне натискання, повернення до вкладки та роботу upstream після скасування. Це план безпечного випробування, а не звіт про перевірений продукт.
Джерела
- https://wurk.fun/blog/stream-llm-responses-so-your-app-doesn-t-look-frozen
- https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events
- https://developer.mozilla.org/en-US/docs/Web/API/Streams_API/Using_readable_streams
- https://developer.mozilla.org/en-US/docs/Web/API/AbortController
- https://wurk.fun/blog/get-json-you-can-trust-from-an-llm-schema-validate-retry