Retour au blog

IA pour débutantsGuide

Pourquoi une réponse IA s'arrête-t-elle en pleine phrase ? max_tokens, la fenêtre de contexte et finish_reason expliqués

Une réponse IA qui s'arrête en pleine phrase a atteint une limite. Lisez finish_reason, distinguez max_tokens d'une fenêtre de contexte pleine et vérifiez la limite de sortie de chaque modèle.

Par CheapTokens TeamPublié le Mis à jour le 7 min de lecture

Couverture sombre avec le logo cheaptokens : les mots max_tokens, finish_reason et length dans des cases, et le titre « Réponse coupée en pleine phrase ? »
Sur cette page
  1. Trois limites qui coupent une réponse
  2. Lisez d'abord finish_reason
  3. Correction 1 : augmenter max_tokens
  4. Correction 2 : quand la fenêtre de contexte est pleine
  5. Correction 3 : obtenir une longue réponse en plusieurs parties
  6. Quand finish_reason vaut stop
  7. Choisir un modèle selon la longueur de réponse

Une réponse qui s'arrête au milieu d'une phrase a presque toujours été coupée par une limite. Le modèle n'a pas perdu le fil ; la requête a manqué de place. La réponse indique de quelle limite il s'agissait : lisez finish_reason. length signifie qu'une limite a été atteinte. stop signifie que le modèle a terminé de lui-même.

Trois éléments déterminent la longueur maximale d'une réponse. Une fois que vous savez lequel vous a bloqué, la correction prend une minute.

Trois limites qui coupent une réponse#

  • max_tokens est un plafond que vous fixez dans la requête. Quand la réponse l'atteint, la génération s'arrête, même au milieu d'un mot. La référence de l'API DeepSeek le définit comme le nombre maximal de tokens générés dans la complétion.
  • La limite de sortie du modèle est le plafond pour une réponse unique de ce modèle. Elle appartient au modèle, donc gardez max_tokens inférieur ou égal à cette valeur. Les chiffres de nos modèles figurent dans le tableau ci-dessous.
  • La fenêtre de contexte est la place pour l'échange entier : votre entrée et la réponse ensemble. La référence de DeepSeek indique que les tokens d'entrée et générés sont plafonnés ensemble par la longueur de contexte du modèle.

Si les tokens restent une notion floue, commencez par Qu'est-ce qu'un token en IA ?. Cette page suppose que vous savez ce que c'est.

Lisez d'abord finish_reason#

Chaque choix dans une réponse de chat porte un finish_reason. À côté, usage vous indique combien de tokens sont entrés et sortis.

Voici à quoi ressemble une réponse coupée à côté d'une réponse terminée. La requête demandait « En une courte phrase, qu'est-ce qu'un token ? », d'abord avec max_tokens à 16, puis à 200.

Exemple illustratif, pas une réponse enregistrée : vos compteurs et champs supplémentaires différeront.

json
{
  "choices": [
    {
      "message": { "role": "assistant", "content": "A token is a small piece of text that a model reads and writes, usu" },
      "finish_reason": "length"
    }
  ],
  "usage": { "prompt_tokens": 21, "completion_tokens": 16, "total_tokens": 37 }
}
json
{
  "choices": [
    {
      "message": { "role": "assistant", "content": "A token is a small piece of text that a model reads and writes, usually a word or part of a word." },
      "finish_reason": "stop"
    }
  ],
  "usage": { "prompt_tokens": 21, "completion_tokens": 24, "total_tokens": 45 }
}

Dans la première réponse, completion_tokens vaut 16, exactement le plafond, et le texte se termine par « usu ». Dans la seconde, le modèle s'est arrêté à 24 tokens, bien en dessous du plafond de 200, parce qu'il avait terminé.

