← Volver a eventos
SwarmUp por 540HackSpain 2026, Madrid. Reto HappyRobot

SwarmUp

Una IA a los mandos de un apagón en cascada

Un agente autónomo que recibe cientos de señales, decide cuáles importan, reparte una flota que nunca alcanza, llama por teléfono a los responsables y replanifica cuando la situación cambia.

Lo construimos en 48 horas sobre calles reales de Getafe. Un operador humano puede intervenir en cualquier momento.

Réplica animada de la interfaz real. Pausa, reinicia o inyecta una avería con los botones de la barra superior. En pantallas estrechas, desliza para verla entera.

Por qué un apagón

HappyRobot proponía inundaciones o incendios. Nos salimos de la lista: el apagón del año pasado lo teníamos muy fresco, y también lo que fallaron los servicios de emergencia.

HackSpain 2026 reunió a 250 desarrolladores y cinco startups en Madrid, organizado por Exponential. Elegimos el reto de HappyRobot: ¿puede una IA gestionar una crisis?

Siempre hay menos unidades que problemas

110-140 %

Es la demanda frente a la flota disponible en cada ejecución. Nunca hay para todos, así que el agente tiene que priorizar y explicar por qué.

Hospital sin luz

Diésel para los generadores

No aguanta más de 8 minutos sin red.

Semáforos apagados

Policía para dirigir el tráfico

Si no, nada de lo que mandamos llega.

Soporte vital en casa

Generador portátil a domicilio

Llama alguien: un familiar depende de una máquina.

Torre de teleco

Generador, ya

Sin baterías, el agente se queda sin teléfono.

Detrás hay dos grafos: uno de topología, con qué hospitales, centrales y torres dependen de cada subestación, y otro de soluciones, con sus reglas y sus pesos. Cada ejecución sortea una crisis distinta a partir de una semilla, así que nada está guionizado.

Dos horas de crisis, comprimidas en minutos

El dashboard en plena crisis: subestaciones que caen, hospitales sin luz y unidades enrutadas por las calles de verdad.

Dashboard de SwarmUp en plena crisis: lista de 53 emplazamientos con 18 críticos, mapa de Getafe con unidades en tránsito, feed del agente con llamadas aceptadas y replanificaciones, y la flota en la parte inferior.
A la izquierda, los emplazamientos ordenados por criticidad. En el centro, el mapa con cada unidad y su ruta. A la derecha, el feed del agente con decisiones, llamadas y replanificaciones. Abajo, la flota: cuadrillas, cisternas, generadores y policía.

Cómo piensa el agente

Cada tick pasa por tres capas. Lo barato y determinista va primero; el modelo solo entra cuando hace falta pensar.

  1. Reglas, en torno a 1 ms

    Detecta

    Filtra el ruido y calcula prioridades. Solo despierta al LLM si algo cambia de verdad: un umbral cruzado, una llegada que falla o una llamada rechazada.

  2. LLM, de 8 a 20 s

    Decide

    Recibe el mundo, las reglas, la topología y los incidentes parecidos. Devuelve un plan estructurado: qué descarta, qué hace y a quién llama.

  3. Reglas duras

    Actúa

    Las reglas vetan lo que rompe una restricción y le devuelven el motivo al modelo. Lo que pasa el filtro se ejecuta: unidades en marcha y llamadas.

El LLM propone, las reglas mandan.

Nunca se congela

Si el modelo no responde a tiempo, un playbook de contingencia toma el mando y la simulación sigue.

Aprende de cada crisis

Cada incidente resuelto se guarda en Chroma y se recupera en la siguiente deliberación. El agente cita los incidentes pasados que ha usado.

Un humano siempre al lado

Desde la consola, un operador puede inyectar eventos, pausar o corregir el plan en cualquier momento.

Y llama por teléfono de verdad

Las decisiones no se quedan en la pantalla. El agente llama a los responsables con HappyRobot, sin guion fijo, y lo que contestan cambia el plan.

Llamada real, 1 minuto, hospital El Bercial

El Bercial está sin red. Enviamos el generador, con llegada en unos cinco minutos. ¿Lo aceptan?

Lo acepto.

¿Cuántos minutos necesitan para activar el respaldo?

Diez.Registrado: 10 min para activar el respaldo

Confirma lo entendido, cuelga, resume la llamada y el resultado vuelve al agente. Si alguien dice «en media hora», entiende 30 minutos.

  1. El agente lanza la misión por webhook
  2. HappyRobot llama al contacto y sigue el promptUna cola reparte las llamadas entre un pool de contactos.
  3. La IA resume la llamada en un JSON
  4. Se envía a un Cloudflare Worker con Hono y D1Sin nube propia, el Worker hizo de micro backend de eventos.
  5. El backend lo lee y reaccionaUn no o un retraso disparan una replanificación.

El proveedor que nos indicó la organización no conectaba por SIP. El viernes de madrugada, conectamos un teléfono IP propio, apuntó el SIP trunk a HappyRobot y empezamos a hacer llamadas reales. La ventaja duró hasta que el resto de equipos se topó con lo mismo y la organización habilitó otro proveedor.

Hecho en un fin de semana, con tests

14.000líneas de TypeScript
162tests, todos en verde
83commits en 3 días, todo por PR
48 hde viernes a domingo
FrontendReact 19, Vite 8 y MapLibre GL, con unidades enrutadas por calles reales de OpenStreetMap
BackendExpress 4 y zod, monorepo TypeScript estricto sobre Node 24
LLMdeepseek-v4-flash vía Helmcode, con el SDK de OpenAI para poder cambiar de modelo
MemoriaChroma, con 72 incidentes curados más el cierre de cada ejecución
TelefoníaHappyRobot con cola de llamadas y balanceo por contacto
RetornoCloudflare Worker con Hono y D1
Calidadoxlint, 162 tests y CI en GitHub Actions