← Retour
Module 04

Tool Calling & Agents

Quand le LLM agit dans le monde reel. Function calling, boucle agent, AI SDK Agent class, MCP — de la theorie au prototype Selectra.

01

Du chatbot a l'agent

Jusqu'ici, le LLM fait une seule chose : generer du texte. Il peut repondre a des questions, mais il ne peut pas agir. Il ne peut pas envoyer un email, chercher sur le web, ni appeler une API de comparaison d'offres.

Concept cle

Tool calling = le LLM qui agit

Le tool calling permet au LLM de deciderd'appeler une fonction que TU as definie. Le modele ne l'execute pas lui-meme — il produit un JSON "appelle cette fonction avec ces parametres", et ton code l'execute.

Analogie

Imagine un medecin. Il peut diagnostiquer (= raisonner), mais pour soigner il a besoin d'outils : un stethoscope, un scanner, un scalpel. Le LLM, c'est le medecin. Les tools, ce sont ses instruments. Sans outils, il ne peut que parler. Avec des outils, il peut agir.

Chatbot vs Agent


  CHATBOT (sans tools)            AGENT (avec tools)
  ──────────────────              ─────────────────
  User → LLM → Texte             User → LLM → "je dois chercher"
                                              → [appel outil: search]
                                              → resultats
                                              → LLM → "je dois calculer"
                                              → [appel outil: calculate]
                                              → resultat
                                              → LLM → Reponse finale
02

Tool calling — donner des outils au LLM

Voici comment ca marche concretement avec le Vercel AI SDK.

1

Tu definis les outils disponibles