Pour déterminer ce qui s'est passé, procédez dans cet ordre :

  1. Regardez finish_reason. Si c'est stop, la réponse est complète. Le modèle a choisi de terminer, ou a atteint une séquence d'arrêt que vous avez définie. Si c'est length, une limite a coupé la réponse, et l'étape suivante vous dit laquelle. D'autres valeurs existent, comme content_filter et tool_calls ; aucune des deux n'est un problème de longueur.
  2. Comparez completion_tokens avec le max_tokens que vous avez envoyé. S'ils sont égaux ou presque, vous avez atteint max_tokens.
  3. Si completion_tokens est bien inférieur à max_tokens et que prompt_tokens est grand, la fenêtre de contexte s'est probablement remplie. La référence de DeepSeek utilise length pour les deux cas, donc le champ seul ne permet pas de les distinguer ; la comparaison de l'étape 2 est ce qui vous permet de trancher. La documentation d'Anthropic et de Z.ai nomme le second cas séparément, comme model_context_window_exceeded. Regardez le champ dans vos propres réponses pour voir quel nom vous obtenez.

Les trois descriptions proviennent de la documentation des développeurs, vérifiée le 20 octobre 2026 : DeepSeek, Anthropic et Z.ai.

Ce que vous voyez finish_reason Cause Que faire
Coupé, completion_tokens égal à max_tokens length max_tokens atteint Augmentez max_tokens, ou demandez la réponse en plusieurs parties
Coupé, completion_tokens bien inférieur à max_tokens, entrée longue length (ou model_context_window_exceeded dans certaines API) Fenêtre de contexte pleine Raccourcissez l'entrée ou l'historique, ou choisissez un modèle avec une fenêtre plus grande
Complet mais plus court que souhaité stop Le modèle a terminé, ou une séquence d'arrêt s'est déclenchée Demandez plus de détails ; vérifiez le paramètre stop
Pas de texte, ou un refus content_filter La réponse a été filtrée Reformulez la requête
Pas de texte, une demande d'outil à la place tool_calls Le modèle veut appeler un outil Exécutez l'outil et renvoyez le résultat

Correction 1 : augmenter max_tokens#

La cause la plus fréquente est aussi la plus facile à corriger. Définissez max_tokens vous-même, pour savoir quel plafond s'applique. Ne comptez pas sur la valeur par défaut.

python
from openai import OpenAI

client = OpenAI(base_url="https://api.cheaptokens.dev/v1", api_key="YOUR_API_KEY")

resp = client.chat.completions.create(
    model="deepseek-ai/DeepSeek-V4-Flash-0731",
    messages=[{"role": "user", "content": "Write a detailed guide to setting up a home network."}],
    max_tokens=16000,  # example value: stay at or below the model's output limit
)

choice = resp.choices[0]
print(choice.finish_reason, resp.usage.completion_tokens)

Cela montre la forme de l'appel. La clé s'insère ici comme YOUR_API_KEY ; gardez une vraie clé hors du code que vous partagez.

Augmenter le nombre n'aide que jusqu'à la limite propre au modèle. Voici les limites sur CheapTokens, vérifiées le 20 octobre 2026 par rapport à la liste des modèles CheapTokens :

Modèle ID du modèle Sortie max par réponse Contexte
DeepSeek-V4-Flash (0731) deepseek-ai/DeepSeek-V4-Flash-0731 32 768 tokens 380K
GLM-5.3-Flash zai-org/GLM-5.3-Flash 8 192 tokens 390K
MiniMax-M2.7 MiniMaxAI/MiniMax-M2.7 8 192 tokens 200K

Les développeurs publient leurs propres limites pour leurs propres API. Z.ai, par exemple, indique jusqu'à 128K de sortie pour la série GLM-5. Ce ne sont pas les limites de GLM-5.3-Flash sur CheapTokens, qui est de 8 192 tokens par réponse. Pour tout ce que vous construisez sur CheapTokens, utilisez le tableau ci-dessus.

Correction 2 : quand la fenêtre de contexte est pleine#

Dans un chat, tout l'historique est renvoyé à chaque message, donc l'entrée grandit à chaque tour. La fenêtre de contexte doit contenir cet historique plus la nouvelle réponse. Si l'historique seul en occupe presque toute la place, il ne reste presque plus de place pour une réponse.

