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.
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.
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.
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.
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 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