Les événements indiquent ce qui se passe pendant qu’un agent travaille. Les éléments sont les messages et les appels d’outils enregistrés que vous pouvez récupérer par la suite. Utilisez les événements pour mettre à jour votre application en temps réel et les éléments pour y afficher l’historique de la session.
Votre application envoie des événements d’entrée pour soumettre des messages, annuler des tours ou renvoyer les résultats des outils. L’agent envoie des événements qui signalent les sorties produites et les changements dans la session. Pour savoir comment envoyer des entrées, consultez Exécuter et poursuivre des sessions.
Lire un flux d’événements
Abonnez-vous au flux avant d’envoyer une tâche pour que votre application reçoive les premiers événements du tour. Passez en arguments votre client API, l’identifiant de session de la conversation et un gestionnaire d’événements :
# Pass your saved session ID to this helper.
def stream_session(client: OpenAI, session_id: str, handle_event):
with client.beta.agents.sessions.events.stream(session_id) as events:
for event in events:
handle_event(event)
match event.type:
case "agent.session.idle":
continue
case "error":
raise RuntimeError(event.error.message)
case "agent.session.failed" | "agent.session.environment.failed":
raise RuntimeError(f"Agent lifecycle failure: {event.type}")
case "agent.session.turn.failed":
if event.turn.subagent_id is None:
detail = event.turn.error.message if event.turn.error else ""
raise RuntimeError(f"{event.type}: {detail}")
case "agent.session.turn.cancelled":
if event.turn.subagent_id is None:
raise RuntimeError("The agent turn was cancelled")
case "agent.session.turn.completed":
if event.turn.subagent_id is None:
return
raise RuntimeError("Stream closed before a turn ended. Retrieve the saved state.")La fonction utilitaire transmet chaque événement à votre gestionnaire, puis vérifie s’il correspond à l’un des types courants. À la réception de agent.session.idle, elle continue de lire le flux. Elle rend la main lorsque le tour de l’agent racine se termine avec succès. Elle lève une erreur si ce tour échoue ou est annulé, si la session ou l’environnement échoue, ou si elle reçoit un événement error. Les événements des tours des sous-agents ne mettent pas fin au flux. Votre gestionnaire détermine comment afficher les sorties, et le code appelant traite les erreurs levées par la fonction utilitaire. Si le flux se ferme avant la fin d’un tour, la fonction utilitaire lève une erreur. Consultez Reprendre après une interruption du flux.
Envoyer un message après s’être abonné au flux
Cette version prend un message en argument et l’envoie après avoir ouvert le flux :
# Pass your saved session ID and message to this helper.
def send_and_stream(client: OpenAI, session_id: str, text, handle_event):
with client.beta.agents.sessions.events.stream(session_id) as events:
client.beta.agents.sessions.events.create(
session_id,
events=[
{
"type": "agent.session.input.message",
"input": [
{
"role": "user",
"content": [{"type": "input_text", "text": text}],
}
],
}
],
)
for event in events:
handle_event(event)
match event.type:
case "agent.session.idle":
continue
case "error":
raise RuntimeError(event.error.message)
case "agent.session.failed" | "agent.session.environment.failed":
raise RuntimeError(f"Agent lifecycle failure: {event.type}")
case "agent.session.turn.failed":
if event.turn.subagent_id is None:
detail = event.turn.error.message if event.turn.error else ""
raise RuntimeError(f"{event.type}: {detail}")
case "agent.session.turn.cancelled":
if event.turn.subagent_id is None:
raise RuntimeError("The agent turn was cancelled")
case "agent.session.turn.completed":
if event.turn.subagent_id is None:
return
raise RuntimeError("Stream closed before a turn ended. Retrieve the saved state.")Traiter les mises à jour
Utilisez le champ type de l’événement pour déterminer comment votre application doit réagir :
- Affichage du texte : ajoutez le texte reçu dans
agent.session.turn.output_text.deltaà la fin du segment de contenu concerné. À la réception deagent.session.turn.output_text.done, remplacez le contenu de ce segment par son texte complet. Il est possible qu’aucun fragment de texte ne soit envoyé. - Suivi de l’avancement : les événements de session, de tour et d’élément indiquent la progression du travail. Pour connaître l’issue du tour, vérifiez si vous avez reçu
agent.session.turn.completed,agent.session.turn.failedouagent.session.turn.cancelled. - Données à fournir : à la réception de
agent.session.requires_action, récupérez la session et examinezrequired_actions. Votre code peut devoir renvoyer le résultat d’une fonction, connecter un environnement ou gérer l’accès du navigateur à une origine ou l’authentification.
L’inactivité de la session ou la fermeture du flux ne suffit pas à confirmer la réussite du tour. Même si le tour se termine avec succès, certains appels d’outils peuvent avoir échoué. Examinez la sortie de l’agent.
Utilisez item_id, output_index et content_index pour rattacher les mises à jour du texte au même segment de contenu. Dans cet exemple abrégé, les deux événements mettent à jour un même segment :
{
"type": "agent.session.turn.output_text.delta",
"item_id": "msg_789",
"output_index": 0,
"content_index": 0,
"delta": "Acme competes"
}
{
"type": "agent.session.turn.output_text.done",
"item_id": "msg_789",
"output_index": 0,
"content_index": 0,
"text": "Acme competes on price and distribution."
}
Chaque événement possède son propre event_id. La valeur de item_id, commune aux deux événements, identifie l’élément enregistré, qui regroupe le contenu du message, son statut et sa phase. Consultez Récupérer le travail enregistré.
Consultez la référence des événements de flux pour connaître tous les types d’événements et leurs champs. Ces événements de flux sont distincts des webhooks. Pour suivre l’activité des sous-agents et savoir quel agent a exécuté une commande, consultez Observer la délégation.
Récupérer les éléments et les tours
Pour récupérer le travail enregistré, utilisez l’identifiant de session que votre application conserve dans l’état de la conversation :
- Éléments de la session : listez les éléments pour récupérer les messages et les appels d’outils de l’agent racine sur l’ensemble des tours.
- Tours : listez les tours pour parcourir le travail effectué pendant la session. Récupérez un tour à partir de son identifiant pour examiner son statut, ses horodatages, sa consommation de ressources et son éventuelle erreur.
- Éléments d’un seul tour : pour un tour de l’agent racine, utilisez le point de terminaison qui liste les éléments du tour. Chaque sous-agent dispose de son propre historique des éléments et d’un point de terminaison qui liste ses éléments par tour.
Les points de terminaison qui renvoient des listes fournissent une page à la fois. Utilisez les fonctions de pagination du SDK ou le curseur after pour récupérer davantage de résultats. Une seule page peut ne pas contenir tous les éléments d’un tour. Utilisez order: "asc" pour lire les éléments du plus ancien au plus récent.
Reprendre après une interruption du flux
Récupérez les sorties manquées à partir des éléments enregistrés. Pour rétablir l’affichage dans votre application :
- Ouvrez un nouveau flux et placez les événements entrants dans une mémoire tampon.
- Récupérez la session et ses éléments enregistrés en gardant le flux ouvert.
- Restaurez l’état local à partir de ces éléments en utilisant l’identifiant de chaque élément comme clé.
- Appliquez les mises à jour des éléments conservées en mémoire tampon à l’aide de
item_id. Écartez les mises à jour des éléments qui ont déjà atteint leur état final dans l’historique récupéré. - Reprenez le traitement des événements en temps réel.
Lorsque vous vous reconnectez à une session qui a échoué, le flux signale l’échec enregistré, puis se ferme.
Si la session récupérée présente status: "failed" ou si vous recevez agent.session.failed,
cessez les tentatives de reconnexion et suivez les
consignes de récupération de la session.
Restaurez les formulaires de saisie en attente à partir du champ required_actions de la session récupérée.
Les éléments de l’historique n’indiquent pas quelles demandes nécessitent encore une réponse. Pour les demandes d’approbation du navigateur, associez chaque formulaire à sa demande à l’aide de request_id et supprimez les formulaires dont la demande n’est plus en attente. Après la reconnexion, vous n’avez pas besoin de renvoyer la tâche ni les approbations précédentes.
Un événement output_text.done permet de remplacer le contenu d’une mémoire tampon temporaire par le texte complet. Les éléments enregistrés permettent de récupérer le travail terminé, même si certains événements intermédiaires manqués ne peuvent pas être récupérés.