Aller au contenu

Evanesca ouvre bientôt : cette page montre comment le chat fonctionnera.

Modèles

L'appel d'outils sur les modèles à poids ouverts : pourquoi il dépend de qui les exécute

L'appel d'outils permet à un modèle de demander à votre code d'exécuter une fonction — retrouver une commande, interroger une base, envoyer un e-mail — puis de poursuivre à partir du résultat. La plupart des modèles à poids ouverts récents y sont entraînés, mais un appel propre dépend de la pile de service de l'opérateur autant que des poids : le même modèle peut fonctionner chez un fournisseur et être refusé chez un autre. Evanesca n'indique l'appel d'outils qu'après un vrai appel chez l'opérateur qui sert chaque modèle.

Publié le 6 oct. 2026 · vérifié le 20 oct. 2026

Comment fonctionne l'appel d'outils

Vous décrivez les fonctions que propose votre code — un nom, une description et un schéma JSON des arguments — dans le champ tools de la requête. Le modèle répond alors soit par du texte, soit par des tool_calls : la fonction voulue et les arguments choisis. Votre code exécute la fonction, renvoie le résultat dans un message de rôle « tool », et le modèle reprend. Cette boucle est le socle des frameworks d'agents.

Le modèle n'exécute jamais rien lui-même. Il rédige une demande, et votre code décide de la satisfaire ou non. C'est aussi là que vous gardez la main : quelles fonctions existent, ce qu'elles peuvent toucher, ce qui est journalisé.

Deux détails piègent les premières intégrations. Un modèle peut demander plusieurs appels dans une même réponse : traitez tool_calls comme une liste. Et chaque résultat renvoyé doit porter l'identifiant de l'appel auquel il répond, dans tool_call_id, pour que le modèle associe résultats et demandes.

Une affaire de pile de service, pas seulement de poids

Pour qu'un appel d'outil revienne propre, le logiciel de service de l'opérateur doit appliquer le modèle de conversation (chat template) du modèle, reconnaître les tokens spéciaux qui marquent un appel et les convertir en structure tool_calls. Un opérateur peut laisser la fonction désactivée, ou la proposer pour un modèle et pas pour un autre.

Qwen2.5-VL 72B a illustré l'écart. Sa fiche affirme qu'il « can reason and dynamically direct tools » (fiche du modèle, relue le 6 octobre 2026) ; pourtant OVHcloud, qui l'exécutait pour Evanesca, a répondu à un appel d'outil par une erreur HTTP 400 — « feature 'tool calls' is not currently supported » — lors de la mesure du 6 août 2026 : il a donc été servi sans appel d'outils jusqu'à sa mise en pause, le 20 octobre 2026. Pixtral 12B, qui lit désormais les images chez Scaleway, a renvoyé un appel d'outil propre lors de sa mesure, le même jour. Les templates comptent aussi : Mistral AI cite un template d'appel de fonctions « more robust » parmi les nouveautés de Mistral Small 3.2 (fiche du modèle, relue le même jour).

C'est pourquoi le catalogue d'Evanesca n'indique l'appel d'outils qu'après un vrai appel chez l'opérateur qui sert le modèle. Un modèle sans cette mention n'a pas été mesuré ; rien n'est jamais déduit des poids. Si vous servez vous-même vos modèles, ce câblage est à configurer dans le serveur d'inférence que vous choisissez.

Le vérifier en un appel

Nul besoin d'un benchmark pour savoir si un opérateur sert l'appel d'outils pour un modèle. Déclarez une petite fonction et posez une question qui l'exige :

Une requête avec un outil
curl https://evanesca.app/api/v1/chat/completions \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gemma-4-26b",
    "messages": [{"role": "user", "content": "Quel temps fait-il à Paris ?"}],
    "tools": [{
      "type": "function",
      "function": {
        "name": "get_weather",
        "description": "Current weather in a city",
        "parameters": {
          "type": "object",
          "properties": {"city": {"type": "string"}},
          "required": ["city"]
        }
      }
    }]
  }'

Une bonne réponse s'arrête avec finish_reason « tool_calls » et nomme la fonction déclarée. Ses arguments arrivent sous forme de chaîne qui doit se lire comme du JSON, avec les champs requis et des valeurs cohérentes — ici, la ville demandée :

Ce qu'il faut trouver dans la réponse
"finish_reason": "tool_calls",
"message": {
  "role": "assistant",
  "tool_calls": [{
    "id": "call_…",
    "type": "function",
    "function": {"name": "get_weather", "arguments": "{\"city\": \"Paris\"}"}
  }]
}

Comment cela échoue en pratique

  • Des arguments illisibles : de la prose, une chaîne tronquée, ou du JSON encodé deux fois. L'appel « réussit », et votre parseur plante.
  • Une réponse en texte au lieu d'un appel — « je ne peux pas consulter la météo » —, qui arrête discrètement une boucle automatisée au lieu de lever une erreur.
  • Une fonction jamais déclarée, ou la bonne avec des paramètres manquants ou inventés.
  • Un modèle de raisonnement qui épuise son max_tokens à réfléchir et s'arrête avant d'écrire l'appel.

Un test qui vérifie seulement la présence de tool_calls passe à côté de la plupart de ces cas. Contrôlez le nom, analysez les arguments et comparez leurs valeurs à ce que demandait le prompt.

