Tool Use et Function Calling avec Agno
Donnez des "mains" à vos agents IA : apprenez à utiliser les outils intégrés d'Agno (recherche web, fichiers, finance) et à créer vos propres outils custom avec le décorateur @tool.
Donner des "Mains" à l'IA
Un LLM seul est puissant mais aveugle : il ne peut pas accéder à Internet, lire vos fichiers, appeler une API externe, ou exécuter du code. Le tool use (ou function calling) résout ce problème en donnant à l'agent la capacité d'agir sur le monde réel.
Définition : Le tool use, c'est la capacité d'un LLM à décider quand appeler une fonction externe, quels arguments lui passer, puis à utiliser le résultat pour construire sa réponse finale.
C'est ce qui transforme un simple chatbot en véritable agent autonome.
Comment Fonctionne le Function Calling
Sous le capot, le mécanisme est élégant. Quand vous donnez des outils à un agent, voici ce qui se passe à chaque échange :
Le LLM reçoit la description de chaque outil (nom, paramètres, docstring) sous forme de JSON Schema. Il choisit ensuite s'il doit appeler un outil et avec quels arguments. Il ne voit jamais le code Python : seulement la description et le résultat.
Le LLM ne "s'exécute" pas lui-même. C'est le framework (ici Agno) qui intercepte la décision du LLM, appelle réellement la fonction Python, et renvoie le résultat au LLM pour qu'il continue.
Les Outils Built-in d'Agno
Agno propose une bibliothèque riche d'outils prêts à l'emploi. Voici les plus utiles :
| Outil | Import | Usage principal |
|---|---|---|
DuckDuckGoTools | agno.tools.duckduckgo | Recherche web et actualités |
WebSearchTools | agno.tools.websearch | Recherche multi-moteurs (Google, Bing, Brave…) |
FileTools | agno.tools.file | Lire/écrire des fichiers locaux |
YFinanceTools | agno.tools.yfinance | Cours de bourse, données financières |
PythonTools | agno.tools.python | Exécuter du code Python dynamiquement |
ShellTools | agno.tools.shell | Exécuter des commandes shell |
Exemple : Agent de Recherche Web
from agno.agent import Agent
from agno.models.anthropic import Claude
from agno.tools.duckduckgo import DuckDuckGoTools
agent = Agent(
model=Claude(id="claude-sonnet-4-20250514"),
tools=[DuckDuckGoTools()],
instructions=["Réponds toujours en français.", "Cite tes sources."],
markdown=True,
)
agent.print_response("Quelles sont les dernières avancées en IA générative ?")
L'agent va automatiquement décider de lancer une recherche DuckDuckGo, récupérer les résultats, puis synthétiser une réponse sourcée : sans que vous ayez rien à configurer de plus.
Combiner Plusieurs Outils
Un agent peut avoir autant d'outils que nécessaire. Il choisit lequel utiliser selon le contexte :
from agno.agent import Agent
from agno.models.anthropic import Claude
from agno.tools.duckduckgo import DuckDuckGoTools
from agno.tools.yfinance import YFinanceTools
agent = Agent(
model=Claude(id="claude-sonnet-4-20250514"),
tools=[
DuckDuckGoTools(),
YFinanceTools(stock_price=True, analyst_recommendations=True),
],
markdown=True,
)
agent.print_response("Donne-moi le cours d'NVIDIA et les dernières actualités sur l'entreprise.")
Créer ses Propres Outils avec @tool
C'est là que la magie opère vraiment. Vous pouvez transformer n'importe quelle fonction Python en outil pour votre agent, avec un simple décorateur.
La Règle d'Or : La Docstring Est le Cerveau
Le LLM décide d'utiliser votre outil uniquement grâce à sa docstring. Une docstring claire = un outil bien utilisé. Une docstring vague = un outil ignoré ou mal utilisé.
from agno.agent import Agent
from agno.models.anthropic import Claude
from agno.tools import tool
# ✅ Bon exemple : docstring précise
@tool
def convertir_temperature(valeur: float, de: str, vers: str) -> str:
"""
Convertit une température entre Celsius, Fahrenheit et Kelvin.
Args:
valeur: La valeur numérique à convertir.
de: L'unité source ('celsius', 'fahrenheit', 'kelvin').
vers: L'unité cible ('celsius', 'fahrenheit', 'kelvin').
Returns:
La valeur convertie avec son unité.
"""
conversions = {
("celsius", "fahrenheit"): lambda x: x * 9/5 + 32,
("fahrenheit", "celsius"): lambda x: (x - 32) * 5/9,
("celsius", "kelvin"): lambda x: x + 273.15,
("kelvin", "celsius"): lambda x: x - 273.15,
}
key = (de.lower(), vers.lower())
if key not in conversions:
return f"Conversion de {de} vers {vers} non supportée."
resultat = conversions[key](valeur)
return f"{valeur}° {de} = {resultat:.2f}° {vers}"
agent = Agent(
model=Claude(id="claude-sonnet-4-20250514"),
tools=[convertir_temperature],
markdown=True,
)
agent.print_response("Combien font 100°F en Celsius ?")
Agno inspecte automatiquement la signature de la fonction (types des paramètres, valeurs par défaut) et la docstring pour générer le JSON Schema que le LLM reçoit. Vous n'écrivez jamais de JSON à la main.
Micro-exercice : Agent Chercheur de Fichiers
Construisons un agent capable de faire une recherche web et d'enregistrer le résultat dans un fichier.
from agno.agent import Agent
from agno.models.anthropic import Claude
from agno.tools.duckduckgo import DuckDuckGoTools
from agno.tools.file import FileTools
from agno.tools import tool
import datetime
@tool
def obtenir_date_du_jour() -> str:
"""Retourne la date et l'heure actuelles au format lisible."""
return datetime.datetime.now().strftime("%Y-%m-%d à %H:%M")
agent = Agent(
model=Claude(id="claude-sonnet-4-20250514"),
tools=[
DuckDuckGoTools(),
FileTools(base_dir="./rapports"), # Restreint l'écriture à ce dossier
obtenir_date_du_jour,
],
instructions=[
"Quand on te demande de faire un rapport, cherche l'info sur le web,",
"puis sauvegarde le résultat dans un fichier .md avec la date dans le nom.",
"Confirme toujours le nom du fichier créé.",
],
markdown=True,
)
agent.print_response(
"Fais un rapport sur les dernières sorties de modèles IA open-source "
"et sauvegarde-le dans un fichier."
)
L'agent va chaîner 3 appels d'outils dans l'ordre : d'abord obtenir_date_du_jour, puis duckduckgo_search, puis save_file : tout seul, sans instructions explicites sur l'ordre.
Gérer les Erreurs dans les Outils
Vos outils peuvent échouer (API indisponible, fichier manquant…). La bonne pratique est de retourner un message d'erreur explicite plutôt que de lever une exception : le LLM peut alors s'adapter.
from agno.tools import tool
import httpx
@tool
def appeler_api_meteo(ville: str) -> str:
"""
Récupère la météo actuelle pour une ville donnée.
Retourne la température et les conditions météo.
"""
try:
# Exemple avec l'API Open-Meteo (gratuite, pas de clé requise)
response = httpx.get(
"https://geocoding-api.open-meteo.com/v1/search",
params={"name": ville, "count": 1, "language": "fr"},
timeout=5.0,
)
response.raise_for_status()
data = response.json()
if not data.get("results"):
return f"Ville '{ville}' introuvable."
loc = data["results"][0]
return f"Localisation trouvée : {loc['name']}, {loc.get('country', '')} (lat: {loc['latitude']}, lon: {loc['longitude']})"
except httpx.TimeoutException:
return f"Erreur : l'API météo n'a pas répondu dans les délais pour '{ville}'."
except Exception as e:
return f"Erreur inattendue : {str(e)}"
Ne jamais lever d'exception non gérée dans un outil. Le LLM reçoit la valeur de retour : si c'est un message d'erreur clair, il peut réessayer, demander de l'aide, ou expliquer le problème à l'utilisateur.
Tool Use vs RAG : Quand Utiliser Quoi ?
Ces deux approches semblent similaires mais répondent à des besoins différents :
| Tool Use | RAG | |
|---|---|---|
| Source de données | Dynamique (API, web, fichiers temps réel) | Statique (documents indexés à l'avance) |
| Latence | Plus élevée (appel réseau) | Plus faible (recherche vectorielle locale) |
| Coût | Variable selon l'API | Fixe (infrastructure vectorielle) |
| Fraîcheur | Toujours à jour | Dépend de la fréquence de ré-indexation |
| Cas d'usage | Cours de bourse, météo, actions CRUD | Base de connaissances interne, documentation |
Règle pratique : utilisez le RAG pour vos données privées et stables (docs, FAQ, PDF), et le tool use pour tout ce qui nécessite une action en temps réel ou un appel à un système externe.
Les deux peuvent coexister dans le même agent Agno !
# Agent hybride : RAG pour les docs internes + tools pour le web
agent = Agent(
model=Claude(id="claude-sonnet-4-20250514"),
knowledge=votre_knowledge_base, # RAG sur vos documents
search_knowledge=True,
tools=[DuckDuckGoTools()], # Tool pour le web en temps réel
instructions=[
"Cherche d'abord dans ta base de connaissances.",
"Si l'info n'y est pas, utilise la recherche web.",
],
)
Specialiste IA — Master Intelligence Artificielle
Diplome d'un Master en Intelligence Artificielle, je travaille au quotidien sur des projets IA en entreprise. J'ai cree IwanttolearnAI pour rendre l'apprentissage de l'IA accessible a tous, gratuitement.
Continuer a apprendre
Mémoire des Agents IA : Short-Term et Long-Term avec Agno
Apprenez à donner une mémoire persistante à vos agents Agno : short-term dans le contexte, long-term avec SQLite et PostgreSQL, et partage de mémoire entre plusieurs agents.
MCP : Le Protocole qui Connecte les Agents aux Outils
Découvrez MCP (Model Context Protocol) créé par Anthropic : architecture client-serveur, transports stdio et HTTP, utilisation avec Agno, et création de votre propre serveur MCP.
Comprendre les Agents IA : Au-delà du Simple Chatbot
Découvrez ce qu'est un agent IA, comment il diffère d'un simple chatbot, et les concepts fondamentaux : boucle de raisonnement, outils, mémoire et planification.