Inicio / Artículos / Transmisión de LLM resumible con Redis Streams como punto de encuentro por turno

Transmisión de LLM resumible con Redis Streams como punto de encuentro por turno

Supera las interrupciones de conexión y las pausas de varios minutos en las herramientas al publicar eventos del agente en un flujo Redis con ámbito de turno que los clientes pueden reanudar.

2049 palabras

Lo que queríamos

Las respuestas del agente pueden tardar decenas de segundos: razonamiento, carga de habilidades, llamadas a herramientas, espera y transmisión de tokens. Las demostraciones mantienen una conexión abierta. En el entorno de producción, la transmisión se interrumpe a mitad de respuesta, se vuelven a desplegar las pasarelas y hay pausas mientras las herramientas devuelven respuesta minutos después. El objetivo es lograr una transmisión en tiempo real reanudable para que el cliente pueda reconectarse y continuar la misma interacción.

El camino recorrido

Iteración 1: el cliente habla directamente con el agente

Simple, pero frágil. Cualquier problema de red interrumpe la transmisión. La escalabilidad horizontal implica sesiones persistentes o pérdida de eventos.

Iteración 2: transmisión gRPC entre servicios

Contratos internos mejorados, pero aún problemático para clientes basados en navegador y débil ante pausas de varios minutos durante el reinicio de los pods.

¿Por qué no Kafka?

Excelente para registros duraderos; es más pesado de lo necesario para un encuentro por turno con una retención corta y grupos de consumidores que no se adaptan bien a “una pestaña del navegador”.

Iteración 3 (lo que funcionó): un encuentro nombrado por turno

// Agent output
{
  "type": "tool_result",
  "tool": "product_search",
  "data": {
    "items": [...]
  }
}

// Gateway -> TV
{
  "type": "product_carousel",
  "items": [...]
}

// Gateway -> Mobile
{
  "type": "product_list",
  "items": [...]
}
cursor = last_event_id or "0-0"

while True:
    entries = xread({key: cursor}, block=30_000)

    if not entries:          # the only timeout check point
        check_timeouts()
        continue

    for entry_id, event in entries:
        # writes to the socket; not an ack that the client received it
        sse.send(id=entry_id, data=event.payload)
        cursor = entry_id
        if event.type in TERMINAL:
            return
id: 1755600000123-0
data: {"type":"tool_selected","tool":"search"}

id: 1755600000871-0
data: {"type":"response_block","block":{...}}
GET /sessions/{sid}/turns/{tid}/stream
Last-Event-ID: 1755600000871-0
# turn starts: one atomic step (MULTI/EXEC, or a Lua script)
xadd(key, first_event)
expire(key, GENEROUS_TTL)

# producer finishes: bring it in
expire(key, RECONNECT_TTL)

Cada turno del usuario cuenta con un Redis Stream (o patrón stream+grupo de consumidores) indexado por turn_id. El agente publica eventos de token/herramienta; la pasarela sigue desde el último id del cliente. La reconexión continúa a partir de ese cursor. Los pods pueden fallar; el stream conserva suficiente historial para ese turno.

