Skip to main content

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
Dans ces cas, implémentez un fournisseur personnalisé et enregistrez-le auprès de l’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). Tous les fournisseurs héritent de la classe abstraite 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.
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).
L’implémentation de 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.
1

Créer la classe du fournisseur

Créez app/Ai/Providers/MyInferenceProvider.php.
2

Enregistrer dans l'AppServiceProvider

Enregistrez-le en utilisant extend() dans la méthode boot de App\Providers\AppServiceProvider.
3

Ajouter le fournisseur dans config/ai.php

Ajoutez également les variables dans .env.
4

Utiliser depuis un agent

Une fois enregistré, il suffit de passer le nom du fournisseur à l’argument provider de prompt() pour l’utiliser comme un fournisseur standard.
Pour l’utiliser comme fournisseur par défaut, modifiez la clé default de config/ai.php.

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 contrat StepTextGateway est nécessaire.

Le contrat StepTextGateway

Voici l’interface définie par src/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.
L’ancien contrat TextGateway (avec generateText(), stream(), onToolInvocation()) présent avant la 0.8 a été supprimé en 0.9. Si vous avez une passerelle personnalisée, vous devez migrer vers StepTextGateway. La méthode onToolInvocation() liée aux appels d’outils a été déplacée dans TextGenerationLoop.

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éthode fake() 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 utilisant extend().

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.
Dernière modification le 13 juillet 2026