IntermédiaireAgents IA
18 min de lecture10 vues

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 :

OutilImportUsage principal
DuckDuckGoToolsagno.tools.duckduckgoRecherche web et actualités
WebSearchToolsagno.tools.websearchRecherche multi-moteurs (Google, Bing, Brave…)
FileToolsagno.tools.fileLire/écrire des fichiers locaux
YFinanceToolsagno.tools.yfinanceCours de bourse, données financières
PythonToolsagno.tools.pythonExécuter du code Python dynamiquement
ShellToolsagno.tools.shellExé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 UseRAG
Source de donnéesDynamique (API, web, fichiers temps réel)Statique (documents indexés à l'avance)
LatencePlus élevée (appel réseau)Plus faible (recherche vectorielle locale)
CoûtVariable selon l'APIFixe (infrastructure vectorielle)
FraîcheurToujours à jourDépend de la fréquence de ré-indexation
Cas d'usageCours de bourse, météo, actions CRUDBase 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.