FastAPI fournit le contrat HTTP, la validation et le cycle de vie du service; LangChain exécute le pipeline ou l’agent. Gardez ces responsabilités séparées afin de tester la logique IA sans serveur et l’API sans appeler systématiquement un modèle réel.
Définir les schémas HTTP
Créez des modèles Pydantic distincts pour la requête et la réponse. Limitez la longueur des messages, validez les identifiants de thread et refusez les champs inconnus si votre contrat l’exige. Ne retournez pas directement l’état interne de l’agent.
Initialiser les dépendances
Construisez le modèle, les outils et l’agent au démarrage de l’application plutôt qu’à chaque requête. Injectez les clients et la configuration; les tests peuvent alors fournir des doublures. Fermez proprement les ressources lors de l’arrêt.
Gérer l’asynchrone
Utilisez async def et ainvoke lorsque l’intégration est asynchrone. Ajoutez timeout, annulation et limite de concurrence. N’exécutez pas un appel bloquant lourd directement sur la boucle événementielle.
Traduire les erreurs
Transformez les erreurs attendues en codes HTTP cohérents, sans exposer de clé, prompt interne ou stack trace. Distinguez entrée invalide, quota, timeout fournisseur et indisponibilité temporaire.
Sécuriser et observer
Authentifiez avant l’appel au modèle, vérifiez les droits dans chaque outil, appliquez des quotas et corrélez requête HTTP et trace LangChain. Pour le streaming, utilisez un protocole d’événements explicite et gérez la déconnexion.
Checklist avant mise en production
- Valider les entrées, les sorties et les permissions des outils.
- Tester les erreurs du fournisseur, les délais d’attente et les limites de coût.
- Ajouter des traces sans enregistrer de secrets ni de données personnelles inutiles.
- Mesurer la qualité sur un jeu de cas représentatifs avant chaque évolution.
Questions fréquentes
Faut-il utiliser async def ?
Oui si les bibliothèques appelées fournissent des méthodes awaitables. Sinon, utilisez une route synchrone ou déportez correctement le travail bloquant.
Peut-on conserver l’agent comme variable globale ?
L’agent peut être partagé s’il est conçu pour cela, mais l’état utilisateur doit rester isolé par thread et les clients doivent être thread-safe.