Saltar al contenido principal
Jordi Izquierdo Montalbán
Proyectos

Asistente Ambiental de Email y Calendario

Asistente autónomo desatendido 24/7 conectado a Gmail y Google Calendar: triaje inteligente en 3 vías, revisión humana (Human-in-the-Loop) para validación de borradores y citas, memoria de preferencias a largo plazo y automatización periódica en segundo plano.

Código privado: te lo enseño en una entrevista

LangGraph, Python, Gmail API, Google Calendar API, SQLite, Cron, Pydantic, LangSmith

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

Ciclo autónomo 24/7: trigger periódico cron → triaje de bajo coste en 3 vías → subgrafo de calendario/redacción → aprobación humana (HITL) → memoria permanente entre sesiones.

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.

  1. 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.
  2. Calendario. Ante una petición de reunión, el agente comprueba la disponibilidad real con check_calendar_availability y propone horarios compatibles.
  3. 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.
  4. 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.
  5. 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 BaseStore para 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 CriteriaGrade y 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.