Hooks et contextes

Hooks qui modifient la boucle de l'agent, contextes reçus par votre code et fonctions utilitaires qui renvoient les mêmes valeurs lorsqu'un agent déployé exécute à nouveau la boucle.

Fournissez le contenu du résultat d'un hook sous forme de blocs de contenu, comme agents.TextContentBlock(text="..."), ou utilisez agents.skip(reason), agents.retry(feedback) et agents.reject(reason) avec une chaîne de caractères.

Guide : Les mécanismes de contrôle.

NomRôle
HookCode exécuté à différents points de la boucle de l'agent : avant et après chaque tour, appel au modèle et appel d'outil.
HookDecisionDécision d'un hook, convertie en résultat du point d'exécution qui la renvoie.
agents.skipArrêter le tour, l'appel au modèle ou l'appel d'outil.
agents.retryIgnorer la réponse du modèle et appeler à nouveau le modèle avec feedback.
agents.rejectRejeter la réponse du modèle et terminer le tour avec reason.
agents.hookCe qu'un hook reçoit et renvoie à chaque point d'exécution : poursuivre ou remplacer l'entrée ou la sortie.
StateForme sauvegardée d'un hook ou d'une sandbox : son type et les données JSON conservées d'un tour à l'autre.
hook.PreAgentTurnTour reçu par un hook pre_agent_turn.
hook.PreLlmCallAppel au modèle reçu par un hook pre_llm_call.
hook.PostLlmCallRéponse du modèle reçue par un hook post_llm_call.
hook.PostAgentTurnRéponse finale du tour reçue par un hook post_agent_turn.
hook.PreToolCallAppel d'outil reçu par un hook pre_tool_call.
hook.PostToolCallAppel d'outil et résultat reçus par un hook post_tool_call.
hook.PreAgentTurnHookContinueCe que pre_agent_turn renvoie pour démarrer le tour avec un autre contenu utilisateur.
hook.PreAgentTurnHookSkipCe que pre_agent_turn renvoie pour terminer le tour avant l'exécution du modèle, comme le fait agents.skip.
hook.PreLlmCallHookContinueCe que pre_llm_call renvoie pour laisser l'appel au modèle s'exécuter, comme le fait None.
hook.PreLlmCallHookSkipCe que pre_llm_call renvoie pour terminer le tour au lieu d'appeler le modèle, comme le fait agents.skip.
hook.PostLlmCallHookAcceptCe que post_llm_call renvoie pour conserver la réponse du modèle ou remplacer son contenu.
hook.PostLlmCallHookRetryCe que post_llm_call renvoie pour ignorer la réponse et appeler à nouveau le modèle, comme le fait agents.retry.
hook.PostLlmCallHookRejectCe que post_llm_call renvoie pour rejeter la réponse et terminer le tour, comme le fait agents.reject.
hook.PreToolCallHookContinueCe que pre_tool_call renvoie pour exécuter l'outil avec d'autres arguments.
hook.PreToolCallHookSkipCe que pre_tool_call renvoie pour ignorer l'appel, comme le fait agents.skip.
hook.PostToolCallHookContinueCe que post_tool_call renvoie pour fournir au modèle un autre résultat d'outil.
hook.PostAgentTurnHookAcceptCe que post_agent_turn renvoie pour conserver la réponse finale ou remplacer son contenu.
hook.ReplaceAssistantContentRemplacer la réponse du modèle par content, depuis post_llm_call ou post_agent_turn.
pattern.hook.StructuredOutputHookValider la réponse finale de chaque tour avec un modèle Pydantic et demander au modèle de la corriger.
CallbackContextCe qu'un callback reçoit dans ctx : la session dans laquelle il s'exécute et la sandbox de cette session.
CallbackSessionSession dans laquelle un callback s'exécute : son identifiant et celui du tour.
HookCallbackContextCe qu'une méthode de hook reçoit dans ctx : la session dans laquelle elle s'exécute et la sandbox de cette session.
ToolCallbackContextCe qu'un outil reçoit comme premier paramètre, exclusivement positionnel : la session, sa sandbox et l'appel.
ApprovalCallbackContextCe qu'un gestionnaire d'approbation reçoit dans ctx : la session à l'origine de la demande et l'identifiant de l'approbation.
SandboxCallbackContextContexte reçu par un hook de sandbox dans on_create et on_destroy.
agents.nowHeure actuelle en UTC, sous forme d'un objet datetime avec fuseau horaire.
agents.sleepAttendre pendant duration, dans la boucle de l'agent, un outil, un Hook ou une exécution locale.
agents.uuid4UUID aléatoire qui reste identique lorsqu'un agent déployé exécute à nouveau la boucle de l'agent.
agents.randomGénérateur de nombres aléatoires qui renvoie les mêmes nombres lorsqu'un agent déployé exécute à nouveau la boucle.
Hooks

