Les grandes écoles réécrivent leurs programmes, et les recruteurs commencent à demander aux candidats ingénieurs de construire un agent IA en direct pendant l'entretien. Le problème, c'est que personne n'explique jamais ce qu'est vraiment un agent. Ce guide le fait, et tu repars avec un agent qui tourne.
Un agent IA, c'est trois choses
Oublie le marketing. Un agent, c'est une boucle avec trois pièces :
- Un modèle — le cerveau qui décide quoi faire (ici Claude).
- Des outils — des fonctions qu'il a le droit d'appeler : chercher dans une base, envoyer un mail, lire un fichier.
- Une boucle — tant que le modèle demande un outil, tu l'exécutes, tu lui rends le résultat, et tu le rappelles. Quand il arrête de demander, c'est fini.
C'est tout. Un chatbot répond une fois. Un agent boucle jusqu'à ce que le travail soit fait.
Installation
pip install anthropic
export ANTHROPIC_API_KEY="ta-clé"
Un agent complet en 25 lignes
Le SDK gère la boucle pour toi avec le tool runner. Tu écris juste les outils, il s'occupe du reste : appeler le modèle, exécuter l'outil demandé, renvoyer le résultat, recommencer.
import anthropic
from anthropic import beta_tool
client = anthropic.Anthropic()
@beta_tool
def get_weather(city: str) -> str:
"""Donne la météo actuelle d'une ville.
Args:
city: Le nom de la ville, par exemple Saint-Denis.
"""
return f"27 degrés et ensoleillé à {city}"
runner = client.beta.messages.tool_runner(
model="claude-opus-4-8",
max_tokens=16000,
tools=[get_weather],
messages=[{"role": "user", "content": "Il fait quoi à Saint-Denis ?"}],
)
for message in runner:
for block in message.content:
if block.type == "text":
print(block.text)
Le décorateur @beta_tool lit la signature de ta fonction et sa docstring pour générer le schéma automatiquement. Tu n'écris pas une ligne de JSON.
La même chose à la main, pour comprendre la boucle
Si tu veux voir ce que le tool runner fait à ta place, la voilà. C'est la boucle, littéralement :
messages = [{"role": "user", "content": question}]
while True:
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=16000,
tools=tools,
messages=messages,
)
if response.stop_reason == "end_turn":
break # il n'a plus besoin d'outil : c'est terminé
messages.append({"role": "assistant", "content": response.content})
results = []
for block in response.content:
if block.type == "tool_use":
results.append({
"type": "tool_result",
"tool_use_id": block.id, # doit correspondre au bloc tool_use
"content": execute(block.name, block.input),
})
messages.append({"role": "user", "content": results})
Piège vu en production
Renvoie toujours le response.content complet dans l'historique, pas seulement le texte. Si tu ne gardes que le texte, tu perds les blocs tool_use et l'API rejette ton appel suivant parce qu'un tool_result ne correspond plus à rien. C'est l'erreur numéro un quand on écrit la boucle soi-même.
Sécurité
Le tool runner exécute tes fonctions automatiquement dès que le modèle les demande. Pour tout ce qui a un effet irréversible — envoyer un mail, débiter, supprimer — mets une validation humaine dans la fonction : demande confirmation, et renvoie « refusé par l'utilisateur » si la réponse est non.
Ce que ton agent sait faire ensuite
À partir de ce squelette, tu ajoutes des outils et l'agent devient utile :
- Un outil qui lit ta base clients → il répond aux questions sur tes clients.
- Un outil qui appelle une API météo, un CRM, un webhook n8n → il agit sur tes vrais systèmes.
- Plusieurs outils d'un coup → il enchaîne : cherche, filtre, écrit, envoie. Sans que tu écrives l'enchaînement.
La description de chaque outil compte plus que son code : c'est elle que le modèle lit pour décider quand l'appeler. Sois explicite sur quand l'utiliser, pas seulement sur ce qu'il fait.
Pour aller plus loin
Si tu veux d'abord comprendre la théorie avant de coder, commence par C'est quoi un agent IA. Une fois le tien construit, apprends à le fiabiliser avec Tester un agent avant de lui faire confiance.
Documentation officielle tool use →