Skip to main content
Quando un agente usa più tool, può capitare di voler controllare l’utilizzo prima di chiamare il modello e registrare la risposta di ogni step. I middleware del Laravel AI SDK non avvolgono l’intero agente una sola volta: vengono eseguiti a ogni step della generazione. Basandosi sulla documentazione ufficiale di Laravel 13 e sull’implementazione di laravel/ai v1.3.0, questa pagina va un passo oltre le operazioni di base dell’AI SDK e mette in ordine la sequenza di esecuzione e le condizioni di arresto.

L’unità di esecuzione dei middleware

Quando l’agente riceve la risposta del modello, esegue i tool e poi chiama di nuovo il modello, la chiamata successiva costituisce uno step separato. Subito prima di ogni step, vengono attraversati i middleware restituiti da HasMiddleware::middleware() nell’ordine in cui sono dichiarati. Il PendingStep passato a handle(PendingStep $step, Closure $next) del middleware contiene l’array degli step già eseguiti steps, il loro utilizzo cumulativo usage e il numero dello step corrente a partire da zero number. Al primo step, usage non include ancora l’utilizzo della chiamata al modello in corso. Il then() agganciato al risultato di $next($step) viene eseguito dopo la risposta del modello e prima dell’esecuzione delle chiamate ai tool. Non è un hook chiamato solo dopo l’esecuzione dei tool. Inoltre, usage in quel momento è la somma degli step completati in precedenza e non stima il numero di token della richiesta in corso.

Registrare l’elaborazione per ogni step

Ecco un esempio che registra nel log solo il numero dello step e i token di input usati fino a quel momento. Evita di salvare incondizionatamente nel log il testo del prompt o l’output del modello.
Implementa HasMiddleware nell’agente e restituisci le istanze da middleware().
Nell’ordine di middleware(), metti Stop per primo. Se il limite viene superato e lo step successivo non viene avviato, il LogAgentSteps che segue non viene eseguito per quello step. Invertendo l’ordine, può succedere che nel log venga registrato solo l‘“inizio” e non “il modello ha risposto”. Restituisci da handle() il risultato di $next($step); la callback di then() non deve restituire la risposta.

Stop blocca la chiamata successiva al modello

Stop::when(...) termina l’elaborazione prima dello step quando la condizione diventa true, Stop::unless(...) quando la condizione diventa false. L’esempio sopra non esegue la chiamata successiva quando i token di input cumulativi degli step completati raggiungono o superano 50.000. Non è un limite rigido che interrompe forzatamente una singola chiamata al modello prima che superi la soglia.
Stop non interrompe una richiesta al provider già in corso. Se devi garantire rigorosamente un limite di utilizzo, non affidarti solo alla verifica dello step successivo e valuta anche i limiti lato modello o provider.
Un middleware che vuole fermarsi con una condizione personalizzata può anche restituire Laravel\Ai\Gateway\StepResult::stop(). Da handle() restituisci il risultato di $next($step), uno StepResponse oppure StepResult::stop(). Restituire un tipo diverso genera un’eccezione.

Verificare l’ordine di esecuzione

Per non confondere la risposta del modello con l’esecuzione dei tool, verifica almeno i casi seguenti.
  • In una generazione con un solo step, il log di inizio e quello di risposta del modello compaiono una volta ciascuno.
  • Negli step aggiuntivi che seguono i tool, il numero cresce a partire da 0 e lo usage degli step successivi include l’utilizzo degli step precedenti.
  • Se la condizione di arresto è soddisfatta fin dall’inizio, non avvengono né la chiamata al modello né i log di LogAgentSteps.
  • Se la condizione viene raggiunta a metà, gli step precedenti restano e la chiamata al modello per lo step successivo non avviene.
Separa il percorso normale da quello che si interrompe e controlla quante volte viene eseguito ogni step. Anche quando then() richiede effetti collaterali, progettalo presupponendo che non venga chiamato nei percorsi che falliscono o si fermano prima di ottenere la risposta del modello.

Fonti primarie consultate

Ultima modifica il 21 ottobre 2026