Hooks

Hook

Hook

class Hook(*, tools: Sequence[PythonTool[..., Any] | ClientTool[..., Any]] = (), **data: Any)

Code exécuté à différents points de la boucle de l'agent : avant et après chaque tour, appel au modèle et appel d'outil.

Redéfinissez les points d'exécution dont vous avez besoin ; renvoyer None poursuit l'exécution sans modification. Un hook est un modèle Pydantic. Ses champs constituent son état : la session conserve leurs valeurs et chaque appel démarre avec les valeurs laissées par le dernier appel réussi. Tout autre élément contenu dans le hook, comme un client, est un PrivateAttr, qui n'est jamais sauvegardé. __init__ ne s'exécute qu'à la création du hook : chaque appel démarre à partir d'une copie.

Une valeur sauvegardée enregistre sa classe, que le SDK retrouve parmi les modules déjà chargés. Le chargement d'une valeur n'importe jamais de module. Définissez chaque classe de hook, ainsi que la classe de chaque hook conservé dans un champ, au niveau du module, dans un module importé par celui de votre agent. Sinon, la création d'une session échoue. Conservez les hooks contenus dans un champ dans une liste ou un tuple. Un ensemble lève SdkError.

Un champ avec un alias, comme max_calls: int = Field(0, alias="maxCalls"), utilise son nom à la création du hook, Budget(max_calls=5), et son alias dans la valeur sauvegardée. Pour créer le hook également à partir de l'alias, définissez validate_by_alias=True dans model_config. La méthode model_validate de Pydantic lit un hook par nom de champ ; elle ne charge donc pas la valeur sauvegardée d'un hook dont un champ possède un alias.

ParamètreTypeValeur par défautDescription
toolsSequence[PythonTool[..., Any] | ClientTool[..., Any]]()Outils que le hook ajoute aux outils de l'agent.
**dataAny{}Valeurs des champs du hook.
AttributTypeDescription
toolsSequence[PythonTool[..., Any]]Outils que le hook ajoute aux outils de l'agent.
Hook.pre_agent_turn

Hook.pre_agent_turn

async def pre_agent_turn(
    ctx: HookCallbackContext,
    request: hook.PreAgentTurn,
) -> hook.PreAgentTurnHookContinue | hook.PreAgentTurnHookSkip | HookDecision | None

S'exécute avant chaque tour, avec le contenu utilisateur du tour dans request.user_content.

Renvoyez hook.PreAgentTurnHookContinue pour envoyer un autre contenu, comme [*request.user_content, agents.TextContentBlock(text="...")], ou agents.skip ou hook.PreAgentTurnHookSkip pour ignorer le tour.

ParamètreTypeValeur par défautDescription
ctxHookCallbackContextobligatoireSession dans laquelle le hook s'exécute et sa sandbox.
requesthook.PreAgentTurnobligatoireTour sur le point de s'exécuter.
Hook.post_agent_turn

Hook.post_agent_turn

async def post_agent_turn(
    ctx: HookCallbackContext,
    result: hook.PostAgentTurn,
) -> hook.PostAgentTurnHookAccept | None

S'exécute après chaque tour, avec la réponse finale du modèle dans result : result.text, result.content.

Renvoyez hook.PostAgentTurnHookAccept() pour conserver la réponse, ou remplacez son contenu avec acceptance=hook.ReplaceAssistantContent(content=[agents.TextContentBlock(text="...")]).

ParamètreTypeValeur par défautDescription
ctxHookCallbackContextobligatoireSession dans laquelle le hook s'exécute et sa sandbox.
resulthook.PostAgentTurnobligatoireTour exécuté, avec la réponse finale du modèle.
Hook.pre_llm_call

