ADR-004 — Persistencia de sesión: MemorySaver ahora, RedisSaver en producción
Estado: Aceptado (decisión temporal consciente)
Fecha: 2026-04-09
Rama: feature/rag-studio
Contexto
LangGraph requiere un checkpointer para persistir el estado entre turnos de una conversación (thread_id = session_id). Las opciones principales son:
MemorySaver: RAM del proceso. Simple, sin dependencias.RedisSaver: Redis externo. Sobrevive reinicios y soporta múltiples réplicas.PostgresSaver: PostgreSQL externo. Similar a Redis pero con overhead mayor.
Decisión
Usar MemorySaver en la fase actual de desarrollo y pruebas. Migrar a RedisSaver antes de llevar el servicio a producción con tráfico real.
Justificación
Por qué MemorySaver ahora: - Cero dependencias adicionales para levantar el servicio. - Iteración más rápida: reiniciar el proceso no requiere limpiar Redis. - Las evals E2E usan sesiones únicas por test; la pérdida de estado al reiniciar no afecta los resultados.
Por qué Redis en producción:
- Si el proceso se reinicia (deploy, crash), todas las conversaciones activas pierden su historial. El usuario experimenta el bot como si fuera el primer mensaje.
- En producción con múltiples réplicas (load balancer), cada instancia tendría su propio MemorySaver, rompiendo la continuidad de sesión.
- Redis ya está en el stack de infraestructura compartida (infra/docker-compose.yml).
Plan de migración
# Hoy
from langgraph.checkpoint.memory import MemorySaver
checkpointer = MemorySaver()
# En producción (cuando se active)
from langgraph.checkpoint.redis import RedisSaver
checkpointer = RedisSaver.from_conn_string(os.getenv("REDIS_URL"))
El cambio es una línea. No requiere modificar nodos ni el grafo.
Consecuencias
Riesgo aceptado (desarrollo): conversaciones se pierden al reiniciar el proceso. Aceptable en dev/staging.
Deuda técnica: marcar en el backlog la tarea "Migrar MemorySaver → RedisSaver antes de producción".