Introduction
Le Laravel AI SDK fournit une API expressive et unifiée pour dialoguer avec des fournisseurs d’IA tels que OpenAI, Anthropic ou Gemini. Grâce à ce SDK, vous pouvez construire des agents intelligents munis d’outils et de sorties structurées, générer des images, synthétiser ou transcrire de l’audio, produire des embeddings vectoriels, etc. — le tout via une interface cohérente et fidèle à l’esprit de Laravel.Le Laravel AI SDK est un package officiel introduit dans Laravel 13. Distribué sous le nom
laravel/ai, il permet d’utiliser plusieurs fournisseurs d’IA via une API unique.Fournisseurs pris en charge
Installation
1
Installer le package
Installez le Laravel AI SDK avec Composer.
2
Publier le fichier de configuration et les migrations
Publiez le fichier de configuration et les migrations à l’aide de la commande Artisan
vendor:publish.3
Exécuter les migrations
Exécutez les migrations de base de données. Les tables
agent_conversations et agent_conversation_messages sont créées et serviront à stocker l’historique des conversations.Configuration
Variables d’environnement
Renseignez dans votre fichier.env les clés API des fournisseurs d’IA que vous souhaitez utiliser.
config/ai.php.
URL de base personnalisée
Si vous passez par un service proxy, vous pouvez définir une URL personnalisée pour chaque fournisseur.Fournisseur compatible OpenAI
Pour utiliser une API compatible OpenAI (LM Studio, vLLM, Together, Fireworks, une passerelle locale, etc.), configurez un fournisseur avec le driveropenai-compatible. url est obligatoire, et key est envoyé sous forme de jeton Bearer lorsqu’il est fourni.
Enum Lab
Pour référencer un fournisseur dans votre code, utilisez l’enumLab.
Agents
Les agents sont l’élément de base du Laravel AI SDK. La commandemake:agent permet de générer une classe d’agent.
app/Ai/Agents/. Voici un exemple d’agent implémentant toutes les principales interfaces.
Prompt
La méthodeprompt() envoie un message à l’agent.
make() permet de résoudre les dépendances depuis le container et de créer l’instance.
prompt().
Contexte conversationnel
En implémentant l’interfaceConversational et en définissant la méthode messages(), vous pouvez transmettre l’historique de la conversation à l’IA.
Le trait RemembersConversations permet d’enregistrer et de récupérer automatiquement l’historique en base de données.
forUser(), puis reprenez la suite avec continue() en utilisant l’conversationId renvoyé.
Sortie structurée
En implémentant l’interfaceHasStructuredOutput et en définissant un schéma JSON via la méthode schema(), vous obtenez la réponse de l’IA sous forme de données structurées.
Objets imbriqués
Tableau d’objets
anyOf (choix parmi plusieurs schémas)
Quand une valeur peut correspondre à l’un de plusieurs schémas, utilisez la méthodeanyOf.
Pièces jointes
L’argumentattachments permet de transmettre des documents ou des images à l’agent.
Streaming
La méthodestream() renvoie la réponse par morceaux (chunks). C’est idéal pour envoyer en temps réel une réponse longue au frontend.
then() permet d’exécuter du code une fois le streaming terminé.
Protocole Vercel AI SDK
Si vous utilisez le SDK Vercel AI côté frontend, appelezusingVercelDataProtocol().
Broadcast
Vous pouvez pousser les événements d’un flux vers un canal de broadcast (Laravel Echo, par exemple).broadcastOnQueue() permet de broadcaster via une file d’attente.
Ignorer les événements trop volumineux
Certaines plateformes de broadcast limitent la taille des messages WebSocket à environ 10 Ko. Les événements de streaming volumineux, comme les résultats d’outils, peuvent dépasser cette limite et échouer au broadcast. L’attributWithoutBroadcasting permet d’exclure certains types d’événements du broadcast.
agent_conversation_messages. Le frontend peut donc récupérer toutes les données des outils une fois le flux terminé. Cela fonctionne aussi bien via une queue (broadcastOnQueue) qu’en synchrone (broadcast / broadcastNow).
Queue
La méthodequeue() met le prompt en file d’attente pour un traitement asynchrone.
Outils
Les outils permettent à l’IA d’appeler des fonctions de votre code. Vous générez une classe d’outil avecmake:tool.
tools() de l’agent.
Outil de recherche par similarité
Vous pouvez ajouter facilement un outil de recherche par similarité basé sur des embeddings vectoriels.withDescription() permet de personnaliser la description de l’outil.
Outils de stockage de fichiers
La fabrique d’outilsFileStorage permet de donner à l’agent l’accès aux disques de système de fichiers de Laravel. La méthode all retourne un ensemble complet d’outils pour lister, lire, générer des URL, écrire, supprimer et copier des fichiers sur le disque spécifié.
readOnly pour ne donner qu’un accès en lecture seule.
Illuminate\Support\Collection, ce qui vous permet de filtrer les outils exposés.
Outils MCP
Si vous utilisez Laravel MCP dans votre application, vous pouvez exposer à l’agent les outils publiés par un serveur Model Context Protocol. Le client MCP de Laravel permet de se connecter à un serveur MCP distant ou local et de transmettre ses outils directement à l’agent.Pour utiliser des outils MCP, le package Laravel MCP doit être installé dans l’application.
tools du client MCP renvoie une collection : utilisez l’opérateur de spread ... pour l’insérer dans le tableau tools de l’agent.
Outils du fournisseur
Il s’agit d’outils spéciaux implémentés nativement par les fournisseurs d’IA.Recherche web
Ajoute une recherche web à l’agent. Compatible avec Anthropic, OpenAI, Gemini et OpenRouter.Récupération de contenu web
Outil pour récupérer le contenu d’une URL donnée. Compatible avec Anthropic et Gemini.Recherche de fichiers
Outil qui recherche des documents dans un vector store. Compatible avec OpenAI et Gemini.FileSearchQuery.
Sous-agents
Un agent peut également être renvoyé depuis la méthodetools() d’un autre agent. En enregistrant un agent comme outil, l’agent parent peut déléguer certaines tâches à un sous-agent et intégrer le résultat à sa propre réponse. C’est utile lorsqu’un agent généraliste doit accéder à un agent spécialisé disposant d’instructions, d’outils, d’un modèle ou d’une configuration de fournisseur dédiés.
Par exemple, un agent de support client peut déléguer les questions sur la politique de remboursement à un agent spécialisé.
CanActAsTool et définissez son nom et sa description en tant qu’outil.
CanActAsTool, Laravel utilise le nom de la classe comme nom d’outil et génère automatiquement une description générique. Chaque appel à un sous-agent est indépendant : l’historique de conversation de l’agent parent n’est pas transmis.
Middleware
Vous pouvez ajouter des middlewares à un agent pour intercepter les prompts ou les réponses.HasMiddleware et déclarez les middlewares via middleware().
then() permet d’exécuter du code après la réponse.
Agents anonymes
Sans définir de classe, vous pouvez utiliser un agent anonyme via le helperagent().
Configuration d’un agent (attributs PHP)
Vous pouvez déclarer les paramètres par défaut d’un agent à l’aide d’attributs PHP.Options de fournisseur
Implémentez l’interfaceHasProviderOptions pour passer des options propres à un fournisseur.
Approbation humaine (Human Tool Approval)
Pour les outils sensibles ou irréversibles (suppression de fichier, virement…), vous pouvez exiger une approbation humaine avant leur exécution. Rendez l’outil approuvable en implémentant le contratApprovable et en utilisant le trait InteractsWithApprovals. Par défaut, un outil approuvable nécessite systématiquement une approbation.
needsApproval sur l’outil. Elle peut renvoyer un booléen ou une instance Approval contenant la raison de l’approbation.
tools de l’agent, vous pouvez également surcharger l’exigence d’approbation.
pendingApprovals sur la réponse, vous obtenez l’ID de l’appel, le nom de l’outil, les arguments et la raison de l’approbation.
Decisions contenant la décision pour chaque appel d’outil en attente. Les décisions permettent d’approuver, de rejeter ou de modifier les arguments avant exécution.
true et false sont respectivement des raccourcis pour approuver ou rejeter. Chaque appel d’outil en attente doit avoir une décision. Un ID d’appel inconnu, manquant ou déjà résolu lève une ApprovalMismatchException. Pour les appels dépourvus de décision explicite, les méthodes approveRemaining ou rejectRemaining définissent une décision par défaut.
Decision::reject('Approbation refusée.') renvoie ce résultat au modèle, qui poursuit sa réponse. Rejeter sans résultat arrête la boucle de génération à l’endroit où le rejet est enregistré.
L’approbation d’outils est prise en charge par les méthodes prompt, stream, queue, broadcast, broadcastNow et broadcastOnQueue.
Pendant le streaming et le broadcast, la pause est exprimée sous la forme d’un événement tool_approval_request. Si vous utilisez le protocole de flux Vercel AI SDK, les demandes et résultats d’approbation sont émis en tant que parties natives d’approbation d’outil du protocole.
Pour les agents en file d’attente, la réponse finale est transmise au callback then, et Laravel émet également un événement ToolApprovalRequested.
Laravel enregistre les résultats des outils approuvés avant de redemander au modèle de poursuivre. Si la génération échoue par la suite, les approbations sont déjà résolues. Plutôt que de renvoyer les mêmes décisions, poursuivez la conversation avec un prompt texte classique.
Un flux d’approbation complet
Les routes ci-dessous illustrent un flux d’approbation complet. La routeGET retourne l’écran de chat, la route POST accepte soit un nouveau prompt texte depuis l’écran de chat, soit des décisions d’approbation. Cet exemple suppose que le modèle User de l’application utilise le trait HasConversations.
awaiting_approval, l’écran de chat doit afficher les approbations en attente et envoyer à ce même endpoint le choix de l’utilisateur, indexé par l’ID d’appel de l’outil.
message.
Génération d’images
La classeImage permet de générer des images. Les fournisseurs OpenAI, Gemini et xAI sont pris en charge.
Enregistrement des images
Génération d’image via une queue
Synthèse vocale (TTS)
La classeAudio permet de convertir du texte en audio. Les fournisseurs OpenAI et ElevenLabs sont pris en charge.
Enregistrement de l’audio
Génération audio via une queue
Transcription (STT)
La classeTranscription permet de convertir un fichier audio en texte. Les fournisseurs OpenAI, ElevenLabs et Mistral sont pris en charge.
Séparation des intervenants (diarization)
Utilisezdiarize() pour obtenir une transcription séparée par intervenant.
Transcription via une queue
Résumé de texte (Text Summarization)
La méthodesummarize de la classe Stringable de Laravel permet de résumer un texte. Par défaut, le résumé fait au maximum trois phrases et utilise le modèle texte le moins cher du fournisseur configuré.
Str propose également une version statique.
Embeddings
Convertissez du texte en représentation vectorielle pour la recherche par similarité, entre autres.Embeddings multimodaux
La méthodeEmbeddings::for accepte non seulement des chaînes de caractères mais aussi des images, de l’audio, des documents ou des vidéos : vous pouvez donc générer des embeddings pour des contenus non textuels. Gemini prend en charge les embeddings d’images, d’audio, de documents et de vidéos ; VoyageAI prend en charge les embeddings d’images et de vidéos.
VoyageAI n’autorise pas le mélange de médias distants (URL) et de médias encodés en Base64 dans une même requête. Les fichiers locaux, ceux du storage et les fichiers uploadés sont envoyés en Base64. Les entrées texte peuvent être combinées à l’une ou l’autre source. Consultez la documentation de chaque fournisseur pour connaître les modèles et types d’entrées multimodales disponibles.
Recherche vectorielle (pgvector)
Voici un exemple de configuration de recherche vectorielle avec PostgreSQL et l’extension pgvector.1
Création de la migration
2
Configuration du modèle
3
Requête de recherche par similarité
Cache des embeddings
Vous pouvez éviter de régénérer les embeddings pour un même texte grâce au cache. Définissez le comportement par défaut dansconfig/ai.php.
Reranking
Réordonnez des résultats de recherche selon leur pertinence par rapport à une requête. Les fournisseurs Cohere et Jina sont pris en charge.limit() permet de restreindre le nombre de résultats renvoyés.
Reranking de collections
Vous pouvez réordonner directement une collection Eloquent.Gestion des fichiers
Vous pouvez téléverser des fichiers auprès des fournisseurs d’IA pour les référencer plus tard.Référencer un fichier déjà téléversé
Attachez à l’agent un fichier existant via son ID.Récupérer et supprimer un fichier
Choix du fournisseur
Options spécifiques au fournisseur
La méthodewithProviderOptions permet de passer des options d’upload propres au fournisseur, comme le purpose d’un fichier chez OpenAI.
Vector stores
Les vector stores permettent de laisser les fournisseurs gérer les documents pour vous.Ajouter des fichiers à un store
Retirer un fichier d’un store
Failover
En passant un tableau de fournisseurs, on bascule automatiquement sur le suivant si le premier échoue.Tests
Le Laravel AI SDK fournit des fakes pour tester sans appeler véritablement les API.Tester un agent
preventStrayPrompts() fait remonter une exception si un prompt non défini par le fake est déclenché.
Si
fake() est appelé sur un agent à sortie structurée sans données explicites, Laravel génère automatiquement des données factices conformes au schéma défini par l’agent.AnonymousAgent::fake().
Tester la génération d’images
Tester la synthèse vocale
Tester la transcription
Tester les embeddings
Tester le reranking
Tester les fichiers
Tester les vector stores
Événements
Le Laravel AI SDK émet les événements suivants. En les écoutant, vous pouvez implémenter du logging, du monitoring, etc.Événements liés aux agents
Événements liés aux agents
PromptingAgent— avant l’envoi du promptAgentPrompted— après l’envoi du promptStreamingAgent— au démarrage du streamingAgentStreamed— à la fin du streamingInvokingTool— avant l’appel d’un outilToolInvoked— après l’appel d’un outilToolApprovalRequested— lors d’une demande d’approbation d’outilToolApprovalResolved— après résolution de l’approbation d’outil
Images, audio, transcription
Images, audio, transcription
GeneratingImage— avant la génération d’imageImageGenerated— après la génération d’imageGeneratingAudio— avant la génération audioAudioGenerated— après la génération audioGeneratingTranscription— avant la transcriptionTranscriptionGenerated— après la transcription
Embeddings et reranking
Embeddings et reranking
GeneratingEmbeddings— avant la génération d’embeddingsEmbeddingsGenerated— après la génération d’embeddingsReranking— avant le rerankingReranked— après le reranking
Fichiers et stores
Fichiers et stores
StoringFile— avant le stockage du fichierFileStored— après le stockage du fichierFileDeleted— après la suppression du fichierCreatingStore— avant la création du storeStoreCreated— après la création du storeAddingFileToStore— avant l’ajout d’un fichier à un storeFileAddedToStore— après l’ajout d’un fichier à un storeRemovingFileFromStore— avant le retrait d’un fichier d’un storeFileRemovedFromStore— après le retrait d’un fichier d’un store