Aller au contenu principal
Leçon 7 sur 12 · Raisonnement IA avec Mistral — reasoning_effort, Small 4 et Large 4

Conversations multi-tours : garder la réflexion dans l'historique

Leçon 7 sur 12 Mis à jour le 2 novembre 2026 Développeur
Sur cette page
  1. La règle : rejouer le message complet
  2. Le code de référence
  3. Ce que cela coûte
  4. Streaming et API Conversations
  5. Le cas des historiques produits par Magistral
  6. Points clés à retenir

Leçon réécrite le 2 novembre 2026. Elle présentait le paramètre prompt_mode de Magistral, retiré avec ce modèle. Elle traite désormais d’une règle que la documentation actuelle met en avant : en multi-tours, la réflexion doit rester dans l’historique. Source : Reasoning — Multi-turn conversations.

La règle : rejouer le message complet

Avec l’API Chat Completions, c’est vous qui renvoyez l’historique à chaque tour. La tentation est grande de n’y remettre que le texte de la réponse, plus court et plus lisible. La documentation de Mistral est explicite : rejouez toujours le message complet de l’assistant, fragments de réflexion compris. Retirer la trace de raisonnement d’un tour à l’autre dégrade les performances du modèle, qui s’appuie sur elle pour rester cohérent. L’économie de tokens se paie en qualité.

Le code de référence

Le plus simple est d’ajouter à l’historique l’objet message renvoyé par le SDK, tel quel :

import os
from mistralai.client import Mistral
from mistralai.client.models import TextChunk, UserMessage

client = Mistral(api_key=os.environ["MISTRAL_API_KEY"], timeout_ms=300_000)
messages = []

for question in ["Combien font 17 × 23 ?", "Multiplie maintenant ce résultat par 3."]:
    messages.append(UserMessage(content=question))

    response = client.chat.complete(
        model="mistral-large-4-0",
        messages=messages,
        reasoning_effort="high",
    )
    assistant_message = response.choices[0].message

    # Affichage : la réponse seule
    content = assistant_message.content
    if isinstance(content, str):
        print(content)
    else:
        print("".join(c.text for c in content or [] if isinstance(c, TextChunk)))

    # Historique : le message complet, réflexion comprise
    messages.append(assistant_message)

Le paramètre timeout_ms relève le délai d’attente du client, utile quand une longue réflexion allonge le temps de réponse. Le point essentiel est la dernière ligne : on n’ajoute pas un message reconstruit à partir du seul texte, mais assistant_message lui-même.

Ce que cela coûte

L’exemple officiel montre l’effet sur les tokens. Au premier tour, la requête compte 25 tokens d’entrée : la seule question. Le modèle répond avec 187 tokens, réflexion comprise. Au second tour, l’entrée passe à 221 tokens : la première question (25), la réponse complète du premier tour avec sa réflexion (187) et la nouvelle question (9). Les tokens de sortie d’un tour deviennent des tokens d’entrée au tour suivant, et c’est précisément ce qui permet au modèle de savoir sans ambiguïté de quel « résultat » parle l’utilisateur.

Sur une longue conversation, ce mécanisme fait grossir l’historique à chaque tour. Deux conséquences pratiques : surveillez usage.prompt_tokens, qui croît avec la conversation, et gardez en tête la fenêtre de contexte du modèle (256 000 tokens pour Small 4, un million pour Large 4). Si l’historique devient trop lourd, ouvrez une nouvelle conversation avec un résumé de la précédente plutôt que de retirer les traces de réflexion.

Streaming et API Conversations

En streaming, la réponse arrive par morceaux (leçon 3) : pour l’historique, il faut donc réassembler soi-même un message complet, réflexion comprise, ce qui alourdit le code. Si votre application est conversationnelle, l’API Conversations offre une alternative : l’historique y est conservé côté serveur, et vous poursuivez l’échange avec conversations.append sans renvoyer les tours précédents (leçon 4).

Le cas des historiques produits par Magistral

Si vous conservez des conversations produites par Magistral, sachez que leur format a varié. Les versions 25.07 et 25.09 séparaient déjà la réflexion dans des fragments thinking, comme aujourd’hui. La version 25.06, la première, plaçait la réflexion dans le texte même de la réponse, entre des balises <think> et </think>. Avant de rejouer de tels historiques sur Small 4 ou Large 4, testez la reprise sur quelques conversations : rien ne garantit qu’un modèle actuel exploite une réflexion écrite dans un autre format, par un autre modèle.

Points clés à retenir

  • En Chat Completions, rejouez le message complet de l’assistant, réflexion comprise
  • Retirer les fragments de réflexion économise des tokens mais dégrade nettement la qualité
  • Les tokens de sortie d’un tour deviennent des tokens d’entrée au tour suivant : surveillez prompt_tokens
  • En streaming, l’API Conversations évite de réassembler l’historique soi-même
  • Les historiques Magistral 25.06 mélangeaient réflexion et réponse dans le texte, avec des balises <think>