Los 35 agentes IA que automatizan el ciclo procurement completo en Cemex y clientes LATAM. Supervisors + especialistas coordinados por LangGraph, modelos Claude elegidos por tarea, infraestructura multi-tenant. Esta es la explicación técnica que tú necesitas para vender, y el equipo técnico del cliente necesita para aprobar.
Decisiones de stack razonadas para procurement enterprise: low-latency, multi-tenant, auditable, con proveedores maduros que no mueren mañana.
Cómo los 4 módulos se comunican entre sí y con el mundo externo. Un proveedor puede entrar por cualquier canal y llegar al mismo supervisor correcto.
Onboarding automático de proveedores por WhatsApp + email. El supervisor orquesta 5 especialistas que reúnen los 6 documentos + 6 datos críticos antes de escalar a revisión humana.
Cada mensaje del proveedor pasa por debounce 8s y llega al supervisor, que decide el handoff. La regla dura: todo flujo termina en comunicador.
Recibe cada mensaje inbound (WA o email), evalúa contexto (quién es el proveedor, estado actual, qué acaba de mandar) y delega al especialista apropiado. Valida que el mensaje final salga por comunicador — nunca habla directo al proveedor. Implementa debounce (8s) para consolidar mensajes ráfaga.
Registra proveedor nuevo, actualiza datos, cambia estados, asigna asesor automático por menor carga (peso: revisión humana x3 + activos x1).
register_new_providerupdate_provider_data
change_provider_statusasignar_asesor_automatico
reassign_provider
Determina por pattern matching sobre filename si el archivo subido es constancia fiscal, opinión cumplimiento, comprobante domicilio, acta constitutiva, estado de cuenta o ID representante. Sin LLM — regex determinístico.
extraer_tipo_documentoValida documentos con Claude Vision (legibilidad, datos correctos, firmas/sellos). RFC formato SAT: persona moral 12 chars, física 13. CLABE 18 dígitos. Opinión cumplimiento con TTL de 30 días.
validate_rfc_formatvalidate_clabe_format
validate_document_visioncheck_opinion_ttl
Envía WhatsApp y email. Recibe respuestas. Respeta per-chat takeover (proveedores.agente_pausado) para cuando un humano retoma. Fallback: si WA falla, webhook extrae respuesta y la envía directo.
send_whatsapp_messagesend_email_microsoft_graph
solicitar_documentos_faltantes
Crea notificaciones en dashboard + email interno + Teams cuando un proveedor alcanza hitos (docs listos, revisión humana pendiente, aprobación). Dedup temporal 60s para evitar ruido si dos agentes notifican el mismo evento.
notificar_equipo_dashboardnotificar_equipo_email
notificar_equipo_teams
Pipeline agéntico de 15 sub-agentes que encuentra proveedores nuevos cuando no están en catálogo. 7 fuentes externas corren en paralelo, el scraper enriquece top-5, el evaluador scorea con fórmula explicable.
M2 sí tiene supervisor, pero custom en Python puro (vive en agents/modulo2_busqueda/orquestador/supervisor.py), no LangGraph. Orquesta el pipeline con ThreadPoolExecutor para ejecutar las 7 fuentes en paralelo, controla el hardgate de costo y streamea cada paso al frontend vía SSE. Razón del diseño: cero overhead de routing LLM + control determinista del costo por búsqueda.
Convierte query del comprador ("acero en Nuevo León con ISO 9001") a CriteriosBusqueda Pydantic validado (categoría, estado, num_resultados cap 10, certs requeridas).
analizar_consultaSi query ambiguo ("proveedores"), sugiere chat inline "¿qué categoría? ¿qué estado?" con opciones pre-armadas. Evita búsquedas desperdiciadas.
sugerir_slotsSi ya buscamos esto antes con match alta confianza, retorna sin gastar APIs. Al final, upsert JSONB con dedup case-insensitive. Allow-list ISO regex para certs.
buscar_en_memoriaescribir_en_memoriaAPI gratuita del DENUE. Empresas con RFC válido y actividad económica oficial SCIAN. Coverage México total. Requiere DENUE_TOKEN.
buscar_denueEmpresas por categoría + ubicación. Extrae tel, sitio web, rating, horarios. Fallback a web_search si no hay API key.
buscar_google_mapsUsa tool web_search_20250305 oficial de Anthropic. Encuentra empresas con presencia online pero no en directorios estructurados. Max 2 reformulaciones por cost cap.
buscar_webCoverage menor que Google Maps pero sin API key y complementa con datos geográficos precisos (coordenadas).
buscar_openstreetmapEmpresas mexicanas grandes catalogadas en Wikidata (Q4830453 business, Q43229 organization). Útil para conocer corporativos y filiales.
buscar_wikidataScrapea seccionamarilla.com.mx. Scrapling usa curl_cffi + TLS Chrome fingerprint para bypass anti-bot. Heurísticas de extracción robustas a cambios de layout. follow_redirects=False (defensa SSRF).
buscar_paginas_amarillasScrapea empresite.mx enfocado a empresas B2B con razón social + domicilio fiscal. Complementario a Páginas Amarillas.
buscar_empresiteVisita top-5 sitios y extrae datos: tel, email, descripción, certs mencionadas. Cascade Scrapling → httpx si el primary falla. SSRF-safe (valida DNS, bloquea AWS IMDS), A6 sanitize (strip tags XML antes de LLM).
scrapear_urlsfetch_with_cascadePara top-5 usa web_search para estimar precios típicos de la categoría. Ayuda al comprador a contextualizar ofertas.
enriquecer_preciosScorea candidatos en 5 sub-dimensiones (presencia web, certs, ubicación, precio, completitud) con pesos configurables. Output Pydantic con fórmula_explicada obligatoria. Fallback rule-based si Sonnet falla.
evaluar_candidatosEvalúa calidad tras primera pasada. Si insuficiente, expande criterios y reintenta con fuentes que faltaron.
evaluar_calidadrefinar_busquedaComposición pura Python (sin LLM): hero + tabla + mapa + card top-5. El frontend renderiza vía SSE en vivo conforme los demás agentes completan.
presentar_resultadosCiclo completo de vida de contratos: generación desde plantillas, firma electrónica con valor legal mexicano vía Mifiel, vigilancia de vencimientos con alertas 60/30/15/7 días, renovación asistida, retención SAT 7 años automática.
Mifiel provee firma con valor legal ante SAT. Simulation mode default en demo (no consume créditos). Multi-firmante lado proveedor + lado tenant, paralelo o secuencial configurable.
Triggers: nuevo_contrato, firma_proveedor_recibida, firma_tenant_recibida, vencimiento_cercano, renovacion_iniciada. Todo handoff termina en comunicador_m3.
Renderiza Jinja2 + WeasyPrint con variables del asesor y data proveedor. Hash SHA-256 para integridad. Registra documento en Mifiel para que arme widget de firma.
render_contract_pdfrender_templatecompute_pdf_hashmifiel_register_documentscan_unfilled_varsVerifica PDF draft antes de mandar al proveedor: variables sin llenar, cláusulas obligatorias presentes, bloque de firmas correcto.
scan_unfilled_varsvalidate_required_clausesvalidate_signature_blockvalidate_contract_completenessWebhook handler idempotente (event_id unique). Procesa eventos signed / rejected / expired. Descarga PDF firmado cuando cierra. HMAC verify obligatorio fail-closed.
procesar_firma_eventoWA al proveedor con link widget Mifiel (deep link o QR), email con PDF adjunto, notif dashboard a firmantes tenant. Firma móvil pública accesible por QR sin login.
send_wa_contratosend_email_contratosend_notification_tenantBarrido diario: alertas 60/30/15/7 días antes del vencimiento. Recordatorios WA si proveedor no ha firmado + expira TTL Mifiel (30 días).
escanear_vencimientosescanear_recordatorios_firmalistar_proximos_a_vencerComprador click "Renovar" → clona contrato padre, aplica deltas (fechas, montos), marca padre renovado, arranca generador sobre el nuevo.
clonar_contrato_para_renovacionVision sobre PDFs externos. Extrae partes, fechas, monto, tipo → inserta en contratos con estado=firmado_completo y fuente=externo. Trae contratos legacy al dashboard.
extraer_datos_contrato_externoregistrar_contrato_externoCiclo completo de OCs: generación, validación integrada con M1+M3, envío al proveedor por WA+email, clasificación automática de respuestas, escalamiento a humanos cuando se requiere, OCR de evidencias de entrega, vigilante cron diario.
Cross-módulo fuerte: Validador M4 exige proveedor.estado=aprobado (M1) y contratos.estado=firmado_completo (M3). Si monto > oc_max_monto_sin_escalar, escala automático antes de enviar.
Triggers: crear_oc, mensaje_proveedor, imagen_proveedor, vigilante_diario, crear_oc_sin_enviar. Invoca escalador automático si monto excede límite antes del envío.
Jinja2 SandboxedEnvironment (autoescape=true, bloquea {{ __class__ }} RCE) + cap 200KB plantilla + WeasyPrint timeout 10s via ThreadPoolExecutor. PDF a Supabase Storage.
generar_ocProveedor.estado=aprobado (M1), contratos.estado=firmado_completo + fecha vigente (M3), items cantidad+precio positivos, monto > 0, moneda MXN/USD/EUR, fecha entrega futura, RFC formato SAT.
validar_ocEnvía OC con PDF signed URL, nudges de acuse, responde textos redactados por seguimiento. Respeta oc_simulation_mode para demos sin consumir APIs.
enviar_oc_a_proveedorenviar_nudge_acuseresponder_inbound_proveedorClasifica mensajes del proveedor en 5 buckets (acuse / confirmación / cambio / entrega / desconocido) con heurísticas. Cada bucket dispara su transición FSM y propone respuesta. Desconocido escala humano.
procesar_respuesta_proveedorevaluar_cronogramaCrea notificación dashboard cuando: cambio fecha/cantidad, monto excede límite, disputa, pregunta fuera política, rechazo proveedor. Shape canónico {proveedor_id, tipo, mensaje, canal, leida} alineado con M1/M3.
escalar_a_compradorOCR sobre fotos WA del proveedor: OC firmada → acuse, remisión → surtida_parcial, foto entrega → surtida_completa. SSRF-safe (DNS resolution + bloqueo IPs privadas) + cap 10MB.
leer_evidencia_proveedorTenantScope context manager por tenant. Detecta: sin acuse > 2 días, retraso entrega > 3 días tolerancia, modificadas > 5 días. Cada alerta dispara comunicador o escalador.
escanear_ocs_atrasadasCómo los 4 módulos encadenan desde que alguien contacta a Cemex hasta la OC cerrada. El dato fluye en una dirección; los estados cierran cada fase antes de habilitar la siguiente.
Proveedor mensaje por WA → supervisor gestor valida RFC+CLABE+6 docs → Vision → estado=aprobado
Comprador busca nuevos proveedores → 7 fuentes paralelas → score → invitación a alta M1
Comprador arma contrato de plantilla → Mifiel firma proveedor + tenant → estado=firmado_completo
Comprador emite OC → validator exige aprobado+firmado → WA → OCR entrega → cerrada
Qué sistemas externos toca cada módulo. Todo outbound pasa por el módulo que tenga autoridad sobre ese sistema — no hay conexiones directas desde agentes cross-módulo.
| Sistema externo | M1 | M2 | M3 | M4 | Uso primario | Tipo |
|---|---|---|---|---|---|---|
| WhatsApp Meta Cloud API | ✓ | · | ✓ | ✓ | Inbound + outbound con proveedores | Webhook + REST |
| Microsoft Graph (Email + Teams) | ✓ | · | ✓ | ✓ | Email outbound + polling + alertas Teams | OAuth + REST |
| Mifiel | · | · | ✓ | · | Firma electrónica con valor legal SAT | REST + webhook |
| DENUE / INEGI | · | ✓ | · | · | Registro oficial empresas MX | REST público |
| Google Maps Places | · | ✓ | · | · | Descubrimiento por ubicación | REST + API key |
| Claude web_search tool | · | ✓ | · | · | Búsqueda web nativa Anthropic | Tool use |
| OpenStreetMap / Overpass | · | ✓ | · | · | Geo-data gratis | REST público |
| Wikidata SPARQL | · | ✓ | · | · | Corporativos grandes | SPARQL |
| SecciónAmarilla MX | · | ✓ | · | · | Directorio B2C scraping | HTML scraping |
| Empresite MX | · | ✓ | · | · | Directorio B2B scraping | HTML scraping |
| Anthropic Claude API | ✓ | ✓ | ✓ | ✓ | LLM Sonnet + Haiku + Vision | REST |
| Supabase Postgres | ✓ | ✓ | ✓ | ✓ | Multi-tenant schema-per-cliente | postgrest |
| Supabase Storage | ✓ | · | ✓ | ✓ | Documentos + PDFs firmados | S3-like API |
No todos los agentes necesitan el modelo más caro. Sonnet solo donde el razonamiento justifica el costo y la latencia.
Usado en: todos los 4 supervisors, validador M1 (Vision + reglas), analizador M2, buscador_web M2, enriquecedor M2, evaluador M2, refinador M2, generador M3+M4, validador_completitud M3, validador_firma M3, validador M4, seguimiento M4.
Razón: decisiones multi-paso, clasificación con contexto histórico, compliance check, razonamiento sobre datos heterogéneos.
Usado en: gestor M1, clasificador M1, comunicador M1, notificador M1, DENUE, Google Maps, memoria M2, clarifier M2, comunicador M3+M4, vigilante M3+M4, renovador M3, escalador M4.
Razón: CRUD, envío de mensajes, OCR structured output, pattern matching, tareas de baja incertidumbre donde la velocidad importa más.
Usado en: lector M3 (contratos externos), lector M4 (evidencias entrega), validador M1 (docs proveedor).
Razón: extracción estructurada desde imagen con JSON schema. Haiku Vision basta; no necesitamos Sonnet.
Usado en: clasificador M1 (regex filename), memoria M2 (SQL directo), scraper M2, presentador M2.
Razón: operaciones determinísticas donde el LLM añadiría costo sin valor. Los agentes "sin LLM" son baratos y rápidos.
Todo módulo hereda estos patterns. La última auditoría CSO (2026-04-17) cerró 2 CRITICAL + 2 HIGH y dejó 0 abiertos.
Todos los queries per-tenant usan wrapper db() que resuelve schema por subdomain. Hook pre-commit bloquea supabase.table('proveedores') directo. TenantScope context manager en crons.
Datos del proveedor wrapped en XML tags (<provider_message>, etc). sanitize_mensaje_inbound strip tags + escape <> antes de LLM. Aplicado en M1, M3, M4.
Scraper M2 + Lector M4 validan DNS resolution. Bloquean IPs privadas, loopback, link-local (169.254.169.254 = AWS IMDS). follow_redirects=False default.
Generador M3+M4 usa SandboxedEnvironment(autoescape=True). Bloquea RCE vía {{ __class__ }}. Cap 200KB plantilla.
M3 (contratos) y M4 (OCs) tienen estados validados en DB CHECK constraints + agent validador + blueprint endpoints 409 invalid_state.
Tabla historial_acciones + contratos_eventos + oc_eventos para trazabilidad. Cada mutation pasa por _log_accion.
Credenciales Mifiel por tenant cifradas con Fernet + HKDF derivation key-per-tenant. Master key en .env 0600.
Tokens en-memoria 12h TTL + daemon cleanup 15min. Flask-Limiter en login 5/15min + 20/hora. Bcrypt 12 rounds.
Importador M4 prefija ' a celdas que empiezan con = + - @. Evita RCE Excel al abrir CSV exportado con data maliciosa.
Todo corre en systemd con hardening (NoNewPrivileges, ProtectSystem strict, PrivateTmp). 7 unidades activas.
Webhook WhatsApp + health. Flask single worker. HMAC verify fail-closed. Debounce 8s.
Dashboard multi-tenant Flask. 1 worker / 4 threads. Tokens in-memory. 4 portales nginx per-tenant.
SSE streaming M2 búsqueda. gunicorn gevent 1 worker (SSE no-sync).
Cron email polling Microsoft Graph. Detecta intent + adjuntos.
Seguimientos M1 proveedores (recordatorios docs).
06:00 AM diario. Alertas 60/30/15/7 días + recordatorios firma.
07:15 AM diario. Barrido OCs atrasadas M4. TenantScope por tenant.
Mensual. Retention SAT 7 años. Limpia contratos expirados + archiva.