awesome-everything EN
↑ Обратно к восхождению

AI / LLM

Streaming: собери устойчивый streaming-эндпоинт и клиент

Суть Практический проект — собрать устойчивый streaming-эндпоинт и клиент целиком: SSE-реле, измерение TTFT/TPOT, отмена посреди потока, восстановление после ошибок и проверка на буферизующем прокси.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 240 min

Читать про TTFT, частичный JSON и буферизующие прокси — не то же самое, что выкатить stream, переживающий медленного клиента, кнопку Stop, обрыв соединения и дефолтный nginx. Собери эндпоинт и клиент целиком, измерь латентность, которая важна, и докажи, что он держит каждый отказ.

Цель

Преврати ментальную модель юнита в работающую систему: проксируй SSE-stream провайдера через свой эндпоинт, корректно накапливай delta (текст и аргументы tool), измеряй TTFT и TPOT, чисто отменяй вплоть до upstream, восстанавливайся после ошибок и проверь, что реальный прокси не убивает stream буферизацией.

Проект
0 из 7
Цель

Собрать streaming-эндпоинт чата (сервер) и клиент, который проксирует SSE-stream LLM-провайдера, измеряет TTFT/TPOT, поддерживает отмену посреди потока с прокидкой до upstream, восстанавливается после ошибок и обрывов и проверен на инкрементальную доставку через реальный reverse proxy — а не только на localhost.

Требования
Критерии приёмки
  • Демо, показывающее инкрементальный рендер токенов сквозь прокси, с измеренным TTFT в сотнях мс (не равным общему времени) и цифрой TPOT — снятые числа, а не оценки.
  • Tool-вызов, чьи аргументы приходят фрагментами и парсятся ровно один раз на content_block_stop; покажи лог-строку, доказывающую, что промежуточный JSON.parse не делался, а финальный объект аргументов полон.
  • Клик по Stop видимо останавливает токены И серверный лог / дашборд провайдера подтверждает, что upstream-генерация оборвалась (счётчик токенов перестаёт расти) — а не просто зависший UI.
  • Снимок before/after буферизующего прокси: с фиксом — инкрементальная доставка; с proxy_buffering on — сброс «всё разом» после долгой паузы; плюс абзац-заметка с точным конфигом, который вызвал и вылечил проблему.
Senior-стретч
  • Добавь обработку backpressure на сервере: при false от res.write() приостанавливай upstream-stream и возобновляй на 'drain', и докажи, что память остаётся ограниченной против искусственно медленного клиента (throttled-потребитель).
  • Добавь heartbeat/keepalive-кадр (': ping') по интервалу, чтобы прокси и балансировщики с idle-timeout не убивали медленный-к-первому-токену reasoning-запрос.
  • Добавь путь для reasoning-модели: стримь summaries рассуждений (или состояние прогресса), чтобы TTFT 10–60с никогда не показывал голый зависший спиннер, и измерь разницу в воспринимаемой латентности.
  • Добавь страницу on-call-runbook: триаж «работает на localhost, валит в проде», чеклист буферизации прокси/CDN/serverless, диагностику пустых аргументов tool (потерянные input_json_delta) и контракт отмены/идемпотентности.
Итог

Это цикл, который ты будешь гонять на каждой реальной streaming-фиче: корректно реле SSE (правильные заголовки, парсинг с буферизацией-и-делением, накопление delta, аргументы tool парсятся только на content_block_stop), измеряй латентность, которая реально важна (TTFT и TPOT, а не общее время), отменяй вплоть до upstream, чтобы кнопка Stop останавливала биллинг, восстанавливайся после обрывов безопасным retry всего хода и проверяй на реальном прокси, потому что прод-отказ №1 — буферизация, превращающая TTFT обратно в общее время, — никогда не вылезает на localhost. Собери это раз на игрушечном чате — и прод-версия станет мышечной памятью.

Продолжить восхождение ↑Бюджеты на LLM: асимметрия токенов, роутинг и kill switch
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources2
expand
  1. 01
  2. 02

Trademarks belong to their respective owners. Editorial reference only.