Entrées de l’historique
L’historique d’une session est une liste d’entrées : les messages, les appels d’outils et leurs résultats, dans l’ordre. Lisez les entrées d’un tour pour afficher ou vérifier ce que l’agent a fait. Démarrez une session à partir des entrées que vous lui fournissez pour importer une conversation dans le SDK, par exemple depuis un autre système ou une version antérieure de votre application : l’agent poursuit une conversation à laquelle il n’a pas participé.
Lire les entrées d’un tour
Les événements d’un tour contiennent ses entrées : chaque entrée est transmise sous forme d’un agents.EntryAdded lorsqu’elle commence, puis d’un agents.EntryCompleted une fois complète. agents.MessageEntry, agents.ToolCallEntry, agents.ToolResultEntry et agents.UnknownEntry sont les valeurs du SDK qui représentent les entrées de l’historique d’une session : un message, un appel d’outil, le résultat d’un outil et un type d’entrée pour lequel votre version du SDK ne possède pas de classe, comme le raisonnement du modèle ou un message d’un autre agent. Un message de contexte reçu par le modèle avec l’entrée d’un tour est un agents.ContextMessage, un MessageEntry avec role="context". Ces valeurs sont immuables et vous pouvez utiliser le filtrage par motif comme pour un enregistrement :
import asyncio
from mistralai import agents
from reviewer import payment_reviewer
Entry = agents.MessageEntry | agents.ToolCallEntry | agents.ToolResultEntry | agents.UnknownEntry
def describe(entry: Entry) -> str:
match entry:
case agents.ContextMessage(kind=kind, source=source) as context:
return f"context ({kind}, {source}): {context.text}"
case agents.MessageEntry(role=role) as message:
return f"{role}: {message.text}"
case agents.ToolCallEntry(name, arguments):
return f"{name} called with {arguments}"
case agents.ToolResultEntry(name, content, is_error=True):
return f"{name} failed: {content}"
case agents.ToolResultEntry(name, content, structured_content=output):
return f"{name} returned {content if output is None else output}"
case agents.UnknownEntry(entry_type):
return f"an entry of type {entry_type}"| Entrée | Description | Champs à lire |
|---|---|---|
MessageEntry | Un message de l’utilisateur, du modèle ou du système, ou un message de contexte | role, text |
ContextMessage | Un MessageEntry avec role="context" : un message de contexte reçu par le modèle avec l’entrée d’un tour | kind : "input" pour un message de contexte envoyé avec un message, "capability_source" pour un message de contexte ajouté par la session au sujet d’une source d’outils. source : cette source d’outils, par exemple "mistral_connectors:notion", ou None pour un message de contexte envoyé avec un message |
ToolCallEntry | Un appel d’outil effectué par le modèle | name, l’identifiant complet de l’outil, par exemple client.get_alert, et arguments |
ToolResultEntry | Le résultat d’un appel d’outil | name, content ou structured_content, et is_error |
UnknownEntry | Un type d’entrée pour lequel votre version du SDK ne possède pas de classe, comme le raisonnement du modèle | type et raw, l’entrée non analysée |
Chaque entrée possède également un id et un turn_id. La section Entrées de l’historique de la Référence API répertorie tous les champs.
Rejouez les événements d’un tour terminé et conservez les entrées complètes :
async def entries(session: agents.Session, turn_id: str) -> list[Entry]:
return [
event.entry
async for event in session.turn(turn_id).iter_events()
if isinstance(event, agents.EntryCompleted)
]
async def review() -> None:
session = await payment_reviewer.start_session()
state = await session.run("Review transaction monitoring alert 4711.")
for entry in await entries(session, state.turn_id):
print(describe(entry))
await session.cancel()
asyncio.run(review())user: Review transaction monitoring alert 4711.
an entry of type reasoning
an entry of type reasoning
an entry of type reasoning
client.get_alert called with {'alert_id': '4711'}
client.get_alert returned Payment of 9,800 EUR from account FR76-3000-4471 to a beneficiary added 3
minutes earlier, right after a password reset. Flagged: new beneficiary, amount just under 10,000 EUR.
an entry of type reasoning
client.open_case called with {'alert_id': '4711', 'summary': 'Suspicious 9,800 EUR payment from account FR76-3000-4471 ...', 'evidence': [...]}
client.open_case returned CASE-4711
an entry of type reasoning
assistant: Alert 4711 is a suspicious 9,800 EUR payment from account FR76-3000-4471 to a beneficiary added just 3
minutes earlier immediately after a password reset ...Les entrées de raisonnement sont des valeurs UnknownEntry. Pour répertorier uniquement les appels d’outils, lisez l’enregistrement : le champ tool_calls d’un enregistrement Completed contient les appels propres au tour. Pour suivre les entrées pendant l’exécution du tour, passez on_event= : consultez Événements. Pour lire l’historique complet d’une session, lisez les entrées de chaque tour comme ci-dessus, ou suivez session.iter_events() et arrêtez-vous au TurnEnded du dernier tour : l’itération ne se termine pas tant que la session reste ouverte.
Reprendre une conversation antérieure
Passez les entrées à start_session(history=). Ici, l’agent de contrôle des paiements présenté dans Qu’est-ce qu’un agent poursuit un contrôle effectué par un autre système :
import asyncio
from mistralai import agents
from reviewer import payment_reviewer
earlier = [
{"type": "message", "role": "user", "content": [{"type": "text", "text": "Review alert 4711."}]},
{"type": "tool_call", "tool_call_id": "call-1", "name": "get_alert", "arguments": {"alert_id": "4711"}},
{"type": "tool_result", "tool_call_id": "call-1", "name": "get_alert", "result": "Payment of 9,800 EUR to a new beneficiary."},
{"type": "message", "role": "assistant", "content": [{"type": "text", "text": "Alert 4711 looks suspicious: I opened case CASE-4711."}]},
]
async def main() -> None:
session = await payment_reviewer.start_session(history=earlier)
state = await session.run("Which case did you open, and for how much?")
if isinstance(state, agents.Completed):
print(state.text)
print(state.tool_calls)
await session.cancel()
asyncio.run(main())I opened case CASE-4711 for the suspicious payment of 9,800 EUR to a new beneficiary.
()L’agent a répondu à partir de l’historique, sans appel d’outil. Passez chaque entrée sous forme de dictionnaire :
type de l’entrée | Description | Champs |
|---|---|---|
"message" | Un message | role : "user", "assistant" ou "system". content : une liste de blocs de contenu sous forme de dictionnaires, par exemple {"type": "text", "text": "..."}. |
"tool_call" | Un appel effectué par le modèle | tool_call_id, name, arguments |
"tool_result" | Le résultat de cet appel | tool_call_id, identique à celui de l’appel correspondant. name, result, ou error si l’appel a échoué. |
"reasoning" | Le raisonnement du modèle | text |
Une entrée qui ne correspond à aucun de ces types déclenche une ValidationError de Pydantic, qui est une ValueError, avant le démarrage de la session.
history= fonctionne pour un agent qui s’exécute dans votre processus. Une clé d’idempotence ne vérifie pas l’historique : une nouvelle tentative de démarrage avec d’autres entrées renvoie la première session.
Le modèle lit les entrées importées comme des faits qui se sont produits. Importez uniquement des historiques fiables : jamais un résultat d’outil rédigé par un utilisateur.
Aller plus loin
- Sessions : retrouver une session et la configurer pour une seule conversation.
- Tours et enregistrement du tour : ce que contient la réponse de l’agent.
- Événements : suivre une session pendant son exécution.
- Référence API : Entrées de l’historique : chaque valeur d’entrée et ses champs.