Niveaux d’effort de MiniMax M3.1 Flash : pourquoi le réglage par défaut coûte 7 fois plus cher pour corriger le même bug

AIHubMix7 min de lecture
Niveaux d’effort de MiniMax M3.1 Flash : pourquoi le réglage par défaut coûte 7 fois plus cher pour corriger le même bug

MiniMax M3.1 Flash propose cinq niveaux de réflexion, sans possibilité de la désactiver. Si vous ne choisissez pas de niveau, le modèle sélectionne le plus élevé à votre place. Le guide de génération de texte de MiniMax indique que le niveau d’effort « est défini par défaut sur max lorsqu’il n’est pas précisé ».

Ce réglage par défaut coûte cher, et cela passe facilement inaperçu. AIHubMix a exécuté la même correction de deux bugs à chaque niveau. Le réglage par défaut a utilisé environ 10 fois plus de jetons de réflexion que low et a pris environ 6 fois plus de temps, et chaque exécution, quel que soit le niveau, a réussi les 215 tests. Le coût de réflexion du modèle a augmenté avec le niveau d’effort, alors que la difficulté de la tâche est restée identique.

En bref : commencez par low, passez à un niveau supérieur uniquement si la tâche échoue ou nécessite des tentatives supplémentaires, et ne laissez jamais le champ vide.

Cinq niveaux, sans possibilité de désactiver la réflexion

Protocole Champ Valeurs Valeur par défaut
OpenAI Chat Completions reasoning_effort low, medium, high, xhigh, max max
Anthropic Messages output_config.effort low, medium, high, xhigh, max max
OpenAI Responses reasoning.effort low, medium, high, xhigh, max max

La réflexion ne peut pas être désactivée. D’après la référence de l’API Messages de MiniMax, l’API renvoie une erreur HTTP 400 pour thinking: {"type": "disabled"} et pour le niveau d’effort none, avec le message model "MiniMax-M3.1-Flash" requires adaptive thinking. Les anciens modèles MiniMax ignorent complètement le champ d’effort. À ce jour, M3.1 Flash est le seul modèle MiniMax pour lequel ce champ a un effet.

Les trois protocoles sont disponibles pour minimax-m3.1-flash sur AIHubMix. Une différence par rapport à l’API de MiniMax : AIHubMix a accepté reasoning_effort: "none" et "minimal" avec une réponse HTTP 200, mais le modèle a quand même réfléchi. Considérez ces valeurs comme sans effet, et non comme un moyen de désactiver la réflexion.

Coût de chaque niveau sur une tâche

Le test : une fonction de facturation présentant deux bugs. Une pause qui dépasse la fin de la période comptabilise une journée en double, et les pauses qui se chevauchent sont soustraites deux fois. Le modèle renvoie la fonction corrigée, puis un banc de test local la vérifie à l’aide de 215 cas cachés. Chaque niveau a été exécuté trois fois via le point de terminaison Chat Completions d’AIHubMix, le 19 octobre 2026, avec max_tokens défini à 32,768. Tous les chiffres ont été mesurés par AIHubMix ; personne d’autre ne les a reproduits.

Effort Moyenne de jetons de réflexion Plage (3 exécutions) Temps moyen Coût moyen par correction Tests
low 591 344–812 9.5 s $0.0006 215/215 ×3
medium 1,522 970–2,488 21.7 s $0.0013 215/215 ×3
high 2,863 2,194–3,673 27.1 s $0.0022 215/215 ×3
xhigh 1,949 1,019–2,562 19.2 s $0.0015 215/215 ×3
max 4,699 2,612–6,246 40.4 s $0.0034 215/215 ×3
non spécifié 6,364 4,284–9,376 56.3 s $0.0045 215/215 ×3

Les coûts sont calculés selon les tarifs d’AIHubMix pour minimax-m3.1-flash : $0.165 par million de jetons en entrée, $0.66 par million de jetons en sortie et $0.0165 par million de jetons d’entrée mis en cache. Les jetons de réflexion sont facturés comme des jetons de sortie. Par exemple, la ligne « non spécifié » affichait une moyenne de 464 jetons d’invite (dont environ 192 mis en cache) et 6,673 jetons de sortie, soit environ $0.0045 par correction.

Ce que montrent les chiffres

Le niveau low suffisait pour cette tâche. Chaque niveau a produit une correction correcte à chaque fois. Pour un bug circonscrit dans une seule fonction, la réflexion supplémentaire des niveaux supérieurs n’a apporté aucun gain mesurable.

