laravel/ai v1.3.0, esta página va un paso más allá de las operaciones básicas del AI SDK y organiza el orden de ejecución y las condiciones de detención.
La unidad en la que se ejecuta el middleware
Cuando el agente recibe la respuesta del modelo, ejecuta herramientas y vuelve a llamar al modelo, la siguiente llamada al modelo es un paso distinto. Justo antes de cada paso, se pasa por el middleware devuelto enHasMiddleware::middleware() en el orden en que se declaró.
El PendingStep que se pasa a handle(PendingStep $step, Closure $next) del middleware contiene el array de pasos ya ejecutados steps, su uso acumulado usage y el número del paso actual, empezando en cero, number. En el primer paso, usage todavía no incluye el uso de la llamada al modelo actual.
El then() encadenado al resultado de $next($step) se ejecuta después de que el modelo responda y antes de que se ejecuten las llamadas a herramientas. No es un hook que se llame solo después de ejecutar las herramientas. Además, el usage en ese momento es la suma de los pasos completados anteriormente y no predice el número de tokens de la petición en curso.
Registrar procesamiento por paso
Este ejemplo solo registra en el log el número de paso y el número de tokens de entrada utilizados hasta el momento. Evita guardar sin condiciones el texto del prompt o la salida del modelo en los logs.HasMiddleware en el agente y devuelve las instancias desde middleware().
middleware(), coloca Stop primero. Cuando se supera el límite y no se inicia el siguiente paso, el LogAgentSteps posterior no se ejecuta en ese paso. Si inviertes el orden, puede que solo se registre el “inicio” en el log y no “el modelo respondió”. Devuelve el resultado de $next($step) desde handle(); el callback de then() no necesita devolver la respuesta.
Stop detiene la siguiente llamada al modelo
Stop::when(...) termina el procesamiento antes de ese paso cuando la condición es true, y Stop::unless(...) cuando la condición es false. El ejemplo anterior no realiza la siguiente llamada cuando los tokens de entrada acumulados de los pasos completados llegan a 50,000 o más. No es un límite estricto que detenga a la fuerza una llamada al modelo antes de que supere el umbral.
Un middleware que quiera detenerse con una condición propia también puede devolver
Laravel\Ai\Gateway\StepResult::stop(). Desde handle() se devuelve el resultado de $next($step), un StepResponse o StepResult::stop(). Devolver un tipo no relacionado provoca una excepción.
Verificar el orden de ejecución
Para no confundir la respuesta del modelo con la ejecución de herramientas, comprueba al menos los siguientes casos.- En una generación de un solo paso, el log de inicio y el log de respuesta del modelo aparecen una vez cada uno.
- En los pasos adicionales que siguen a una herramienta, el número aumenta desde 0 y el
usagede los pasos posteriores incluye el uso de los pasos anteriores. - Si la condición de detención se cumple desde el principio, no se producen ni la llamada al modelo ni los logs de
LogAgentSteps. - Si la condición se alcanza a mitad de camino, los pasos anteriores se conservan y no se produce la llamada al modelo del siguiente paso.
then() necesite efectos secundarios, diséñalo partiendo de que no se llamará en las rutas que fallan o se detienen antes de obtener la respuesta del modelo.
Fuentes primarias consultadas
- Documentación oficial de Laravel 13: middleware del AI SDK
- Laravel AI SDK v1.3.0: valores de PendingStep
- Laravel AI SDK v1.3.0: bucle de generación · orden de ejecución del middleware
- Laravel AI SDK v1.3.0: StepResult::stop() y then()
- Laravel AI SDK v1.3.0: middleware Stop
- Laravel AI SDK v1.3.0: pruebas de detención de pasos