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 daHasMiddleware::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.HasMiddleware nell’agente e restituisci le istanze da middleware().
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.
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
usagedegli 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.
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
- Documentazione ufficiale di Laravel 13: middleware dell’AI SDK
- Laravel AI SDK v1.3.0: valori di PendingStep
- Laravel AI SDK v1.3.0: loop di generazione e ordine di esecuzione dei middleware
- Laravel AI SDK v1.3.0: StepResult::stop() e then()
- Laravel AI SDK v1.3.0: middleware Stop
- Laravel AI SDK v1.3.0: test dell’arresto degli step