Streaming en LangChain: implementación completa con FastAPI y SSE

By Carlos Montiel | Especialista en IA Empresarial
Publicado: 2026-07-28 | Por: Carlos Montiel | Lectura: ~4 minutos

El ejemplo de streaming que aparece en la mayoría de tutoriales funciona en una terminal. Ponerlo en producción detrás de un endpoint real requiere unas piezas más.

El patrón base: astream() dentro de un endpoint async

Integrar LangChain con FastAPI implica definir endpoints async que llaman a `chain.ainvoke()` para respuestas completas o `chain.astream()` para streaming de tokens. Podés crear un endpoint que transmita eventos usando Server-Sent Events (SSE) sobre un pipeline de RAG — el patrón típico usa un endpoint de FastAPI con `StreamingResponse`, iterando de forma asíncrona a través de `chain.astream()` y emitiendo datos en formato SSE.

Código de referencia

from fastapi import FastAPI from fastapi.responses import StreamingResponse import json app = FastAPI() @app.get("/chat/stream") async def chat_stream(mensaje: str): async def event_generator(): async for chunk in cadena.astream({"texto": mensaje}): yield f"data: {json.dumps({'content': chunk})}\n\n" yield f"data: {json.dumps({'type': 'done'})}\n\n" return StreamingResponse(event_generator(), media_type="text/event-stream")

astream_events para control fino de qué se transmite

El método `astream_log` de LangChain usa JSON Patch para transmitir eventos, dando una forma eficiente de actualizar partes de un documento JSON de forma incremental. Los callbacks interceptan eventos de ciclo de vida a través de todos los componentes de LangChain, permitiendo control granular sobre el comportamiento de streaming — con `astream_events` podés transmitir agentes token por token y conectarlo a SSE de FastAPI para una experiencia sin spinners de carga.

Las 4 piezas de un setup listo para producción

Una configuración lista para producción necesita: un endpoint async de FastAPI que llame a `chain.ainvoke()` o `chain.astream()`; manejo de errores estructurado que capture `openai.RateLimitError` y `LangChainException` por separado (no un catch-all genérico); middleware de CORS con orígenes permitidos explícitos; y un gestor de procesos Gunicorn corriendo 4 o más workers de Uvicorn.

El error más común: mezclar sync y async

Usá `chain.ainvoke()` para respuestas únicas y `chain.astream()` para streaming de tokens — nunca llames métodos síncronos dentro de handlers async. Este es el bug de producción más común en integraciones LangChain + FastAPI: un método síncrono bloqueante dentro de un handler async bloquea todo el event loop, degradando la latencia de todas las demás solicitudes concurrentes, no solo la que lo llamó.

Carlos Montiel
Arquitecto de Soluciones IA Empresarial
Especialista en LLMs, Agentes y Orquestación
guatemalia.com/#contacto · info@guatemalia.com

¿Necesitas implementar IA en tu empresa?

Carlos Montiel es arquitecto de soluciones IA empresarial. Implementa LLMs, Agentes, RAG y orquestadores en empresas de Guatemala y Latinoamérica. Contáctalo para una consultoría.

Contactar a Carlos Montiel

info@guatemalia.com