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

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éeDescriptionChamps à lire
MessageEntryUn message de l’utilisateur, du modèle ou du système, ou un message de contexterole, text
ContextMessageUn MessageEntry avec role="context" : un message de contexte reçu par le modèle avec l’entrée d’un tourkind : "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
ToolCallEntryUn appel d’outil effectué par le modèlename, l’identifiant complet de l’outil, par exemple client.get_alert, et arguments
ToolResultEntryLe résultat d’un appel d’outilname, content ou structured_content, et is_error
UnknownEntryUn type d’entrée pour lequel votre version du SDK ne possède pas de classe, comme le raisonnement du modèletype 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

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éeDescriptionChamps
"message"Un messagerole : "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èletool_call_id, name, arguments
"tool_result"Le résultat de cet appeltool_call_id, identique à celui de l’appel correspondant. name, result, ou error si l’appel a échoué.
"reasoning"Le raisonnement du modèletext

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.

  • 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.