Hook.pre_llm_call

async def pre_llm_call(
    ctx: HookCallbackContext,
    invocation: hook.PreLlmCall,
) -> hook.PreLlmCallHookContinue | hook.PreLlmCallHookSkip | HookDecision | None

S'exécute avant chaque appel au modèle. Renvoyez agents.skip ou hook.PreLlmCallHookSkip pour terminer le tour sans appeler le modèle (stop_reason="skipped").

ParamètreTypeValeur par défautDescription
ctxHookCallbackContextobligatoireSession dans laquelle le hook s'exécute et sa sandbox.
invocationhook.PreLlmCallobligatoireAppel au modèle sur le point de s'exécuter.
Hook.post_llm_call

Hook.post_llm_call

async def post_llm_call(
    ctx: HookCallbackContext,
    invocation: hook.PostLlmCall,
) -> hook.PostLlmCallHookAccept | hook.PostLlmCallHookRetry | hook.PostLlmCallHookReject | HookDecision | None

S'exécute après chaque appel au modèle, avec sa réponse dans invocation : invocation.text, invocation.tool_calls, invocation.content.

Renvoyez hook.PostLlmCallHookAccept pour conserver la réponse ou remplacer son contenu, comme le fait hook.PostAgentTurnHookAccept, agents.retry pour appeler à nouveau le modèle avec des indications de correction, ou agents.reject pour terminer le tour.

ParamètreTypeValeur par défautDescription
ctxHookCallbackContextobligatoireSession dans laquelle le hook s'exécute et sa sandbox.
invocationhook.PostLlmCallobligatoireAppel au modèle exécuté, avec sa réponse.
Hook.pre_tool_call

Hook.pre_tool_call

async def pre_tool_call(
    ctx: HookCallbackContext,
    call: hook.PreToolCall,
) -> hook.PreToolCallHookContinue | hook.PreToolCallHookSkip | HookDecision | None

S'exécute avant chaque appel d'outil, avec l'appel dans call.

Renvoyez hook.PreToolCallHookContinue pour exécuter l'outil avec d'autres effective_arguments, ou agents.skip ou hook.PreToolCallHookSkip pour ignorer l'appel : le modèle reçoit alors la raison à la place du résultat. L'entrée de l'appel d'outil dans l'historique affiche les arguments définis par le hook ; un appel ignoré conserve ceux du modèle.

ParamètreTypeValeur par défautDescription
ctxHookCallbackContextobligatoireSession dans laquelle le hook s'exécute et sa sandbox.
callhook.PreToolCallobligatoireAppel d'outil sur le point de s'exécuter.
Hook.post_tool_call

Hook.post_tool_call

async def post_tool_call(
    ctx: HookCallbackContext,
    result: hook.PostToolCall,
) -> hook.PostToolCallHookContinue | None

S'exécute après chaque appel d'outil, avec l'appel et son résultat, un agents.ToolResult, dans result.

Renvoyez hook.PostToolCallHookContinue avec un autre tool_result pour modifier ce que le modèle reçoit, comme agents.ToolResult(content=[agents.TextContentBlock(text="...")]).

ParamètreTypeValeur par défautDescription
ctxHookCallbackContextobligatoireSession dans laquelle le hook s'exécute et sa sandbox.
resulthook.PostToolCallobligatoireAppel d'outil exécuté, avec son résultat.
HookDecision

HookDecision

class HookDecision

Décision d'un hook, convertie en résultat du point d'exécution qui la renvoie.

Créez-la avec agents.skip, agents.retry ou agents.reject.

AttributTypeDescription
kindLiteral['skip', 'retry', 'reject']"skip", "retry" ou "reject" : la fonction qui l'a créée.
messagestrRaison ou indications de correction reçues par la fonction.
agents.skip

agents.skip

def agents.skip(reason: str) -> HookDecision

Arrêter le tour, l'appel au modèle ou l'appel d'outil.

Depuis pre_tool_call, reason est ce que le modèle reçoit à la place du résultat de l'outil. Depuis pre_agent_turn ou pre_llm_call, le tour se termine avec stop_reason="skipped" et reason comme texte.

