laravel/ai in v1.3.0 geht diese Seite einen Schritt über die Grundlagen des AI SDK hinaus und ordnet Ausführungsreihenfolge und Abbruchbedingungen ein.
In welcher Einheit Middleware ausgeführt wird
Wenn ein Agent eine Modellantwort erhält, ein Tool ausführt und das Modell erneut aufruft, ist der nächste Modellaufruf ein eigener Schritt. Unmittelbar vor jedem Schritt durchläuft die Anfrage die vonHasMiddleware::middleware() zurückgegebene Middleware in der deklarierten Reihenfolge.
Das PendingStep, das an handle(PendingStep $step, Closure $next) der Middleware übergeben wird, enthält das Array der bereits ausgeführten Schritte steps, deren kumulierten Verbrauch usage und die nullbasierte Nummer des aktuellen Schritts number. Beim ersten Mal enthält usage den Verbrauch des aktuellen Modellaufrufs noch nicht.
Ein an das Ergebnis von $next($step) angehängtes then() läuft, nachdem das Modell geantwortet hat und bevor Tool-Aufrufe ausgeführt werden. Es ist kein Hook, der erst nach der Tool-Ausführung aufgerufen wird. Außerdem ist usage zu diesem Zeitpunkt die Summe der zuvor abgeschlossenen Schritte und sagt nicht die Tokenanzahl der laufenden Anfrage voraus.
Verarbeitung pro Schritt registrieren
Dieses Beispiel protokolliert nur die Schrittnummer und die Anzahl der bis dahin verbrauchten Eingabetokens. Speichern Sie Prompt-Texte oder Modellausgaben nicht bedingungslos im Log.HasMiddleware und geben Sie die Instanzen aus middleware() zurück.
Stop in der Reihenfolge von middleware() zuerst. Wenn das Limit überschritten ist und der nächste Schritt nicht gestartet wird, wird das nachfolgende LogAgentSteps in diesem Schritt nicht ausgeführt. Bei umgekehrter Reihenfolge kann es passieren, dass nur der „Start“ protokolliert wird, „Modell hat geantwortet“ aber nicht. Geben Sie das Ergebnis von $next($step) aus handle() zurück. Im Callback von then() müssen Sie keine Antwort zurückgeben.
Stop verhindert den nächsten Modellaufruf
Stop::when(...) beendet die Verarbeitung vor dem jeweiligen Schritt, wenn die Bedingung true wird, Stop::unless(...), wenn sie false wird. Im obigen Beispiel erfolgt kein weiterer Aufruf mehr, sobald die kumulierten Eingabetokens der abgeschlossenen Schritte 50.000 oder mehr betragen. Es handelt sich nicht um ein hartes Limit, das einen einzelnen Modellaufruf erzwungen abbricht, bevor er den Schwellenwert überschreitet.
Middleware, die nach eigenen Bedingungen anhalten soll, kann auch
Laravel\Ai\Gateway\StepResult::stop() zurückgeben. Aus handle() geben Sie das Ergebnis von $next($step), ein StepResponse oder StepResult::stop() zurück. Die Rückgabe eines anderen Typs löst eine Exception aus.
Ausführungsreihenfolge überprüfen
Damit Sie Modellantwort und Tool-Ausführung nicht verwechseln, prüfen Sie mindestens die folgenden Fälle:- Bei einer Generierung mit nur einem Schritt erscheinen Start-Log und Modellantwort-Log jeweils einmal.
- Bei weiteren Schritten nach einem Tool steigt die Nummer ab 0 an, und
usageder nachfolgenden Schritte enthält den Verbrauch der vorherigen Schritte. - Ist die Abbruchbedingung von Anfang an erfüllt, erfolgen weder ein Modellaufruf noch Logs von
LogAgentSteps. - Wird die Bedingung zwischendurch erreicht, bleiben die bisherigen Schritte erhalten, und der Modellaufruf des nächsten Schritts findet nicht statt.
then() Seiteneffekte benötigt, gehen Sie bei Ihrem Design davon aus, dass es in Pfaden, die vor Erhalt einer Modellantwort fehlschlagen oder anhalten, nicht aufgerufen wird.
Verwendete Primärquellen
- Offizielle Laravel-13-Dokumentation: Middleware im AI SDK
- Laravel AI SDK v1.3.0: Werte von PendingStep
- Laravel AI SDK v1.3.0: Generierungsschleife und Ausführungsreihenfolge der Middleware
- Laravel AI SDK v1.3.0: StepResult::stop() und then()
- Laravel AI SDK v1.3.0: Stop-Middleware
- Laravel AI SDK v1.3.0: Tests zum Anhalten von Schritten