En el artículo Turbocharging AI Agents with Symfonys Async Approach mostramos cómo acelerar un Agente de IA con una arquitectura asíncrona basada en message bus y CQRS. Ahora damos el siguiente paso para poner el agente en piloto automático: eliminar la intervención humana en el sondeo de canales de entrada y abrir la puerta a evoluciones realmente interesantes.
Antes hacíamos polling de un buzón IMAP sin persistir estado, lo que podía provocar reprocesamiento de correos. A propósito era un ejemplo simple. En esta versión añadimos gestión de estado sin base de datos relacional y sin Doctrine para poder ejecutar varias instancias en paralelo con consumidores multihilo, aprovechar mejor los recursos y garantizar un procesamiento fiable y continuo.
Filtrar solo mensajes UNSEEN no siempre resuelve el problema. Otro bot o una persona puede haber leído el buzón, un error previo puede haber interrumpido el flujo y además esa técnica solo aplica a IMAP, no a mensajería instantánea, SMS u otras fuentes. Por eso necesitamos guardar el estado del último sondeo exitoso de cada canal de entrada.
Evitar una base de datos completa ahora nos da simplicidad sin sacrificar robustez. Un archivo local podría almacenar el estado, pero rompería el despliegue sin estado al reiniciar contenedores y además complica el acceso concurrente con bloqueos de archivo. La alternativa idónea es usar Redis como almacén distribuido y compartido.
Si ya usamos Redis como transporte en Messenger, aprovecharlo también para el estado resulta natural. Redis es un almacenamiento clave valor distribuido, ideal para compartir un estado consistente entre múltiples instancias sin problemas de locking. Esto mantiene la aplicación escalable y realmente stateless.
Con el componente Cache de Symfony podemos crear pools dedicados que no se borran al ejecutar cache clear. Un pool específico para el estado, por ejemplo inbound.state.cache, aísla y protege estos datos de cualquier limpieza general. Además, podemos apuntar el proveedor por defecto a un Redis dedicado, incluso a una base lógica concreta como la 11, separando claramente los datos del estado de otros usos de Redis.
Por qué importa un pool separado: persistencia que sobrevive despliegues y operaciones de mantenimiento, e aislamiento para evitar que otras partes de la aplicación borren o modifiquen el estado por accidente. Al estar el estado fuera de los contenedores, múltiples instancias comparten la misma referencia temporal y de progreso, habilitando procesamiento en paralelo sin colisiones.
Cuando sea necesario reiniciar el ciclo, podemos limpiar solo ese pool con bin console cache:pool:clear inbound.state.cache sin afectar el resto de la caché de la aplicación.
Abstraer el estado por canal facilita escalar a múltiples fuentes. Definimos un DTO base ChannelState con las propiedades clave como lastMessageKey y lastMessageDate y extendemos con DTOs concretos, por ejemplo MailChannelState que añade email y folder. Así, mañana podemos añadir estados para SMS, mensajería o cualquier otro origen, manteniendo un contrato común.
Centralizamos el acceso al estado con un ChannelStateService que guarda y recupera desde el pool de caché. La clave de caché se compone de un prefijo, el nombre corto de la clase y un hash de los parámetros que identifican de forma única el canal, por ejemplo combinación de email y folder. Usar un hash produce claves compactas y únicas, evitando claves enormes y ambiguas al concatenar parámetros.
Actualizamos ImapMailService para exponer propiedades y métodos como protected y creamos ImapMailStateService que hereda la lógica de IMAP y la decora con persistencia de estado. El flujo típico es cargar el último estado, construir criterios de búsqueda tipo SINCE fecha, ordenar por llegada, limitar el lote, omitir mensajes ya procesados o anteriores, y guardar el estado con el mensaje más reciente del ciclo. El resultado es idempotencia, reintentos seguros y cero reprocesamientos innecesarios.
Registramos el nuevo servicio con sus argumentos de conexión y lo usamos desde los handlers sin cambiar el resto de la aplicación. Si en el futuro cambiamos de backend de caché, la adaptación se limita al servicio y a configuración.
Para poner el agente en piloto automático incorporamos Symfony Scheduler. Este componente permite definir tareas recurrentes con alta fiabilidad e integración nativa con Messenger e inyección de dependencias. Creamos una tarea que dispara un mensaje CheckInboundChannelsMessage según una expresión cron, por ejemplo cada minuto o a diario, y un handler que al recibirlo ejecuta ImapMailStateService, obtiene nuevos correos y lanza un comando a nuestro Agente de IA para resumir o clasificar.
Instalamos Symfony Scheduler y la librería de cron expressions, definimos un provider que añade una RecurringMessage al Schedule con la zona horaria deseada y un handler que orquesta el fetch y el posterior procesamiento. El transporte scheduler_default se crea automáticamente al usar el atributo AsSchedule.
Por último, arrancamos el consumer de Messenger con bin console messenger:consume --all -vv. Desde ese momento la aplicación sondea de forma autónoma, procesa en paralelo y no pierde ningún mensaje entrante, sin que nadie tenga que pulsar un botón.
Conclusión: a partir de una arquitectura asíncrona, añadimos persistencia de estado con Redis y pools de caché dedicados, y programamos el ciclo de sondeo con Symfony Scheduler. El resultado es un agente de IA realmente autónomo, escalable, sin estado y eficiente en recursos. El siguiente paso natural es contenerizar en Docker y desplegar tantas instancias como requiera la carga.
En Q2BSTUDIO llevamos esta estrategia un paso más allá combinando aplicaciones a medida, software a medida y agentes IA para empresas con prácticas de ciberseguridad de primer nivel y operaciones en servicios cloud AWS y Azure. Diseñamos arquitecturas que integran mensajería, caches distribuidas y orquestación de tareas para que tus procesos funcionen en piloto automático y con observabilidad end to end.
Si quieres aplicar automatización inteligente en tu organización, descubre cómo nuestras soluciones de inteligencia artificial e IA para empresas pueden impulsar tu operación, desde agentes IA que leen y resumen correos hasta pipelines que clasifican incidencias y enriquecen datos para servicios inteligencia de negocio y power bi.
También te ayudamos a estandarizar y escalar procesos con metodologías y herramientas probadas. Empieza con una evaluación y un plan de implementación de bajo riesgo en nuestra página de automatización de procesos y da el salto a operaciones guiadas por datos, resilientes y listas para crecer.
Palabras clave recomendadas para tu proyecto y posicionamiento: aplicaciones a medida, software a medida, inteligencia artificial, ia para empresas, agentes IA, ciberseguridad, servicios cloud aws y azure, servicios inteligencia de negocio, power bi.