Construir un streaming de chatbot de IA robusto: reconexión, respuestas parciales y mensajes de estado accesibles
Cómo los chatbots de sitios web manejan con fiabilidad respuestas transmitidas durante interrupciones de red, reintentos y lectores de pantalla, sin repetir ni dejar mensajes a medias.

El streaming hace que un chatbot de IA parezca más rápido porque las primeras palabras aparecen antes de que se haya calculado la respuesta completa. Sin embargo, técnicamente esto crea un proceso distribuido: el servidor, el proveedor del modelo, el proxy, el navegador y la interfaz de usuario mantienen el estado conjuntamente durante segundos o minutos. La red móvil cambia de cobertura, una pestaña pasa al fondo, un proxy cierra una conexión inactiva o un usuario vuelve a enviar por error. Sin un protocolo claro, los fragmentos de texto se duplican, las declaraciones incompletas se marcan como finalizadas o se desencadena dos veces la misma acción de una herramienta.
Por eso, un chatbot de sitio web robusto trata el streaming como una máquina de estados y no como una animación. Esta guía muestra cómo interactúan las ID de eventos, la reanudación, la finalización atómica y los avisos discretos para lectores de pantalla.
Un mensaje necesita una identidad permanente
Asigne una ID de solicitud en el cliente al enviar y una ID de mensaje inmutable en el servidor. Además, agregue un número de secuencia correlativo a cada sección del flujo. Si llega la misma solicitud tras un error de conexión, el servidor no debe iniciar una segunda ejecución independiente, sino devolver el estado existente o continuar de forma segura.
Las identidades cumplen funciones distintas: la ID de solicitud garantiza la idempotencia de la escritura, la ID de mensaje identifica el resultado y el número de secuencia ordena los fragmentos. Una marca de tiempo por sí sola no basta, ya que las solicitudes paralelas pueden colisionar o llegar con retraso.
Separar el transporte del estado de negocio
El ciclo de vida del proceso de negocio no cambia según se utilicen Server-Sent Events, Fetch streams o WebSockets. Modele al menos los estados aceptado, en ejecución, completado, cancelado y fallido. Solo un evento explícito de finalización hace que una respuesta sea vinculante. En cambio, el fin de una conexión TCP no significa automáticamente que se haya completado con éxito.
En el caso de los Server-Sent Events, el estándar HTML especifica las reconexiones y el envío de la última ID de evento. Este mecanismo es útil, pero no sustituye un historial en el servidor. El servidor debe saber qué fragmentos pertenecen a un mensaje y si una nueva consulta puede omitir secuencias ya emitidas.
Reconexión sin duplicar texto
Guarde un búfer de eventos limitado para cada mensaje en curso. Al reconectarse, el cliente envía la última secuencia confirmada. El servidor solo entrega eventos posteriores. Si el búfer ha caducado, no responde con fragmentos deducidos, sino con una instantánea del texto completo actual y una nueva secuencia base.
El cliente procesa los eventos de forma idempotente: se ignoran las secuencias menores o iguales al último valor aplicado. Las brechas mayores activan la recuperación de una instantánea. Así, la pantalla se mantiene correcta aunque un proxy repita datos o el navegador vuelva a estar en línea tras un breve periodo de desconexión.
Las respuestas parciales no deben activar acciones
El texto transmitido en tiempo real es provisional. Los enlaces pueden estar incompletos, una aclaración crucial puede aparecer recién en la siguiente frase y los argumentos estructurados de las herramientas son sintácticamente inválidos hasta el final. Renderice el texto progresivamente, pero active acciones de riesgo solo tras la finalización y previa validación independiente.
Esto aplica especialmente a pedidos, reservas de citas, modificaciones de datos de clientes o envío de correos electrónicos. La ejecución de una herramienta requiere su propia ID de acción idempotente, verificación de permisos y, si procede, una confirmación visible. Una reconexión nunca debe volver a ejecutar el mismo efecto.
Tratar la cancelación como un evento real del protocolo
Un botón de detención no debe limitarse a pausar la interfaz. El cliente envía una solicitud de cancelación con la ID del mensaje; el servidor marca el proceso y, si es posible, interrumpe el trabajo del modelo y de la herramienta. Los fragmentos que lleguen con posterioridad se descartan. En la interfaz queda claro que la respuesta fue cancelada.
Si la cancelación no llega al servidor, es posible que el proceso continúe allí. Por ello, el servidor también comprueba el estado periódicamente. Las métricas de costes y latencia deben contabilizar las ejecuciones canceladas por separado; de lo contrario, aparecerán como errores normales o desaparecerán del análisis.
Hacer que los errores sean comprensibles y repetibles
Diferencie al menos entre interrupción de red, tiempo de espera agotado, error del proveedor, bloqueo de seguridad y validación de negocio. El mensaje para el usuario no necesita revelar detalles técnicos internos, pero debe indicar el siguiente paso seguro. «Conexión interrumpida: se reanuda la respuesta» es distinto de «Esta acción no se ha ejecutado».
Un botón de reintento solo reutiliza la ID de solicitud original si se desea continuar la misma ejecución. Para una regeneración real, se crea una nueva ID y la interfaz no muestra ambas versiones como un único resultado.
No saturar a los lectores de pantalla con cada token
El contenido dinámico debe ser perceptible para las tecnologías de asistencia. WAI-ARIA define Live Regions con distintos niveles de urgencia. Sin embargo, una región actualizada token por token con aria-live puede generar cientos de interrupciones. Es preferible un indicador visual de streaming junto con un canal de estado separado y moderado.
Notifique, por ejemplo, «Generando respuesta», luego, en intervalos razonables, una frase o párrafo completado, y al final «Respuesta completa». Utilice aria-live="polite" para progresos normales; assertive se reserva exclusivamente para errores realmente urgentes. El foco debe permanecer en el campo de entrada o en la posición elegida por el usuario, sin saltar con cada fragmento.
Establezca aria-busy="true" en la zona de respuesta mientras el contenido esté incompleto, y quítelo en el momento de la finalización atómica. El botón de detención requiere una etiqueta clara y debe ser accesible por teclado. Compruebe también la adaptación a movimiento reducido, el zoom y las vistas en pantallas móviles pequeñas.
Probar la máquina de estados de forma sistemática
Una prueba del flujo ideal no es suficiente. Automatice al menos estos casos:
- Desconectar la red tras varios fragmentos y reanudar sin duplicar texto.
- Entregar el mismo evento dos veces y aplicarlo solo una.
- Omitir una secuencia y solicitar una instantánea.
- Pausar la pestaña, cambiar de red y mostrar el cierre correcto después.
- Cancelar durante la preparación de una herramienta sin ejecutar ningún efecto.
- Marcar como incompleta la respuesta parcial tras un tiempo de espera agotado.
- Verificar la frecuencia adecuada de las lecturas y el foco en lectores de pantalla.
Mida el tiempo hasta el primer fragmento visible, el tiempo hasta la finalización completa, la tasa de reconexión, las secuencias duplicadas o descartadas y el éxito de las cancelaciones. El tiempo hasta el primer token puede ser excelente, aunque muchas respuestas nunca se completen de manera fiable.
Un plan de implantación por fases
- Definir los estados de mensaje y de eventos en el servidor.
- Implementar ID idempotentes y secuencias antes de las animaciones en la interfaz.
- Añadir la reconexión con búfer y la instantánea de respaldo.
- Separar estrictamente las acciones de herramientas del texto provisional.
- Comprobar los avisos de estado con teclado y lector de pantalla.
- Probar situaciones de error bajo conexiones limitadas e inestables.
- Solo entonces, activar progresivamente el streaming en producción.
Conclusión: Rápido a la vista, inequívocamente completado
Un buen streaming combina la velocidad percibida con un modelo de estado preciso. Las ID permanentes, los eventos ordenados, la finalización atómica y la reconexión segura evitan respuestas duplicadas o incompletas. Una Live Region moderada hace accesible el proceso sin interrumpir constantemente a los usuarios de lectores de pantalla.
A continuación, pruebe un chat real con una red móvil inestable. Si tras una cancelación y reconexión no queda del todo claro qué mensaje está completo y qué acción se ha ejecutado realmente, es el protocolo lo que necesita corregirse primero, no la animación de carga.
Fuentes
Convierta las visitas en mejores conversaciones
Reduzca la carga de soporte manteniendo respuestas coherentes
Ofrezca soporte instantáneo en el sitio, derive casos complejos a su equipo y mantenga cada respuesta alineada con su base de conocimiento aprobada.
Artículos relacionados
Seguir leyendo

Cómo optimizar los tiempos de respuesta de un chatbot de IA: presupuesto de latencia, streaming y timeouts
Las respuestas rápidas de un chatbot se construyen a lo largo de toda la cadena técnica. Aprenda a planificar presupuestos de latencia, streaming, timeouts, reintentos y fallbacks seguros.

Chatbot de IA accesible: Lista de verificación WCAG para sitios web
Un chatbot de IA solo es útil si todos pueden utilizarlo. Esta lista de verificación orientada a las WCAG muestra en qué deben fijarse los equipos web en cuanto al widget, el diálogo, el teclado, el uso móvil y la transferencia al soporte.

Asegurar las llamadas a herramientas en chatbots de IA: permisos, confirmación y mecanismos de reversión
Las llamadas a herramientas hacen que un chatbot para sitios web sea capaz de actuar, pero también más riesgoso. Esta guía práctica muestra cómo interactúan el principio de menor privilegio, la verificación en el servidor, las confirmaciones concretas, la idempotencia y las rutas de reversión.