Le passage de low à medium marque une nette différence. En moyenne, medium a utilisé environ 2,6 fois plus de jetons de réflexion que low et a pris plus de deux fois plus de temps.

Au-dessus de medium, les niveaux se confondent. Nos exécutions en xhigh ont utilisé en moyenne moins de jetons qu’en high, et max chevauchait les deux. Trois exécutions par niveau ne suffisent pas à les départager. Pour cette tâche, « high », « xhigh » et « max » signifiaient tous « plus de réflexion, parfois beaucoup plus ».

Le niveau non spécifié se comporte comme max. Cela correspond à la documentation de MiniMax. Notre moyenne pour le niveau « non spécifié » était supérieure à celle de « max », mais les plages se chevauchent et l’écart relève de la variabilité d’une exécution à l’autre.

La variabilité est importante à tous les niveaux. Pour une même invite, le réglage par défaut a donné des durées allant de 39 à 82 secondes. Sur le point de terminaison Anthropic Messages, trois exécutions en low ont utilisé 511, 1,861 et 6,060 jetons de réflexion. La dernière a pris 56 secondes, soit autant qu’une exécution typique en max. Le niveau d’effort détermine la profondeur moyenne de réflexion, et non une limite stricte.

Le débit est resté stable, à environ 112 jetons de sortie par seconde sur les 24 exécutions de Flash ; le temps évolue donc presque linéairement avec le nombre de jetons de réflexion. À cette vitesse, une réflexion de 6,000 jetons impose une attente de près d’une minute.

MiniMax n’a pas publié de données sur le nombre de jetons ou la latence pour chaque niveau. Nous ne pouvons pas dire à partir de ce seul test à quel moment une tâche plus difficile commence à nécessiter les niveaux supérieurs. Les chiffres ci-dessus montrent uniquement le coût de chaque niveau lorsque la tâche n’en a pas besoin.

Les invites courtes nécessitent peu de réflexion

« Réfléchit toujours » ne signifie pas « réfléchit toujours beaucoup ». La réflexion est adaptative : sa profondeur dépend de la difficulté apparente de l’invite.

  • Classer cinq tickets d’assistance dans l’une des quatre catégories : 0 jeton de réflexion en low et une moyenne de 6 avec le réglage par défaut. Toutes les catégories étaient correctes.
  • « Combien font 17 × 23 ? » en low : aucune réflexion, seulement 2 jetons de sortie.

L’absence d’un bouton pour désactiver la réflexion ne coûte donc presque rien pour les appels courts de classification, d’extraction et de routage. Le coût se manifeste sur les tâches ouvertes, comme le code, où le modèle trouve davantage de choses à approfondir à mesure que vous augmentez son niveau de réflexion.

Par où commencer

Voici des points de départ. Seules les deux premières lignes ont été directement mesurées ; les autres sont nos recommandations, à vérifier en fonction de vos propres tentatives supplémentaires :

Charge de travail Commencer à Passer au niveau supérieur lorsque
Classification, extraction, routage low Les résultats sont erronés dans les cas difficiles
Corrections d’une seule fonction, petites revues low Une correction échoue deux fois aux tests
Modifications sur plusieurs fichiers, refactorisations medium L’agent oublie un fichier dépendant
Boucles d’agent avec de nombreux appels d’outils low ou medium Les étapes se répètent ou s’enlisent
Débogage difficile, questions de conception high Les réponses restent superficielles
Conversation interactive avec une personne en attente low Ne choisissez jamais max par défaut dans ce cas

N’utilisez max que si vous avez constaté l’échec de high pour ce type de tâche.

