Skip to main content

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.
Les modèles par défaut utilisés pour le texte, les images, l’audio, la transcription ou les embeddings peuvent également être définis dans 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.
Une URL de base personnalisée est disponible pour OpenAI, Anthropic, Gemini, Groq, Cohere, DeepSeek, xAI et OpenRouter.

Fournisseur compatible OpenAI

Pour utiliser une API compatible OpenAI (LM Studio, vLLM, Together, Fireworks, une passerelle locale, etc.), configurez un fournisseur avec le driver openai-compatible. url est obligatoire, et key est envoyé sous forme de jeton Bearer lorsqu’il est fourni.
Une fois configuré, vous l’utilisez par son nom comme n’importe quel autre fournisseur.
En définissant un modèle texte par défaut, vous n’avez plus besoin de le préciser à chaque appel.
Le fournisseur OpenAI-Compatible prend en charge la génération de texte, le streaming, les outils, les sorties structurées et les images en pièce jointe. Si l’endpoint attend des champs supplémentaires dans le corps de la requête, utilisez les options de fournisseur.

Enum Lab

Pour référencer un fournisseur dans votre code, utilisez l’enum Lab.

Agents

Les agents sont l’élément de base du Laravel AI SDK. La commande make:agent permet de générer une classe d’agent.
Les agents générés sont placés dans le répertoire app/Ai/Agents/. Voici un exemple d’agent implémentant toutes les principales interfaces.

Prompt

La méthode prompt() envoie un message à l’agent.
La méthode statique make() permet de résoudre les dépendances depuis le container et de créer l’instance.
Le fournisseur, le modèle et le timeout peuvent être surchargés via les arguments de prompt().

Contexte conversationnel

En implémentant l’interface Conversational 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.
Vous démarrez la conversation avec forUser(), puis reprenez la suite avec continue() en utilisant l’conversationId renvoyé.

Sortie structurée

En implémentant l’interface HasStructuredOutput 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éthode anyOf.

Pièces jointes

L’argument attachments permet de transmettre des documents ou des images à l’agent.
Les images se joignent de la même manière.

Streaming

La méthode stream() renvoie la réponse par morceaux (chunks). C’est idéal pour envoyer en temps réel une réponse longue au frontend.
Le callback then() permet d’exécuter du code une fois le streaming terminé.
Vous pouvez également itérer manuellement sur le flux.

Protocole Vercel AI SDK

Si vous utilisez le SDK Vercel AI côté frontend, appelez usingVercelDataProtocol().

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’attribut WithoutBroadcasting permet d’exclure certains types d’événements du broadcast.
Les événements exclus ne sont pas broadcastés, mais restent enregistrés dans la table 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éthode queue() 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 avec make:tool.
Vous enregistrez les outils dans la méthode tools() de l’agent.

Outil de recherche par similarité

Vous pouvez ajouter facilement un outil de recherche par similarité basé sur des embeddings vectoriels.
Vous pouvez également passer des options.
Une closure permet de définir votre propre logique de recherche.
withDescription() permet de personnaliser la description de l’outil.

Outils de stockage de fichiers

La fabrique d’outils FileStorage 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é.
Utilisez readOnly pour ne donner qu’un accès en lecture seule.
Ces méthodes retournent une 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.
La méthode tools du client MCP renvoie une collection : utilisez l’opérateur de spread ... pour l’insérer dans le tableau tools de l’agent.
L’AI SDK enveloppe automatiquement chaque outil MCP pour que l’agent puisse l’appeler comme n’importe quel autre outil. Vous pouvez aussi utiliser un client MCP nommé.
Il est également possible de se connecter à un serveur MCP local.
Pour la création du client MCP et l’authentification (jeton Bearer, OAuth…), reportez-vous à la documentation du client MCP.

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.
Vous pouvez limiter le nombre de résultats, restreindre les domaines ou préciser une localisation.

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.
Vous pouvez aussi construire des filtres complexes avec FileSearchQuery.

Sous-agents

Un agent peut également être renvoyé depuis la méthode tools() 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é.
Pour personnaliser la manière dont le sous-agent est exposé à son parent, faites-lui implémenter l’interface CanActAsTool et définissez son nom et sa description en tant qu’outil.
Si le sous-agent n’implémente pas 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.
Faites implémenter à l’agent l’interface HasMiddleware et déclarez les middlewares via middleware().
Voici un exemple d’implémentation d’un middleware.
Le callback 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 helper agent().
Il est aussi possible de créer un agent anonyme avec sortie structurée.

Configuration d’un agent (attributs PHP)

Vous pouvez déclarer les paramètres par défaut d’un agent à l’aide d’attributs PHP.
Des raccourcis d’attributs pour la sélection du modèle sont également disponibles.

Options de fournisseur

Implémentez l’interface HasProviderOptions pour passer des options propres à un fournisseur.

Approbation humaine (Human Tool Approval)