ParamètreTypeValeur par défautDescription
reasonstrobligatoireCe que le modèle reçoit à la place du résultat de l'outil, ou le texte du tour terminé.
agents.retry

agents.retry

def agents.retry(feedback: str) -> HookDecision

Ignorer la réponse du modèle et appeler à nouveau le modèle avec feedback.

ParamètreTypeValeur par défautDescription
feedbackstrobligatoireCe que le modèle lit avant de répondre à nouveau.
agents.reject

agents.reject

def agents.reject(reason: str) -> HookDecision

Rejeter la réponse du modèle et terminer le tour avec reason.

ParamètreTypeValeur par défautDescription
reasonstrobligatoireTexte avec lequel le tour se termine.
agents.hook

agents.hook

Ce qu'un hook reçoit et renvoie à chaque point d'exécution : poursuivre ou remplacer l'entrée ou la sortie.

Un hook qui poursuit l'exécution sans modification renvoie None ; un hook qui l'arrête renvoie agents.skip, agents.retry ou agents.reject.

Ses classes sont présentées dans Classes de agents.hook.

State

State

class State(*, type: str, state: dict[str, JsonValue])

Forme sauvegardée d'un hook ou d'une sandbox : son type et les données JSON conservées d'un tour à l'autre.

ParamètreTypeValeur par défautDescription
typestrobligatoireLe type qui reconstruit la valeur, sous la forme module:QualifiedName.
statedict[str, JsonValue]obligatoireLes données enregistrées de la valeur : les champs d'un hook, ou ce que renvoie SandboxHook.to_unified_state() pour un hook de sandbox.
Classes de agents.hook

Classes de agents.hook

hook.PreAgentTurn

hook.PreAgentTurn

class PreAgentTurn(*, turn_id: str, user_content: list[ContentBlock])

Le tour que reçoit un hook pre_agent_turn.

ParamètreTypeValeur par défautDescription
turn_idstrobligatoireL'identifiant du tour.
user_contentlist[ContentBlock]obligatoireLe contenu de l'utilisateur pour ce tour. Les blocs renvoyés sans modification sont transmis au modèle tels quels.
hook.PreLlmCall

hook.PreLlmCall

class PreLlmCall(*, turn_id: str)

L'appel au modèle que reçoit un hook pre_llm_call.

ParamètreTypeValeur par défautDescription
turn_idstrobligatoireL'identifiant du tour.
hook.PostLlmCall

hook.PostLlmCall

class PostLlmCall(
    *,
    turn_id: str,
    content: list[ContentBlock],
    text: str,
    tool_calls: tuple[ToolCall, ...],
    reasoning: str,
    finish_reason: Literal['stop', 'tool_call', 'length', 'content_filter', 'other'],
    usage: TokenUsage | None,
)

La réponse du modèle que reçoit un hook post_llm_call.

ParamètreTypeValeur par défautDescription
turn_idstrobligatoireL'identifiant du tour.
contentlist[ContentBlock]obligatoireLes blocs de contenu de la réponse, dans l'ordre, sans le raisonnement ni les appels d'outils.
textstrobligatoireLes blocs de texte de la réponse concaténés, ou "" si elle n'en contient aucun.
tool_callstuple[ToolCall, ...]obligatoireLes appels d'outils effectués par la réponse. name est le nom appelé par le modèle, par exemple get_weather.
reasoningstrobligatoireLes textes de raisonnement de la réponse concaténés, ou "" si elle n'en contient aucun.
finish_reasonLiteral['stop', 'tool_call', 'length', 'content_filter', 'other']obligatoireLa raison pour laquelle le modèle s'est arrêté.
usageTokenUsage | NoneobligatoireLes tokens utilisés par l'appel au modèle, lorsque le fournisseur les indique.
hook.PostAgentTurn

hook.PostAgentTurn

class PostAgentTurn(
    *,
    turn_id: str,
    content: list[ContentBlock],
    text: str,
    tool_calls: tuple[ToolCall, ...],
    reasoning: str,
    finish_reason: Literal['stop', 'tool_call', 'length', 'content_filter', 'other'],
    usage: TokenUsage | None,
)

La réponse finale du tour que reçoit un hook post_agent_turn.

