L’API HTTP doit contrôler authentification, taille des entrées et erreurs. La chaîne LangChain reste une dépendance interne, testable indépendamment de FastAPI.
Installer
~~~bash pip install -U fastapi 'uvicorn[standard]' langchain langchain-openai pydantic-settings ~~~
Créer la chaîne une seule fois
~~~python from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser
prompt = ChatPromptTemplate.from_messages([ ('system', 'Réponds clairement en français.'), ('user', '{question}'), ]) chain = prompt | ChatOpenAI(model='votre-modele-actif', temperature=0) | StrOutputParser() ~~~
Initialisez clients et chaînes au démarrage, pas à chaque requête.
Exposer la route
~~~python from fastapi import FastAPI, Depends, HTTPException from pydantic import BaseModel, Field
app = FastAPI()
class AskRequest(BaseModel): question: str = Field(min_length=1, max_length=10_000)
class AskResponse(BaseModel): answer: str
@app.post('/ask', response_model=AskResponse) async def ask(body: AskRequest, user=Depends(authenticate)): try: answer = await chain.ainvoke({'question': body.question}) return AskResponse(answer=answer) except TimeoutError as error: raise HTTPException(504, 'Le modèle ne répond pas') from error ~~~
Ne retournez pas l’exception brute du fournisseur au client.
Ajouter le streaming
Utilisez StreamingResponse et chain.astream. Arrêtez l’appel en aval lorsque le client se déconnecte. Définissez un type de média adapté et envoyez des événements structurés si le client doit distinguer tokens, sources et erreurs.
Tester
Remplacez la chaîne par un faux dans les tests de route. Vérifiez 200, entrée vide, entrée trop longue, utilisateur absent, timeout et erreur fournisseur. Testez séparément le prompt sur un dataset métier.
Production
Ajoutez quota par identité, limitation de concurrence, budget de tokens, traces et métriques. Placez la clé modèle côté serveur. Pour les agents, limitez le nombre d’étapes et sécurisez chaque outil.
FAQ
async rend-il l’appel plus rapide ?
Non, mais il permet au serveur de traiter d’autres requêtes pendant l’attente réseau.
Faut-il un worker par utilisateur ?
Non. Dimensionnez selon concurrence, limites fournisseur et charge CPU ; les tâches longues vont dans une file.