Qué es un Middleware
Un middleware es un componente que se interpone entre los pasos de ejecución de un agente, permitiendo interceptar y modificar el flujo de datos. Esta arquitectura proporciona control granular sobre el comportamiento del agente sin necesidad de modificar su lógica central.
Los middlewares resultan útiles para implementar funcionalidades transversales como:
- Gestión del historial: Resumir o recortar conversaciones largas
- Resiliencia: Configurar fallbacks cuando un modelo falla
- Guardrails: Aplicar validaciones de entrada y salida
- Observabilidad: Añadir logging, métricas y trazabilidad
El ciclo de vida del agente
Para entender cómo funcionan los middlewares, es necesario conocer el bucle de ejecución de un agente. El flujo básico sigue estos pasos:
[Inicio] → [Llamada al modelo] → [Ejecución de herramientas] → [Llamada al modelo] → ... → [Fin]
Los middlewares pueden engancharse (hook) en diferentes puntos de este ciclo:
before_agent: Se ejecuta una vez al iniciar la invocaciónbefore_model: Se ejecuta antes de cada llamada al modeloafter_model: Se ejecuta después de cada respuesta del modeloafter_agent: Se ejecuta una vez al finalizar la invocación
Esta arquitectura permite encadenar múltiples middlewares que se ejecutan en secuencia, donde cada uno puede modificar el estado antes de pasarlo al siguiente.
Añadir middlewares a un agente
Para utilizar middlewares, se pasan como una lista al parámetro middleware de create_agent:
from langchain.agents import create_agent
from langchain.agents.middleware import SummarizationMiddleware
agent = create_agent(
model="gpt-5",
tools=[...],
middleware=[
SummarizationMiddleware(...)
]
)
Cuando se configuran varios middlewares, se ejecutan en orden para los hooks "before" y en orden inverso para los hooks "after". Esto garantiza que el último middleware en procesar la entrada sea el primero en procesar la salida.
SummarizationMiddleware
El SummarizationMiddleware gestiona automáticamente el tamaño del historial de conversación. Cuando la conversación supera un límite de tokens, resume los mensajes antiguos y los reemplaza por un resumen compacto.
Este middleware es especialmente útil en:
- Conversaciones largas que pueden exceder la ventana de contexto del modelo
- Diálogos multi-turno con historial extenso
- Aplicaciones donde preservar el contexto completo es importante
Configuración básica
from langchain.agents import create_agent
from langchain.agents.middleware import SummarizationMiddleware
agent = create_agent(
model="gpt-5",
tools=[weather_tool, calculator_tool],
middleware=[
SummarizationMiddleware(
model="gpt-4o-mini",
trigger={"tokens": 4000},
keep={"messages": 20}
)
]
)
Los parámetros principales son:
- model: Modelo a utilizar para generar el resumen. Puede ser diferente al modelo principal del agente, lo que permite usar un modelo más económico para esta tarea
- trigger: Condición que activa la resumización. En este caso, cuando el historial supera los 4000 tokens
- keep: Número de mensajes recientes que se mantienen sin resumir
Funcionamiento interno
Cuando la conversación alcanza el umbral configurado, el middleware ejecuta automáticamente estas acciones:
- 1. Identifica los mensajes que superan el límite
- 2. Genera un resumen utilizando el modelo configurado
- 3. Reemplaza los mensajes antiguos con un mensaje de resumen
- 4. Mantiene los mensajes recientes intactos
A diferencia de un simple recorte de mensajes, la resumización actualiza permanentemente el estado. Los turnos futuros verán el resumen en lugar de los mensajes originales, lo que preserva el contexto sin consumir tokens innecesarios.
# Ejemplo de conversación antes de resumir
# [msg1, msg2, msg3, ..., msg50, msg51, msg52]
# Después de resumir (keep=20)
# [resumen_msg1_a_msg32, msg33, msg34, ..., msg52]
ModelFallbackMiddleware
El ModelFallbackMiddleware proporciona resiliencia automática cuando el modelo principal falla. Configura una cadena de modelos alternativos que se prueban en secuencia hasta que uno responde correctamente.
Este middleware resulta útil para:
- Construir agentes resilientes que soporten caídas de servicio
- Optimización de costes usando modelos más baratos como fallback
- Redundancia entre proveedores (OpenAI, Anthropic, Google, etc.)
Configuración básica
from langchain.agents import create_agent
from langchain.agents.middleware import ModelFallbackMiddleware
agent = create_agent(
model="gpt-5",
tools=[...],
middleware=[
ModelFallbackMiddleware(
"gpt-4o-mini",
"claude-sonnet-4-20250514"
)
]
)
En este ejemplo, si gpt-5 falla, el middleware intentará automáticamente con gpt-4o-mini. Si este también falla, probará con claude-sonnet-4-20250514.
Estrategias de fallback
El orden de los modelos en la configuración define la prioridad de fallback. Puedes diseñar diferentes estrategias según tus necesidades:
Estrategia por coste:
ModelFallbackMiddleware(
"gpt-4o-mini", # Modelo económico primero
"gpt-5" # Modelo premium como respaldo
)
Estrategia por proveedor:
ModelFallbackMiddleware(
"gpt-4o", # OpenAI como respaldo
"claude-sonnet-4-20250514" # Anthropic como segundo respaldo
)
El middleware captura errores de conexión, timeouts y respuestas de error del proveedor. Cuando detecta un fallo, registra el error internamente y reintenta con el siguiente modelo de la lista sin interrumpir la experiencia del usuario.
Combinar múltiples middlewares
Los middlewares se pueden componer para crear comportamientos complejos. Cada middleware se centra en una responsabilidad específica y la combinación produce el efecto deseado:
from langchain.agents import create_agent
from langchain.agents.middleware import (
SummarizationMiddleware,
ModelFallbackMiddleware
)
agent = create_agent(
model="gpt-5",
tools=[search_tool, calculator_tool],
middleware=[
SummarizationMiddleware(
model="gpt-4o-mini",
trigger={"tokens": 3000},
keep={"messages": 15}
),
ModelFallbackMiddleware(
"gpt-4o-mini",
"claude-sonnet-4-20250514"
)
]
)
En esta configuración:
- El
SummarizationMiddlewaremantiene el historial bajo control - El
ModelFallbackMiddlewaregarantiza la disponibilidad del servicio
El orden de los middlewares en la lista importa. Los hooks before_model se ejecutan en el orden definido (primero resumización, luego fallback), mientras que los hooks after_model se ejecutan en orden inverso.
Esta arquitectura modular permite añadir o quitar funcionalidades sin modificar la lógica del agente, facilitando el mantenimiento y la evolución de aplicaciones basadas en agentes.
Otros middleware
Hemos comentado dos middleware que proporciona LangChain de manera nativa, pero no son los únicos, existen otros:
- HumanInTheLoopMiddleware: Añade supervisión humana a las llamadas de herramientas del agente, pausando la ejecución hasta recibir una decisión de aprobación, edición o rechazo.
- ModelCallLimitMiddleware: Limita el número de llamadas al modelo por ejecución de agente para controlar costes y evitar bucles excesivos.
- ToolCallLimitMiddleware: Restringe la cantidad de ejecuciones de herramientas por conversación, cortando flujos que hacen un uso desmedido de tools.
- PIIMiddleware: Detecta y trata información personal sensible (PII) antes de enviarla al modelo, aplicando redacción o bloqueo según la política definida.
- LLMToolEmulator: Emula la salida de herramientas utilizando un modelo de lenguaje, útil para pruebas sin tocar sistemas externos reales.
- LLMToolSelectorMiddleware: Utiliza un modelo de lenguaje para seleccionar dinámicamente qué subconjunto de herramientas es relevante antes de cada llamada al modelo principal.
- TodoListMiddleware: Proporciona al agente una lista de tareas interna para planificar, desglosar y hacer seguimiento de subtareas durante la ejecución.
- ModelRetryMiddleware: Reintenta automáticamente llamadas al modelo que fallan por errores transitorios, aplicando lógica de reintentos configurable.
- ToolRetryMiddleware: Reintenta ejecuciones de herramientas que devuelven errores recuperables, reduciendo fallos por incidencias puntuales en servicios externos.
- ContextEditingMiddleware / ClearToolUsesEdit: Permiten editar el contexto de la conversación, por ejemplo limpiando usos antiguos de herramientas que ya no aportan información relevante.
- ShellToolMiddleware / HostExecutionPolicy: Controlan cómo se ejecutan comandos de shell desde el agente, definiendo políticas de seguridad sobre qué operaciones y hosts están permitidos.
- FilesystemFileSearchMiddleware: Gestiona el acceso del agente al sistema de archivos, permitiendo buscar y limitar qué ficheros pueden leerse o utilizarse como contexto.
Fuentes y referencias
Documentación oficial y recursos externos para profundizar en LangChain
Documentación oficial de LangChain
Alan Sastre
Ingeniero de Software y formador, CEO en CertiDevs
Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, LangChain es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.
Más tutoriales de LangChain
Explora más contenido relacionado con LangChain y continúa aprendiendo con nuestros tutoriales gratuitos.
Aprendizajes de esta lección
Comprender qué son los middlewares y su propósito, usar middlewares built-in para casos comunes, implementar gestión de historial y resiliencia, aplicar guardrails y validaciones, y entender cómo los middlewares se integran en el ciclo de vida del agente.
Cursos que incluyen esta lección
Esta lección forma parte de los siguientes cursos estructurados con rutas de aprendizaje