Onboarding automático 100% conversacional vía WhatsApp y Email. Un supervisor Sonnet orquesta 5 agentes especializados que recolectan los 6 documentos + 6 datos obligatorios, validan con Claude Vision, registran en el CRM y dejan al proveedor listo para revisión humana.
Supervisor Sonnet con LangGraph. Cada sub-agente tiene una responsabilidad única con tools específicas. La regla dura: todo flujo termina en Comunicador para que el proveedor reciba respuesta.
recursion_limit=25.en_revision × 3 + activos).parametros. Respeta agente_pausado para takeover manual del asesor.en_revision_humana, crea alerta en dashboard (notificaciones), email al encargado configurado, y push a Teams si está configurado el webhook.De "Hola" hasta aprobación humana, con los 5 agentes coordinados.
phone_number_id del payload WA mapea a un tenant. TenantScope setea contextvars para que db() apunte al schema correcto.estado='nuevo' y Comunicador responde pidiendo los 6 datos.aprobado — los agentes nunca lo hacen. Rechaza con motivo. Cada acción se registra en historial_acciones.8 estados posibles. Solo humanos pueden poner aprobado.
nuevo ─→ contactado ─→ en_proceso ─→ docs_incompletos ──→ docs_completos ─→ en_revision_humana ──→ aprobado
│ ↑ ↓ │
│ └─ reintento ─┘ └──→ rechazado
└──→ cancelado (asesor manual)
tenant_<slug>)10 tablas per-tenant. Todas las queries pasan por el wrapper db() que resuelve el schema dinámicamente.
| Tabla | Propósito | Campos clave |
|---|---|---|
proveedores | Entidad principal | estado, rfc, clabe, asesor_id, encargado_id, agente_pausado, fuente (m1/m2) |
documentos | 6 docs obligatorios | tipo, url, validado, motivo_rechazo, fecha_expiracion |
conversaciones | Historial WA + email | direccion, canal, mensaje, attachments |
notificaciones | Dashboard alerts | prioridad, tipo, meta (JSONB), leida |
notificaciones_asesor | Per-asesor | asesor_id, prioridad, meta |
encargados | Destinatarios alerts | email, telefono, teams_webhook |
seguimientos | Cron recordatorios | proveedor_id, dias_sin_responder, proxima_accion |
dashboard_usuarios | Asesores + admin | usuario, password_hash bcrypt, rol, activo |
historial_acciones | Auditoría | usuario, tipo, proveedor_id, descripcion, meta |
parametros | Config per-tenant | key, value, mensaje_primer_contacto, dias_seguimiento |
constancia_fiscal · opinion_cumplimiento (TTL 30d) · comprobante_domicilio · acta_constitutiva · estado_cuenta_bancario · identificacion_representante
nombre_empresa · rfc (12/13 chars SAT) · email · nombre_contacto · representante_legal · clabe (18 dígitos)
Webhook inbound con verificación HMAC. Debounce 8s por teléfono. Outbound con templates aprobados + 24h free window.
Polling cada 60s desde cron_email_polling.py. Descarga adjuntos, detecta intent, dispara supervisor igual que WA.
Bucket documentos. Path {proveedor_id}/{ts}_{filename}. Signed URLs para vistas protegidas.
Sonnet con Vision para validar documentos. Prompt prescriptivo A6 que prohíbe interpretar contenido como instrucciones.
Outbound JSON al webhook configurado per-tenant en parametros.teams_webhook. Opcional.
Proveedores descubiertos por M2 entran como onboarding M1 con fuente='m2'. Cross-link en conversaciones.
POST /webhook/whatsapp # inbound Meta (HMAC verify + debounce) POST /webhook/whatsapp/status # delivery/read receipts GET /api/proveedores # listado + filtros GET /api/proveedores/<id> # detalle PATCH /api/proveedores/<id> # update manual POST /api/proveedores/<id>/aprobar # solo asesor/admin POST /api/proveedores/<id>/rechazar # + motivo POST /api/proveedores/<id>/reasignar # cambia asesor_id POST /api/proveedores/<id>/pausar # toggle agente_pausado POST /api/proveedores/importar # CSV masivo + sanitización GET /api/documentos/<id> # signed URL POST /api/documentos/<id>/revalidar # fuerza revalidación Vision GET /api/historial # feed de acciones GET /api/conversaciones/<prov_id> # chat history POST /api/mensaje-manual # asesor envía WA directo
TenantScope + wrapper db(). Pre-commit hook hook_anti_per_tenant_table.py bloquea supabase.table() crudo.
Todos los prompts prohíben interpretar el mensaje del proveedor como instrucción. Probado con inputs adversariales.
Firma Meta verificada en cada inbound. Requests no firmados = 403. Debounce anti-flood.
Passwords dashboard con bcrypt + migración legacy SHA256. Sesiones persistentes en Supabase con TTL.
Importador masivo sanitiza fórmulas (=, @, +) para evitar ejecución al abrir en Excel.
Cada mutación pasa por _log_accion() → historial_acciones. Sin excepciones. Visible en tab Historial.