ParamètreTypeValeur par défautDescription
turn_idstrobligatoireL'identifiant du tour.
contentlist[ContentBlock]obligatoireLes blocs de contenu de la réponse, dans l'ordre, sans le raisonnement ni les appels d'outils.
textstrobligatoireLes blocs de texte de la réponse concaténés, ou "" si elle n'en contient aucun.
tool_callstuple[ToolCall, ...]obligatoireLes appels d'outils effectués par la réponse. name est le nom appelé par le modèle, par exemple get_weather.
reasoningstrobligatoireLes textes de raisonnement de la réponse concaténés, ou "" si elle n'en contient aucun.
finish_reasonLiteral['stop', 'tool_call', 'length', 'content_filter', 'other']obligatoireLa raison pour laquelle le modèle s'est arrêté.
usageTokenUsage | NoneobligatoireLes tokens utilisés par l'appel au modèle, lorsque le fournisseur les indique.
hook.PreToolCall

hook.PreToolCall

class PreToolCall(
    *,
    turn_id: str,
    tool_name: str,
    tool_id: str,
    tool_call_id: str,
    arguments: dict[str, JsonValue],
)

L'appel d'outil que reçoit un hook pre_tool_call.

ParamètreTypeValeur par défautDescription
turn_idstrobligatoireL'identifiant du tour.
tool_namestrobligatoireLe nom de l'outil personnalisé ou de l'outil intégré, par exemple file_system.bash.
tool_idstrobligatoireL'identifiant de l'outil : <namespace>.<name>, par exemple billing.charge, ou le nom de l'outil intégré.
tool_call_idstrobligatoireL'identifiant de l'appel, tel que fourni par ToolCallEntry.tool_call_id et ToolCallbackContext.tool_call_id.
argumentsdict[str, JsonValue]obligatoireLes arguments produits par le modèle.
hook.PostToolCall

hook.PostToolCall

class PostToolCall(
    *,
    turn_id: str,
    tool_name: str,
    tool_id: str,
    tool_call_id: str,
    arguments: dict[str, JsonValue],
    tool_result: ToolResult,
)

L'appel d'outil et son résultat que reçoit un hook post_tool_call.

Hérite de turn_id, tool_name, tool_id et tool_call_id de hook.PreToolCall.

ParamètreTypeValeur par défautDescription
argumentsdict[str, JsonValue]obligatoireLes arguments avec lesquels l'outil s'est exécuté, après toute modification par un hook pre_tool_call.
tool_resultToolResultobligatoireLe résultat de l'appel. Renvoyez-le, ou une copie, dans hook.PostToolCallHookContinue : les blocs renvoyés sans modification sont transmis au modèle tels quels, et un appel échoué dont is_error=True est conservé garde son erreur.
hook.PreAgentTurnHookContinue

hook.PreAgentTurnHookContinue

class PreAgentTurnHookContinue(*, user_content: Sequence[ContentBlock])

Ce que renvoie pre_agent_turn pour démarrer le tour avec un autre contenu utilisateur.

ParamètreTypeValeur par défautDescription
user_contentSequence[ContentBlock]obligatoireLe contenu que reçoit le modèle à la place du message de l'utilisateur.
hook.PreAgentTurnHookSkip

hook.PreAgentTurnHookSkip

class PreAgentTurnHookSkip(*, reason: Sequence[ContentBlock] = [])

Ce que renvoie pre_agent_turn pour terminer le tour avant l'exécution du modèle, comme le fait agents.skip.

ParamètreTypeValeur par défautDescription
reasonSequence[ContentBlock][]Le texte qui conclut le tour.
hook.PreLlmCallHookContinue

hook.PreLlmCallHookContinue

class PreLlmCallHookContinue()

Ce que renvoie pre_llm_call pour autoriser l'exécution de l'appel au modèle, comme le fait None.

hook.PreLlmCallHookSkip

hook.PreLlmCallHookSkip

class PreLlmCallHookSkip(*, reason: Sequence[ContentBlock] = [])

Ce que renvoie pre_llm_call pour terminer le tour au lieu d'appeler le modèle, comme le fait agents.skip.

ParamètreTypeValeur par défautDescription
reasonSequence[ContentBlock][]Le texte qui conclut le tour.
hook.PostLlmCallHookAccept

