Laravel AI SDK erreicht Version 1.0.0 nach Monaten in der Beta-Phase. Das offizielle Paket vereint OpenAI, Anthropic, Gemini und weitere Anbieter über eine Schnittstelle. Installation: `composer require laravel/ai`.

terminal
composer require laravel/ai

Die Klassifizierung mit TypeSafes Jev-Modell ist die Hauptneuheit. Jev liefert schnelle, kostengünstige Ja-Nein- und Auswahlentscheidungen: ein Support-Ticket erhält `is_urgent` und wird zu `billing`, `technical` oder `sales` geroutet. Für einzelne binäre Fragen gibt es `Str::of($message)->decide('Is this spam?');`. TypeSafe und OpenRouter funktionieren heute; weitere Anbieter nutzen dieselbe Schnittstelle.

Streaming spricht nun Vercel Chat und AG-UI direkt an. Eine Route mit `Vercel::chat($request)`, `withMessages()` und `stream()` lädt den Gesprächsverlauf, speichert ihn und verarbeitet ausstehende Tool-Freigaben. AG-UI-Clients wie CopilotKit nutzen `usingAgentUserInteractionProtocol()`.

Riskante Tools fordern menschliche Freigabe. Eine Klasse `DeleteFile` implementiert `Approvable` und `Tool` mit `InteractsWithApprovals`. Freigabe erteilen, mit für das Modell sichtbarer Begründung ablehnen oder Argumente vor der Ausführung ändern.

Weitere 1.0-Additions: Middleware läuft bei jedem Generierungsschritt (nicht nur einmal); `ToolSearch` lädt selten gebrauchte Tools bei Bedarf auf OpenAI und Anthropic; `CodeExecution` führt Code in Sandboxes von Anthropic, OpenAI, Azure, Gemini und xAI aus. Der Gesprächsverlauf zieht in eine `steps`-Spalte um—Apps, die alte Spalten abfragen, brauchen eine Migration.

Laravel Boost vereinfacht das Update: `composer require laravel/boost --dev`, dann `php artisan boost:install`, danach `/upgrade-ai-sdk-v1` in Claude Code oder Cursor ausführen.

Laravel 13.33 bringt kleinere, praktische Verbesserungen. `Cache::memo()` akzeptiert nun `tags`, sodass Memo-Lesevorgänge innerhalb einer Anfrage getaggt bleiben: `Cache::memo()->tags(['permissions'])->get(...)`. Wiederholte Berechtigungs- oder Konfigurationsabfragen vermeiden zusätzliche Redis-Zugriffe.

Das Attribut `#[Refreshes]` verwaltet von der Datenbank berechnete Spalten. Markiere `#[Refreshes('net_salary')]` bei einem Modell, wo `net_salary` aus `base_salary + allowance - deduction` per gespeicherter Formel entsteht. Nach dem Anlegen oder Speichern fragt Laravel diese Spalte ab und aktualisiert das Modellobjekt. Mehrere Spalten: `#[Refreshes('net_salary', 'tax_status')]`. Jeder Speichervorgang kostet eine kleine Abfrage (`select net_salary from employees where id = ? limit 1`). Für selten benötigte Aktualisierungen bleibt manuelles `refresh()` sinnvoll.

`AsCollection::nullable()` und `AsArrayObject::nullable()` speichern nun echtes SQL NULL statt der Zeichenkette "null", sodass `whereNull()` sie findet. Die Modifizierer `inplace()` und `lock()` fordern `ALGORITHM=INPLACE` und `LOCK=NONE` bei Index- und Fremdschlüsselmigrationen auf großen MySQL-Tabellen. Form-Request-Attribute wie `#[StopOnFirstFailure]` erben von Basisklassen. `Worker::$killOnTimeout = false` erlaubt einem abgelaufenen Job, eine Exception auszulösen und aufzuräumen, ohne den Worker zu beenden. `mockArtisan()` und `realArtisan()` trennen simulierte von echten Befehlsausführungen, ohne `$mockConsoleOutput` umzuschalten.