Aller au contenu principal

Contexte multi-tour : stockage et chiffrement

Le probleme du contexte entre requetes

Dans une conversation multi-tour avec des outils, le volume de contexte augmente rapidement. Chaque appel d’outil ajoute ses resultats au fil de messages, et le raisonnement interne du modele doit etre preserve pour la coherence. Deux mecanismes resolvent ce probleme : le stockage distant et le chiffrement cote client.

Methode 1 : store_messages et previous_response_id

Le stockage distant delegue la gestion du contexte aux serveurs xAI. Vous activez store_messages=True dans votre premiere requete, puis vous chainrez les requetes suivantes avec previous_response_id :

# Premiere requete : activer le stockage
response = await client.chat.completions.create(
    model="grok-4",
    messages=[{"role": "user", "content": "Analyse ce dataset de ventes"}],
    tools=my_tools,
    store_messages=True
)

response_id = response.id  # sauvegarder l'identifiant

# Requete suivante : utiliser le contexte stocke
response2 = await client.chat.completions.create(
    model="grok-4",
    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 reduit la taille de vos requetes et simplifie votre code.

Avantages

  • Requetes plus legeres (pas besoin de renvoyer tout l’historique)
  • Le raisonnement interne du modele est preserve automatiquement
  • Pas de gestion complexe de l’etat cote client

Limites

  • Les messages sont stockes sur les serveurs xAI (consideration de confidentialite)
  • L’identifiant response_id doit etre conserve entre les requetes
  • Le stockage a une duree de retention limitee

Methode 2 : use_encrypted_content

Le chiffrement cote client offre une alternative pour les cas ou vous souhaitez conserver le controle du contexte sans stocker vos donnees sur les serveurs xAI :

# Activer le contenu chiffre
response = await client.chat.completions.create(
    model="grok-4",
    messages=[{"role": "user", "content": "Analyse ce contrat"}],
    tools=my_tools,
    use_encrypted_content=True
)

# Le raisonnement et les sorties d'outils sont retournes chiffres
# Vous les ajoutez tel quel aux messages suivants
messages = [
    {"role": "user", "content": "Analyse ce contrat"},
    response.choices[0].message,  # contient le contenu chiffre
    {"role": "user", "content": "Quelles sont les clauses de resiliation ?"}
]

response2 = await client.chat.completions.create(
    model="grok-4",
    messages=messages,
    use_encrypted_content=True
)

Avec use_encrypted_content=True, le raisonnement interne et les resultats d’outils sont retournes sous forme chiffree. Vous ne pouvez pas les lire, mais vous les renvoyez dans les requetes suivantes. Le serveur les dechiffre pour maintenir la continuite du raisonnement.

Avantages

  • Le contexte reste sous votre controle (pas de stockage distant)
  • Le raisonnement interne est preserve sans etre expose en clair
  • Compatible avec les politiques de confidentialite strictes

Limites

  • Les requetes sont plus volumineuses (le contenu chiffre est inclus)
  • Vous devez gerer l’historique des messages cote client

Choisir entre les deux methodes

Le choix depend de votre contexte :

  • store_messages : preferable pour les applications de chat, les assistants interactifs, et les cas ou la simplicite prime. Le contexte est gere automatiquement.
  • use_encrypted_content : preferable pour les applications sensibles, le traitement de documents confidentiels, et les cas ou les donnees ne doivent pas quitter votre infrastructure (au-dela du transit API).

Combiner avec le workflow hybride

Les deux methodes s’integrent dans le pattern de boucle vu dans la lecon precedente :

async def multi_turn_conversation(questions: list[str]) -> list[str]:
    responses = []
    previous_id = None

    for question in questions:
        kwargs = {
            "model": "grok-4",
            "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 enchaine les questions en preservant le contexte complet de la conversation, y compris les resultats d’outils et le raisonnement interne du modele.

Points cles a retenir

  • store_messages=True + previous_response_id delegue la gestion du contexte a xAI
  • use_encrypted_content=True preserve le raisonnement sans stockage distant
  • Le choix depend de vos contraintes de confidentialite et de simplicite
  • Les deux methodes sont compatibles avec les workflows multi-tour et les outils hybrides
  • previous_response_id elimine le besoin de renvoyer l’historique complet des messages