Quand un fournisseur personnalisé est nécessaire
Laravel AI SDK prend en charge en standard les principaux services d’IA tels qu’OpenAI, Anthropic, Gemini et Mistral. Cependant, les fournisseurs standards ne suffisent pas dans les cas suivants :- Un service d’IA émergent qui n’est pas encore officiellement pris en charge
- Vous voulez faire transiter les requêtes par une passerelle de modèles interne ou une couche de gestion de la facturation
- Un serveur d’inférence on-premise possédant son propre protocole ou mode d’authentification
AiManager du SDK afin de pouvoir l’utiliser avec la même API que les fournisseurs standards.
Pour les API compatibles OpenAI, utilisez le pilote intégréDepuis la version 0.9 du SDK, un pilote
openai-compatible est fourni en standard. Pour un serveur d’inférence interne compatible OpenAI (par exemple l’endpoint compatible OpenAI d’Ollama), il suffit d’ajouter la configuration dans config/ai.php pour l’utiliser, sans avoir besoin d’implémenter un fournisseur personnalisé.Vue d’ensemble de l’architecture
Structure en deux couches
Laravel AI SDK est composé de deux couches : les fournisseurs (providers) et les passerelles (gateways).| Couche | Rôle | Exemples |
|---|---|---|
| Provider | Interface côté application. Résolution du nom de modèle, conservation de la configuration | OpenAiProvider, AnthropicProvider |
| Gateway | Envoie une seule étape de requête à l’API | AnthropicGateway, OpenAiCompatibleGateway |
Laravel\Ai\Providers\Provider et implémentent les contrats (interfaces) correspondant à chaque fonctionnalité. Les boucles multi-étapes incluant des appels d’outils sont réalisées par TextGenerationLoop, qui appelle la passerelle de manière itérative.
Liste des contrats
Implémentez uniquement les contrats correspondant aux fonctionnalités que vous souhaitez fournir.| Contrat | Espace de noms | Fonctionnalité |
|---|---|---|
TextProvider | Laravel\Ai\Contracts\Providers\TextProvider | Génération de texte, agents |
EmbeddingProvider | Laravel\Ai\Contracts\Providers\EmbeddingProvider | Génération d’embeddings vectoriels |
ImageProvider | Laravel\Ai\Contracts\Providers\ImageProvider | Génération d’images |
AudioProvider | Laravel\Ai\Contracts\Providers\AudioProvider | Synthèse vocale (TTS) |
TranscriptionProvider | Laravel\Ai\Contracts\Providers\TranscriptionProvider | Reconnaissance vocale (STT) |
Dans la plupart des cas, implémenter uniquement
TextProvider est suffisant.Le contrat TextProvider
Voici l’interface qu’un fournisseur de génération de texte doit implémenter (src/Contracts/Providers/TextProvider.php).
prompt() et stream() peut être déléguée aux traits existants (GeneratesText, StreamsText), donc au total seules quatre méthodes doivent réellement être implémentées : les trois qui retournent les noms de modèles et textGateway(). La boucle multi-étapes d’outils est gérée par TextGenerationLoop, la passerelle ne traite donc qu’une seule étape de requête à la fois.
Exemple d’implémentation : fournisseur personnalisé
Voici un exemple d’enregistrement d’un service d’inférence disposant d’une API propre en tant que fournisseur nommémy-inference.
Enregistrer dans l'AppServiceProvider
Enregistrez-le en utilisant
extend() dans la méthode boot de App\Providers\AppServiceProvider.Implémentation d’une passerelle personnalisée
Pour les services qui possèdent une API propre non compatible OpenAI, une passerelle personnalisée implémentant le contratStepTextGateway est nécessaire.
Le contrat StepTextGateway
Voici l’interface définie parsrc/Contracts/Gateway/StepTextGateway.php. La passerelle traite une seule étape de la conversation et retourne une StepResponse. La boucle d’appels d’outils est gérée par le TextGenerationLoop appelant.
Exemple d’implémentation d’une passerelle personnalisée
Voici le squelette d’une passerelle simple qui envoie des requêtes HTTP à une API d’inférence propriétaire.Pour prendre en charge les appels d’outils (function calling), incluez les résultats des appels d’outils dans
toolCalls au sein de generateTextStep() et définissez finishReason à FinishReason::ToolCalls. L’exécution des outils et le passage à l’étape suivante sont gérés automatiquement par TextGenerationLoop. Reportez-vous à AnthropicGateway.php pour un exemple concret d’implémentation.Comment tester
Utiliser la méthode fake() de la classe d’agent
Pour tester un agent qui utilise un fournisseur personnalisé, utilisez la méthodefake() de la classe d’agent. Une passerelle factice est assignée au fournisseur, qu’il soit personnalisé ou non.
Depuis la 0.9, les réponses de
Agent::fake() passent par le même TextGenerationLoop que le fournisseur réel. Si vous configurez un appel d’outil factice sur un agent qui n’a pas d’outils enregistrés, une exception NoSuchToolException sera levée.Fournisseur mock avec extend()
Vous pouvez également enregistrer un fournisseur de test depuis le conteneur en utilisantextend().
Liens de référence
OllamaProvider.php — Exemple d'implémentation simple d'un fournisseur
Configuration minimale d’un fournisseur qui se connecte à un serveur de modèle local. Utile comme référence pour implémenter un fournisseur personnalisé.
AnthropicGateway.php — Exemple d'implémentation d'une passerelle
Exemple d’implémentation d’une passerelle qui implémente
StepTextGateway. Vous pouvez y examiner l’implémentation de generateTextStep() et generateStreamStep().Contrat StepTextGateway
Définition de l’interface qu’une passerelle de génération de texte doit implémenter.
Contrat TextProvider
Définition de l’interface qu’un fournisseur de génération de texte doit implémenter.