AI / LLM
Streaming: собери устойчивый streaming-эндпоинт и клиент
Читать про TTFT, частичный JSON и буферизующие прокси — не то же самое, что выкатить stream, переживающий медленного клиента, кнопку Stop, обрыв соединения и дефолтный nginx. Собери эндпоинт и клиент целиком, измерь латентность, которая важна, и докажи, что он держит каждый отказ.
Преврати ментальную модель юнита в работающую систему: проксируй SSE-stream провайдера через свой эндпоинт, корректно накапливай delta (текст и аргументы tool), измеряй TTFT и TPOT, чисто отменяй вплоть до upstream, восстанавливайся после ошибок и проверь, что реальный прокси не убивает stream буферизацией.
Собрать 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 — сброс «всё разом» после долгой паузы; плюс абзац-заметка с точным конфигом, который вызвал и вылечил проблему.
- Добавь обработку 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. Собери это раз на игрушечном чате — и прод-версия станет мышечной памятью.