Ces fenêtres sont grandes, et une courte question ne les remplira pas. Les longues conversations et les documents collés le feront. Ce qui aide :

  • Démarrez une nouvelle conversation pour une nouvelle tâche au lieu de continuer une ancienne.
  • Demandez au modèle de résumer la conversation jusqu'ici, et ne conservez que le résumé.
  • Supprimez les anciens messages et pièces jointes dont vous n'avez plus besoin.
  • Si l'entrée elle-même est énorme, choisissez le modèle avec la plus grande fenêtre. Parmi les nôtres, c'est GLM-5.3-Flash avec 390K. Sa limite de sortie est de 8 192 tokens, donc demandez un long résultat en plusieurs parties.

Correction 3 : obtenir une longue réponse en plusieurs parties#

Quand la réponse que vous voulez dépasse la limite de sortie du modèle, aucun réglage ne la fera tenir dans une seule réponse. Demandez-la en morceaux : quand finish_reason vaut length, renvoyez la réponse partielle et demandez au modèle de continuer.

python
messages = [{"role": "user", "content": "Write a detailed guide to setting up a home network."}]
parts = []

for _ in range(4):  # example limit: at most 4 rounds
    resp = client.chat.completions.create(
        model="zai-org/GLM-5.3-Flash",
        messages=messages,
        max_tokens=8000,  # example value: below this model's output limit
    )
    choice = resp.choices[0]
    parts.append(choice.message.content)
    if choice.finish_reason != "length":
        break
    messages.append({"role": "assistant", "content": choice.message.content})
    messages.append({"role": "user", "content": "Continue exactly where you stopped. Don't repeat anything."})

text = "".join(parts)

Même mise en garde : un exemple du schéma, pas une exécution enregistrée. Lisez les jointures entre les parties. Un modèle répète parfois une phrase ou redémarre une liste à la jonction.

Chaque tour renvoie tout ce qui précède comme entrée, et chaque token de sortie est facturé. Une longue réponse coûte plus cher qu'une courte. Voici une réponse de huit mille tokens sur 2 000 tokens d'entrée, ce qui tient pour tous les modèles du tableau :

Modèle Coût OpenRouter
GLM-5.3-Flash $0.00036 $0.00069
DeepSeek-V4-Flash $0.00083 $0.0013
MiniMax-M2.7 $0.0013 $0.0102

2 000 tokens d'entrée et 8 000 tokens de sortie au total. Les prix par million de tokens sont actuels et évoluent avec nos tarifs ; la colonne OpenRouter indique des prix de référence pour la même charge de travail.

Quand finish_reason vaut stop#

stop signifie que le modèle a terminé la réponse. S'il a terminé plus tôt que vous ne le vouliez, ce n'est pas un problème de limite et un max_tokens plus grand n'y change rien. Dites ce que vous voulez : la longueur, les sections, le niveau de détail. Vérifiez aussi si la requête définit un paramètre stop ; une séquence d'arrêt qui apparaît dans la réponse la termine sur-le-champ.

Choisir un modèle selon la longueur de réponse#

Partez de la réponse dont vous avez besoin. Si elle tient en 8 192 tokens, MiniMax-M2.7 (MiniMaxAI/MiniMax-M2.7) la gère sur CheapTokens. Sa sortie est moins chère que le prix de référence OpenRouter, et elle est facturée à $0.15 (par 1M de tokens de sortie). Le prix est le même à toute heure, il n'y a pas d'heures de pointe, et l'API est compatible OpenAI et Anthropic.

Voici la liste de prix actuelle pour chaque modèle :

Modèle Contexte Entrée $/1M Sortie $/1M OpenRouter entrée OpenRouter sortie
GLM-5.3-Flash reasoning 390K $0.02 $0.04 $0.0413 $0.0758
DeepSeek-V4-Flash 380K $0.015 $0.10 $0.0475 $0.1568
MiniMax-M2.7 180K $0.05 $0.15 $0.30 $1.20

Prix en USD pour 1 million de jetons. Les chiffres d'OpenRouter sont affichés à titre de comparaison et peuvent varier.

Si vous n'avez pas encore envoyé de requête, Votre première requête API avec CheapTokens vous guide pas à pas. Pour savoir ce qu'est un token et pourquoi l'entrée et la sortie sont comptées séparément, voir Qu'est-ce qu'un token en IA ?.

Les endpoints, les identifiants de modèles et les limites de chaque modèle figurent dans la documentation CheapTokens.