Contexte multi-tour : stockage et chiffrement
Mis à jour le 30 juillet 2026
Le problème du contexte entre requêtes
Dans une conversation multi-tour avec des outils, le volume de contexte augmente rapidement. Chaque appel d’outil ajoute ses résultats au fil de messages, et le raisonnement interne du modèle doit être préservé pour la cohérence. Deux mécanismes résolvent ce problème : le stockage distant et le chiffrement côté client.
Méthode 1 : store_messages et previous_response_id
Le stockage distant délègue la gestion du contexte aux serveurs xAI. Vous activez store_messages=True dans votre première requête, puis vous chaînez les requêtes suivantes avec previous_response_id :
# Première requête : activer le stockage
response = await client.chat.completions.create(
model="grok-4.5",
messages=[{"role": "user", "content": "Analyse ce dataset de ventes"}],
tools=my_tools,
store_messages=True
)
response_id = response.id # sauvegarder l'identifiant
# Requête suivante : utiliser le contexte stocké
response2 = await client.chat.completions.create(
model="grok-4.5",
messages=[{"role": "user", "content": "Quels sont les 3 produits les plus vendus ?"}],
previous_response_id=response_id,
store_messages=True
)
Avec cette approche, vous n’avez pas besoin de renvoyer l’historique complet des messages. Le serveur xAI conserve le contexte et le rattache automatiquement. Cela réduit la taille de vos requêtes et simplifie votre code.
Avantages
- Requêtes plus légères (pas besoin de renvoyer tout l’historique)
- Le raisonnement interne du modèle est préservé automatiquement
- Pas de gestion complexe de l’état côté client
Limites
- Les messages sont stockés sur les serveurs xAI (considération de confidentialité)
- L’identifiant
response_iddoit être conservé entre les requêtes - Le stockage a une durée de rétention limitée
Méthode 2 : use_encrypted_content
Le chiffrement côté client offre une alternative pour les cas où vous souhaitez conserver le contrôle du contexte sans stocker vos données sur les serveurs xAI :
# Activer le contenu chiffré
response = await client.chat.completions.create(
model="grok-4.5",
messages=[{"role": "user", "content": "Analyse ce contrat"}],
tools=my_tools,
use_encrypted_content=True
)
# Le raisonnement et les sorties d'outils sont retournés chiffrés
# Vous les ajoutez tel quel aux messages suivants
messages = [
{"role": "user", "content": "Analyse ce contrat"},
response.choices[0].message, # contient le contenu chiffré
{"role": "user", "content": "Quelles sont les clauses de résiliation ?"}
]
response2 = await client.chat.completions.create(
model="grok-4.5",
messages=messages,
use_encrypted_content=True
)
Avec use_encrypted_content=True, le raisonnement interne et les résultats d’outils sont retournés sous forme chiffrée. Vous ne pouvez pas les lire, mais vous les renvoyez dans les requêtes suivantes. Le serveur les déchiffre pour maintenir la continuité du raisonnement.
Avantages
- Le contexte reste sous votre contrôle (pas de stockage distant)
- Le raisonnement interne est préservé sans être exposé en clair
- Compatible avec les politiques de confidentialité strictes
Limites
- Les requêtes sont plus volumineuses (le contenu chiffré est inclus)
- Vous devez gérer l’historique des messages côté client
Choisir entre les deux méthodes
Le choix dépend de votre contexte :
- store_messages : préférable pour les applications de chat, les assistants interactifs, et les cas où la simplicité prime. Le contexte est géré automatiquement.
- use_encrypted_content : préférable pour les applications sensibles, le traitement de documents confidentiels, et les cas où les données ne doivent pas quitter votre infrastructure (au-delà du transit API).
Combiner avec le workflow hybride
Les deux méthodes s’intègrent dans le pattern de boucle vu dans la leçon précédente :
async def multi_turn_conversation(questions: list[str]) -> list[str]:
responses = []
previous_id = None
for question in questions:
kwargs = {
"model": "grok-4.5",
"messages": [{"role": "user", "content": question}],
"tools": my_tools,
"store_messages": True,
}
if previous_id:
kwargs["previous_response_id"] = previous_id
response = await client.chat.completions.create(**kwargs)
previous_id = response.id
responses.append(response.choices[0].message.content)
return responses
Ce pattern enchaîne les questions en préservant le contexte complet de la conversation, y compris les résultats d’outils et le raisonnement interne du modèle.
Points clés à retenir
store_messages=True+previous_response_iddélègue la gestion du contexte à xAIuse_encrypted_content=Truepréserve le raisonnement sans stockage distant- Le choix dépend de vos contraintes de confidentialité et de simplicité
- Les deux méthodes sont compatibles avec les workflows multi-tour et les outils hybrides
previous_response_idélimine le besoin de renvoyer l’historique complet des messages