Pour utiliser l’approbation d’outils, vous devez avoir un agent Conversational dont l’historique de conversation est persisté. Le trait RemembersConversations fournit la persistance nécessaire pour reprendre les appels suspendus.
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 contrat Approvable et en utilisant le trait InteractsWithApprovals. Par défaut, un outil approuvable nécessite systématiquement une approbation.
Pour décider dynamiquement si une approbation est nécessaire selon les arguments de l’appel, définissez une méthode needsApproval sur l’outil. Elle peut renvoyer un booléen ou une instance Approval contenant la raison de l’approbation.
Lorsque vous renvoyez les outils depuis la méthode tools de l’agent, vous pouvez également surcharger l’exigence d’approbation.
Lorsqu’un outil approuvable est appelé, l’agent est mis en pause avant l’exécution. En inspectant 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.
Pour reprendre l’agent, continuez la conversation en passant une instance 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.
Les booléens 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.
Rejeter avec un résultat comme 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 route GET 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.
Si le statut de la réponse vaut 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.
Pour un message de chat classique, envoyez plutôt la valeur message.
Le flux d’approbation permet de donner à un agent d’IA de puissantes capacités d’action, tout en intercalant une vérification humaine avant l’exécution. Utilisez-le sans hésiter pour les outils impliquant des opérations irréversibles : suppression de fichier, traitement de paiement, écriture vers une API externe, etc.

Génération d’images

La classe Image permet de générer des images. Les fournisseurs OpenAI, Gemini et xAI sont pris en charge.
Vous pouvez préciser la qualité, le ratio ou un timeout.
Il est également possible de joindre une image de référence pour la retoucher.

Enregistrement des images

Génération d’image via une queue


Synthèse vocale (TTS)

La classe Audio permet de convertir du texte en audio. Les fournisseurs OpenAI et ElevenLabs sont pris en charge.
Vous pouvez préciser le genre de la voix, un identifiant de voix spécifique ou des instructions de diction.

Enregistrement de l’audio

Génération audio via une queue


Transcription (STT)

La classe Transcription permet de convertir un fichier audio en texte. Les fournisseurs OpenAI, ElevenLabs et Mistral sont pris en charge.

Séparation des intervenants (diarization)

Utilisez diarize() pour obtenir une transcription séparée par intervenant.

Transcription via une queue


Résumé de texte (Text Summarization)

La méthode summarize 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é.
Vous pouvez préciser le nombre maximal de phrases, le fournisseur, le modèle ou un timeout. La classe Str propose également une version statique.

Embeddings

Convertissez du texte en représentation vectorielle pour la recherche par similarité, entre autres.
Vous pouvez également préciser le fournisseur, le modèle et la dimension.

Embeddings multimodaux

La méthode Embeddings::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.
Pour les entrées multimodales, utilisez les mêmes classes de fichiers que pour les pièces jointes. Ces fichiers peuvent être créés depuis un chemin local, un disque de système de fichiers, une URL distante ou un contenu encodé en Base64. Les images, documents et vidéos peuvent aussi être créés depuis un fichier uploadé, et les documents peuvent également être créés depuis une chaîne de caractères brute.
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é

Des méthodes de bas niveau sont également disponibles.

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 dans config/ai.php.
Vous pouvez aussi contrôler le cache requête par requête.

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.
On peut aussi les créer depuis une chaîne ou un upload de formulaire.

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éthode withProviderOptions permet de passer des options d’upload propres au fournisseur, comme le purpose d’un fichier chez OpenAI.
Pour définir des options différentes selon le fournisseur, passez une closure.

Vector stores

Les vector stores permettent de laisser les fournisseurs gérer les documents pour vous.

Ajouter des fichiers à un store

Vous pouvez aussi joindre des métadonnées.

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

Des assertions pour la mise en queue sont également disponibles.
preventStrayPrompts() fait remonter une exception si un prompt non défini par le fake est déclenché.
Pour un agent qui renvoie une sortie structurée, vous pouvez indiquer la réponse sous forme de tableau : l’agent renverra une réponse structurée contenant les données spécifiées.
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.
Pour tester un agent anonyme, utilisez 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

Vous pouvez également faire des assertions sur les opérations effectuées sur un store.

Événements

Le Laravel AI SDK émet les événements suivants. En les écoutant, vous pouvez implémenter du logging, du monitoring, etc.
  • PromptingAgent — avant l’envoi du prompt
  • AgentPrompted — après l’envoi du prompt
  • StreamingAgent — au démarrage du streaming
  • AgentStreamed — à la fin du streaming
  • InvokingTool — avant l’appel d’un outil
  • ToolInvoked — après l’appel d’un outil
  • ToolApprovalRequested — lors d’une demande d’approbation d’outil
  • ToolApprovalResolved — après résolution de l’approbation d’outil
  • GeneratingImage — avant la génération d’image
  • ImageGenerated — après la génération d’image
  • GeneratingAudio — avant la génération audio
  • AudioGenerated — après la génération audio
  • GeneratingTranscription — avant la transcription
  • TranscriptionGenerated — après la transcription
  • GeneratingEmbeddings — avant la génération d’embeddings
  • EmbeddingsGenerated — après la génération d’embeddings
  • Reranking — avant le reranking
  • Reranked — après le reranking
  • StoringFile — avant le stockage du fichier
  • FileStored — après le stockage du fichier
  • FileDeleted — après la suppression du fichier
  • CreatingStore — avant la création du store
  • StoreCreated — après la création du store
  • AddingFileToStore — avant l’ajout d’un fichier à un store
  • FileAddedToStore — après l’ajout d’un fichier à un store
  • RemovingFileFromStore — avant le retrait d’un fichier d’un store
  • FileRemovedFromStore — après le retrait d’un fichier d’un store
Dernière modification le 2 août 2026