Einführung
Das Laravel AI SDK bietet eine einheitliche, ausdrucksstarke API für die Interaktion mit KI-Anbietern wie OpenAI, Anthropic und Gemini. Mit dem AI SDK realisieren Sie unter einer einheitlichen, Laravel-typischen Schnittstelle vielfältige KI-Funktionen: den Aufbau intelligenter Agenten mit Tools und strukturierter Ausgabe, Bildgenerierung, Sprachsynthese und Transkription sowie die Erzeugung von Vektor-Embeddings.Das Laravel AI SDK ist ein in Laravel 13 hinzugefügtes offizielles Paket. Es wird als
laravel/ai bereitgestellt und ermöglicht die Nutzung mehrerer KI-Anbieter über eine einheitliche API.Übersicht der unterstützten Anbieter
Installation
1
Paket installieren
Installieren Sie das Laravel AI SDK über Composer.
2
Konfigurationsdatei und Migrationen veröffentlichen
Veröffentlichen Sie die Konfigurationsdatei und die Migrationen mit dem Artisan-Befehl
vendor:publish.3
Migrationen ausführen
Führen Sie die Datenbank-Migrationen aus. Dabei werden die Tabellen
agent_conversations und agent_conversation_messages erstellt, die zum Speichern des Konversationsverlaufs dienen.Konfiguration
Umgebungsvariablen
Tragen Sie die API-Schlüssel der KI-Anbieter, die Sie verwenden möchten, in Ihre.env-Datei ein.
config/ai.php einstellen.
Benutzerdefinierte Basis-URL
Wenn Sie einen Proxy-Dienst verwenden, können Sie pro Anbieter eine eigene URL festlegen.OpenAI-kompatible Anbieter
Wenn Sie eine OpenAI-kompatible API verwenden — beispielsweise LM Studio, vLLM, Together, Fireworks oder ein lokales Gateway —, können Sie den Anbieter mit dem Treiberopenai-compatible konfigurieren. url ist erforderlich; ein angegebener key wird als Bearer-Token gesendet.
Lab-Enum
Um Anbieter im Code zu referenzieren, verwenden Sie dasLab-Enum.
Agenten
Agenten sind der grundlegende Baustein des Laravel AI SDK. Mit dem Befehlmake:agent erzeugen Sie eine Agentenklasse.
app/Ai/Agents/ abgelegt. Das folgende Beispiel zeigt einen Agenten, der alle wichtigen Interfaces implementiert.
Prompt
Mit der Methodeprompt() senden Sie eine Nachricht an den Agenten.
make() können Sie Abhängigkeiten über den Container auflösen und eine Instanz erzeugen.
prompt() überschreiben.
Konversationskontext
Indem Sie das InterfaceConversational implementieren und die Methode messages() definieren, geben Sie den bisherigen Konversationsverlauf an die KI weiter.
Mit dem Trait RemembersConversations speichern und laden Sie den Konversationsverlauf automatisch in der Datenbank.
forUser() beginnen Sie eine Konversation. Über die zurückgegebene conversationId können Sie mit continue() an derselben Konversation weiterarbeiten.
Strukturierte Ausgabe
Implementieren Sie das InterfaceHasStructuredOutput und definieren Sie in schema() ein JSON-Schema, um die Antwort der KI als strukturierte Daten zu erhalten.
Verschachtelte Objekte
Array von Objekten
anyOf (Auswahl aus mehreren Schemata)
Wenn ein Wert einem von mehreren Schemata entsprechen kann, verwenden Sie die MethodeanyOf.
Anhänge
Mit dem Argumentattachments übergeben Sie dem Agenten Dokumente oder Bilder.
Streaming
Mit der Methodestream() senden Sie die Antwort in Chunks zurück — ideal, um lange Antworten in Echtzeit an das Frontend zu übertragen.
then() beschreiben Sie die Verarbeitung nach Abschluss des Streamings.
Vercel-AI-SDK-Protokoll
Wenn Sie im Frontend das Vercel AI SDK verwenden, rufen SieusingVercelDataProtocol() auf.
Broadcasting
Die Events eines Streams können Sie an Broadcast-Kanäle wie Laravel Echo senden.broadcastOnQueue() können Sie das Broadcasting über eine Queue durchführen.
Große Events überspringen
Manche Broadcast-Plattformen beschränken WebSocket-Nachrichten auf etwa 10 KB. Stream-Events mit großen Datenmengen — etwa umfangreiche Tool-Ergebnisse — können diese Grenze überschreiten und beim Broadcasting scheitern. Mit dem AttributWithoutBroadcasting schließen Sie bestimmte Event-Typen vom Broadcasting aus.
agent_conversation_messages gespeichert. Dadurch kann das Frontend nach Abschluss des Streams sämtliche Tool-Daten abrufen. Dies funktioniert sowohl über Queue (broadcastOnQueue) als auch synchron (broadcast / broadcastNow).
Queue
Mit der Methodequeue() können Sie Prompts in einer Queue einreihen und asynchron verarbeiten.
Tools
Mit Tools ermöglichen Sie es der KI, Funktionen in Ihrem Code aufzurufen. Mit dem Befehlmake:tool erzeugen Sie eine Tool-Klasse.
tools() des Agenten.
Similarity-Search-Tool
Ein Ähnlichkeitssuche-Tool auf Basis von Vektor-Embeddings lässt sich einfach hinzufügen.withDescription() können Sie die Beschreibung des Tools anpassen.
File-Storage-Tools
Mit der Tool-FactoryFileStorage geben Sie einem Agenten Zugriff auf eine Filesystem-Disk von Laravel. Die Methode all liefert einen kompletten Satz an Tools zum Auflisten, Lesen, URL-Generieren, Schreiben, Löschen und Kopieren von Dateien auf der angegebenen Disk.
readOnly.
Illuminate\Support\Collection zurück, sodass Sie die bereitgestellten Tools weiter einschränken können.
MCP-Tools
Wenn Sie in Ihrer Anwendung Laravel MCP verwenden, können Sie Tools an Ihren Agenten weitergeben, die von einem Model-Context-Protocol-Server angeboten werden. Über den Laravel MCP-Client verbinden Sie sich mit einem entfernten oder lokalen MCP-Server und übergeben dessen Tools direkt an Ihren Agenten.Für die Nutzung von MCP-Tools muss das Paket Laravel MCP in Ihrer Anwendung installiert sein.
tools des MCP-Clients liefert eine Collection. Verwenden Sie den Spread-Operator ..., um sie in das tools-Array Ihres Agenten zu integrieren.
Anbieter-Tools
Dies sind spezielle Tools, die KI-Anbieter nativ implementieren.Websuche
Fügt eine Websuche zu Ihrem Agenten hinzu. Unterstützt werden Anthropic, OpenAI, Gemini und OpenRouter.Web-Fetch
Ein Tool, das den Inhalt einer angegebenen URL abruft. Unterstützt werden Anthropic und Gemini.Dateisuche
Ein Tool zum Suchen von Dokumenten in einem Vector Store. Unterstützt werden OpenAI und Gemini.FileSearchQuery angeben.
Sub-Agenten
Ein Agent kann auch aus dertools()-Methode eines anderen Agenten zurückgegeben werden. Wenn Sie einen Agenten als Tool registrieren, kann der übergeordnete Agent bestimmte Aufgaben an den Sub-Agenten delegieren und dessen Ergebnis in die eigene Antwort einbeziehen. Das ist praktisch, wenn ein generalistischer Agent auf spezialisierte Agenten mit eigenen Anweisungen, Tools, Modelleinstellungen oder Anbieter-Konfigurationen zugreifen soll.
Ein Kundensupport-Agent könnte etwa Fragen zur Rückerstattungsrichtlinie an einen spezialisierten Rückerstattungs-Agenten delegieren.
CanActAsTool und definieren einen Namen und eine Beschreibung für das Tool.
CanActAsTool nicht implementieren, verwendet Laravel den Klassennamen als Tool-Namen und erzeugt automatisch eine generische Beschreibung. Jeder Aufruf eines Sub-Agenten erfolgt unabhängig, ohne den Konversationsverlauf des übergeordneten Agenten zu übernehmen.
Middleware
Sie können Middleware zu einem Agenten hinzufügen, um Prompts und Antworten abzufangen.HasMiddleware und registrieren Sie die Middleware in der Methode middleware().
then() können Sie auch nachgelagerte Verarbeitung nach der Antwort hinzufügen.
Anonyme Agenten
Ohne eine Klasse zu definieren, können Sie mit dem Helperagent() einen anonymen Agenten verwenden.
Agentenkonfiguration (PHP-Attribute)
Die Standardkonfiguration eines Agenten lässt sich mit PHP-Attributen deklarativ festlegen.Provider-Optionen
Indem Sie das InterfaceHasProviderOptions implementieren, können Sie anbieterspezifische Optionen übergeben.
Freigabe durch den Menschen (Human Tool Approval)
Für Tools, die sensible oder nicht rückgängig zu machende Aktionen ausführen — etwa das Löschen von Dateien oder Überweisungen — können Sie vor der Ausführung eine menschliche Freigabe verlangen. Um ein Tool freigabepflichtig zu machen, implementieren Sie den ContractApprovable und verwenden den Trait InteractsWithApprovals. Freigabepflichtige Tools benötigen standardmäßig eine Freigabe.
needsApproval im Tool. Diese Methode kann einen Boolean oder eine Approval-Instanz mit einem Begründungsgrund zurückgeben.
tools-Methode des Agenten überschreiben.
pendingApprovals der Antwort können Sie ID, Toolname, Argumente und Freigabegrund jedes Tool-Aufrufs prüfen.
Decisions-Instanz, die eine Entscheidung für jeden ausstehenden Tool-Aufruf enthält. Mit einer Entscheidung lässt sich der Aufruf freigeben, ablehnen oder die Argumente vor der Ausführung bearbeiten.
true und false sind Kurzformen für Freigabe bzw. Ablehnung. Jeder ausstehende Tool-Aufruf muss eine Entscheidung erhalten. Wird eine unbekannte, fehlende oder bereits aufgelöste Tool-Aufruf-ID angegeben, wird eine ApprovalMismatchException geworfen. Mit den Methoden approveRemaining oder rejectRemaining können Sie eine Standardentscheidung für Aufrufe ohne explizite Entscheidung festlegen.
Decision::reject('Nicht freigegeben.') —, wird dieses an das Modell zurückgegeben und die Antwort wird fortgesetzt. Wird ohne Ergebnis abgelehnt, stoppt die Generierungsschleife an dem Punkt, an dem die Ablehnung protokolliert wurde.
Die Tool-Freigabe wird von den Methoden prompt, stream, queue, broadcast, broadcastNow und broadcastOnQueue unterstützt.
Während des Streamings und Broadcastings wird die Pause als tool_approval_request-Event dargestellt. Wenn Sie das Vercel-AI-SDK-Streaming-Protokoll verwenden, werden Freigabeanforderungen und -ergebnisse als native Tool-Approval-Parts des Protokolls emittiert.
Bei in die Queue eingereihten Agenten wird die resultierende Antwort an den then-Callback übergeben; zusätzlich dispatcht Laravel das Event ToolApprovalRequested.
Bevor Laravel das Modell zum Fortfahren auffordert, speichert es die Ergebnisse der freigegebenen Tool-Ausführung. Schlägt die Generierung anschließend fehl, sind die Freigaben bereits aufgelöst. Statt dieselben Entscheidungen erneut zu senden, setzen Sie die Konversation mit einem gewöhnlichen Text-Prompt fort.
Vollständiger Freigabe-Ablauf
Die folgenden Routen zeigen einen vollständigen Freigabe-Ablauf. DieGET-Route liefert die Chat-Ansicht, die POST-Route nimmt entweder eine neue Textnachricht aus der Chat-Ansicht oder eine Freigabeentscheidung entgegen. Dieses Beispiel setzt voraus, dass das User-Modell Ihrer Anwendung den Trait HasConversations verwendet.
awaiting_approval lautet, muss die Chat-Ansicht die ausstehenden Freigaben anzeigen und die Wahl des Nutzers mit der Tool-Aufruf-ID als Schlüssel an denselben Endpunkt zurücksenden.
message-Wert.
Bildgenerierung
Mit der KlasseImage können Sie Bilder generieren. Unterstützt werden OpenAI, Gemini und xAI.
Bild speichern
Bildgenerierung per Queue
Sprachsynthese (TTS)
Mit der KlasseAudio wandeln Sie Text in Sprache um. Unterstützt werden OpenAI und ElevenLabs.
Audio speichern
Sprachsynthese per Queue
Transkription (STT)
Mit der KlasseTranscription wandeln Sie Audiodateien in Text um. Unterstützt werden OpenAI, ElevenLabs und Mistral.
Sprechertrennung (Diarisierung)
Mitdiarize() erhalten Sie eine nach Sprechern getrennte Transkription.
Transkription per Queue
Textzusammenfassung (Text Summarization)
Mit der Methodesummarize der Laravel-Klasse Stringable können Sie Text zusammenfassen. Standardmäßig wird in maximal drei Sätzen zusammengefasst und dabei das günstigste Textmodell des konfigurierten Anbieters verwendet.
Str gibt es ebenfalls eine statische Variante.
Embeddings
Sie wandeln Text in eine Vektordarstellung um und nutzen diese etwa für Ähnlichkeitssuchen.Multimodale Embeddings
Die MethodeEmbeddings::for akzeptiert neben Strings auch Bilder, Audio, Dokumente und Videos als Eingabe und kann so auch für nicht-textuelle Inhalte Embeddings erzeugen. Gemini unterstützt Embeddings für Bilder, Audio, Dokumente und Videos; VoyageAI unterstützt Embeddings für Bilder und Videos.
VoyageAI erlaubt es nicht, Medien aus entfernten URLs und Base64-kodierte Medien innerhalb desselben Requests zu mischen. Lokale Dateien, Storage-Dateien und hochgeladene Dateien werden als Base64-kodierte Inhalte gesendet, während Texteingaben mit beiden Medienquellen kombiniert werden können. Prüfen Sie in der Dokumentation des jeweiligen Anbieters die verfügbaren multimodalen Modelle und Eingaben.
Vektorsuche (pgvector)
Ein Beispiel für die Konfiguration der Vektorsuche mit PostgreSQL und der pgvector-Erweiterung:1
Migration erstellen
2
Modell konfigurieren
3
Ähnlichkeitssuche
Embeddings zwischenspeichern
Sie können vermeiden, Embeddings für denselben Text mehrfach zu erzeugen, indem Sie das Ergebnis zwischenspeichern. Konfigurieren Sie die Standard-Cache-Einstellung inconfig/ai.php.
Reranking
Sie können Suchergebnisse nach Relevanz zur Anfrage neu anordnen. Unterstützt werden Cohere und Jina.limit() schränken Sie die Anzahl der zurückgegebenen Einträge ein.
Reranking von Collections
Sie können Eloquent-Collections direkt reranken.Dateiverwaltung
Sie können Dateien zum KI-Anbieter hochladen und später darauf zugreifen.Referenzierung gespeicherter Dateien
Sie hängen eine bereits hochgeladene Datei über ihre ID an einen Agenten an.Dateien abrufen und löschen
Anbieter angeben
Anbieterspezifische Optionen angeben
Mit der MethodewithProviderOptions übergeben Sie anbieterspezifische Upload-Optionen. So können Sie z. B. bei OpenAI den Datei-purpose setzen.
Vector Stores
Mit Vector Stores lassen sich Dokumente auf Anbieterseite verwalten.Dateien zum Store hinzufügen
Dateien aus dem Store entfernen
Failover
Wenn Sie mehrere Anbieter als Array angeben, wird bei Ausfall des ersten Anbieters automatisch auf den nächsten umgeschaltet.Tests
Das Laravel AI SDK stellt Fake-Funktionen für Tests bereit, sodass Sie testen können, ohne echte APIs anzusprechen.Agenten testen
preventStrayPrompts() wird eine Exception ausgelöst, wenn ein Prompt aufgerufen wird, der nicht im Fake definiert ist.
Wenn
fake() bei einem Agenten mit strukturierter Ausgabe ohne explizite Fake-Daten aufgerufen wird, generiert Laravel automatisch Fake-Daten, die dem definierten Schema entsprechen.AnonymousAgent::fake().
Bildgenerierung testen
Sprachsynthese testen
Transkription testen
Embeddings testen
Reranking testen
Dateien testen
Vector Stores testen
Events
Das Laravel AI SDK dispatcht die folgenden Events. Über das Abonnieren dieser Events können Sie Logging und Monitoring realisieren.Agenten-bezogen
Agenten-bezogen
PromptingAgent— Vor dem Senden des PromptsAgentPrompted— Nach dem Senden des PromptsStreamingAgent— Bei Beginn des StreamingsAgentStreamed— Nach Abschluss des StreamingsInvokingTool— Vor dem Aufruf eines ToolsToolInvoked— Nach dem Aufruf eines ToolsToolApprovalRequested— Bei Anfrage einer Tool-FreigabeToolApprovalResolved— Nach Auflösung einer Tool-Freigabe
Bild, Audio und Transkription
Bild, Audio und Transkription
GeneratingImage— Vor der BildgenerierungImageGenerated— Nach der BildgenerierungGeneratingAudio— Vor der SprachsyntheseAudioGenerated— Nach der SprachsyntheseGeneratingTranscription— Vor der TranskriptionTranscriptionGenerated— Nach der Transkription
Embeddings und Reranking
Embeddings und Reranking
GeneratingEmbeddings— Vor der Erzeugung von EmbeddingsEmbeddingsGenerated— Nach der Erzeugung von EmbeddingsReranking— Vor dem RerankingReranked— Nach dem Reranking
Dateien und Stores
Dateien und Stores
StoringFile— Vor dem Speichern einer DateiFileStored— Nach dem Speichern einer DateiFileDeleted— Nach dem Löschen einer DateiCreatingStore— Vor dem Erstellen eines StoresStoreCreated— Nach dem Erstellen eines StoresAddingFileToStore— Vor dem Hinzufügen einer Datei zum StoreFileAddedToStore— Nach dem Hinzufügen einer Datei zum StoreRemovingFileFromStore— Vor dem Entfernen einer Datei aus dem StoreFileRemovedFromStore— Nach dem Entfernen einer Datei aus dem Store