Auto-Etiquetado de Gmail
Objetivo
Obtener correos de la bandeja de entrada, clasificarlos mediante subagentes paralelos en 'Acción Requerida' / 'Esperando Respuesta' / 'Referencia' y aplicar las etiquetas en lote a través de la API de Gmail.
Scripts
./scripts/gmail_label_fetch.py- Obtiene resúmenes de correos como JSON compacto./scripts/gmail_label_split.py- Divide los correos en N lotes para clasificación paralela./scripts/gmail_label_merge.py- Fusiona los lotes clasificados en un único labels.json./scripts/gmail_label_apply.py- Aplica las clasificaciones de etiquetas en lote
Subagente
email-classifier— definido en.claude/agents/email-classifier.md- Modelo: Sonnet 4.5 (rápido, clasificación eficiente en costos)
- Cada subagente lee un lote y escribe un archivo de salida clasificado
Flujo (Paralelo — predeterminado)
Paso 1: Obtener correos
python3 .claude/skills/gmail-label/scripts/gmail_label_fetch.py \
--account CUENTA --query "in:inbox" --limit 100 --output .tmp/emails.json
Paso 2: Dividir en lotes
python3 .claude/skills/gmail-label/scripts/gmail_label_split.py \
--input .tmp/emails.json --chunks 10 --output-dir .tmp/chunks
Paso 3: Clasificar en paralelo (generar 10 subagentes)
Genera 10 subagentes email-classifier en segundo plano, uno por lote. Cada subagente:
- Lee
.tmp/chunks/chunk_N.json - Clasifica cada correo
- Escribe
.tmp/chunks/classified_N.json
Usa la herramienta Task con run_in_background: true y model: "sonnet". Lanza TODOS los 10 en un solo mensaje para lograr verdadero paralelismo:
Para cada lote 0-9, genera una Task con:
subagent_type: "email-classifier"
model: "sonnet"
run_in_background: true
prompt: "Lee /ruta/absoluta/.tmp/chunks/chunk_N.json, clasifica cada correo, escribe los resultados en /ruta/absoluta/.tmp/chunks/classified_N.json"
CRÍTICO: NO uses TaskOutput para leer los resultados de los subagentes. Los subagentes escriben sus resultados en archivos; el agente principal nunca necesita ver los datos de clasificación. Leer TaskOutput saturará la ventana de contexto y causará errores de "prompt demasiado largo" con lotes grandes (500+ correos).
En su lugar, verifica la existencia de los archivos:
# Espera hasta que todos los archivos clasificados existan (tiempo límite de 120s)
for i in $(seq 0 9); do
while [ ! -f ".tmp/chunks/classified_$i.json" ]; do sleep 2; done
done
Luego continúa directamente al Paso 4 (fusión).
Paso 4: Fusionar clasificaciones
python3 .claude/skills/gmail-label/scripts/gmail_label_merge.py \
--input-dir .tmp/chunks --output .tmp/labels.json
Paso 5: Aplicar etiquetas
python3 .claude/skills/gmail-label/scripts/gmail_label_apply.py \
--account CUENTA --input .tmp/labels.json
Guías de Clasificación
Acción Requerida:
- Alertas de seguridad que necesitan verificación
- Tarjetas de crédito / renovaciones de dominio próximas a vencer
- Menciones @ en Slack que hacen preguntas
- Nuevos miembros del equipo a saludar (notificaciones de Slack)
- Correos de clientes que requieren respuesta
- Actualizaciones de listados comerciales (Google Business Profile, Bing Places)
- Avisos de Stripe que requieren acción
Esperando Respuesta:
- Correos de ventas salientes esperando respuesta
- Tickets de soporte pendientes de resolución
- Propuestas enviadas, pendientes de respuesta
Referencia:
- Boletines de marketing (DigitalMarketer, etc.)
- Boletines de organizaciones benéficas/sin ánimo de lucro (RAPS, etc.)
- Informes de rendimiento de Google Business Profile
- Ofertas promocionales (Blinkist, ventas, etc.)
- Notificaciones de actualizaciones de plataforma (Google Play, Apify, etc.)
- Códigos de confirmación (ya usados)
- Boletines inmobiliarios (Westbank, etc.)
- Correos de cuentas de juegos (Riot Games, etc.)
- Alertas de seguridad informativas (2FA activado, etc.)
- Avisos de salud
- Notificaciones de cambios legales/políticas
Registro de Cuentas
Las cuentas se almacenan en gmail_accounts.json en la raíz del espacio de trabajo. Cada cuenta necesita:
email- Dirección de Gmailtoken_file- Ruta al token OAuth
Añadir Nuevas Cuentas
python3 .claude/skills/gmail-inbox/scripts/gmail_multi_auth.py --account NOMBRE_CUENTA --email EMAIL
Rendimiento
- Flujo serial: ~36s para 100 correos (obtener 1s + clasificar 34s + aplicar 1s)
- Flujo paralelo: ~30s para 100 correos (clasificar 19s + fusionar <1s + aplicar ~10s)
- La clasificación es el cuello de botella; 10 subagentes paralelos la reducen de 34s a 19s (~1.8x de aceleración)
- La sobrecarga de inicio de los agentes (~4s de escalonamiento) limita las ganancias teóricas
- El paso de aplicar puede variar debido a la limitación de la API de Gmail
Esquema
Entradas
| Nombre | Tipo | Requerido | Descripción |
|---|---|---|---|
account | string | Sí | Nombre de la cuenta de Gmail del registro |
query | string | No | Consulta de búsqueda de Gmail (por defecto: 'in:inbox') |
limit | integer | No | Máximo de correos a clasificar (por defecto: 100) |
chunks | integer | No | Lotes para clasificación paralela (por defecto: 10) |
Salidas
| Nombre | Tipo | Descripción |
|---|---|---|
labels_applied | object | Conteo por categoría: Acción Requerida, Esperando Respuesta, Referencia |
Credenciales
| Nombre | Origen |
|---|---|
credentials.json | archivo |
token_*.json | archivo (generado automáticamente) |
Componible Con
Habilidades que encadenan bien con esta: gmail-inbox
Costo
API de Claude Sonnet para clasificación