Accueil → Aide

400 en forçant un appel d'outil sur un modèle de raisonnement

Réglez tool_choice sur auto et indiquez dans le prompt quand l'outil s'applique. Sur les modèles où le raisonnement est toujours actif, un appel d'outil forcé devrait sauter ce raisonnement, donc l'API refuse la requête plutôt que de dégrader le modèle en silence.

Ce que vous voyez

Pourquoi cela arrive

Vouloir forcer un appel d'outil est légitime. C'est ainsi que de nombreux frameworks garantissent une sortie structurée : définir un outil, le forcer, analyser les arguments. Cette astuce cesse de fonctionner sur les modèles qui raisonnent avant chaque réponse, car le chemin forcé contourne justement l'étape pour laquelle vous payez.

Le refus vaut mieux que l'alternative. Une API qui accepterait le paramètre et l'ignorerait vous laisserait croire que vous avez contraint le modèle alors que non : un bug qui apparaît bien plus tard, en production, sous forme de sorties occasionnellement impossibles à analyser.

Ces mêmes modèles refusent généralement les valeurs non par défaut de temperature, top_p et top_k, et ne prennent pas en charge le pré-remplissage du tour de l'assistant. Du code porté depuis un modèle plus ancien de la même famille se heurte à plusieurs de ces points à la fois, ce qui le fait ressembler à un problème d'authentification ou d'endpoint plutôt qu'à un problème de paramètres.

Vérifiez si c'est bien la cause

Envoyez la même requête deux fois en ne changeant que tool_choice :

for CHOICE in '{"type":"auto"}' '{"type":"any"}'; do
  echo -n "$CHOICE -> "
  curl -s -o /dev/null -w '%{http_code}\n' \
    'YOUR_BASE_URL/chat/completions' \
    -H 'Authorization: Bearer YOUR_KEY' \
    -H 'Content-Type: application/json' \
    -d "{\"model\":\"YOUR_MODEL\",\"max_tokens\":16,
         \"messages\":[{\"role\":\"user\",\"content\":\"hi\"}],
         \"tool_choice\":$CHOICE}"
done

Si auto renvoie 200 et any renvoie 400, le modèle ne prend pas en charge l'utilisation forcée d'outils. Rien n'est en cause dans votre clé ou votre endpoint.

Comment le corriger

  1. Laissez tool_choice sur auto et soyez explicite dans le promptÉnoncez la condition clairement : « appelle search quand la question nécessite des informations à jour ». Les modèles de raisonnement suivent bien ce type d'instruction ; c'est leur raison d'être.
  2. Utilisez une réponse contrainte par schéma plutôt qu'un outil forcéSi vous forciez un outil uniquement pour obtenir une sortie structurée, un paramètre de sortie structurée ou de JSON schema fait directement ce travail et reste généralement pris en charge.
  3. Vérifiez temperature en même tempsLes frameworks définissent une temperature par défaut que vous n'avez jamais choisie. Sur ces modèles, toute valeur non par défaut donne un 400, identique en apparence à l'échec de tool_choice.
  4. Validez la sortie plutôt que de faire confiance à la contrainteMême là où forcer fonctionne, les modèles émettent des arguments qui ne respectent pas le schéma. Une analyse avec un chemin de repli mérite d'être écrite une fois pour toutes.
Sur APICLAN, cela concerne claude-fable-5-1 et claude-fable-5 : l'utilisation forcée d'outils, les paramètres d'échantillonnage non par défaut et le pré-remplissage de l'assistant sont tous refusés. Le guide Fable 5.1 donne la liste complète ainsi que ses tarifs de cache.

Voir aussi

Unexpected token '<' lors d'un appel à une API compatible OpenAI401 invalid API key : quand la clé semble correcte mais échoue quand même

Dernière vérification le 2026-10-01. Rédigé à partir de problèmes diagnostiqués sur une passerelle compatible OpenAI en production, pas compilé à partir d'autres sites.