Detalles importantes

  • Disciplina del cursor — los clientes confirman el último ID de stream visto; nunca reinician desde 0 después de la primera conexión.
  • Eventos de latido cardíaco — impiden que los intermediarios cierren conexiones inactivas mientras la herramienta espera.
  • Ciclo de vida de turnos — indicadores explícitos turn_started / turn_paused / turn_completed / turn_failed.
  • TTL — vencimiento de los flujos una vez finalizado el turno para que Redis no se convierta en un archivo infinito.
  • Autenticación — turn_id no es un mecanismo de autorización; los turnos deben estar vinculados a la sesión autenticada.
  • El caso que lo resolvió: una pausa de varios minutos

    Una herramienta asignó el trabajo a otro pipeline que respondió minutos después. La transmisión directa por HTTP dejó de funcionar. Con Redis Streams, el agente publicó un evento de pausa, el cliente indicó que “todavía estaba trabajando”, y posteriormente los tokens se reanudaron al reconectarse sin tener que ejecutar todo el proceso de nuevo.

    Qué enviamos al cliente

    Eventos tipificados: tokens, resúmenes de tool_start y tool_result (nunca información confidencial), errores y finalización. Mantenga los datos a transmitir de tamaño reducido; guarde los archivos voluminosos en almacenamiento de objetos y envíe referencias a ellos.

    Costos, límites y aspectos a tener en cuenta

    Preste atención a la memoria de Redis, a la longitud máxima del flujo y al número de conexiones si muchos gateways se conectan en una sola operación. Establezca un límite para las operaciones simultáneas por usuario. Realice pruebas de carga para detectar problemas de reconexión tras la implementación de un gateway.

    El estado final

    El gateway funciona como un lector consciente del estado de las tareas; el agente actúa como escritor; Redis Streams sirve como punto de encuentro. La experiencia de usuario en tiempo real sobrevive a los fallos monótonos que arruinan las arquitecturas de demostración.

    Consejo operativo: guarde el último ID de transmisión en la cookie de sesión o en la memoria del cliente, y también en el lado del servidor para permitir su reproducción por parte del soporte técnico. Cuando un usuario diga que “se congeló”, el soporte debe reconstruir la interacción a partir de la transmisión sin pedirle que espere diez minutos mientras el herramienta se carga. Agregue paneles de control para mostrar la tasa de reanudación, las interacciones abandonadas y la duración promedio de las pausas, de modo que el equipo pueda determinar si los agentes son lentos o las redes son inestables.

    Consejo operativo: guarde el último ID de transmisión en la cookie de sesión o en la memoria del cliente, y también en el lado del servidor para permitir su reproducción por parte del soporte técnico. Cuando un usuario diga que “se congeló”, el soporte debe reconstruir la interacción a partir de la transmisión sin pedirle que espere diez minutos mientras el herramienta se carga. Agregue paneles de control para mostrar la tasa de reanudación, las interacciones abandonadas y la duración promedio de las pausas, de modo que el equipo pueda determinar si los agentes son lentos o las redes son inestables.

    Consejo operativo: guarde el último ID de transmisión en la cookie de sesión o en la memoria del cliente, y también en el lado del servidor para permitir su reproducción por parte del soporte técnico. Cuando un usuario diga que “se congeló”, el soporte debe reconstruir la interacción a partir de la transmisión sin pedirle que espere diez minutos mientras el herramienta se carga. Agregue paneles de control para mostrar la tasa de reanudación, las interacciones abandonadas y la duración promedio de las pausas, de modo que el equipo pueda determinar si los agentes son lentos o las redes son inestables.

    Consejo operativo: guarde el último ID de transmisión en la cookie de sesión o en la memoria del cliente, y también en el lado del servidor para permitir su reproducción por parte del soporte técnico. Cuando un usuario diga que “se congeló”, el soporte debe reconstruir la interacción a partir de la transmisión sin pedirle que espere diez minutos mientras el herramienta se carga. Agregue paneles de control para mostrar la tasa de reanudación, las interacciones abandonadas y la duración promedio de las pausas, de modo que el equipo pueda determinar si los agentes son lentos o las redes son inestables.

    Consejo operativo: guarde el último ID de transmisión en la cookie de sesión o en la memoria del cliente, y también en el lado del servidor para permitir su reproducción por parte del soporte técnico. Cuando un usuario diga que “se congeló”, el soporte debe reconstruir la interacción a partir de la transmisión sin pedirle que espere diez minutos mientras el herramienta se carga. Agregue paneles de control para mostrar la tasa de reanudación, las interacciones abandonadas y la duración promedio de las pausas, de modo que el equipo de producto pueda determinar si los agentes son lentos o las redes son inestables.

    Consejo operativo: guarde el último ID de transmisión en la cookie de sesión o en la memoria del cliente, y también en el lado del servidor para permitir su reproducción por parte del soporte técnico. Cuando un usuario diga que “se congeló”, el soporte debe reconstruir la interacción a partir de la transmisión sin pedirle que espere diez minutos mientras el herramienta se carga. Agregue paneles de control para mostrar la tasa de reanudación, las interacciones abandonadas y la duración promedio de las pausas, de modo que el equipo de producto pueda determinar si los agentes son lentos o las redes son inestables.

    Consejo operativo: guarde el último ID de transmisión en la cookie de sesión o en la memoria del cliente, y también en el lado del servidor para permitir su reproducción por parte del soporte técnico. Cuando un usuario diga que “se congeló”, el soporte debe reconstruir la interacción a partir de la transmisión sin pedirle que espere diez minutos mientras el herramienta se carga. Agregue paneles de control para mostrar la tasa de reanudación, las interacciones abandonadas y la duración promedio de las pausas, de modo que el equipo de producto pueda determinar si los agentes son lentos o las redes son inestables.

    Consejo operativo: guarde el último ID de transmisión en la cookie de sesión o en la memoria del cliente, y también en el lado del servidor para permitir su reproducción por parte del soporte técnico. Cuando un usuario diga que “se congeló”, el soporte debe reconstruir la interacción a partir de la transmisión sin pedirle que espere diez minutos mientras el herramienta se carga. Agregue paneles de control para mostrar la tasa de reanudación, las interacciones abandonadas y la duración promedio de las pausas, de modo que el equipo de producto pueda determinar si los agentes son lentos o las redes son inestables.

    Consejo operativo: guarde el último ID de transmisión en la cookie de sesión o en la memoria del cliente, y también en el lado del servidor para permitir su reproducción por parte del soporte técnico. Cuando un usuario diga que “se congeló”, el soporte debe reconstruir la interacción a partir de la transmisión sin pedirle que espere diez minutos mientras el herramienta se carga. Agregue paneles de control para mostrar la tasa de reanudación, las interacciones abandonadas y la duración promedio de las pausas, de modo que el equipo pueda determinar si los agentes son lentos o las redes son inestables.

    Consejo operativo: guarde el último ID de transmisión en la cookie de sesión o en la memoria del cliente, y también en el lado del servidor para permitir su reproducción por parte del soporte técnico. Cuando un usuario diga que “se congeló”, el soporte debe reconstruir la interacción a partir de la transmisión sin pedirle que espere diez minutos mientras el herramienta se carga. Agregue paneles de control para mostrar la tasa de reanudación, las interacciones abandonadas y la duración promedio de las pausas, de modo que el equipo pueda determinar si los agentes son lentos o las redes son inestables.

    Consejo operativo: guarde el último ID de transmisión en la cookie de sesión o en la memoria del cliente, y también en el lado del servidor para permitir su reproducción por parte del soporte técnico. Cuando un usuario diga que “se congeló”, el soporte debe reconstruir la interacción a partir de la transmisión sin pedirle que espere diez minutos mientras el herramienta se carga. Agregue paneles de control para mostrar la tasa de reanudación, las interacciones abandonadas y la duración promedio de las pausas, de modo que el equipo de producto pueda determinar si los agentes son lentos o si las redes son inestables.

    Consejo operativo: guarde el último ID de transmisión en la cookie de sesión o en la memoria del cliente, y también en el lado del servidor para permitir su reproducción por parte del soporte técnico. Cuando un usuario diga que “se congeló”, el soporte debe reconstruir la interacción a partir de la transmisión sin pedirle que espere diez minutos mientras el herramienta se carga. Agregue paneles de control para mostrar la tasa de reanudación, las interacciones abandonadas y la duración promedio de las pausas, de modo que el equipo de producto pueda determinar si los agentes son lentos o si las redes son inestables.

    Consejo operativo: guarde el último ID de transmisión en la cookie de sesión o en la memoria del cliente, y también en el lado del servidor para permitir su reproducción por parte del soporte técnico. Cuando un usuario diga que “se congeló”, el soporte debe reconstruir la interacción a partir de la transmisión sin pedirle que espere diez minutos mientras el herramienta se carga. Agregue paneles de control para mostrar la tasa de reanudación, las interacciones abandonadas y la duración promedio de las pausas, de modo que el equipo de producto pueda determinar si los agentes son lentos o si las redes son inestables.

    Consejo operativo: guarde el último ID de transmisión en la cookie de sesión o en la memoria del cliente, y también en el lado del servidor para permitir su reproducción por parte del soporte técnico. Cuando un usuario diga que “se congeló”, el soporte debe reconstruir la interacción a partir de la transmisión sin pedirle que espere diez minutos mientras el herramienta se carga. Agregue paneles de control para mostrar la tasa de reanudación, las interacciones abandonadas y la duración promedio de las pausas, de modo que el equipo de producto pueda determinar si los agentes son lentos o si las redes son inestables.

    Consejo operativo: guarde el último ID de transmisión en la cookie de sesión o en la memoria del cliente, y también en el lado del servidor para permitir su reproducción por parte del soporte técnico. Cuando un usuario diga que “se congeló”, el soporte debe reconstruir la interacción a partir de la transmisión sin pedirle que espere diez minutos mientras el herramienta se carga. Agregue paneles de control para mostrar la tasa de reanudación, las interacciones abandonadas y la duración promedio de las pausas, de modo que el equipo de producto pueda determinar si los agentes son lentos o las redes son inestables.

    Consejo operativo: guarde el último ID de transmisión en la cookie de sesión o en la memoria del cliente, y también en el lado del servidor para permitir su reproducción por parte del soporte técnico. Cuando un usuario diga que “se congeló”, el soporte debe reconstruir la interacción a partir de la transmisión sin pedirle que espere diez minutos mientras el herramienta se carga. Agregue paneles de control para mostrar la tasa de reanudación, las interacciones abandonadas y la duración promedio de las pausas, de modo que el equipo de producto pueda determinar si los agentes son lentos o las redes son inestables.

    Consejo operativo: guarde el último ID de transmisión en la cookie de sesión o en la memoria del cliente, y también en el lado del servidor para permitir su reproducción por parte del soporte técnico. Cuando un usuario diga que “se congeló”, el soporte debe reconstruir la interacción a partir de la transmisión sin pedirle que espere diez minutos mientras el herramienta se carga. Agregue paneles de control para mostrar la tasa de reanudación, las interacciones abandonadas y la duración promedio de las pausas, de modo que el equipo pueda determinar si los agentes son lentos o las redes son inestables.

    Consejo operativo: guarde el último ID de transmisión en la cookie de sesión o en la memoria del cliente, y también en el lado del servidor para permitir su reproducción por parte del soporte técnico. Cuando un usuario diga que “se congeló”, el soporte debe reconstruir la interacción a partir de la transmisión sin pedirle que espere diez minutos mientras el herramienta se carga. Agregue paneles de control para mostrar la tasa de reanudación, las interacciones abandonadas y la duración promedio de las pausas, de modo que el equipo pueda determinar si los agentes son lentos o las redes son inestables.

    Consejo operativo: guarde el último ID de transmisión en la cookie de sesión o en la memoria del cliente, y también en el lado del servidor para permitir su reproducción por parte del soporte técnico. Cuando un usuario diga que “se congeló”, el soporte debe reconstruir la interacción a partir de la transmisión sin pedirle que espere diez minutos mientras el herramienta se carga. Agregue paneles de control para mostrar la tasa de reanudación, las interacciones abandonadas y la duración promedio de las pausas, de modo que el equipo de producto pueda determinar si los agentes son lentos o si las redes son inestables.

    Consejo operativo: guarde el último ID de transmisión en la cookie de sesión o en la memoria del cliente, y también en el lado del servidor para permitir su reproducción por parte del soporte técnico. Cuando un usuario diga que “se congeló”, el soporte debe reconstruir la interacción a partir de la transmisión sin pedirle que espere diez minutos mientras el herramienta se carga. Agregue paneles de control para mostrar la tasa de reanudación, las interacciones abandonadas y la duración promedio de las pausas, de modo que el equipo de producto pueda determinar si los agentes son lentos o si las redes son inestables.

    Consejo operativo: guarde el último ID de transmisión en la cookie de sesión o en la memoria del cliente, y también en el lado del servidor para permitir su reproducción por parte del soporte técnico. Cuando un usuario diga que “se congeló”, el soporte debe reconstruir la interacción a partir de la transmisión sin pedirle que espere diez minutos mientras el herramienta se carga. Agregue paneles de control para mostrar la tasa de reanudación, las interacciones abandonadas y la duración promedio de las pausas, de modo que el equipo pueda determinar si los agentes son lentos o las redes son inestables.

    Consejo operativo: guarde el último ID de transmisión en la cookie de sesión o en la memoria del cliente, y también en el lado del servidor para permitir su reproducción por parte del soporte técnico. Cuando un usuario diga que “se congeló”, el soporte debe reconstruir la interacción a partir de la transmisión sin pedirle que espere diez minutos mientras el herramienta se carga. Agregue paneles de control para mostrar la tasa de reanudación, las interacciones abandonadas y la duración promedio de las pausas, de modo que el equipo pueda determinar si los agentes son lentos o las redes son inestables.

    Lecturas relacionadas