Aller au contenu principal

Conversations persistantes

L’état qui persiste entre les échanges

L’un des avantages majeurs de l’API Agents par rapport à Chat Completions est la persistance des conversations. Vous n’avez plus à gérer manuellement l’historique des messages — Mistral le fait pour vous côté serveur.

Démarrer une conversation

La méthode conversations.start() crée une nouvelle conversation et envoie le premier message :

from mistralai import Mistral
import os

client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])

# Créer un agent
agent = client.beta.agents.create(
    model="mistral-medium-latest",
    name="Assistant Projet",
    description="Assistant de gestion de projet.",
    instructions="Vous aidez à organiser et suivre les projets. Soyez structuré."
)

# Démarrer la conversation
response = client.beta.conversations.start(
    agent_id=agent.id,
    inputs="Je lance un nouveau projet de refonte de notre site web. Budget : 50K€, deadline : septembre 2026."
)

print(f"Conversation ID : {response.conversation_id}")

Le conversation_id retourné est votre clé pour continuer cette conversation plus tard.

Continuer une conversation

Pour ajouter un message à une conversation existante, fournissez le conversation_id :

# Premier échange
response1 = client.beta.conversations.start(
    agent_id=agent.id,
    inputs="Je lance un projet de refonte web. Budget 50K€."
)

# Deuxième échange — l'agent se souvient du contexte
response2 = client.beta.conversations.append(
    conversation_id=response1.conversation_id,
    inputs="Quelles sont les étapes prioritaires ?"
)

# Troisième échange — toujours dans le même contexte
response3 = client.beta.conversations.append(
    conversation_id=response2.conversation_id,
    inputs="Rédige un planning pour les 3 premiers mois."
)

Le mécanisme d’immutabilité

Chaque appel à conversations.append() retourne un nouveau conversation_id. L’ancien reste accessible en lecture, mais vous devez utiliser le dernier ID pour le prochain append.

# Chaque append retourne un nouvel ID
id_1 = response1.conversation_id  # "conv-aaa"
id_2 = response2.conversation_id  # "conv-bbb"
id_3 = response3.conversation_id  # "conv-ccc"

# Utilisez toujours le DERNIER id pour continuer
response4 = client.beta.conversations.append(
    conversation_id=id_3,  # Pas id_1 ou id_2
    inputs="Ajoute les jalons de validation client."
)

Lire l’historique d’une conversation

conversation = client.beta.conversations.retrieve(
    conversation_id=response.conversation_id
)

for entry in conversation.entries:
    print(f"[{entry.role}] {entry.type}: {entry.content[:100]}...")

Gérer le stockage

Par défaut, les conversations sont stockées dans le cloud Mistral. Vous pouvez désactiver ce comportement :

# Conversation éphémère — rien n'est sauvegardé
response = client.beta.conversations.start(
    agent_id=agent.id,
    inputs="Données confidentielles à analyser...",
    store=False
)

Avec store=False :

  • La conversation n’est pas récupérable après la session
  • Les données ne sont pas conservées sur les serveurs Mistral
  • Utile pour le traitement de données sensibles

Pattern de conversation multi-tours

Voici un pattern complet pour gérer une conversation interactive :

from mistralai import Mistral
import os

client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])

agent = client.beta.agents.create(
    model="mistral-large-latest",
    name="Coach Technique",
    description="Coach pour les décisions techniques.",
    instructions="Vous êtes un coach technique senior. Posez des questions pour comprendre le contexte avant de conseiller."
)

# Boucle conversationnelle
conversation_id = None

while True:
    user_input = input("Vous : ")
    if user_input.lower() in ["quit", "exit"]:
        break

    if conversation_id is None:
        response = client.beta.conversations.start(
            agent_id=agent.id,
            inputs=user_input
        )
    else:
        response = client.beta.conversations.append(
            conversation_id=conversation_id,
            inputs=user_input
        )

    conversation_id = response.conversation_id

    for entry in response.outputs:
        if hasattr(entry, "content"):
            print(f"Agent : {entry.content}")

Points clés à retenir

  • conversations.start() crée une nouvelle conversation avec un premier message
  • conversations.append() ajoute un message à une conversation existante
  • Chaque append retourne un nouveau conversation_id — utilisez toujours le dernier
  • store=False désactive la persistance côté Mistral pour les données sensibles
  • L’agent conserve tout le contexte de la conversation sans que vous ayez à renvoyer l’historique