- El middleware de Genkit permite interceptar y modificar el ciclo de generación de IA mediante hooks de modelo, herramientas y flujo general.
- Incluye funcionalidades nativas para reintentos automáticos, fallback entre modelos, control de archivos y aprobación humana de herramientas.
- Es compatible con TypeScript, Go y Dart, facilitando la creación de capas de seguridad y observabilidad sin alterar la lógica de negocio.
Si te dedicas a montar aplicaciones con inteligencia artificial, sabrás que no todo es escribir el prompt perfecto. Cuando pasas de un prototipo a algo que realmente funciona en producción, te topas con muros como los errores temporales de la API, los límites de cuota o la necesidad de que un humano valide una acción crítica. Aquí es donde entra en juego Genkit Middleware, una solución de Google diseñada para que los desarrolladores puedan añadir capas de control sin tener que reescribir todo el código de sus agentes.
Básicamente, estamos hablando de un sistema de interceptores que se coloca alrededor de las llamadas de generación. En lugar de envolver cada función generate() en un bloque de control manual, puedes definir una serie de pasos que la petición debe atravesar. Esto permite que la arquitectura de tus agentes sea mucho más limpia y modular, separando la lógica de la aplicación de las preocupaciones transversales como la seguridad, la observabilidad y la resiliencia del sistema.
¿Cómo funciona exactamente el sistema de interceptación?

Para entenderlo bien, piensa en el ciclo de vida de una petición en Genkit. Normalmente, el modelo genera una respuesta, decide si necesita usar una herramienta, ejecuta dicha herramienta y vuelve a procesar el resultado. El middleware de Genkit no es un simple cuello de botella, sino que ofrece tres puntos de anclaje distintos para intervenir en este proceso:
- Hook de Generate: Se ejecuta una sola vez por cada ciclo de generación. Es el sitio ideal para inyectar instrucciones al sistema o modificar los mensajes antes de que empiecen a volar.
- Hook de Model: Envuelve la llamada directa a la API del modelo. Es fundamental para gestionar reintentos automáticos, implementar cachés o registrar cuánto tiempo tarda en responder el LLM.
- Hook de Tool: Actúa justo cuando se va a ejecutar una herramienta. Es perfecto para crear sistemas de aprobación donde un humano debe dar el visto bueno antes de que el agente borre un archivo o haga un pago.
Esta estructura se comporta de forma similar a los middlewares que vemos en frameworks como Express o Koa, funcionando como una especie de cebolla: la petición entra por la capa exterior, llega al centro (el modelo) y luego vuelve a salir atravesando las capas en orden inverso. Lo mejor es que puedes apilar varios middlewares en un array, definiendo así el orden exacto de ejecución.
Catálogo de middlewares preinstalados

Para que no tengamos que reinventar la rueda, el paquete @genkit-ai/middleware ya viene con varias herramientas listas para usar. Una de las más útiles es la de reintentos (retry), que utiliza un algoritmo de retroceso exponencial con jitter. Esto evita que saturemos la API cuando hay errores transitorios como RESOURCE_EXHAUSTED o UNAVAILABLE, haciendo que la aplicación sea mucho más robusta ante fallos momentáneos.
Si la cuota de tu modelo principal se agota, el middleware de fallback entra al rescate. Permite configurar una lista de modelos alternativos para que, si el primero falla, la petición pase automáticamente a uno más pequeño o barato, evitando que el usuario final vea un error. Es una estrategia vital para mantener la continuidad del servicio en entornos de alta demanda.
En cuanto a la seguridad, contamos con el middleware de aprobación de herramientas (toolApproval). Este sistema crea una lista blanca de herramientas seguras; cualquier acción que no esté en esa lista lanzará un ToolInterruptError, obligando al sistema a pausarse hasta que alguien confirme la acción. A esto se suma el middleware de filesystem, que concede al modelo acceso a archivos locales pero estrictamente limitados a un directorio raíz para evitar que la IA ande husmeando donde no debe.

Por último, tenemos la funcionalidad de skills. Este middleware escanea carpetas en busca de archivos SKILL.md y los inyecta en el prompt del sistema. Es una forma muy elegante de gestionar el conocimiento del agente, permitiendo que cargue habilidades específicas bajo demanda sin llenar el prompt principal de texto innecesario.
Creación de middleware personalizado

Cuando las opciones nativas no son suficientes, Genkit nos permite fabricar nuestros propios interceptores usando la función generateMiddleware. Esta herramienta nos permite definir esquemas de configuración mediante Zod, asegurando que los parámetros que pasemos sean correctos y estén tipados. Podemos crear desde simples loggers que registren cada entrada y salida, hasta sistemas complejos de redacción de datos sensibles (PII).
Un caso de uso muy potente sería implementar un filtro de contenido. Podrías crear un hook de modelo que analice la respuesta y, si detecta palabras prohibidas o datos internos de precios, bloquee la respuesta o la limpie antes de que llegue al usuario. También es posible gestionar cuotas por usuario consultando una base de datos en el hook de generación antes de permitir que la llamada proceda.
Diferencias entre implementaciones y ecosistema

Aunque el concepto es universal, hay matices según el lenguaje. En TypeScript, el sistema es muy dinámico y permite definir middlewares en archivos .prompt mediante el campo use. En Go, la implementación es más rígida debido a que es un lenguaje compilado, lo que ha requerido la creación de un registro de middleware para poder convertir nombres de texto en objetos funcionales durante la ejecución.
Es importante no confundir Genkit con el Agent Development Kit (ADK) de Google. Mientras que el ADK está pensado para sistemas multi-agente complejos y pesados sobre infraestructura de GCP, Genkit es la opción ideal para añadir capacidades agénticas a aplicaciones ya existentes (web, móvil, etc.). Además, todo el flujo de middleware se puede monitorizar desde la Genkit Developer UI, donde podemos trazar exactamente qué hook modificó la petición y cómo ha sido el camino hasta el resultado final.
La llegada de este sistema transforma la función de generación en una verdadera tubería composible. Al integrar la gestión de errores, la seguridad de los archivos y las validaciones humanas en una capa separada, el desarrollo de agentes se vuelve un proceso mucho más profesional y menos propenso a errores catastróficos en producción.