Aller au contenu principal

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 auto par défaut — c’est le plus naturel et le plus flexible
  • Utilisez any pour les pipelines d’extraction de données structurées
  • Utilisez none pour empêcher les boucles infinies de tool_calls
  • Ne changez jamais de tool_choice en cours de traitement d’un tool_call (terminez d’abord le cycle)

Points clés à retenir

  • tool_choice contrôle quand le modèle utilise les fonctions
  • auto = 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_choice dynamiquement selon le contexte de la conversation