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.
headers-Array. Nutzen Sie dies für Endpunkte, die Identifikations-Header oder andere Authentifizierungs-Header als ein Bearer-Token erwarten.
OpenAI-kompatible Embeddings
Da beliebige Endpunkte keine bekannten Modelle besitzen, müssen Sie ein Standard-Embedding-Modell konfigurieren, umembeddings() mit dem OpenAI-kompatiblen Anbieter zu nutzen. Lassen Sie dimensions weg, wird der Parameter nicht in den Request aufgenommen und die native Dimensionsanzahl des Modells verwendet.
OpenAI-kompatible Transkription
UmTranscription mit dem OpenAI-kompatiblen Anbieter zu verwenden, konfigurieren Sie ein Standard-Transkriptionsmodell. Audio wird als gewöhnlicher Multipart-Request an die Route /audio/transcriptions des Endpunkts hochgeladen.
Die OpenAI-kompatiblen und Groq-Anbieter unterstützen keine Sprechertrennung. Der Aufruf von
diarize bei diesen Anbietern löst eine Exception aus.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.
Rohe HTTP-Antwort
Die Antwort eines Textgenerierungs-Agenten besitzt eineraw-Eigenschaft, die die rohe HTTP-Antwort des Anbieter-API-Aufrufs zurückgibt. Damit erhalten Sie anbieterspezifische Informationen, die nicht in der gemeinsamen Antwort des AI SDK enthalten sind, etwa Rate-Limit-Header oder Request-IDs.
Bei Streaming, Bedrock (weil die API über das AWS SDK aufgerufen wird) und Fake-Antworten, die
withRawResponse nicht explizit angeben, ist raw null.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.
Tool-Argumente validieren
Mit derschema-Methode eines Tools können Sie zwar die Typen der entgegengenommenen Argumente einschränken, doch die vom Modell übergebenen Werte selbst sind nicht zwangsläufig korrekt. Über die validate-Methode des Requests können Sie die Tool-Argumente validieren.
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, Azure, Gemini, xAI und OpenRouter.Web-Fetch
Ein Tool, das den Inhalt einer angegebenen URL abruft. Unterstützt werden Anthropic, Gemini und OpenRouter.Dateisuche
Ein Tool zum Suchen von Dokumenten in einem Vector Store. Unterstützt werden OpenAI, Gemini und xAI.FileSearchQuery angeben.
Verzögertes Laden von Tools
Standardmäßig werden alle Tools, die ein Agent bereitstellt, bei jedem Request an den Anbieter gesendet. Bei Agenten mit vielen Tools kann das Tokens verbrauchen und die Genauigkeit der Tool-Auswahl des Modells verringern. Mit OpenAI oder Anthropic können Sie das Anbieter-ToolToolSearch verwenden, um das Laden der Tool-Definitionen aufzuschieben, bis sie benötigt werden.
strategy das Suchverfahren angeben. Verfügbare Strategien sind das standardmäßige regex und bm25.
withProviderOptions übergeben.
Tool-Aufrufe reparieren
Verwenden Sie das AttributRepairToolCalls, damit der Agent einen Aufruf reparieren kann, wenn das Modell ein nicht existierendes lokales Tool aufruft. Laravel gibt den fehlgeschlagenen Aufruf und die Namen der verfügbaren lokalen Tools an das Modell zurück, sodass das Modell den Aufruf korrigieren kann.
MaxSteps explizit festgelegt, bleibt dieses Limit unverändert.
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.
providerOptions-Methode wird der aktuell verwendete Anbieter (als Lab-Enum oder String) übergeben, sodass Sie je nach Anbieter unterschiedliche Optionen zurückgeben können. Da sich so jedem Fallback-Anbieter eine individuelle Konfiguration übergeben lässt, ist das besonders praktisch beim Einsatz von Failover.
Im obigen Anthropic-Beispiel aktiviert cache_control außerdem das Prompt-Caching.
Prompt-Caching
Viele Anbieter cachen wiederholte Prompt-Präfixe automatisch und berechnen für den gecachten Teil einen reduzierten Preis. OpenAI, Gemini, Groq, DeepSeek und xAI benötigen keine Konfiguration – die Ersparnis lässt sich in der Usage der Antwort ablesen.anthropic und bedrock cachen nur auf explizite Anweisung. Mit den Attributen CacheInstructions und CacheToolDefinitions platzieren Sie Cache-Breakpoints am Ende der Anweisungen und der Tool-Definitionen des Agenten. Dadurch lesen alle Konversationen dieses Präfix aus dem Cache, statt es jedes Mal neu zu schreiben.
CacheToolDefinitions. Ein Präfix zu cachen, das sich bei jedem Request ändert, erzeugt jedes Mal einen neuen Cache-Eintrag, der nie wiederverwendet wird und nur Schreibkosten verursacht.
Anbieter, die diese Attribute nicht unterstützen, ignorieren sie einfach – Sie können sie also auch beim Einsatz von Failover gefahrlos deklarieren.
Gecachte Präfixe werden standardmäßig 5 Minuten lang vorgehalten. Bei Anthropic können Sie den Attributen eine TTL übergeben und so bis zu 1 Stunde cachen.
cache_control aktivieren. Dabei wird ein einzelner Breakpoint nach dem letzten Block des Requests platziert; mit fortschreitender Konversation wandert der Breakpoint mit, sodass jeder Turn den vorherigen aus dem Cache liest. Beide Mechanismen lassen sich auch kombinieren.
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, OpenAI Compatible, ElevenLabs, Groq, Mistral und Gemini.
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.
ai.caching.embeddings.individually auf false.
Sie können den Cache auch pro Request steuern.
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. Wenn Sie eine per Queue verarbeitete Bild-, Audio-, Transkriptions- oder Embedding-Generierung faken, werden die für die Generierung registriertenthen-Callbacks weiterhin mit der Fake-Antwort aufgerufen. Um auch diese Callbacks zu überspringen, verwenden Sie zusätzlich Queue::fake().
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
AgentFailed— Wenn die Verarbeitung eines Agenten fehlschlägtAgentFailedOver— Wenn der Agent per Failover wechseltPromptingAgent— 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-FreigabeProviderFailedOver— Wenn der Anbieter per Failover wechseltStartingStep— Vor dem Start eines SchrittsStepCompleted— Nach Abschluss eines SchrittsStepFailed— Wenn ein Schritt fehlschlägtToolFailed— Wenn die Ausführung eines Tools fehlschlägt
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 StoresStoreDeleted— Nach dem Löschen 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