Intégrer un LLM dans Laravel avec un SDK IA
On peut appeler un LLM depuis Laravel à la main avec Http, mais un SDK gère le multi-provider, le tool calling, les sorties structurées, le streaming et les retries. Voici comment fonctionne l'écosystème IA de Laravel en 2026.
Appeler un modèle de langage depuis Laravel, c'est une requête POST, et pour un cas ponctuel vous pouvez l'écrire avec le client Http. Dès que vous avez besoin de sorties structurées, de tool calling, de streaming vers le navigateur, de retries, et de pouvoir changer de provider, un SDK gagne sa place. Ce guide couvre l'écosystème IA de Laravel en 2026 et comment utiliser chaque capacité, avec Prism comme exemple concret.
Le paysage 2026
- ✓Prism (prism-php/prism) : provider-agnostic, une API commune sur Anthropic, OpenAI, Mistral, Ollama et d'autres. Texte, sorties structurées, outils, streaming, embeddings.
- ✓Les SDK officiels par provider : les packages éditeurs quand vous voulez des fonctionnalités spécifiques et que vous ne comptez pas changer.
- ✓Laravel MCP : expose votre application comme des outils qu'un client MCP (dont un agent LLM) peut appeler, le sens inverse de l'appel d'un modèle.
Génération de texte
L'appel de base : choisir un provider et un modèle, poser un prompt système, envoyer le prompt utilisateur. Gardez le choix du modèle en config pour pouvoir le changer sans toucher au code.
use Prism\Prism\Prism;
$response = Prism::text()
->using('anthropic', config('services.llm.model')) // ex. claude-sonnet-5
->withSystemPrompt('Tu es un assistant de support concis.')
->withPrompt($question)
->asText();
return $response->text;Sorties structurées
Quand vous avez besoin de données, pas de prose, décrivez un schéma et récupérez un tableau typé déjà validé contre ce schéma. C'est le bon outil pour l'extraction (sortir des champs d'un email), la classification (router un ticket), et tout cas où l'étape suivante est du code, pas un humain qui lit du texte.
use Prism\Prism\Schema\{ObjectSchema, StringSchema, EnumSchema};
$schema = new ObjectSchema('ticket', 'Un ticket de support trié', [
new StringSchema('summary', 'Résumé en une phrase'),
new EnumSchema('category', 'Domaine du ticket', ['billing', 'technical', 'account']),
new EnumSchema('priority', 'Urgence', ['low', 'medium', 'high']),
], ['summary', 'category', 'priority']);
$response = Prism::structured()
->using('anthropic', config('services.llm.model'))
->withSchema($schema)
->withPrompt($emailBody)
->asStructured();
$ticket = $response->structured; // ['summary' => ..., 'category' => ..., 'priority' => ...]Tool calling, en sécurité
Un outil laisse le modèle appeler une fonction de votre code : chercher une commande, vérifier le stock. Le SDK gère l'aller-retour, mais vous restez du côté de la proposition uniquement. Le modèle renvoie un nom d'outil et des arguments ; votre closure les valide face aux permissions de l'utilisateur courant et à vos règles métier, puis exécute ou refuse. Le modèle ne touche jamais la base directement.
use Prism\Prism\Tool;
$orderStatus = Tool::as('order_status')
->for('Statut de commande pour le client courant')
->withStringParameter('order_id', 'La référence de commande')
->using(function (string $orderId) use ($user) {
$order = $user->orders()->find($orderId); // cadré à l'utilisateur
return $order ? "Statut : {$order->status}" : 'Commande introuvable';
});
$response = Prism::text()
->using('anthropic', config('services.llm.model'))
->withTools([$orderStatus])
->withMaxSteps(3)
->withPrompt($question)
->asText();Streaming vers le navigateur
Un appel de génération prend des secondes ; streamez les tokens pour que l'interface réponde tout de suite. Le SDK expose la réponse comme un itérable ; enveloppez-le dans une réponse streamée Laravel sur Server-Sent Events et consommez-la avec EventSource côté front.
return response()->stream(function () use ($question) {
$stream = Prism::text()
->using('anthropic', config('services.llm.model'))
->withPrompt($question)
->asStream();
foreach ($stream as $chunk) {
echo 'data: ' . json_encode(['text' => $chunk->text]) . "\n\n";
ob_flush();
flush();
}
}, 200, ['Content-Type' => 'text/event-stream', 'X-Accel-Buffering' => 'no']);Embeddings et pgvector
Le même SDK génère des embeddings, que vous stockez dans une colonne pgvector à côté de vos données relationnelles pour un montage RAG léger, sans base vectorielle séparée. Embeddez vos documents à l'ingestion, embeddez la question au moment de la requête, et lancez une recherche de similarité en SQL.
Abstraction du SDK ou SDK du provider directement ?
| Besoin | À la main (Http) | SDK du provider | Prism (abstraction) |
|---|---|---|---|
| Un seul appel simple | Suffit | Surdimensionné | Suffit |
| Sorties structurées, outils, streaming | Vous construisez la plomberie | Oui, à la forme du provider | Oui, uniforme |
| Changer ou comparer les providers | Réécrire chaque appel | Réécrire chaque appel | Changer une chaîne |
| Une fonctionnalité spécifique (prompt caching, batch) | Manuel | De première classe | Peut être en retard |
Coût, cache, rate limiting, fallback
- ✓Mettez en cache les réponses aux prompts fréquents ou identiques pour ne pas payer deux fois la même question.
- ✓Limitez le débit par utilisateur et par clé d'API, et renvoyez un 429 clair.
- ✓Suivez tokens et coût par fonctionnalité, attribués à un utilisateur ou un tenant.
- ✓Ayez un fallback non-IA (une page d'aide, un formulaire) pour quand le provider expire ou échoue.
FAQ
- Faut-il un package pour utiliser l'IA dans Laravel ?
- Pas pour un seul appel simple, qui est juste une requête Http. Vous voulez un SDK dès que vous avez besoin de sorties structurées, de tool calling, de streaming, de retries, ou de pouvoir changer de provider sans réécrire chaque appel. Prism vous donne une API commune sur les providers ; un SDK provider vous donne les fonctionnalités spécifiques.
- Prism ou le SDK du provider ?
- Utilisez Prism quand vous valorisez une API uniforme et la possibilité de changer ou comparer les providers en éditant une chaîne. Utilisez le SDK du provider quand vous dépendez de fonctionnalités spécifiques comme le prompt caching ou l'API batch, ou quand vous vous êtes engagé sur un provider et voulez un support de première classe.
- Comment obtenir une sortie JSON structurée d'un LLM en Laravel ?
- Décrivez la forme voulue comme un schéma et utilisez le mode structuré du SDK. Il contraint le modèle et valide la réponse contre le schéma, donc vous récupérez un tableau typé plutôt que de parser du texte libre. C'est la bonne approche pour l'extraction et la classification.
- Comment faire du tool calling proprement ?
- Définissez chaque outil comme une closure qui prend les arguments du modèle, les valide face aux permissions de l'utilisateur courant et à vos règles métier, puis exécute ou refuse. Le modèle propose l'appel ; votre code décide. Ne laissez jamais le modèle atteindre la base directement, et cadrez chaque outil à l'utilisateur authentifié côté serveur.
- Comment gérer les coûts d'un LLM dans une app Laravel ?
- Gardez le modèle en config pour pouvoir passer à un moins cher par route. Mettez en cache les prompts fréquents, raccourcissez le prompt système et tout contexte récupéré, limitez le débit par utilisateur, et loggez tokens et coût par fonctionnalité pour qu'un pic soit visible avant d'être une surprise sur la facture.
Un SDK IA n'ajoute pas d'intelligence ; il retire de la plomberie. Il vous donne une forme unique pour le texte, les sorties structurées, les outils, le streaming et les embeddings à travers les providers, pour que le travail intéressant, le prompt, le contexte, les frontières des outils, soit là où va votre effort.
Besoin d'aide sur ce sujet ? Intégration IA & RAG
Découvrir ce service →