Ce qui peut dysfonctionner ou coûter plus cher lorsque le niveau d’effort change

  • Réponses tronquées. La réflexion est comptabilisée dans max_tokens. Une exécution avec le réglage par défaut a utilisé 9,376 jetons de réflexion pour une seule fonction ; une limite de 4K ou 8K prévue pour les réponses M2.x peut donc tronquer la réponse et renvoyer finish_reason: "length". MiniMax recommande 131,072 et autorise 524,288.
  • Délais d’attente dépassés. À partir de high, un seul appel peut prendre une minute. Les délais d’attente du client et du proxy, réglés pour un modèle rapide, doivent être portés à 120 secondes ou plus.
  • Valeurs sans effet apparent. Via AIHubMix, none, minimal et une valeur inconnue comme auto ont toutes été acceptées, mais le modèle a quand même réfléchi. D’après les tests d’un projet de passerelle, les points de terminaison de MiniMax rejettent les valeurs inconnues (problème sub2api #8025). Utilisez l’une des cinq valeurs documentées.
  • Outils qui ne proposent pas les niveaux. Actuellement, OpenCode ne propose aucune variante de niveau d’effort pour ce modèle, et certains frameworks envoient « thinking disabled », ce qui déclenche l’erreur 400. Vérifiez ce que votre outil envoie réellement.
  • Plusieurs modèles dans un même pipeline. M3 et M2.x ignorent le champ d’effort. Si vous répartissez les requêtes entre plusieurs modèles, un niveau d’effort qui réduit les coûts sur Flash n’aura aucun effet sur les autres.

Configurer le niveau selon le protocole

Les trois protocoles sont accessibles via AIHubMix avec une seule clé. Le guide de démarrage rapide explique comment obtenir des clés, et la page sur les paramètres de raisonnement unifiés explique comment AIHubMix gère les champs de raisonnement des différents fournisseurs.

Chat Completions :

curl https://aihubmix.com/v1/chat/completions \
  -H "Authorization: Bearer $AIHUBMIX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "minimax-m3.1-flash",
       "reasoning_effort": "low",
       "max_tokens": 32768,
       "messages": [{"role": "user", "content": "Write a function that merges overlapping date ranges."}]}'

Anthropic Messages (SDK Python ; placez output_config dans extra_body si votre version du SDK ne reconnaît pas ce champ) :

import os
import anthropic

client = anthropic.Anthropic(base_url="https://aihubmix.com", api_key=os.environ["AIHUBMIX_API_KEY"])

msg = client.messages.create(
    model="minimax-m3.1-flash",
    max_tokens=32768,
    messages=[{"role": "user", "content": "Write a function that merges overlapping date ranges."}],
    extra_body={"output_config": {"effort": "medium"}},
)
print(msg.usage)

Responses :

import os
from openai import OpenAI

client = OpenAI(base_url="https://aihubmix.com/v1", api_key=os.environ["AIHUBMIX_API_KEY"])

resp = client.responses.create(
    model="minimax-m3.1-flash",
    reasoning={"effort": "low"},
    max_output_tokens=32768,
    input="Write a function that merges overlapping date ranges.",
)
print(resp.usage)

Vérifiez usage lors des premiers appels. Chat Completions indique le nombre de jetons de réflexion dans completion_tokens_details.reasoning_tokens, Messages dans output_tokens_details.thinking_tokens, et Responses dans output_tokens_details.reasoning_tokens. Si ces chiffres ne changent pas lorsque vous modifiez le niveau, le paramètre n’est pas transmis au modèle.

FAQ

Quel est le niveau d’effort par défaut de MiniMax M3.1 Flash ?
Max. Si la requête ne contient pas de champ d’effort, le modèle réfléchit au niveau le plus élevé.

Peut-on désactiver complètement la réflexion ?
Non. La désactivation de la réflexion renvoie une erreur HTTP 400 avec l’API de MiniMax. Le niveau le plus bas est low et, pour les invites courtes, low n’utilise souvent aucun jeton de réflexion.

Quel niveau d’effort choisir pour coder ?
Commencez par low pour les corrections dans une seule fonction et les petites revues, par medium pour les modifications sur plusieurs fichiers, et passez à un niveau supérieur uniquement si une tâche échoue. Lors de notre test, low a corrigé correctement à chaque fois une fonction présentant deux bugs.

Le niveau d’effort max améliore-t-il la précision ?
Pas pour notre tâche de test : chaque niveau a réussi les 215 tests. Max a utilisé beaucoup plus de jetons et de temps. Les niveaux supérieurs peuvent aider pour les tâches plus difficiles, mais personne n’a publié de données indiquant à partir de quel niveau.

Pourquoi la même requête a-t-elle pris 10 secondes une fois et 56 secondes la fois suivante ?
La profondeur de réflexion varie d’une exécution à l’autre, même à niveau fixe. Une exécution à faible niveau d’effort sur le point de terminaison Messages a utilisé environ dix fois plus de jetons de réflexion qu’une autre.

reasoning_effort none fonctionne-t-il via AIHubMix ?
La valeur est acceptée sans erreur, mais le modèle réfléchit quand même. Utilisez plutôt low.

Comment savoir combien de jetons de réflexion un appel a utilisés ?
Consultez l’objet usage : reasoning_tokens avec Chat Completions et Responses, et thinking_tokens avec l’API Messages.

Pour en savoir plus : la série MiniMax M3.1 Flash

Sources