Quels modèles appellent des outils chez Evanesca

Catalogue d'Evanesca
ModèleAppel d'outilsRaisonnementExécuté par
Mistral Large 4Oui, mesuré—Mistral AI, région UE
DeepSeek V4.1 FlashOui, mesuréOuiAKI.IO, Allemagne (repli : Scaleway)
GLM-5.3Oui, mesuréOuiAKI.IO, Allemagne (repli : Scaleway)
Qwen3.8 27BOui, mesuréOuiScaleway, Paris (repli : OVHcloud)
DeepSeek V4 FlashOui, mesuréOuiScaleway, Paris
Apertus v1.5 70BOui, mesuré—Infomaniak, Suisse
GLM-5.2Oui, mesuréOuiScaleway, Paris
Qwen3.6 35BOui, mesuréOuiScaleway, Paris
Gemma 4 26BOui, mesuré—AKI.IO, Allemagne
Mistral Small 4Oui, mesuré—Mistral AI, région UE
Qwen3.5 397BOui, mesuréOuiScaleway, Paris
GPT-OSS 120BOui, mesuréOuiScaleway, Paris (repli : OVHcloud)
Qwen3 Coder 30BOui, mesuré—Scaleway, Paris
Qwen3 235BOui, mesuré—Scaleway, Paris
Mistral Small 3.2Oui, mesuré—Scaleway, Paris (repli : OVHcloud)
Llama 3.3 70BOui, mesuré—Scaleway, Paris (repli : OVHcloud)
Pixtral 12BOui, mesuré—Scaleway, Paris

Construire une boucle qui tient

  1. Validez chaque appel contre votre schéma avant de l'exécuter, et refusez les fonctions que vous n'avez pas déclarées.
  2. Quand un appel est mal formé, renvoyez l'erreur comme résultat de l'outil : la plupart des modèles se corrigent au tour suivant.
  3. Plafonnez le nombre de tours et fixez un délai, pour qu'un modèle perdu ne tourne pas en rond indéfiniment.
  4. Gardez les droits dans votre code : des fonctions en lecture seule par défaut, et une confirmation humaine avant tout ce qui écrit, paie ou supprime.
  5. Journalisez les tokens de chaque tour. Chaque tour est une nouvelle requête qui transporte toute la conversation, et un modèle de raisonnement facture aussi sa réflexion à chaque fois.

Raisonnement et appel d'outils vont souvent ensemble dans un agent, et le coût grimpe vite ; ce que coûte la réflexion explique comment le mesurer.

Agents, données et juridiction

Les résultats des outils font partie du prompt. Tout ce que renvoie votre fonction — une fiche client, un e-mail, une ligne de base de données — part chez l'opérateur du modèle au tour suivant. La question de savoir qui exécute le modèle couvre donc vos résultats d'outils autant que vos questions.

Chez Evanesca, tous les modèles tournent en Europe — pour la plupart en France, chez Scaleway à Paris, OVHcloud à Gravelines servant de relais pour Qwen3.8 27B, GPT-OSS 120B, Mistral Small 3.2 et Llama 3.3 70B (documentation de l'API). Evanesca ne stocke ni prompts ni résultats d'outils : ils restent en mémoire le temps d'écrire la réponse. Ce que gardent les opérateurs relève d'eux : Scaleway peut conserver et lire les requêtes qui provoquent des erreurs ou paraissent abusives, jusqu'à 14 jours (Scaleway, consulté le 6 octobre 2026), et Mistral AI garde les entrées et sorties de ses modèles 30 jours pour surveiller les abus (Mistral AI, consulté le 12 octobre 2026).

Questions fréquentes

Quels modèles à poids ouverts prennent en charge l'appel d'outils ?

La plupart des modèles récents y sont entraînés, mais la prise en charge dépend de l'opérateur qui les sert. Chez Evanesca, tous les modèles appellent des outils, mesure faite par un vrai appel chez l'opérateur ; la page des modèles détaille chacun.

L'appel d'outils est-il la même chose que le function calling ?

Oui. Les deux noms désignent le même mécanisme : le modèle renvoie une demande structurée d'appel à une fonction que vous avez déclarée, votre code l'exécute, et le résultat retourne au modèle.

Pourquoi l'appel d'outils marche-t-il chez un fournisseur et pas chez un autre ?

Parce qu'il est câblé dans la pile de service : le template de conversation, les tokens spéciaux qui marquent un appel et l'analyseur qui construit tool_calls. Un opérateur peut le laisser désactivé pour un modèle, même quand la fiche du modèle dit qu'il sait utiliser des outils.

Evanesca exécute-t-elle mes outils ?

Non. Votre code déclare les fonctions et les exécute ; l'API transmet les définitions et les résultats à l'opérateur du modèle et vous renvoie les appels du modèle. Ce qu'une fonction a le droit de faire reste entièrement entre vos mains.

Quelle différence entre appel d'outils et sortie structurée ?

La sortie structurée demande au modèle de répondre une fois, dans une forme JSON que vous définissez. L'appel d'outils est une boucle : le modèle demande une fonction, votre code l'exécute et renvoie le résultat, et le modèle poursuit avec ce qu'il a appris. La première met en forme une réponse ; le second permet au modèle d'agir et d'observer.

À lire aussi