Exercices AI Engineering Tool use : executer un outil
🎉

Bravo!

Intermédiaire 🧠 Fondamentaux 20 XP 0 personnes ont réussi

Tool use : executer un outil

Tu sais maintenant definir des outils. L'etape suivante : quand le LLM decide d'utiliser un outil, il renvoie le nom de l'outil et les arguments. C'est a ton code de trouver la bonne fonction et de l'appeler avec les bons parametres. C'est le dispatcher.

En production, ca ressemble a ca : le LLM repond quelque chose comme "j'ai besoin d'appeler l'outil meteo avec ville=Paris". Ton backend recoit cette reponse, cherche la fonction correspondante dans un registre d'outils, et l'execute.

Voici le flux complet :

LLM repond : {"tool": "meteo", "arguments": {"ville": "Paris"}}
Ton code : trouve la fonction meteo, l'appelle avec ville="Paris"
Resultat : "Il fait beau a Paris"

Tu vas ecrire une fonction executer_outil(appel, outils) qui prend :
- appel : un dictionnaire avec "tool" (nom de l'outil) et "arguments" (dictionnaire des arguments)
- outils : une liste d'outils (crees avec creer_outil de l'exercice precedent)

La fonction doit :
1. Chercher l'outil dont le "name" correspond a appel["tool"]
2. Si l'outil n'existe pas, renvoyer {"erreur": "Outil inconnu: <nom>"}
3. Si l'outil existe, appeler sa "function" avec les arguments (en utilisant **arguments pour le unpacking)
4. Renvoyer {"resultat": <valeur de retour de la fonction>}
5. Si l'appel de la fonction leve une exception, renvoyer {"erreur": "<message de l'exception>"}

Exemple :

def meteo(ville):
return f"Ensoleille a {ville}"

outils = [creer_outil("meteo", "Meteo", {"ville": {"type": "str"}}, meteo)]
executer_outil({"tool": "meteo", "arguments": {"ville": "Lyon"}}, outils)
renvoie {"resultat": "Ensoleille a Lyon"}

Tests (4/5)

Execute un outil existant
def add(a, b): return a + b
outils = [creer_outil('add', 'Addition', {}, add)]
r = executer_outil({'tool': 'add', 'arguments': {'a': 3, 'b': 4}}, outils)
assert r == {'resultat': 7}
Outil inconnu
r = executer_outil({'tool': 'inexistant', 'arguments': {}}, [])
assert 'erreur' in r
assert 'inexistant' in r['erreur']
Gestion d'erreur
def boom(x): raise ValueError('Mauvais argument')
outils = [creer_outil('boom', 'Explose', {}, boom)]
r = executer_outil({'tool': 'boom', 'arguments': {'x': 1}}, outils)
assert 'erreur' in r
assert 'Mauvais argument' in r['erreur']
Plusieurs outils, bon choix
def f1(): return 'un'
def f2(): return 'deux'
outils = [creer_outil('f1', 'F1', {}, f1), creer_outil('f2', 'F2', {}, f2)]
assert executer_outil({'tool': 'f2', 'arguments': {}}, outils) == {'resultat': 'deux'}

+ 0 tests cachés

Indices (3 disponibles)

solution.py