El problema
En una bandeja de entrada profesional entran decenas de mensajes al día, y el 80% son notificaciones automáticas o correos de baja prioridad. Lanzar herramientas pesadas con cada email sale caro, y sin una persona que revise las respuestas delicadas es peligroso.
La solución
Disparador desatendido (24/7)
3 Vías de acción
Subgrafo de agenda y borrador
Ningún correo se envía sin validación humana explícita.
Persistencia y memoria permanente
Construí un asistente ambiental que trabaja solo en segundo plano, conectado a las APIs de Gmail y Google Calendar. Lo diseñé sobre tres ideas: triaje barato, revisión humana (Human-in-the-Loop) y memoria de preferencias a largo plazo.
- Triaje (
triage_router). Un modelo rápido evalúa cada correo con un esquema estructurado (RouterSchema) y lo manda por una de tres vías:ignore: archiva o marca como leído, sin gastar herramientas.notify: avisa al usuario si es urgente y pide una acción directa.respond: activa el subgrafo de redacción y calendario.
- Calendario. Ante una petición de reunión, el agente comprueba la disponibilidad real con
check_calendar_availabilityy propone horarios compatibles. - Pausa con
interrupt(). El agente redacta un borrador pero nunca lo envía solo. Pausa la ejecución en la base de datos de checkpoints, y el usuario lo aprueba con un clic, lo edita o lo descarta. - Memoria de estilo (
BaseStore). Un almacén independiente de los hilos (namespace=("email_assistant", "user_preferences")) aprende de las correcciones del usuario y adapta el tono, las directrices y los horarios preferidos en respuestas futuras. - Modo desatendido. Un script programado (
cron.py) despierta al agente cada cierto tiempo para revisar los mensajes sin leer, sin que nadie tenga que estar pendiente.
Stack desglosado
- Orquestación: LangGraph (
StateGraph,interrupt,Command(resume=...)). - Persistencia: SQLite checkpointer para hilos activos y
BaseStorepara memoria permanente de perfil. - Integraciones: API REST de Google Workspace (Gmail y Google Calendar).
- Automatización: Ejecución en segundo plano con temporizadores cron.
- Calidad y pruebas: Datasets sintéticos con
CriteriaGradey evaluación semántica mediante LangSmith.
Resultados y aprendizajes
Lo que funcionó fue tratar la supervisión humana como un estado persistente del grafo, no como un input() interactivo. Si el usuario tarda horas en revisar un borrador, el hilo queda guardado en la base de datos sin gastar memoria ni CPU.
Lo que aprendí: un agente ambiental no vale por hablar mucho. Vale por filtrar el ruido y dejar el trabajo listo para la aprobación final.