Agente de IA que procesa emails de Gmail, los clasifica automáticamente usando Google Gemini, crea eventos en Google Calendar para reuniones, y expone todo a través de un dashboard web en React.
- Python 3.11+ · FastAPI · uvicorn
- Google Gemini API (
google-genai) — clasificación y resumen de correos - Gmail API + Google Calendar API (OAuth2)
- SQLite + SQLAlchemy — historial local de correos procesados
- pytest · httpx — testing
- React 18 + TypeScript · Vite
- react-big-calendar + date-fns — calendario interactivo
- Recharts — gráficos de estadísticas (donut, barras, línea)
- Axios — comunicación con el backend
- Vitest + React Testing Library + @vitest/coverage-v8 — tests de componentes
- Design system centralizado (
src/theme.ts) — paleta AI Futuristic Glow con dark theme, glassmorphism y animaciones - Google Fonts: Space Grotesk (headings) · Inter (body) · IBM Plex Mono (AI outputs)
- Sonner — toast notifications (crear/editar/eliminar eventos)
- Docker + GitHub Actions (CI/CD)
- Procesamiento manual de correos: botón "Procesar ahora" en el dashboard
- Clasificación IA: Gemini clasifica cada correo con categoría (reunion, urgente, promocion, informativo, otro) y genera un resumen
- Agendado manual de reuniones: correos clasificados como
reunionmuestran un botón "📅 Agendar" que abre un modal pre-llenado con los datos extraídos por Gemini (título, fecha, hora, ubicación, descripción). El usuario revisa y confirma antes de crear el evento. Si el email incluye un adjunto.ics, los datos se extraen directamente del archivo con mayor precisión. - Panel de configuración (
/settings): ajustaMAX_EMAILS_PER_RUN,CHECK_INTERVAL_MINUTES,GMAIL_FILTER_AFTER_DATEy horario de descanso (QUIET_HOURS_START/END) desde el dashboard. Los cambios se persisten en.envy se aplican sin reiniciar. - Filtro por fecha: solo procesa correos llegados después de
GMAIL_FILTER_AFTER_DATE(por defecto2026/03/20) - Límite configurable: hasta 100 correos por ciclo (
MAX_EMAILS_PER_RUN) - Historial SQLite: todos los correos procesados se guardan localmente con categoría, resumen y timestamp
- Briefing diario (
/briefing): resumen ejecutivo narrativo generado por Gemini. Cards estructuradas con resumen general, correos urgentes (acción requerida), reuniones pendientes de agendar y recomendaciones del agente. Soporta consultar el briefing de cualquier fecha pasada. - Búsqueda inteligente en historial: campo de texto libre que usa SQLite FTS5 (full-text search) para buscar simultáneamente en asunto, remitente y resumen. Se combina con los filtros de fecha y categoría existentes. Los términos encontrados se resaltan en amarillo en los resultados.
- Dashboard de correos con 3 pestañas: Pendientes · Procesados hoy · Historial filtrable + buscable
- Dashboard de estadísticas: donut por categoría · barras+línea de volumen diario · top remitentes
- Calendario interactivo: dos pestañas (lista de cards + grid mes/semana/día) · crear · editar · eliminar eventos · acciones inline en cards · etiquetas con color
- Script de arranque:
email-agentinicia backend + frontend y abre el navegador automáticamente - UI "AI Futuristic Glow": dark theme con fondo
#0B0F19, glassmorphism en navbar, glow en botones IA, animación "AI thinking..." al procesar, overrides de react-big-calendar para dark mode - Hover effects profesionales: glow pulsante en botones primarios, borde iluminado en secundarios, glow rojo en danger
- Empty state glassmorphism: bandeja vacía con card animada en lugar de texto plano
- Toast notifications: feedback visual al crear, editar y eliminar eventos del calendario
- Fix bug NaN: eventos de calendario recién creados ya muestran fecha correcta (normalización de respuesta de Google Calendar API)
- Python 3.11+
- Node.js 18+
- Una cuenta de Google con Gmail habilitado
- API Key de Google Gemini (gratuita)
- Un proyecto en Google Cloud Console con Gmail API y Google Calendar API habilitadas
git clone https://github.com/DeibyGS/email-agent.git
cd email-agent- Ve a Google Cloud Console → APIs y servicios → Credenciales
- Crea unas credenciales de tipo OAuth 2.0 (aplicación de escritorio)
- Descarga el archivo JSON y renómbralo como
credentials.json - Colócalo en
backend/credentials.json
El archivo
token.jsonse genera automáticamente la primera vez que arranques el proyecto — el navegador se abrirá para que autorices el acceso a tu cuenta de Google.
cd backend
cp .env.example .envEdita backend/.env y completa al menos GEMINI_API_KEY con tu clave de Gemini. El resto de variables tiene valores por defecto funcionales.
# Backend
cd backend
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
# Frontend
cd ../frontend
npm installDesde la raíz del proyecto:
./email-agentEsto inicia el backend (puerto 8000), el frontend (puerto 5173) y abre el navegador automáticamente.
Para usar email-agent desde cualquier directorio, crea un symlink global:
sudo ln -sf $(pwd)/email-agent /usr/local/bin/email-agentPara detener: Ctrl+C
# Terminal 1 — Backend
cd backend && source .venv/bin/activate && python main.py
# Terminal 2 — Frontend
cd frontend && npm run dev# Requisito: tener backend/credentials.json y backend/token.json generados (OAuth2)
docker-compose up --buildServicios disponibles:
- Backend:
http://localhost:8000 - Frontend:
http://localhost:3000
# Backend
cd backend && source .venv/bin/activate && pytest tests/ --ignore=tests/test_scheduler.py -v
# Frontend
cd frontend && npm test # modo watch
cd frontend && npm run test:coverage # con reporte de coberturaCopiar backend/.env.example a backend/.env y completar:
| Variable | Descripción | Ejemplo |
|---|---|---|
GEMINI_API_KEY |
API Key de Google Gemini | AIza... |
GMAIL_FILTER_AFTER_DATE |
Solo procesar correos después de esta fecha | 2026/03/20 |
MAX_EMAILS_PER_RUN |
Máximo de correos por ciclo | 100 |
CHECK_INTERVAL_MINUTES |
Intervalo del scheduler automático | 30 |
QUIET_HOURS_START |
Hora de inicio del descanso (0–23) | 0 |
QUIET_HOURS_END |
Hora de fin del descanso (0–24) | 8 |
Las credenciales OAuth2 de Google se guardan en backend/credentials.json y backend/token.json (no se suben al repositorio).
email-agent/
├── backend/
│ ├── config/settings.py # Variables de entorno y credenciales
│ ├── src/
│ │ ├── gmail/client.py # Cliente Gmail API
│ │ ├── ai/classifier.py # Clasificador Gemini
│ │ ├── calendar/client.py # Cliente Calendar API
│ │ ├── scheduler/job.py # Pipeline de procesamiento
│ │ ├── database/
│ │ │ ├── models.py # Modelos SQLAlchemy
│ │ │ ├── repository.py # Acceso a datos
│ │ │ └── init_db.py # Inicialización SQLite
│ │ └── api/
│ │ ├── routes.py # Endpoints principales
│ │ └── calendar_router.py # Endpoints de calendario
│ ├── tests/
│ ├── main.py
│ └── requirements.txt
├── frontend/
│ └── src/
│ ├── components/ # Navbar, EmailCard, modales
│ ├── pages/ # EmailsPage · StatsPage · CalendarPage
│ ├── services/api.ts # Llamadas al backend
│ └── types/index.ts # Interfaces TypeScript
├── docs/API.md # Referencia completa de la API REST
├── docker-compose.yml # Orquestación backend + frontend
├── .github/workflows/ci.yml # CI: pytest · ruff · vitest · docker build
└── email-agent # Script de arranque rápido (local)
Ver referencia completa en docs/API.md.
Base URL local: http://localhost:8000