Presentazione di Laravel PAO: output più pulito per gli agenti AI | Laravel - Lo stack pulito per Artisans e agenti
Gli sviluppatori PHP e Laravel ripetono lo stesso ciclo di feedback tutto il giorno: test, correzione, analisi, refactoring e di nuovo test. Gli strumenti di questo ciclo producono un output pensato per i terminali umani: colori ANSI, dot leader e tabelle decorate. Un output del genere va bene quando lo leggi tu, ma diventa rumoroso quando lo legge un agente.
Per un agente, lo stesso output può nascondere le parti che contano: l'asserzione fallita, il percorso del file, il numero di riga, l'identificatore PHPStan, il diff di Rector.
Laravel PAO (PHP agent-optimized output) risolve questo problema. Rileva quando gli strumenti PHP supportati vengono eseguiti da un agente AI, come Claude Code, Cursor, Devin, Gemini CLI o altri. Per gli strumenti di test e analisi, Laravel PAO restituisce JSON compatto e strutturato. Per i comandi Artisan, ripulisce l'output decorato della console, così gli agenti ricevono le stesse informazioni con meno rumore.
Da oggi, le nuove applicazioni Laravel includono PAO come dipendenza dev per impostazione predefinita.
Cosa cambia con Laravel PAO
Prendiamo una grande suite di test PHPUnit. Senza Laravel PAO, un agente riceve centinaia di caratteri di output di avanzamento prima di vedere se la suite è passata o fallita:
Con Laravel PAO, l'agente ottiene invece questo:
La differenza può sembrare piccola in un articolo, ma conta molto in una sessione con un agente. L'output resta compatto indipendentemente da quanti test superati hai.
Anche i fallimenti diventano più utili. Invece di chiedere all'agente di scavare nell'output formattato del terminale, PAO gli fornisce i dettagli di cui ha bisogno per continuare a lavorare:
L'agente sa cosa è fallito, dove è fallito e su quale messaggio deve ragionare in seguito.
PAO supporta gli strumenti che già usi
Attualmente Laravel PAO supporta PHPUnit, Pest, Paratest, PHPStan, Rector e l'output di Laravel Artisan.
Per PHPUnit, Pest e Paratest, PAO riporta risultati compatti: conteggi, durate, fallimenti, errori, test saltati, warning, notice e deprecazioni. L'output extra utile, come i riepiloghi di coverage o profiling, viene ripulito e incluso senza il rumore del terminale circostante.
L'output di PHPStan viene normalizzato in JSON che si concentra sul numero totale di errori e sui dettagli per file di cui gli agenti hanno bisogno per correggerli:
Anche l'output di Rector diventa più facile da usare per gli agenti, preservando i file modificati, i diff e i rector applicati in un formato strutturato.
L'obiettivo non è inventare un nuovo workflow. È rendere più facile per gli agenti seguire il workflow che gli sviluppatori Laravel già utilizzano.
Output Artisan più pulito
Per i comandi Artisan il risultato non è JSON. È lo stesso output del comando, ma con le decorazioni eliminate.
Comandi come about, db:show e migrate:status includono spesso tabelle decorate, dot leader, colori e spaziature. Questi dettagli rendono l'output piacevole per gli esseri umani, ma gli agenti non ne hanno bisogno.
Per esempio, un output come questo:
Diventa:
Stesse informazioni, meno token da elaborare per l'agente.
Il tuo terminale resta invariato
Questo punto è importante: Laravel PAO non cambia l'esperienza del terminale per te o per il tuo team.
Quando esegui phpunit, pest, phpstan, rector o artisan direttamente nel tuo terminale, l'output resta identico. PAO si attiva solo quando viene rilevato un agente. Così Laravel offre default migliori per lo sviluppo assistito dall'AI senza peggiorare il flusso di lavoro umano.
Come funziona PAO sotto il cofano
Laravel PAO non introduce un nuovo binario né ti chiede di eseguire un comando diverso. Si avvia tramite l'autoload dei file di Composer, che gli permette di essere eseguito all'inizio del processo PHP:
Quel file di autoload esce immediatamente, a meno che il processo corrente non sia in esecuzione all'interno di un ambiente per agenti:
Da lì, PAO esamina il comando in esecuzione e seleziona il driver corrispondente:
Per i test runner, PAO evita di fare scraping dell'output del terminale. PHPUnit, Paratest e Pest hanno già il risultato reale al loro interno. Per PHPUnit, PAO inietta l'opzione --no-output di PHPUnit. Per Pest e Paratest, PAO silenzia l'output di avanzamento e lascia che il runner venga eseguito normalmente.
Alla chiusura, PAO cattura il risultato dei test direttamente dalla facade dei risultati di PHPUnit e costruisce il JSON a partire dai dati reali del risultato:
Per Paratest, PAO utilizza un runner wrapper, così i risultati dei worker paralleli possono essere uniti prima che venga scritta la risposta finale.
Da lì, PAO estrae i campi che interessano agli agenti:
In questo modo PAO ottiene i conteggi reali, le asserzioni, la durata, i fallimenti, gli errori, i warning, le deprecazioni e le posizioni dei file senza dover fare reverse engineering del testo formattato.
Per PHPStan e Rector, PAO si affida alle modalità JSON native degli strumenti invece di analizzare il loro output destinato agli esseri umani:
PAO poi normalizza queste risposte nei campi di cui gli agenti hanno più bisogno. I dettagli degli errori PHPStan sono inoltre limitati per impostazione predefinita, con un suggerimento a passare -v quando serve la lista completa.
Al termine di un comando di test, analisi o refactoring, PAO scrive un singolo oggetto JSON sullo standard output. Qualsiasi output extra utile, come informazioni di coverage o profiling, viene ripulito e incluso senza la decorazione del terminale circostante.
Artisan segue un percorso diverso. Nelle applicazioni Laravel, il service provider di PAO viene scoperto automaticamente. Quando viene rilevato un agente, associa la OutputStyle della console di Laravel all'implementazione di PAO e disabilita la decorazione di Symfony Console all'avvio dei comandi:
I tuoi comandi Artisan continuano a usare le stesse API della console, mentre PAO ripulisce l'output al confine.
Disponibile per impostazione predefinita per offrire default migliori agli agenti AI
Le nuove applicazioni Laravel ora includono Laravel PAO automaticamente, quindi non c'è alcun file di configurazione da pubblicare e non serve alcuna configurazione.
Se vuoi aggiungere PAO a un'applicazione Laravel esistente o a un progetto PHP standalone, installalo con Composer:
PAO funziona con Laravel 12 e versioni successive e con PHP 8.3 e versioni successive, e può essere usato anche in progetti PHP non basati su Laravel che utilizzano gli strumenti supportati tramite l'autoloader di Composer.
Laravel si è sempre preoccupato dei dettagli che rendono lo sviluppo fluido: pagine di errore chiare, output di console espressivo, default ben pensati e strumenti che ti aiutano a restare concentrato.
Man mano che gli agenti entrano a far parte di questo flusso di lavoro, hanno bisogno dello stesso tipo di attenzione. Laravel PAO mantiene il terminale bello per gli esseri umani e rende l'output dei comandi più facile da comprendere, riassumere e utilizzare per gli agenti.
Puoi saperne di più su Laravel PAO su GitHub.
Altri articoli recenti
Laravel AI 1.1 e 1.2: Agent Skills, Cohere e structured output più solidi
Le release 1.1.0 e 1.2.0 di laravel/ai portano gli Agent Skills, l'approvazione obbligatoria per i tool built-in e nuovi provider come Cohere e Laya self-hosted. Sul fronte qualità arrivano i fix allo structured output per Bedrock e il supporto alle provider options. Aggiornati anche i modelli di default, con Claude 4.7+ che ignora i sampling params.
Laravel 13.35.0: scheduler più controllabile, code più flessibili e response Markdown
Laravel 13.35.0 porta Schedule::alwaysOnOneServer(), il supporto a schedule:interrupt per i comandi di lunga durata, --memory in percentuale per queue:work e il nuovo metodo markdown() sulla response factory. Tante piccole migliorie anche a test, view compilate in parallelo e dischi local.
BashBox: un interprete Bash in sandbox per agenti AI in PHP
BashBox è un interprete bash scritto in puro PHP che permette di eseguire gli script generati dagli agenti AI senza mai ricorrere a proc_open, exec o shell_exec. Ogni comando è una classe PHP che lavora su un filesystem virtuale, con limiti di esecuzione, quote disco e accesso di rete configurabili. Ideale per chi sviluppa agenti con il Laravel AI SDK o altre librerie simili.