Les Options de tool_choice
Contrôler quand le modèle utilise les fonctions
Le paramètre tool_choice est un levier puissant pour contrôler le comportement du modèle face aux outils. Selon la valeur choisie, vous pouvez laisser le modèle décider librement, le forcer à utiliser un outil, ou lui interdire complètement.
| Valeur | Comportement | Cas d'usage |
|---|---|---|
| auto | Le modèle décide librement s'il utilise un outil ou répond en texte. C'est le mode par défaut. | Assistants conversationnels, chatbots polyvalents |
| any | Le modèle est obligé d'appeler au moins un outil. Il ne peut pas répondre en texte seul. | Pipelines automatisés, extraction structurée de données |
| none | Le modèle ne peut pas utiliser d'outils, même s'ils sont définis. Il répond en texte uniquement. | Résumer des résultats sans nouveaux appels, reformuler une réponse |
| required | Synonyme de "any". Le modèle doit utiliser au moins un outil. | Équivalent de "any", pour compatibilité |
auto — Le mode par défaut
response = client.chat.complete(
model="mistral-large-latest",
messages=messages,
tools=tools,
tool_choice="auto" # Facultatif, c'est la valeur par défaut
)
Avec auto, le modèle évalue la requête et décide :
- Si la question nécessite des données externes → il appelle une fonction
- Si la question est générale → il répond directement en texte
# Le modèle appellera une fonction
messages = [{"role": "user", "content": "Statut du paiement T1001 ?"}]
# → tool_call: retrieve_payment_status(transaction_id="T1001")
# Le modèle répondra directement
messages = [{"role": "user", "content": "Bonjour, comment allez-vous ?"}]
# → content: "Bonjour ! Je suis un assistant de paiements. Comment puis-je vous aider ?"
C’est le mode le plus courant en production car il offre l’expérience la plus naturelle.
any — Forcer l’utilisation d’outils
response = client.chat.complete(
model="mistral-large-latest",
messages=messages,
tools=tools,
tool_choice="any"
)
Le modèle doit appeler au moins une fonction, même si la question ne semble pas le nécessiter. C’est utile dans les pipelines automatisés où chaque requête doit produire un appel structuré :
# Extraction structurée : forcer le modèle à extraire des données
tools = [{
"type": "function",
"function": {
"name": "extract_entities",
"description": "Extrait les entités nommées d'un texte",
"parameters": {
"type": "object",
"properties": {
"persons": {"type": "array", "items": {"type": "string"}},
"organizations": {"type": "array", "items": {"type": "string"}},
"dates": {"type": "array", "items": {"type": "string"}}
},
"required": ["persons", "organizations", "dates"]
}
}
}]
messages = [{"role": "user", "content": "Sophia Yang de Mistral a présenté "
"le function calling le 15 mars 2026."}]
response = client.chat.complete(
model="mistral-large-latest",
messages=messages,
tools=tools,
tool_choice="any" # Force l'extraction
)
# → extract_entities(persons=["Sophia Yang"],
# organizations=["Mistral"],
# dates=["15 mars 2026"])
none — Désactiver temporairement les outils
response = client.chat.complete(
model="mistral-large-latest",
messages=messages,
tools=tools,
tool_choice="none"
)
Le modèle ne peut pas appeler de fonctions. C’est utile pour :
- Demander un résumé après plusieurs appels de fonctions
- Reformuler une réponse sans déclencher de nouveaux appels
- Tester le comportement du modèle sans les outils
# Après avoir récupéré des données via tool_calls...
# Demander un résumé sans nouveaux appels
messages.append({
"role": "user",
"content": "Résume les informations de tous les paiements que tu as trouvés."
})
response = client.chat.complete(
model="mistral-large-latest",
messages=messages,
tools=tools,
tool_choice="none" # Le modèle résume avec ce qu'il a déjà
)
Changer dynamiquement le tool_choice
En production, vous pouvez adapter tool_choice selon le contexte :
def get_tool_choice(user_input: str, turn_count: int) -> str:
"""Détermine le tool_choice selon le contexte."""
# Premier tour : laisser le modèle décider
if turn_count == 0:
return "auto"
# Si l'utilisateur demande explicitement un résumé
if any(mot in user_input.lower() for mot in ["résume", "récapitule", "synthèse"]):
return "none"
# Par défaut
return "auto"
Bonnes pratiques
- Utilisez
autopar défaut — c’est le plus naturel et le plus flexible - Utilisez
anypour les pipelines d’extraction de données structurées - Utilisez
nonepour empêcher les boucles infinies de tool_calls - Ne changez jamais de
tool_choiceen cours de traitement d’un tool_call (terminez d’abord le cycle)
Points clés à retenir
tool_choicecontrôle quand le modèle utilise les fonctionsauto= le modèle décide librement (défaut, recommandé pour les chatbots)any= le modèle est forcé d’appeler un outil (pipelines, extraction structurée)none= les outils sont désactivés (résumés, reformulation)- Adaptez
tool_choicedynamiquement selon le contexte de la conversation