Objectif : Donner des capacités d'action à un LLM via les outils.
Théorie (15 min) :
- Lire : Claude Tool Use
- Tool Use = Le LLM peut décider d'appeler une fonction Python
- Flow : User → LLM → [décide d'appeler outil] → Python exécute → Résultat → LLM → Réponse finale
- Format JSON : Définir le nom, la description et les paramètres de chaque outil
Pratique (45 min) :
import anthropic
import json
tools = [
{
"name": "get_weather",
"description": "Retourne la météo actuelle pour une ville",
"input_schema": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "Nom de la ville"},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
},
"required": ["city"]
}
}
]
def get_weather(city, unit="celsius"):
# Simulation — en production, appelle une vraie API météo
return {"city": city, "temperature": 18, "unit": unit, "condition": "Ensoleillé"}
# Boucle agent simple
messages = [{"role": "user", "content": "Quelle est la météo à Bruxelles ?"}]
response = client.messages.create(model="claude-opus-4-6", max_tokens=1024, tools=tools, messages=messages)
if response.stop_reason == "tool_use":
tool_call = response.content[-1]
result = get_weather(**tool_call.input)
# Renvoyer le résultat à Claude
messages.append({"role": "assistant", "content": response.content})
messages.append({"role": "user", "content": [{"type": "tool_result", "tool_use_id": tool_call.id, "content": json.dumps(result)}]})
final_response = client.messages.create(model="claude-opus-4-6", max_tokens=1024, tools=tools, messages=messages)
print(final_response.content[0].text)
- Créer 2 outils :
get_weatheretsend_email(simulé) - Tester avec une question qui nécessite les deux outils
- Observer comment le LLM choisit quel outil appeler
Checkpoint : Tu as un agent qui appelle des outils réels.