hook.PostLlmCallHookAccept

class PostLlmCallHookAccept(*, acceptance: ReplaceAssistantContent = ...)

Ce que renvoie post_llm_call pour conserver la réponse du modèle ou remplacer son contenu.

ParamètreTypeValeur par défautDescription
acceptanceReplaceAssistantContent...La valeur par défaut conserve la réponse telle que le modèle l'a fournie. hook.ReplaceAssistantContent(content=[...]) remplace son contenu.
hook.PostLlmCallHookRetry

hook.PostLlmCallHookRetry

class PostLlmCallHookRetry(*, feedback: Sequence[ContentBlock])

Ce que renvoie post_llm_call pour supprimer la réponse et appeler à nouveau le modèle, comme le fait agents.retry.

ParamètreTypeValeur par défautDescription
feedbackSequence[ContentBlock]obligatoireCe que lit le modèle avant de répondre à nouveau.
hook.PostLlmCallHookReject

hook.PostLlmCallHookReject

class PostLlmCallHookReject(*, reason: Sequence[ContentBlock])

Ce que renvoie post_llm_call pour rejeter la réponse et terminer le tour, comme le fait agents.reject.

ParamètreTypeValeur par défautDescription
reasonSequence[ContentBlock]obligatoireLe texte qui conclut le tour.
hook.PreToolCallHookContinue

hook.PreToolCallHookContinue

class PreToolCallHookContinue(*, effective_arguments: dict[str, JsonValue] = {})

Ce que renvoie pre_tool_call pour exécuter l'outil avec d'autres arguments. Passez effective_arguments= ; sans arguments fournis, l'outil s'exécute sans arguments.

ParamètreTypeValeur par défautDescription
effective_argumentsdict[str, JsonValue]{}Les arguments avec lesquels l'outil s'exécute, à la place de ceux du modèle. La valeur par défaut, {}, l'exécute sans arguments.
hook.PreToolCallHookSkip

hook.PreToolCallHookSkip

class PreToolCallHookSkip(*, reason: Sequence[ContentBlock] = [])

Ce que renvoie pre_tool_call pour ignorer l'appel, comme le fait agents.skip.

ParamètreTypeValeur par défautDescription
reasonSequence[ContentBlock][]Ce que reçoit le modèle à la place du résultat de l'outil.
hook.PostToolCallHookContinue

hook.PostToolCallHookContinue

class PostToolCallHookContinue(*, tool_result: ToolResult)

Ce que renvoie post_tool_call pour fournir au modèle un autre résultat d'outil.

ParamètreTypeValeur par défautDescription
tool_resultToolResultobligatoireLe résultat que reçoit le modèle pour cet appel.
hook.PostAgentTurnHookAccept

hook.PostAgentTurnHookAccept

class PostAgentTurnHookAccept(*, acceptance: ReplaceAssistantContent = ...)

Ce que renvoie post_agent_turn pour conserver la réponse finale ou remplacer son contenu.

ParamètreTypeValeur par défautDescription
acceptanceReplaceAssistantContent...La valeur par défaut conserve la réponse telle que le modèle l'a fournie. hook.ReplaceAssistantContent(content=[...]) remplace son contenu.
hook.ReplaceAssistantContent

hook.ReplaceAssistantContent

class ReplaceAssistantContent(*, content: Sequence[ContentBlock])

Remplacez la réponse du modèle par content, depuis post_llm_call ou post_agent_turn.

ParamètreTypeValeur par défautDescription
contentSequence[ContentBlock]obligatoireLe contenu qui remplace la réponse du modèle, par exemple [agents.TextContentBlock(text="...")] ; au moins un bloc.
Hooks prêts à l'emploi

Hooks prêts à l'emploi

pattern.hook.StructuredOutputHook

pattern.hook.StructuredOutputHook

class StructuredOutputHook[T](
    *,
    tools: Sequence[PythonTool[..., Any] | ClientTool[..., Any]] = (),
    **data: Any,
)

Validez la réponse finale de chaque tour avec un modèle Pydantic, et demandez au modèle de la corriger.

Indiquez le modèle Pydantic entre crochets, comme dans StructuredOutputHook[City](max_retries=2), ou créez une sous-classe de StructuredOutputHook[City] et définissez de nouvelles valeurs par défaut pour ses champs.

