laravel/ai v1.3.0, cette page va un peu plus loin que les opérations de base de l’AI SDK et détaille l’ordre d’exécution et les conditions d’arrêt.
L’unité d’exécution des middlewares
Lorsqu’un agent reçoit la réponse du modèle, exécute des outils puis rappelle le modèle, ce nouvel appel au modèle constitue une étape distincte. Juste avant chaque étape, les middlewares retournés parHasMiddleware::middleware() sont traversés dans l’ordre de leur déclaration.
Le PendingStep transmis à la méthode handle(PendingStep $step, Closure $next) du middleware contient le tableau des étapes déjà exécutées steps, leur consommation cumulée usage et le numéro de l’étape courante number, qui commence à zéro. Lors de la première étape, usage n’inclut pas encore la consommation de l’appel au modèle en cours.
Le then() chaîné au résultat de $next($step) s’exécute après la réponse du modèle et avant l’exécution des appels d’outils. Ce n’est pas un hook appelé uniquement après l’exécution des outils. De plus, à ce stade, usage correspond au total des étapes précédemment terminées et ne prédit pas le nombre de tokens de la requête en cours.
Enregistrer un traitement pour chaque étape
Voici un exemple qui journalise uniquement le numéro de l’étape et le nombre de tokens d’entrée consommés jusque-là. Évitez d’enregistrer systématiquement le texte du prompt ou la sortie du modèle dans les logs.HasMiddleware à l’agent et retournez les instances depuis middleware().
middleware(), placez Stop en premier. Si la limite est dépassée et que l’étape suivante n’est pas lancée, le LogAgentSteps qui suit n’est pas exécuté pour cette étape. Si vous inversez l’ordre, seul le log de « démarrage » peut être enregistré, sans le log « le modèle a répondu ». Retournez le résultat de $next($step) depuis handle() ; le callback de then() n’a pas besoin de retourner la réponse.
Stop empêche l’appel suivant au modèle
Stop::when(...) termine le traitement avant l’étape lorsque la condition devient vraie, et Stop::unless(...) lorsque la condition devient fausse. Dans l’exemple ci-dessus, l’appel suivant n’est pas effectué dès que le cumul des tokens d’entrée des étapes terminées atteint 50 000 ou plus. Il ne s’agit pas d’une limite stricte qui interromprait de force un appel au modèle avant qu’il ne dépasse le seuil.
Un middleware qui souhaite s’arrêter selon sa propre condition peut aussi retourner
Laravel\Ai\Gateway\StepResult::stop(). Depuis handle(), retournez le résultat de $next($step), un StepResponse ou StepResult::stop(). Retourner un type sans rapport lève une exception.
Vérifier l’ordre d’exécution
Pour ne pas confondre réponse du modèle et exécution des outils, vérifiez au minimum les cas suivants.- Pour une génération en une seule étape, le log de démarrage et le log de réponse du modèle apparaissent une fois chacun.
- Pour les étapes supplémentaires qui suivent un outil, le numéro augmente à partir de 0, et le
usagedes étapes suivantes inclut la consommation des étapes précédentes. - Si la condition d’arrêt est remplie dès le départ, ni l’appel au modèle ni les logs de
LogAgentStepsne se produisent. - Si la condition est atteinte en cours de route, les étapes précédentes sont conservées et l’appel au modèle de l’étape suivante n’a pas lieu.
then() doit produire des effets de bord, concevez-le en partant du principe qu’il n’est pas appelé sur les chemins qui échouent ou s’arrêtent avant d’obtenir la réponse du modèle.
Sources primaires consultées
- Documentation officielle de Laravel 13 : les middlewares de l’AI SDK
- Laravel AI SDK v1.3.0 : les valeurs de PendingStep
- Laravel AI SDK v1.3.0 : la boucle de génération et l’ordre d’exécution des middlewares
- Laravel AI SDK v1.3.0 : StepResult::stop() et then()
- Laravel AI SDK v1.3.0 : le middleware Stop
- Laravel AI SDK v1.3.0 : les tests d’arrêt d’étape