Introductie
De Laravel AI SDK biedt een uniforme, expressieve API om te communiceren met AI-providers zoals OpenAI, Anthropic en Gemini. Met de AI SDK bouw je intelligente agents met tools en gestructureerde output, genereer je afbeeldingen, doe je spraaksynthese en transcriptie, en maak je vector-embeddings — allemaal via één consistente, Laravel-achtige interface.De Laravel AI SDK is een officieel package dat is toegevoegd in Laravel 13. Het wordt aangeboden als
laravel/ai en laat je meerdere AI-providers via een uniforme API gebruiken.Overzicht van providerondersteuning
Installatie
1
Het package installeren
Installeer de Laravel AI SDK met Composer.
2
Configuratiebestand en migrations publiceren
Publiceer het configuratiebestand en de migrations met het
vendor:publish Artisan-commando.3
Migrations uitvoeren
Voer de databasemigrations uit. Hiermee worden de tabellen
agent_conversations en agent_conversation_messages aangemaakt, die worden gebruikt voor het opslaan van gespreksgeschiedenis.Configuratie
Omgevingsvariabelen
Stel de API-sleutels van de AI-providers die je gebruikt in via het.env-bestand.
config/ai.php.
Aangepaste basis-URL’s
Wil je via een proxyservice werken, dan kun je per provider een aangepaste URL instellen.OpenAI-Compatible providers
Gebruik je een OpenAI-compatibele API zoals LM Studio, vLLM, Together, Fireworks of een lokale gateway, dan kun je de provider configureren met deopenai-compatible driver. url is verplicht; geef je een key op, dan wordt die als Bearer-token meegestuurd.
headers-array in de configuratie. Dit is handig voor endpoints die andere authenticatie- of identificatieheaders nodig hebben dan een Bearer-token.
Embeddings met OpenAI-Compatible
Omdat er voor een willekeurig endpoint geen bekende modellen zijn, moet je een standaard embeddingsmodel configureren omembeddings() met een OpenAI-Compatible provider te gebruiken. Laat je dimensions weg, dan wordt de parameter niet in de request opgenomen en wordt het modelspecifieke aantal dimensies gebruikt.
Transcriptie met OpenAI-Compatible
OmTranscription met een OpenAI-Compatible provider te gebruiken, configureer je een standaard transcriptiemodel. De audio wordt als een standaard multipart-request geüpload naar /audio/transcriptions van je endpoint.
De OpenAI-Compatible en Groq providers ondersteunen geen sprekerscheiding. Roep je bij deze providers de
diarize-methode aan, dan wordt er een exception gegooid.Lab enum
Gebruik deLab enum om in je code naar providers te verwijzen.
Agents
Agents zijn de fundamentele bouwstenen van de Laravel AI SDK. Met hetmake:agent-commando genereer je een agentklasse.
app/Ai/Agents/. Hieronder zie je een voorbeeld van een agent die alle belangrijke interfaces implementeert.
Prompts
Met deprompt()-methode stuur je een bericht naar een agent.
make()-methode maak je een instantie waarbij de dependencies via de container worden geresolved.
prompt().
Ruwe HTTP-respons
De respons van een tekstgenererende agent heeft eenraw-property die de ruwe HTTP-respons van de provider-API-aanroep teruggeeft. Hiermee kun je providerspecifieke informatie ophalen die niet in de gemeenschappelijke respons van de AI SDK zit, zoals rate-limit-headers of request-ID’s.
raw is null bij streaming, bij Bedrock (omdat de API via de AWS SDK wordt aangeroepen) en bij fake-responses waarbij geen expliciete withRawResponse is opgegeven.Gesprekscontext
Implementeer je deConversational-interface en definieer je een messages()-methode, dan kun je eerdere gespreksgeschiedenis aan de AI doorgeven.
Met de RemembersConversations-trait wordt de gespreksgeschiedenis automatisch opgeslagen in en opgehaald uit de database.
forUser() en gebruik het teruggegeven conversationId om het gesprek voort te zetten met continue().
Gestructureerde output
Implementeer je deHasStructuredOutput-interface en definieer je een JSON-schema in de schema()-methode, dan ontvang je de respons van de AI als gestructureerde data.
Geneste objecten
Arrays van objecten
anyOf (keuze uit meerdere schema’s)
Kan een waarde met een van meerdere schema’s overeenkomen, gebruik dan deanyOf-methode.
Bijlagen
Via hetattachments-argument geef je documenten en afbeeldingen door aan een agent.
Streaming
Met destream()-methode geef je de respons in chunks terug. Dit is ideaal om lange responses in realtime naar de frontend te sturen.
then()-callback beschrijf je wat er moet gebeuren nadat de streaming is voltooid.
Vercel AI SDK-protocol
Gebruik je de Vercel AI SDK op de frontend, roep danusingVercelDataProtocol() aan.
Broadcasting
Je kunt de events van een stream naar een broadcastkanaal sturen, bijvoorbeeld via Laravel Echo.broadcastOnQueue() kun je via de queue broadcasten.
Grote events overslaan
Sommige broadcastplatformen beperken WebSocket-berichten tot ongeveer 10KB. Stream-events met veel data, zoals grote toolresultaten, kunnen deze limiet overschrijden waardoor het broadcasten mislukt. Met hetWithoutBroadcasting-attribuut kun je specifieke eventtypes uitsluiten van broadcasting.
agent_conversation_messages. Daardoor kan de frontend na afloop van de stream alsnog alle tooldata ophalen. Dit werkt zowel via de queue (broadcastOnQueue) als synchroon (broadcast / broadcastNow).
Queues
Met dequeue()-methode zet je een prompt op de queue voor asynchrone verwerking.
Tools
Met tools kan de AI functies in je code aanroepen. Met hetmake:tool-commando genereer je een toolklasse.
tools()-methode van de agent.
Validatie van toolargumenten
Met deschema-methode van een tool kun je het type van de ontvangen argumenten beperken, maar dat garandeert niet dat de waarden die het model doorgeeft ook correct zijn. Gebruik de validate-methode van de request om de toolargumenten te valideren.
Similarity search tool
Je kunt eenvoudig een similarity search tool toevoegen die vector-embeddings gebruikt.withDescription() pas je de beschrijving van de tool aan.
File storage tools
Met deFileStorage-toolfactory geef je een agent toegang tot Laravel filesystem disks. De all-methode geeft een set tools terug om bestanden op de opgegeven disk te tonen, lezen, van URL’s te voorzien, schrijven, verwijderen en kopiëren.
readOnly-methode.
Illuminate\Support\Collection terug, zodat je de aangeboden tools verder kunt inperken.
MCP-tools
Gebruikt je applicatie Laravel MCP, dan kun je tools die worden aangeboden door een Model Context Protocol-server aan je agents beschikbaar stellen. Met de Laravel MCP-client maak je verbinding met een remote of lokale MCP-server en geef je de tools ervan direct door aan je agent.Om MCP-tools te gebruiken moet het Laravel MCP-package in je applicatie geïnstalleerd zijn.
tools-methode van de MCP-client geeft een collectie terug, dus gebruik de ... spread-operator om deze in de tools-array van de agent uit te spreiden.
Providertools
Dit zijn speciale tools die AI-providers native implementeren.Zoeken op het web
Voegt webzoeken toe aan je agent. Ondersteund door Anthropic, OpenAI, Azure, Gemini, xAI en OpenRouter.Web fetch
Een tool die de content van een opgegeven URL ophaalt. Ondersteund door Anthropic, Gemini en OpenRouter.File search
Een tool die documenten doorzoekt in een vector store. Ondersteund door OpenAI, Gemini en xAI.FileSearchQuery kun je ook complexe filters opgeven.
Tools lazy laden
Alle tools die een agent aanbiedt worden standaard bij elk request naar de provider gestuurd. Bij agents met veel tools kost dat tokens en kan de nauwkeurigheid waarmee het model tools kiest afnemen. Bij OpenAI of Anthropic kun je met deToolSearch-providertool het laden van tooldefinities uitstellen tot ze nodig zijn.
strategy-argument de zoekmethode opgeven. Beschikbare strategieën zijn het standaard regex en bm25.
withProviderOptions-methode.
Toolaanroepen repareren
Gebruik hetRepairToolCalls-attribuut om een agent in staat te stellen een aanroep te repareren wanneer het model een niet-bestaande lokale tool aanroept. Laravel stuurt de mislukte aanroep en de namen van de beschikbare lokale tools terug naar het model, zodat het model de aanroep kan corrigeren.
MaxSteps expliciet een limiet ingesteld, dan verandert die limiet niet.
Subagents
Een agent kan ook worden teruggegeven vanuit detools()-methode van een andere agent. Registreer je een agent als tool, dan kan de bovenliggende agent specifieke taken delegeren aan een subagent en het resultaat in de oorspronkelijke respons verwerken. Dat is handig wanneer een generieke agent toegang nodig heeft tot gespecialiseerde agents met eigen instructies, tools, model- en providerconfiguratie.
Bijvoorbeeld: een klantenservice-agent die vragen over het terugbetalingsbeleid delegeert aan een terugbetalingsspecialist.
CanActAsTool-interface en definieer je een naam en beschrijving voor de tool.
CanActAsTool niet implementeren, gebruikt Laravel de klassenaam als toolnaam en genereert het automatisch een generieke beschrijving. Elke aanroep van een subagent gebeurt onafhankelijk en neemt de gespreksgeschiedenis van de bovenliggende agent niet over.
Middleware
Voeg middleware toe aan een agent om prompts en responses te onderscheppen.HasMiddleware-interface en registreer de middleware in de middleware()-methode.
then() voeg je ook verwerking toe na de respons.
Anonieme agents
Met deagent()-helper gebruik je een anonieme agent zonder een klasse te definiëren.
Agentconfiguratie (PHP attributes)
Met PHP attributes beschrijf je de standaardinstellingen van een agent declaratief.Provideropties
Implementeer je deHasProviderOptions-interface, dan kun je providerspecifieke opties doorgeven.
providerOptions-methode ontvangt de provider die op dat moment wordt gebruikt (als Lab enum of string), zodat je per provider andere opties kunt teruggeven. Omdat je elke fallback-provider een eigen configuratie kunt meegeven, is dit vooral handig bij gebruik van failover.
In het Anthropic-voorbeeld hierboven wordt met cache_control ook prompt-caching ingeschakeld.
Prompt-caching
Veel providers cachen automatisch herhaalde promptprefixen en rekenen voor het gecachte deel een gereduceerd tarief. OpenAI, Gemini, Groq, DeepSeek en xAI vereisen geen configuratie; de besparing kun je terugvinden in de usage van de respons.anthropic- en bedrock-providers cachen alleen wanneer je dat expliciet aangeeft. Met de attributen CacheInstructions en CacheToolDefinitions plaats je cache-breakpoints aan het einde van de instructies en tooldefinities van de agent. Daardoor lezen alle gesprekken die prefix uit de cache en hoeft die niet telkens opnieuw te worden geschreven.
CacheToolDefinitions. Cache je een prefix die per request verandert, dan wordt er telkens een nieuwe cache-entry aangemaakt die nooit wordt hergebruikt, terwijl je wel de schrijfkosten betaalt.
Providers die deze attributen niet ondersteunen negeren ze gewoon, dus je kunt ze ook bij gebruik van failover veilig declareren.
Een gecachte prefix blijft standaard 5 minuten bewaard. Bij Anthropic kun je door een TTL aan het attribuut mee te geven de prefix tot 1 uur bewaren.
cache_control provideroptie. Daarbij wordt één breakpoint na het laatste blok van de request geplaatst; naarmate het gesprek vordert, schuift het breakpoint mee en leest elke beurt de vorige beurt uit de cache. Beide mechanismen zijn ook te combineren.
Menselijke goedkeuring (human tool approval)
Voor tools die gevoelige of onomkeerbare operaties uitvoeren, zoals het verwijderen van bestanden of het overmaken van geld, kun je vóór uitvoering menselijke goedkeuring vereisen. Om een tool goedkeuringsplichtig te maken, implementeer je hetApprovable-contract en gebruik je de InteractsWithApprovals-trait. Goedkeuringsplichtige tools vereisen standaard goedkeuring.
needsApproval-methode op de tool. Deze methode kan een boolean teruggeven, of een Approval-instantie met een reden voor de goedkeuring.
tools-methode van de agent.
pendingApprovals op de respons zie je per toolaanroep het ID, de toolnaam, de argumenten en de reden van de goedkeuring.
Decisions-instantie door met een beslissing voor elke openstaande toolaanroep. Met een beslissing kun je de aanroep goedkeuren, afwijzen of de argumenten vóór uitvoering aanpassen.
true en false kun je gebruiken als verkorte notatie voor respectievelijk goedkeuren en afwijzen. Alle openstaande toolaanroepen hebben een beslissing nodig. Geef je een onbekend, ontbrekend of al afgehandeld toolaanroep-ID op, dan wordt er een ApprovalMismatchException gegooid. Voor aanroepen zonder expliciete beslissing kun je met de methoden approveRemaining of rejectRemaining een standaardbeslissing opgeven.
Decision::reject('Niet goedgekeurd.'), dan wordt dat aan het model teruggegeven en gaat de respons verder. Wijs je af zonder resultaat, dan stopt de generatieloop zodra de afwijzing is vastgelegd.
Toolgoedkeuring wordt ondersteund door de methoden prompt, stream, queue, broadcast, broadcastNow en broadcastOnQueue.
Tijdens streaming en broadcasting wordt een pauze weergegeven als een tool_approval_request-event. Gebruik je het Vercel AI SDK-streamprotocol, dan worden goedkeuringsverzoeken en resultaten uitgezonden als de native tool-approval-parts van het protocol.
Bij agents in de queue wordt de resulterende respons doorgegeven aan de then-callback, en dispatcht Laravel ook het ToolApprovalRequested-event.
Laravel slaat het uitvoeringsresultaat van goedgekeurde tools op voordat het model wordt gevraagd verder te gaan. Mislukt de generatie daarna, dan zijn de goedkeuringen al afgehandeld. Stuur dezelfde goedkeuringsbeslissingen niet opnieuw, maar zet het gesprek voort met een gewone tekstprompt.
Volledige goedkeuringsflow
De onderstaande routes tonen een volledige goedkeuringsflow. DeGET-route geeft het chatscherm terug en de POST-route ontvangt vanuit het chatscherm ofwel een nieuwe tekstprompt, ofwel goedkeuringsbeslissingen. Dit voorbeeld gaat ervan uit dat het User-model van je applicatie de HasConversations-trait gebruikt.
awaiting_approval, dan moet het chatscherm de openstaande goedkeuringen tonen en de keuzes van de gebruiker, met het toolaanroep-ID als sleutel, naar hetzelfde endpoint sturen.
message-waarde.
Afbeeldingen genereren
Met deImage-klasse genereer je afbeeldingen. De providers OpenAI, Gemini en xAI worden ondersteund.
Afbeeldingen opslaan
Afbeeldingen genereren via de queue
Spraaksynthese (TTS)
Met deAudio-klasse zet je tekst om in spraak. De providers OpenAI en ElevenLabs worden ondersteund.
Audio opslaan
Audio genereren via de queue
Transcriptie (STT)
Met deTranscription-klasse zet je audiobestanden om in tekst. De providers OpenAI, OpenAI Compatible, ElevenLabs, Groq, Mistral en Gemini worden ondersteund.
Sprekerscheiding (diarisatie)
Metdiarize() krijg je een transcriptie die per spreker is gescheiden.
Transcriptie via de queue
Tekst samenvatten (text summarization)
Met desummarize-methode van Laravels Stringable-klasse vat je tekst samen. Standaard wordt er samengevat in maximaal drie zinnen en wordt het goedkoopste tekstmodel van de geconfigureerde provider gebruikt.
Str-klasse heeft daarnaast een statische variant.
Embeddings
Zet tekst om in vectorrepresentaties, bijvoorbeeld voor similarity search.Multimodale embeddings
DeEmbeddings::for-methode accepteert niet alleen strings, maar ook afbeeldingen, audio, documenten en video als input, zodat je ook embeddings kunt genereren voor niet-tekstuele content. Gemini ondersteunt embeddings van afbeeldingen, audio, documenten en video; VoyageAI ondersteunt embeddings van afbeeldingen en video.
VoyageAI staat niet toe dat media van remote URL’s en Base64-gecodeerde media in dezelfde request worden gecombineerd. Lokale, storage- en geüploade bestanden worden verstuurd als Base64-gecodeerde content; tekstinput kan met beide mediabronnen worden gecombineerd. Raadpleeg de documentatie van elke provider voor de beschikbare multimodale modellen en inputs.
Vectorzoeken (pgvector)
Een configuratievoorbeeld voor vectorzoeken met PostgreSQL en de pgvector-extensie.1
Migration maken
2
Model configureren
3
Similarity search query
Embeddings cachen
Je kunt embeddings cachen om te voorkomen dat dezelfde tekst herhaaldelijk wordt verwerkt. Configureer de standaard cache-instellingen inconfig/ai.php.
ai.caching.embeddings.individually op false.
Je kunt de cache ook per request aansturen.
Reranking
Je kunt zoekresultaten reranken (herschikken) op relevantie voor een query. De providers Cohere en Jina worden ondersteund.limit() beperk je het aantal teruggegeven resultaten.
Collecties reranken
Eloquent-collecties kun je direct reranken.Bestandsbeheer
Je kunt bestanden uploaden naar een AI-provider en er later naar verwijzen.Verwijzen naar opgeslagen bestanden
Een geüpload bestand kun je via het bestands-ID als bijlage aan een agent meegeven.Bestanden ophalen en verwijderen
Een provider opgeven
Providerspecifieke opties opgeven
Met dewithProviderOptions-methode geef je providerspecifieke uploadopties door. Zo kun je bijvoorbeeld de purpose van een OpenAI-bestand instellen.
Vector stores
Met vector stores beheer je documenten aan de kant van de provider.Bestanden toevoegen aan een store
Bestanden verwijderen uit een store
Failover
Geef je meerdere providers op als array, dan valt de SDK automatisch terug op de volgende provider wanneer de eerste faalt.Testen
De Laravel AI SDK biedt fake-functionaliteit voor tests, zodat je kunt testen zonder de echte API aan te roepen. Fake je een gequeued afbeeldings-, audio-, transcriptie- of embeddingsgeneratie, dan wordt dethen-callback die je bij de generatie hebt geregistreerd aangeroepen met de fake-respons. Wil je dat de callback ook niet wordt uitgevoerd, gebruik dan daarnaast Queue::fake().
Agents testen
preventStrayPrompts() wordt er een exception gegooid zodra een prompt wordt aangeroepen die niet in de fake is gedefinieerd.
Wordt
fake() op een agent met gestructureerde output aangeroepen zonder expliciete fake-data, dan genereert Laravel automatisch fake-data die voldoet aan het door de agent gedefinieerde schema.AnonymousAgent::fake().
Afbeeldingsgeneratie testen
Spraaksynthese testen
Transcriptie testen
Embeddings testen
Reranking testen
Bestanden testen
Vector stores testen
Events
De Laravel AI SDK dispatcht de onderstaande events. Door naar deze events te luisteren kun je bijvoorbeeld loggen en monitoren.Agentgerelateerd
Agentgerelateerd
AgentFailed— wanneer de agentverwerking misluktAgentFailedOver— bij failover van een agentPromptingAgent— vóór het versturen van een promptAgentPrompted— na het versturen van een promptStreamingAgent— bij de start van streamingAgentStreamed— na afronding van streamingInvokingTool— vóór een toolaanroepToolInvoked— na een toolaanroepToolApprovalRequested— wanneer toolgoedkeuring wordt aangevraagdToolApprovalResolved— nadat een toolgoedkeuring is afgehandeldProviderFailedOver— bij failover van een providerStartingStep— bij de start van een stapStepCompleted— na afronding van een stapStepFailed— wanneer een stap misluktToolFailed— wanneer de uitvoering van een tool mislukt
Afbeeldingen, audio en transcriptie
Afbeeldingen, audio en transcriptie
GeneratingImage— vóór het genereren van een afbeeldingImageGenerated— na het genereren van een afbeeldingGeneratingAudio— vóór het genereren van audioAudioGenerated— na het genereren van audioGeneratingTranscription— vóór een transcriptieTranscriptionGenerated— na een transcriptie
Embeddings en reranking
Embeddings en reranking
GeneratingEmbeddings— vóór het genereren van embeddingsEmbeddingsGenerated— na het genereren van embeddingsReranking— vóór rerankingReranked— na reranking
Bestanden en stores
Bestanden en stores
StoringFile— vóór het opslaan van een bestandFileStored— na het opslaan van een bestandFileDeleted— na het verwijderen van een bestandCreatingStore— vóór het aanmaken van een storeStoreCreated— na het aanmaken van een storeStoreDeleted— na het verwijderen van een storeAddingFileToStore— vóór het toevoegen van een bestand aan een storeFileAddedToStore— na het toevoegen van een bestand aan een storeRemovingFileFromStore— vóór het verwijderen van een bestand uit een storeFileRemovedFromStore— na het verwijderen van een bestand uit een store