Le modèle ne doit pas recevoir un client HTTP générique. Donnez-lui un petit ensemble d’outils métier : lire une commande, rechercher un produit ou créer un ticket. Chaque outil applique ses propres autorisations.
Créer un client contrôlé
~~~bash pip install -U httpx pydantic ~~~
~~~python import httpx
class OrdersClient: def __init__(self, base_url: str, token: str): self.client = httpx.AsyncClient( base_url=base_url, headers={'Authorization': f'Bearer {token}'}, timeout=httpx.Timeout(10.0), )
async def get_order(self, order_id: str) -> dict | None: response = await self.client.get(f'/orders/{order_id}') if response.status_code == 404: return None response.raise_for_status() return response.json() ~~~
Le base_url et le token viennent de la configuration serveur, jamais d’un argument choisi par le modèle.
Définir l’outil
~~~python from pydantic import BaseModel, Field
class OrderQuery(BaseModel): order_id: str = Field(pattern=r'^CMD-[0-9]{6}$')
async def lookup_order(args: OrderQuery, user_id: str) -> dict: order = await orders.get_order(args.order_id) if order is None or order['user_id'] != user_id: return {'found': False} return { 'found': True, 'status': order['status'], 'eta': order.get('eta'), } ~~~
Retournez seulement les champs nécessaires. Le modèle n’a pas besoin de recevoir adresse, e-mail ou informations de paiement.
Boucle d’outil
Envoyez au LLM le nom, la description et le schéma de l’outil. Lorsqu’il propose un appel, validez les arguments avec Pydantic, exécutez l’outil, puis renvoyez le résultat au modèle. Limitez le nombre total d’appels par requête.
Actions d’écriture
Pour créer, modifier ou supprimer une ressource, exigez une confirmation utilisateur, une clé d’idempotence et une autorisation métier dans l’outil. Un texte du modèle ne constitue jamais une confirmation.
Tester les échecs
Testez identifiant invalide, 401, 403, 404, 429, 500, délai dépassé et JSON incorrect. Vérifiez que l’agent n’invente pas un résultat lorsque l’API échoue et qu’il ne révèle pas l’existence d’une ressource appartenant à un autre utilisateur.
Production
Ajoutez circuit breaker, métriques par endpoint, corrélation de trace et quotas. Masquez tokens et données personnelles dans les logs. Versionnez le contrat REST ou placez un adaptateur entre l’agent et l’API.
FAQ
Peut-on fournir toute une spécification OpenAPI au modèle ?
Techniquement oui, mais un sous-ensemble d’outils métier est plus sûr, moins coûteux et plus simple à tester.
Où placer l’autorisation ?
Dans le service ou l’outil appelé, jamais uniquement dans le prompt.