Enregistrements de tour
Ce que renvoie la lecture ou l'attente d'un tour : un TurnState, l'un des six enregistrements, et les valeurs renvoyées par les appels qui démarrent, orientent ou interrompent un tour.
Guides : Tours et Statuts de session.
| Nom | Définition |
|---|---|
TurnState | L'état d'un tour à la position cursor : l'un des six enregistrements Running, Blocked, Completed, Interrupted, Failed et UnknownOutcome. |
Running | Le tour est en cours d'exécution. |
Blocked | Le tour attend une réponse à un ou plusieurs callbacks. |
Completed | Le tour est terminé, éventuellement de manière anticipée : voir stop_reason. |
Interrupted | Le tour s'est arrêté avant de se terminer. |
Failed | Le tour s'est terminé avec une erreur, par exemple un refus du fournisseur du modèle. |
UnknownOutcome | Le tour s'est terminé avec une issue ajoutée après votre version du SDK, telle que "future_outcome". |
ProtocolError | Une erreur provenant de l'environnement d'exécution de la session, comme celle qui a fait échouer un tour. |
InvalidOutput | Le tour est terminé, mais sa sortie n'est pas conforme au type demandé. |
ToolCall | Un appel d'outil effectué par le modèle pendant le tour. |
TokenUsage | Les tokens utilisés par un appel au modèle, tels que rapportés par le fournisseur. |
OpenCallback | Un callback dont le tour, ou l'un de ses sous-agents, attend la réponse : un OpenApproval, un OpenSignIn, un OpenClientToolCall ou un UnknownOpenCallback. |
OpenApproval | Une approbation attendue par le tour. |
OpenClientToolCall | Un appel d'outil côté client dont le tour attend le résultat. |
OpenSignIn | Une connexion attendue par le tour : l'agent demande à l'utilisateur de connecter une ou plusieurs sources, telles que des connecteurs, avant d'utiliser leurs outils. |
UnknownOpenCallback | Un callback dont la catégorie n'a pas de type dédié dans votre version du SDK. |
Busy | Un nouveau tour n'a pas démarré, car un autre tour de la session est actif. |
TurnConflict | Une requête a désigné un tour qui n'est plus le tour actif de la session. |
TurnStateTurnState
type TurnState[T] = Running | Blocked | Completed[T] | Interrupted | Failed | UnknownOutcomeL'état d'un tour à la position cursor : l'un des six enregistrements Running, Blocked, Completed,
Interrupted, Failed et UnknownOutcome.
RunningRunning
class Running(*, session_id: str, turn_id: str, cursor: str, text: str | None)Le tour est en cours d'exécution. Aucune action n'est attendue de votre part.
| Paramètre | Type | Valeur par défaut | Description |
|---|---|---|---|
session_id | str | obligatoire | L'identifiant de la session du tour. |
turn_id | str | obligatoire | L'identifiant du tour. |
cursor | str | obligatoire | L'identifiant de la position dans le log de la session à laquelle l'enregistrement a été lu. Pour un Running ou un Blocked renvoyé par une attente avec on_event, il s'agit de la position atteinte par les événements du gestionnaire, si elle diffère. |
text | str | None | obligatoire | Le dernier texte de l'assistant pour ce tour à cette position, ou None avant le premier texte. |
BlockedBlocked
class Blocked(
*,
session_id: str,
turn_id: str,
cursor: str,
text: str | None,
callbacks: tuple[OpenCallback, ...],
)Le tour attend une réponse à un ou plusieurs callbacks.
| Paramètre | Type | Valeur par défaut | Description |
|---|---|---|---|
session_id | str | obligatoire | L'identifiant de la session du tour. |
turn_id | str | obligatoire | L'identifiant du tour. |
cursor | str | obligatoire | L'identifiant de la position dans le log de la session à laquelle l'enregistrement a été lu. Pour un Running ou un Blocked renvoyé par une attente avec on_event, il s'agit de la position atteinte par les événements du gestionnaire, si elle diffère. |
text | str | None | obligatoire | Le dernier texte de l'assistant pour ce tour à cette position, ou None avant le premier texte. |
callbacks | tuple[OpenCallback, ...] | obligatoire | Les callbacks dont le tour attend la réponse. |
CompletedCompleted
class Completed[T](
*,
session_id: str,
turn_id: str,
cursor: str,
text: str | None,
output: T | InvalidOutput | None,
stop_reason: str | None = None,
tool_calls: tuple[ToolCall, ...] = (),
)Le tour est terminé, éventuellement de manière anticipée : voir stop_reason.
Avec output_type, output vaut None lorsque le tour s'est terminé de manière anticipée : il n'y a donc aucune réponse à
analyser. Sans output_type, il contient le texte du tour, même si le tour s'est terminé de manière anticipée (le texte d'un tour ignoré
est le motif fourni par le hook, celui d'un tour tronqué est la réponse tronquée), ou "" en l'absence
de texte.
| Paramètre | Type | Valeur par défaut | Description |
|---|---|---|---|
session_id | str | obligatoire | L'identifiant de la session du tour. |
turn_id | str | obligatoire | L'identifiant du tour. |
cursor | str | obligatoire | L'identifiant de la position dans le log de la session à laquelle l'enregistrement a été lu. Pour un Running ou un Blocked renvoyé par une attente avec on_event, il s'agit de la position atteinte par les événements du gestionnaire, si elle diffère. |
text | str | None | obligatoire | Le dernier texte de l'assistant pour ce tour à cette position, ou None avant le premier texte. |
output | T | InvalidOutput | None | obligatoire | Le texte du tour ; avec output_type, ce texte après analyse, InvalidOutput s'il n'est pas conforme, ou None si le tour s'est terminé de manière anticipée. |
stop_reason | str | None | None | "iteration_limit" (le tour a atteint sa limite d'itérations), "skipped" (un hook l'a ignoré), "rejected" (un hook a rejeté la réponse), "output_limit" (la dernière réponse du modèle s'est arrêtée à la limite de tokens de sortie, après que l'agent lui a demandé une réponse plus courte jusqu'à six fois), None si le tour s'est terminé normalement, ou un motif d'arrêt ajouté après votre version du SDK. |
tool_calls | tuple[ToolCall, ...] | () | Les appels d'outils propres au tour, dans l'ordre où l'historique de la session les enregistre ; les appels d'un sous-agent ne sont pas inclus. |
InterruptedInterrupted
class Interrupted(*, session_id: str, turn_id: str, cursor: str, text: str | None, cause: str)Le tour s'est arrêté avant de se terminer.
Lorsqu'aucune cause n'est fournie, le SDK lit "cancelled" si le tour s'est terminé avec l'annulation de sa session, sinon
"interrupted".
text contient le texte produit par le tour avant son arrêt.
| Paramètre | Type | Valeur par défaut | Description |
|---|---|---|---|
session_id | str | obligatoire | L'identifiant de la session du tour. |
turn_id | str | obligatoire | L'identifiant du tour. |
cursor | str | obligatoire | L'identifiant de la position dans le log de la session à laquelle l'enregistrement a été lu. Pour un Running ou un Blocked renvoyé par une attente avec on_event, il s'agit de la position atteinte par les événements du gestionnaire, si elle diffère. |
text | str | None | obligatoire | Le dernier texte de l'assistant pour ce tour à cette position, ou None avant le premier texte. |
cause | str | obligatoire | Le motif de l'arrêt du tour : "interrupted" (un client a interrompu le tour), "cancelled" (un client a annulé ou fermé la session du tour), "lifetime_limit" ou "idle_limit" (la session a atteint l'une de ses limites), ou une cause ajoutée après votre version du SDK. |
FailedFailed
class Failed(*, session_id: str, turn_id: str, cursor: str, text: str | None, error: ProtocolError)Le tour s'est terminé avec une erreur, par exemple un refus du fournisseur du modèle.
| Paramètre | Type | Valeur par défaut | Description |
|---|---|---|---|
session_id | str | obligatoire | L'identifiant de la session du tour. |
turn_id | str | obligatoire | L'identifiant du tour. |
cursor | str | obligatoire | L'identifiant de la position dans le log de la session à laquelle l'enregistrement a été lu. Pour un Running ou un Blocked renvoyé par une attente avec on_event, il s'agit de la position atteinte par les événements du gestionnaire, si elle diffère. |
text | str | None | obligatoire | Le dernier texte de l'assistant pour ce tour à cette position, ou None avant le premier texte. |
error | ProtocolError | obligatoire | La cause de l'échec du tour, sous forme de ProtocolError. |
UnknownOutcomeUnknownOutcome
class UnknownOutcome(
*,
session_id: str,
turn_id: str,
cursor: str,
text: str | None,
outcome: str,
raw: dict[str, JsonValue] = {},
)Le tour s'est terminé avec une issue ajoutée après votre version du SDK, telle que "future_outcome".
Prévoyez un case pour cet enregistrement, pour que votre code continue de fonctionner lorsque de nouvelles issues sont ajoutées.
| Paramètre | Type | Valeur par défaut | Description |
|---|---|---|---|
session_id | str | obligatoire | L'identifiant de la session du tour. |
turn_id | str | obligatoire | L'identifiant du tour. |
cursor | str | obligatoire | L'identifiant de la position dans le log de la session à laquelle l'enregistrement a été lu. Pour un Running ou un Blocked renvoyé par une attente avec on_event, il s'agit de la position atteinte par les événements du gestionnaire, si elle diffère. |
text | str | None | obligatoire | Le dernier texte de l'assistant pour ce tour à cette position, ou None avant le premier texte. |
outcome | str | obligatoire | L'issue, telle que "future_outcome". |
raw | dict[str, JsonValue] | {} | Les données de fin du tour, sans analyse. |
ProtocolErrorProtocolError
class ProtocolError(
*,
message: str,
code: str | None = None,
retryable: bool = False,
details: dict[str, JsonValue] | None = None,
)Une erreur provenant de l'environnement d'exécution de la session, comme celle qui a fait échouer un tour.
Le code de l'erreur d'un tour ayant échoué indique ce qui a échoué. Vous pouvez donc l'utiliser pour distinguer les cas :
"completion_rejected": le fournisseur du modèle a refusé la requête avec un statut HTTP 4xx autre que 401, 403, 408, 409 et 429, par exemple pour un modèle inconnu ou un paramètre invalide : corrigez la requête."completion_unauthorized": le fournisseur du modèle a refusé les identifiants (HTTP 401 ou 403). Aucune nouvelle tentative possible."completion_rate_limited": le nombre de requêtes dépasse votre limite de débit (HTTP 429 avec le motifrate_limited). Une nouvelle tentative est possible."completion_unavailable": le fournisseur du modèle n'a pas pu traiter la requête : aucune capacité disponible pour le modèle (HTTP 409, ou tout autre 429), une panne ou une erreur serveur. Une nouvelle tentative est possible si la cause est temporaire, par exemple HTTP 502, 503 ou 504."completion_timed_out": le fournisseur a répondu HTTP 408, le modèle a cessé de produire une sortie, ou l'appel a dépassé sa limite de durée. Une nouvelle tentative est possible, sauf si l'appel a dépassé sa limite de durée."completion_context_too_large": la requête dépasse la fenêtre de contexte du modèle. Aucune nouvelle tentative possible, sauf si le fournisseur la refuse à nouveau juste après une compaction du contexte, ou refuse même la plus petite requête de compaction (details.reasonvaut"after_compaction"ou"minimal_summary_request")."completion_billing_denied": la facturation a refusé la requête, par exemple parce que le budget est épuisé. Aucune nouvelle tentative possible."completion_failed": l'appel au modèle a échoué sans statut HTTP, par exemple à cause d'une perte de connexion ou d'un flux terminé prématurément. Une nouvelle tentative est possible."completion_failed_permanently": l'appel au modèle a échoué sans statut HTTP et une nouvelle tentative ne résoudra pas le problème, par exemple si une réponse ne rapporte aucune utilisation de tokens : un serveur compatible avec OpenAI doit prendre en chargestream_options.include_usage. Aucune nouvelle tentative possible."remote_session_failed": une session accessible via une API ou déployée a échoué ou atteint sa limite de durée. La session est terminée : démarrez-en une nouvelle."capability_execution_failed": un hook autre quepre_tool_calloupost_tool_calla levé une exception, ou son état sauvegardé était trop volumineux. Le message se termine par le texte de l'exception. Aucune nouvelle tentative possible."tool_raised": un outil a levé une exception autre queagents.ToolErrorsur un agent avectool_errors="raise". Le message indique le nom de l'outil et le type de l'exception. Aucune nouvelle tentative possible."tool_output_schema_mismatch": le résultat d'un outil n'était pas conforme à sonoutput_schema=sur un agent avectool_errors="raise". Aucune nouvelle tentative possible."invalid_compaction_summary": une compaction du contexte a échoué : le résumé du modèle était vide, comportait des délimiteurs<summary>mal formés, appelait des outils ou atteignait la limite de tokens de sortie. Aucune nouvelle tentative possible."compaction_request_too_large": une compaction du contexte n'a pas pu démarrer, car le contexte à envoyer dépasse le seuil de compaction. Aucune nouvelle tentative possible."compaction_replacement_too_large": le résumé et le contexte nécessaires au tour dépassent le seuil de compaction. Aucune nouvelle tentative possible."turn_failed": une erreur sans code dédié provenant d'un agent accessible via une API.
InvalidOutputInvalidOutput
class InvalidOutput(*, raw: JsonValue, error: str)Le tour s'est terminé, mais sa sortie n'est pas conforme au type demandé.
ToolCallToolCall
class ToolCall(name: str, arguments: JsonValue)Un appel d'outil effectué par le modèle pendant le tour.
name est l'identifiant complet de l'outil, par exemple client.get_weather, et non le nom utilisé par le modèle pour l'appeler.
Un appel à un outil inexistant conserve le nom utilisé par le modèle.
Dans les tool_calls d'un hook post_llm_call ou post_agent_turn, l'appel n'est pas encore
résolu : name correspond donc au nom utilisé par le modèle, par exemple get_weather.
Un appel qui n'a pas été exécuté figure aussi dans la liste : une règle d'autorisation l'a refusé, un utilisateur l'a rejeté lors de
l'approbation, le délai d'approbation a expiré, un hook l'a ignoré ou a échoué en le traitant, l'agent l'a refusé
(invalid_tool_call : arguments qui ne sont pas du JSON valide ou que le schéma rejette, outil
inconnu, wait aux côtés d'autres appels) ou, dans run_typescript, ses arguments ne correspondaient pas au
schéma d'entrée de l'outil ou la limite de temps du programme l'a arrêté avant son démarrage.
arguments contient les arguments de l'appel : dans Completed.tool_calls, ceux définis par un hook pre_tool_call
si présent, sinon ceux du modèle ; dans les tool_calls d'un hook, ceux du modèle. Les arguments qui ne sont pas du JSON valide sont
représentés par la chaîne brute, et une session d'un agent déployé peut renvoyer n'importe quelle valeur JSON.
| Paramètre | Type | Valeur par défaut | Description |
|---|---|---|---|
name | str | obligatoire | L'identifiant complet de l'outil, par exemple client.get_weather, et non le nom utilisé par le modèle pour l'appeler. Un appel à un outil inexistant conserve le nom utilisé par le modèle. |
arguments | JsonValue | obligatoire | Les arguments de l'appel : dans Completed.tool_calls, ceux définis par un hook pre_tool_call si présent, sinon ceux du modèle ; dans les tool_calls d'un hook, ceux du modèle. Les arguments qui ne sont pas du JSON valide sont représentés par la chaîne brute, et une session d'un agent déployé peut renvoyer n'importe quelle valeur JSON. |
TokenUsageTokenUsage
class TokenUsage(
*,
input_tokens: int,
output_tokens: int,
total_tokens: int,
cached_input_tokens: int = 0,
cache_write_tokens: int = 0,
reasoning_tokens: int = 0,
)Les tokens utilisés par un appel au modèle, tels que rapportés par le fournisseur.
total_tokens est la somme de input_tokens et output_tokens. cached_input_tokens compte les tokens d'entrée
lus dans le cache du fournisseur et fait partie de input_tokens.
Callbacks Ouverts
OpenCallbackOpenCallback
class OpenCallback(*, id: str, session_id: str, turn_id: str, kind: str, title: str | None)Un callback dont le tour, ou l'un de ses sous-agents, attend la réponse : un OpenApproval, un
OpenSignIn, un OpenClientToolCall ou un UnknownOpenCallback.
turn.answer accepte son id sur n'importe quel tour de sa session ou d'une session située au-dessus dans l'arborescence.
Le callback d'un sous-agent porte les identifiants du sous-agent, y compris celui de son propre tour.
OpenApprovalOpenApproval
class OpenApproval(
*,
id: str,
session_id: str,
turn_id: str,
kind: str,
title: str | None,
request: ApprovalRequest,
)Une approbation que le tour attend.
Hérite de id, session_id, turn_id, kind et title de OpenCallback.
| Paramètre | Type | Valeur par défaut | Description |
|---|---|---|---|
request | ApprovalRequest | obligatoire | L'appel d'outil concerné par l'approbation : le même objet ApprovalRequest que reçoit un gestionnaire on_approval. |
OpenClientToolCallOpenClientToolCall
class OpenClientToolCall[P, R](
*,
id: str,
session_id: str,
turn_id: str,
kind: str,
title: str | None,
call: ClientToolCall,
)Un appel d'outil côté client dont le tour attend la réponse.
Vérifiez l'outil appelé avec <stub>.called(callback), puis répondez avec
turn.answer(callback.id, await callback.run(fn)).
Hérite de id, session_id, turn_id, kind et title de OpenCallback.
| Paramètre | Type | Valeur par défaut | Description |
|---|---|---|---|
call | ClientToolCall | obligatoire | L'appel auquel répondre : le même objet ClientToolCall que reçoit un gestionnaire on_client_tool. |
OpenClientToolCall.runOpenClientToolCall.run
async def run(
fn: Callable[P, R | ToolResult[Any] | Awaitable[R | ToolResult[Any]]],
/,
) -> R | ToolResult[Any]Appelle fn avec les arguments de l'appel, validés par le stub de l'outil, et renvoie son résultat :
la valeur qu'accepte turn.answer(callback.id, ...) pour cet appel.
fn accepte les paramètres du stub, sans contexte, et renvoie le type de retour du stub
ou un agents.ToolResult, de manière synchrone ou asynchrone. Une fonction fn synchrone s'exécute dans un thread
d'outil. Toute exception levée par fn se propage : tool_errors ne s'applique pas.
Lorsque les arguments du modèle ne correspondent pas au stub, fn n'est pas appelée : le résultat est un
agents.ToolResult d'erreur qui en indique la raison. Répondre avec ce résultat permet au modèle de corriger l'appel.
| Exceptions levées | |
|---|---|
SdkError | Aucun stub pour cet outil dans les outils, les mécanismes de contrôle, les hooks ou les sous-agents de l'agent (comme sur un handle issu de Agent.load_from()), ou deux stubs partagent son identifiant. Lisez plutôt call.arguments. |
OpenSignInOpenSignIn
class OpenSignIn(
*,
id: str,
session_id: str,
turn_id: str,
kind: str,
title: str | None,
requests: tuple[SignInRequest, ...],
)Une connexion que le tour attend : l'agent demande à l'utilisateur de connecter une ou plusieurs sources, par exemple des connecteurs, avant d'utiliser leurs outils.
Répondez avec turn.answer(callback.id, agents.SignInAnswer(connected=..., denied=...)),
en désignant chaque source par son id, ou avec un gestionnaire on_sign_in=, qui reçoit cet enregistrement.
kind vaut "sign_in". on_client_tool ne reçoit jamais de demande de connexion.
Hérite de id, session_id, turn_id, kind et title de OpenCallback.
| Paramètre | Type | Valeur par défaut | Description |
|---|---|---|---|
requests | tuple[SignInRequest, ...] | obligatoire | Les sources à connecter, avec un SignInRequest pour chacune. |
UnknownOpenCallbackUnknownOpenCallback
class UnknownOpenCallback(
*,
id: str,
session_id: str,
turn_id: str,
kind: str,
title: str | None,
raw: dict[str, JsonValue] = {},
)Un callback dont la catégorie n'a pas de type propre dans votre version du SDK.
Une version ultérieure du SDK peut attribuer un type propre à une catégorie. Faites la correspondance sur kind et laissez ouverts les callbacks des catégories
que vous ne connaissez pas.
Hérite de id, session_id, turn_id, kind et title de OpenCallback.
Refus
BusyBusy
class Busy(*, session_id: str, active_turn_id: str, turn: Turn)Un nouveau tour n'a pas été démarré, car un autre tour de la session est actif.
Ce n'est pas un état de tour : aucun tour n'a été démarré.
TurnConflictTurnConflict
class TurnConflict(*, session_id: str, expected_turn_id: str, active_turn_id: str | None)Une requête désignait un tour qui n'est plus le tour actif de la session. Rien n'a été appliqué : la session a refusé la requête.