Le hook ne demande une correction que si max_retries le permet et s'il reste au tour une itération dans la limite max_iterations de l'agent. Une fois cette limite atteinte, il accepte la dernière réponse ou, si on_limit vaut "reject", lève ValueError, ce qui fait échouer le tour. Définissez schema_in_prompt sur False pour exclure le schéma JSON du message utilisateur, par exemple si output_type le fournit déjà au modèle ; les corrections l'incluent toujours. Définissez enabled sur False pour accepter les réponses sans vérification.

Le hook compte chaque appel au modèle avant son exécution. Un appel relancé par un mécanisme de contrôle ou un hook précédent compte donc aussi dans la limite max_iterations.

Basé sur Hook.

ParamètreTypeValeur par défautDescription
toolsSequence[PythonTool[..., Any] | ClientTool[..., Any]]()Les outils que le hook ajoute aux outils de l'agent.
**dataAny{}Les valeurs des champs du hook.
AttributTypeDescription
max_retriesintLe nombre de corrections que le hook demande au cours d'un tour. Valeur par défaut : 2.
on_limitLiteral['accept', 'reject']Le comportement du hook à la limite : "accept", la valeur par défaut, conserve la dernière réponse ; "reject" lève ValueError, ce qui fait échouer le tour.
schema_in_promptboolIndique si le message utilisateur inclut le schéma JSON. Valeur par défaut : True. Les corrections l'incluent toujours.
enabledboolIndique si le hook vérifie les réponses. Valeur par défaut : True. False les accepte sans vérification.
Contextes

Contextes

CallbackContext

CallbackContext

class CallbackContext

Ce qu'un callback reçoit dans ctx : la session dans laquelle il s'exécute et la sandbox de cette session.

La base commune : une méthode de hook reçoit un HookCallbackContext, et un outil un ToolCallbackContext.

AttributTypeDescription
sessionCallbackSessionLa session dans laquelle le callback s'exécute.
sandboxHookSandboxLa sandbox de la session, pour exécuter des commandes et lire et écrire des fichiers. await ctx.sandbox.execute(command, cwd=None, timeout_seconds=None, env=None) exécute une commande une fois et renvoie un SandboxExecutionResult. await ctx.sandbox.read_file(path, max_bytes=1048576) renvoie les octets d'un fichier. Un path relatif se situe dans l'espace de travail. Un fichier dont la taille dépasse max_bytes provoque une erreur, et un fichier absent lève FileNotFoundError. await ctx.sandbox.write_file(name, content) écrit des octets dans un fichier, dans un dossier que la sandbox réserve aux fichiers des hooks, en dehors de l'espace de travail, et renvoie son chemin. Un name absolu, ou qui sort de ce dossier, lève ValueError. Dans un hook de sandbox d'un agent exécuté par agents serve ou agents deploy, content doit être du texte UTF-8 et la requête, chemin inclus, ne doit pas dépasser 1 Mio de JSON. Chaque méthode lève RuntimeError lorsque la session ne dispose pas d'une sandbox capable d'exécuter des commandes.
CallbackSession

CallbackSession

class CallbackSession

La session dans laquelle un callback s'exécute : son identifiant et celui du tour.

AttributTypeDescription
idstrL'identifiant de la session.
turn_idstrL'identifiant du tour dans lequel le callback s'exécute.
HookCallbackContext

HookCallbackContext

class HookCallbackContext(CallbackContext)

Ce qu'une méthode de hook reçoit dans ctx : la session dans laquelle elle s'exécute et la sandbox de cette session.

ToolCallbackContext

ToolCallbackContext

class ToolCallbackContext(CallbackContext)

Ce qu'un outil reçoit comme premier paramètre, exclusivement positionnel : la session, sa sandbox et l'appel.

Un outil le reçoit selon son type, quel que soit son nom : def search(ctx: agents.ToolCallbackContext, /, query: str). Le modèle ne le voit jamais. Un appel direct peut passer ToolCallbackContext.local(), ou l'omettre pour obtenir ce contexte local. La réponse d'un outil client le reçoit aussi, sans sandbox ; les méthodes de ctx.sandbox lèvent donc RuntimeError.