Chaque outil a un nom, une description (pour que le LLM sache quand l'utiliser), un schema d'entree (Zod), et une fonction d'execution.

2

Le LLM decide d'appeler un outil

En se basant sur la description de l'outil et le contexte de la conversation, le LLM produit un "tool call" : le nom de l'outil + les parametres.

3

Ton code execute l'outil

Le SDK intercepte le tool call, execute ta fonction, et renvoie le resultat au LLM.

4

Le LLM integre le resultat

Le LLM recoit le resultat de l'outil et genere sa reponse finale en l'integrant.

typescript — tool calling basique
import { generateText, tool } from "ai";
import { z } from "zod";

const result = await generateText({
  model: "anthropic/claude-sonnet-4.6",
  tools: {
    comparerOffres: tool({
      description: "Compare les offres d'electricite pour une adresse et une consommation donnees",
      inputSchema: z.object({
        codePostal: z.string().describe("Code postal du logement"),
        consommationKwh: z.number().describe("Consommation annuelle en kWh"),
        type: z.enum(["electricite", "gaz"]).describe("Type d'energie"),
      }),
      execute: async ({ codePostal, consommationKwh, type }) => {
        // En prod, ca appelle une vraie API
        return {
          offres: [
            { fournisseur: "TotalEnergies", prix: 0.19, abonnement: 12, total: consommationKwh * 0.19 + 144 },
            { fournisseur: "Engie", prix: 0.21, abonnement: 10, total: consommationKwh * 0.21 + 120 },
            { fournisseur: "EDF", prix: 0.22, abonnement: 11, total: consommationKwh * 0.22 + 132 },
          ]
        };
      },
    }),
  },
  prompt: "Je consomme 6000 kWh par an et j'habite a Lyon (69000). Quelle est la meilleure offre d'electricite ?",
});

// Le LLM va :
// 1. Voir qu'il a un outil "comparerOffres" qui correspond au besoin
// 2. L'appeler avec { codePostal: "69000", consommationKwh: 6000, type: "electricite" }
// 3. Recevoir les 3 offres
// 4. Presenter la meilleure au client

Concept cle

inputSchema et description sont CRITIQUES

Le LLM decide d'utiliser un outil en lisant sa description. Si ta description est vague, il ne saura pas quand l'appeler. Le inputSchema Zod garantit que les parametres sont du bon type. Utilise .describe() sur chaque champ pour guider le LLM.

Attention

Le LLM ne peut PAS executer de code.Il ne fait que produire un JSON structuré "appelle cette fonction avec ces params". C'est TON code qui execute. Ca signifie que tu controles totalement ce qui se passe — le LLM ne peut pas faire quelque chose que tu n'as pas prevu.

03

La boucle agent : reflexion → action → observation

Un agent, c'est un LLM qui peut appeler des outils en bouclejusqu'a ce qu'il ait assez d'information pour repondre. C'est la difference entre un tool call unique et un vrai agent.

Boucle agent (ReAct pattern)


          ┌─────────────────────────────┐
          │                             │
          ▼                             │
  [ REFLEXION ]                         │
  "De quoi ai-je besoin ?"              │
          |                             │
  [ ACTION ]                            │
  Appeler un outil                      │
          |                             │
  [ OBSERVATION ]                       │
  Lire le resultat                      │
          |                             │
  Ai-je assez d'info ? ──── NON ────────┘
          |
         OUI
          |
  [ REPONSE FINALE ]

Exemple concret pour Selectra :

boucle agent — scenario Selectra
Client: "J'habite au 12 rue de la Paix a Paris, je veux changer de fournisseur"

── Step 1 (Reflexion) ──
Agent: Je dois d'abord trouver le numero PDL de cette adresse.

── Step 1 (Action) ──
→ Tool call: chercherPDL({ adresse: "12 rue de la Paix, 75002 Paris" })

── Step 1 (Observation) ──
← Resultat: { pdl: "09876543210987", puissance: 6, compteur: "Linky" }

── Step 2 (Reflexion) ──
Agent: J'ai le PDL. Maintenant j'ai besoin de la consommation pour comparer.
Le client ne me l'a pas dit. Je vais estimer avec la puissance.

── Step 2 (Action) ──
→ Tool call: estimerConsommation({ puissance: 6, type: "appartement", ville: "Paris" })

── Step 2 (Observation) ──
← Resultat: { estimationKwh: 5500 }

── Step 3 (Reflexion) ──
Agent: J'ai le PDL et la conso. Je peux comparer les offres.

── Step 3 (Action) ──
→ Tool call: comparerOffres({ codePostal: "75002", consommationKwh: 5500, type: "electricite" })

── Step 3 (Observation) ──
← Resultat: { offres: [...] }

── Step 4 (Reponse finale) ──
Agent: "Voici les 3 meilleures offres pour votre logement au 12 rue de la Paix..."

L'agent a fait 3 appels d'outils de sa propre initiative, chacun base sur le resultat du precedent. C'est ca la puissance de la boucle agent.

04

L'Agent class du AI SDK

Le Vercel AI SDK fournit une classe Agentqui gere la boucle automatiquement. Plus besoin d'ecrire la boucle manuellement.

typescript — Agent class
import { Agent, tool, stepCountIs } from "ai";
import { z } from "zod";

const selectraAgent = new Agent({
  model: "anthropic/claude-sonnet-4.6",
  instructions: `Tu es l'agent de qualification Selectra.
    Tu collectes les informations du client et cherches les meilleures offres.
    Utilise les outils disponibles pour trouver le PDL, estimer la conso, et comparer les offres.
    Pose UNE question a la fois au client.`,
  tools: {
    chercherPDL: tool({
      description: "Recherche le numero PDL a partir d'une adresse",
      inputSchema: z.object({
        adresse: z.string().describe("Adresse complete du logement"),
      }),
      execute: async ({ adresse }) => {
        // Appel API Enedis/Grdf
        return { pdl: "09876543210987", puissance: 6 };
      },
    }),
    comparerOffres: tool({
      description: "Compare les offres d'energie pour un client",
      inputSchema: z.object({
        codePostal: z.string(),
        consommationKwh: z.number(),
      }),
      execute: async ({ codePostal, consommationKwh }) => {
        // Appel API comparateur Selectra
        return { offres: [/* ... */] };
      },
    }),
    transfererConseiller: tool({
      description: "Transfere le client a un conseiller humain avec les infos collectees",
      inputSchema: z.object({
        ficheClient: z.object({
          nom: z.string().optional(),
          adresse: z.string(),
          pdl: z.string(),
          intent: z.string(),
          offresProposees: z.array(z.string()),
        }),
      }),
      execute: async ({ ficheClient }) => {
        // Envoie la fiche au CRM
        return { status: "transfert_en_cours", conseiller: "Marie D." };
      },
    }),
  },
});

// Utilisation
const result = await selectraAgent.generate({
  prompt: "Bonjour, je demenage au 42 rue Victor Hugo a Lyon",
  stopWhen: stepCountIs(10), // max 10 etapes
});
ConceptAvant (manuel)Avec Agent class
BoucleWhile loop que tu ecris toi-memeGeree automatiquement
Condition d'arretif (pas de tool call) breakstopWhen: stepCountIs(N)
System promptDans streamText()instructions: dans le constructeur
StreamingstreamText() + gestion manuelleagent.stream()

Concept cle

stopWhen — controler la boucle

stopWhen: stepCountIs(10)limite l'agent a 10 etapes maximum. Sans ca, un agent mal configure pourrait boucler indefiniment. C'est un guardrail essentiel.

05

MCP — le protocole universel pour les outils

Jusqu'ici, tu definis tes outils dans le code. Mais imagine que tu veux donner a ton agent acces a 50 outils provenant de services differents (Slack, Google Calendar, CRM, etc.). Definir chaque tool manuellement, c'est penible.

Concept cle

Model Context Protocol (MCP)

est un protocole standard qui permet a un agent de se connecter a des serveurs d'outils. Chaque serveur MCP expose des outils avec leur schema, et l'agent peut les utiliser sans que tu aies a ecrire les definitions manuellement.

Architecture MCP


  ┌──────────────┐     ┌──────────────────┐
  │  Ton Agent   │────▶│ MCP Server: CRM  │
  │  (AI SDK)    │     │ - getClient()    │
  │              │     │ - updateFiche()  │
  │              │     └──────────────────┘
  │              │
  │              │     ┌──────────────────┐
  │              │────▶│ MCP Server: Slack│
  │              │     │ - sendMessage()  │
  │              │     │ - getChannel()   │
  │              │     └──────────────────┘
  │              │
  │              │     ┌──────────────────┐
  │              │────▶│ MCP Server: Vercel│
  │              │     │ - listDeploys()  │
  └──────────────┘     └──────────────────┘

  L'agent peut utiliser les outils de
  TOUS les serveurs connectes.

Analogie

MCP, c'est comme l'USB-C. Avant, chaque peripherique avait son propre cable. Maintenant, un seul connecteur pour tout. MCP fait pareil pour les outils IA : un seul protocole pour connecter n'importe quel service a n'importe quel agent.

Pour Selectra, tu pourrais imaginer un serveur MCP qui expose les outils du CRM interne : recherche client, mise a jour fiche, historique des appels, etc. L'agent vocal s'y connecte et a acces a tout sans code supplementaire.

06

Patterns d'agents en production

PatternDescriptionCas d'usage Selectra
RouterL'agent detecte l'intent et route vers le bon sous-agentIntent classifier → agent nouveau_logement OU agent changement OU agent suivi
SequentialLes etapes s'executent dans l'ordreQualification → Comparaison → Presentation → Transfert
ParallelPlusieurs outils appeles en paralleleChercher PDL + estimer conso en meme temps
Human-in-the-loopL'agent demande validation avant d'agir"Je vous transfère à un conseiller. C'est OK ?"

Attention

L'agent Selectra en production utiliserait le pattern Router + Sequential :d'abord un LLM leger (GPT-4o mini, Haiku) classifie l'intent rapidement, puis un agent specialise prend le relais pour la qualification. Ca reduit la latence et le cout.

Concept cle

Agents durables (Workflow DevKit)

En production, un agent peut planter en plein milieu (timeout, erreur reseau). Le rend les agents durables: chaque etape est persistee, et en cas de crash, l'agent reprend ou il en etait. On verra ca en detail au Module 5 avec l'agent vocal.

07

Quiz final

Quiz

Quelle est la difference entre un chatbot et un agent ?

Quiz

Pourquoi le LLM ne peut-il pas executer les outils lui-meme ?

Quiz

Pour l'agent Selectra, quel pattern d'agent est le plus adapte ?

Module 04 termine

Tu maitrises le tool calling, la boucle agent, l'Agent class, et MCP. Tu as vu comment l'agent Selectra utilise 3 outils en sequence pour qualifier un client. Prochain module : Agents Vocaux — on assemble tout pour construire l'agent qui parle.