AttributTypeDescription
tool_call_idstrL'identifiant de l'appel du modèle à l'outil, tel qu'il figure dans l'entrée d'appel d'outil de la session.
ToolCallbackContext.local

ToolCallbackContext.local

@classmethod
def local() -> ToolCallbackContext

Un contexte pour un appel en dehors de toute session : chaque identifiant vaut "local" et la sandbox n'est pas liée.

ApprovalCallbackContext

ApprovalCallbackContext

class ApprovalCallbackContext(CallbackContext)

Ce qu'un gestionnaire d'approbation reçoit dans ctx : la session à l'origine de la demande et l'identifiant de l'approbation.

ctx.session.id et ctx.session.turn_id identifient la session et le tour à l'origine de la demande : une approbation de sous-agent contient la session du sous-agent et son propre tour. ctx.callback_id est l'identifiant de l'approbation, celui qu'accepte turn.answer. Le gestionnaire s'exécute dans votre programme ; les méthodes de ctx.sandbox lèvent donc RuntimeError.

AttributTypeDescription
callback_idstrL'identifiant de l'approbation, celui qu'accepte turn.answer.
SandboxCallbackContext

SandboxCallbackContext

class SandboxCallbackContext

Le contexte qu'un hook de sandbox reçoit dans on_create et on_destroy.

AttributTypeDescription
sandboxHookSandboxLa sandbox, pour y exécuter des commandes et y lire et écrire des fichiers.
Valeurs identiques lors de la réexécution de la boucle

Valeurs identiques lors de la réexécution de la boucle

agents.now

agents.now

def agents.now() -> datetime

L'heure actuelle en UTC, sous forme de datetime avec fuseau horaire.

Utilisez cette fonction à la place de datetime.now(). Dans la boucle d'un agent déployé, par exemple dans les méthodes d'une sandbox personnalisée ou dans un SandboxHook, elle renvoie la même heure lorsque l'agent réexécute la boucle pour reprendre une session, ce qui préserve l'échéance. Dans un outil, un Hook ou une exécution locale, elle renvoie l'heure de l'horloge : les outils et les méthodes de Hook s'exécutent sous forme d'étapes enregistrées, en dehors de la partie de la boucle qu'un agent déployé rejoue.

agents.sleep

agents.sleep

async def agents.sleep(duration: timedelta | float, *, summary: str | None = None) -> None

Attendez pendant duration, dans la boucle de l'agent, un outil, un Hook ou une exécution locale.

Utilisez cette fonction à la place de asyncio.sleep(). Dans la boucle d'un agent déployé, par exemple dans les méthodes d'une sandbox personnalisée ou dans un SandboxHook, l'attente repose sur un minuteur côté serveur : elle persiste après un redémarrage de l'agent, et aucune partie de l'agent ne s'exécute pendant l'attente. Les outils et les méthodes de Hook s'exécutent sous forme d'étapes enregistrées, en dehors de la partie de la boucle qu'un agent déployé rejoue : dans ce cas, l'attente doit se terminer avant la limite de temps de l'étape. Dans une exécution locale, il s'agit de asyncio.sleep().

ParamètreTypeValeur par défautDescription
durationtimedelta | floatobligatoireLa durée d'attente, sous forme de timedelta ou en secondes.
summarystr | NoneNoneUn libellé pour l'attente dans la boucle d'un agent déployé. Ignoré ailleurs.
Exceptions levées
SdkErrorLorsque l'attente d'un outil ou d'un Hook dépasserait la limite de temps de l'étape.
agents.uuid4

agents.uuid4

def agents.uuid4() -> UUID

Un UUID aléatoire qui reste identique lorsqu'un agent déployé réexécute la boucle de l'agent.

Utilisez cette fonction à la place de uuid.uuid4(). Dans un outil, un Hook ou une exécution locale, il s'agit de uuid.uuid4().

agents.random

agents.random

def agents.random() -> Random

Un générateur de nombres aléatoires qui produit les mêmes nombres lorsqu'un agent déployé réexécute la boucle.

Utilisez-le à la place du module random. Il propose des méthodes comme random, uniform, choice et shuffle. Dans un outil, un Hook ou une exécution locale, il s'agit d'une nouvelle instance de random.Random.