Approbations et connexions

Comment un programme répond aux demandes d'approbation et de connexion aux connecteurs lors d'un tour : le gestionnaire, la demande qu'il reçoit, les réponses et ce que renvoie turn.answer.

Guide : Approbations.

NomRôle
ApprovalHandlerUne fonction synchrone ou asynchrone de signature (ctx, request) qui répond à une demande d'approbation : AllowApproval, DenyApproval ou KeepCallbackOpen() pour la laisser ouverte.
ApprovalRequestUn appel d'outil en attente d'approbation.
ApprovalToolL'outil concerné par une demande d'approbation.
AllowApprovalAutoriser cet appel une seule fois, ou les appels correspondants pour le reste de la session.
DenyApprovalRefuser cet appel.
KeepCallbackOpenLa valeur que renvoie un gestionnaire de callback pour laisser le callback ouvert et permettre à quelqu'un d'y répondre plus tard.
SignInRequestUne source que la demande de connexion invite l'utilisateur à connecter.
SignInAnswerLa réponse à un OpenSignIn : les identifiants des sources que l'utilisateur a connectées et de celles qu'il a refusé de connecter.
AnsweredLe callback était ouvert lors de sa lecture et a reçu une réponse.
AlreadySettledUne réponse désignait un callback qui n'est plus ouvert : il a reçu une réponse ou a été fermé.
NotFoundUne réponse désignait un callback que la session n'a jamais ouvert et qui n'est ouvert chez aucun de ses sous-agents.
ApprovalHandler

ApprovalHandler

class ApprovalHandler(Protocol):
    def __call__(
        ctx: ApprovalCallbackContext,
        request: ApprovalRequest,
        /,
    ) -> AllowApproval | DenyApproval | KeepCallbackOpen | Awaitable[AllowApproval | DenyApproval | KeepCallbackOpen]

Une fonction synchrone ou asynchrone de signature (ctx, request) qui répond à une demande d'approbation : AllowApproval, DenyApproval ou KeepCallbackOpen() pour la laisser ouverte. Toute autre valeur de retour, y compris None, lève SdkError. Ses paramètres peuvent porter n'importe quel nom.

  • Elle s'exécute dans votre programme et uniquement pendant que agent.run(), session.run() ou turn.result() attend. Entre ces appels, la demande d'approbation reste ouverte. iter_events() ne l'exécute jamais.
  • Une fonction synchrone s'exécute sur la boucle d'événements : n'y effectuez aucune opération bloquante. Une fonction async def peut utiliser await.
  • Si elle lève une exception ou renvoie une autre valeur, l'appel en attente lève cette erreur et la demande d'approbation reste ouverte. Le tour continue de s'exécuter.
  • Elle répond aussi aux demandes d'approbation des sous-agents de la session, avec ctx.session défini sur la session du sous-agent.
  • Fondez votre décision sur request.tool.id, l'identifiant stable de l'outil, jamais sur le nom utilisé par le modèle pour l'appeler.
  • AllowApproval(scope="session") autorise aussi le même appel avec les mêmes données d'entrée pour le reste de la session.
ApprovalRequest

ApprovalRequest

class ApprovalRequest(
    *,
    tool: ApprovalTool,
    hook: str | None = None,
    title: str,
    input: JsonValue = None,
)

Un appel d'outil en attente d'approbation. Les identifiants se trouvent dans le ctx du gestionnaire.

Une demande d'approbation émise par un hook ne peut pas être autorisée pour toute la session. Répondez-y avec AllowApproval(), pour une seule fois.

ParamètreTypeValeur par défautDescription
toolApprovalToolobligatoireL'outil concerné par l'appel.
hookstr | NoneNoneLe nom du hook pre_tool_call qui a demandé l'approbation, ou None si la demande vient de la politique d'autorisation de l'agent.
titlestrobligatoireLa question à afficher à une personne, par exemple "Allow bash?".
inputJsonValueNoneLes arguments de l'appel : ceux du modèle ou ceux définis par un hook pre_tool_call.
ApprovalTool

ApprovalTool

class ApprovalTool(
    *,
    id: str,
    name: str,
    kind: Literal['builtin', 'client', 'mcp', 'connector', 'plugin'] | UnknownValue,
    description: str | None = None,
    input_schema: dict[str, JsonValue] | None = None,
    output_schema: dict[str, JsonValue] | None = None,
    definition: PythonTool[..., Any] | ClientTool[..., Any] | ToolDefinition | None = None,
    annotations: ToolAnnotations = ToolAnnotations(),
)

L'outil concerné par une demande d'approbation.

Fondez votre décision sur id, jamais sur name : name varie selon la façon dont le modèle a appelé l'outil. Une indication que l'outil ne déclare pas dans annotations prend la valeur par défaut de MCP, qui retient l'hypothèse la plus défavorable.

ParamètreTypeValeur par défautDescription
idstrobligatoireL'identifiant stable de l'outil, utilisé par les règles d'autorisation, par exemple "file_system.bash", "client.open_case", "billing.charge" ou "github.create_issue".
namestrobligatoireLe nom utilisé par le modèle, qui varie selon la façon dont il a appelé l'outil : deploy_service directement, tools.client.deploy_service depuis run_typescript.
kindLiteral['builtin', 'client', 'mcp', 'connector', 'plugin'] | UnknownValueobligatoireL'origine de l'outil : "builtin" pour les outils intégrés de l'agent, "client" pour les outils @agents.tool et les outils client de l'agent, "mcp" pour ceux d'un serveur MCP, "connector" pour ceux d'un connecteur Mistral, "plugin" pour tous les autres, ou un UnknownValue pour un type ajouté après votre version du SDK.
descriptionstr | NoneNoneLa description de l'outil, telle que le modèle la lit ; None pour les outils intégrés.
input_schemadict[str, JsonValue] | NoneNoneLe schéma JSON des données d'entrée de l'outil, tel que le modèle le lit ; None pour les outils intégrés.
output_schemadict[str, JsonValue] | NoneNoneLe schéma JSON des données de sortie de l'outil ; None pour les outils intégrés et les outils qui n'en déclarent pas.
definitionPythonTool[..., Any] | ClientTool[..., Any] | ToolDefinition | NoneNoneLa définition de l'outil. Pour un outil de l'agent ou de l'un de ses sous-agents, il s'agit de l'objet outil fourni à l'agent, par exemple celui renvoyé par @agents.tool ; None sur un handle de session qui ne contient pas les outils de l'agent. Pour un outil d'un serveur MCP ou d'un connecteur, il s'agit d'un agents.ToolDefinition contenant la définition complète de l'outil telle que le serveur l'a listée, notamment ses champs title, annotations, output_schema et meta, avec le nom du serveur comme source, avec ou sans l'agent. None pour les autres outils. Chaque définition possède display_title, le nom de l'outil à afficher aux utilisateurs.
annotationsToolAnnotationsToolAnnotations()Les indications déclarées par l'outil, comme read_only_hint : celles définies par annotations= sur @agents.tool, agents.PythonTool et agents.client_tool, et celles qu'un serveur MCP ou un connecteur déclare pour son outil. La demande d'approbation les contient, pour que chaque personne ou programme chargé de l'approbation lise les mêmes indications, avec ou sans l'agent. Une indication non déclarée par l'outil prend la valeur par défaut de MCP, qui retient l'hypothèse la plus défavorable : une politique qui n'autorise que les outils en lecture seule n'autorise un outil que s'il déclare read_only_hint=True.
AllowApproval

AllowApproval

class AllowApproval(*, scope: Literal['once', 'session'] = 'once')

Autoriser cet appel une seule fois, ou les appels correspondants pour le reste de la session.

ParamètreTypeValeur par défautDescription
scopeLiteral['once', 'session']'once'"once" pour cet appel. "session" autorise aussi le même appel avec les mêmes données d'entrée pour le reste de la session.
AttributTypeDescription
decisionLiteral['allow']Toujours "allow".
DenyApproval

DenyApproval

class DenyApproval()

Refuser cet appel.

AttributTypeDescription
decisionLiteral['deny']Toujours "deny".
KeepCallbackOpen

KeepCallbackOpen

class KeepCallbackOpen()

La valeur que renvoie un gestionnaire de callback pour laisser le callback ouvert et permettre à quelqu'un d'y répondre plus tard.

Renvoyez agents.KeepCallbackOpen() depuis on_approval, on_client_tool ou la réponse d'un outil client : rien n'est envoyé, le callback reste ouvert et l'appel en attente renvoie Blocked pour ce callback, sauf si une valeur Blocked qui le liste déjà a été fournie via after= : dans ce cas, l'attente ne se termine qu'à un changement ultérieur. Répondez-y plus tard avec turn.answer, en utilisant AllowApproval ou DenyApproval pour une demande d'approbation et le résultat de l'outil pour un appel d'outil client, ou répondez depuis un autre client.

Cette valeur sert uniquement de retour d'un gestionnaire, jamais de réponse : turn.answer la refuse. None n'a pas non plus cet effet : un gestionnaire d'approbation qui renvoie None lève agents.SdkError, tandis qu'un outil client qui renvoie None envoie le résultat null.

Connexions

Connexions

SignInRequest

SignInRequest

class SignInRequest(
    *,
    source: Literal['connector', 'mcp'] | UnknownValue,
    id: str,
    name: str,
    mode: Literal['connect', 'reconnect'] | UnknownValue = 'connect',
)

Une source que la demande de connexion invite l'utilisateur à connecter.

ParamètreTypeValeur par défautDescription
sourceLiteral['connector', 'mcp'] | UnknownValueobligatoire"connector" pour un connecteur Mistral, "mcp" pour un serveur MCP, ou un UnknownValue pour une source ajoutée après votre version du SDK.
idstrobligatoireL'identifiant de la source, celui qu'accepte SignInAnswer : pour un connecteur, il s'agit du nom que l'agent lui donne, comme dans agents.connector("linear").
namestrobligatoireLe nom à afficher à l'utilisateur : son nom d'affichage si Mistral en possède un, sinon son identifiant.
modeLiteral['connect', 'reconnect'] | UnknownValue'connect'"connect" pour une première connexion, "reconnect" si la source était connectée et que son accès doit être renouvelé, ou un UnknownValue pour un mode ajouté après votre version du SDK.
SignInAnswer

SignInAnswer

class SignInAnswer(*, connected: Iterable[str] = (), denied: Iterable[str] = ())

La réponse à un OpenSignIn : les identifiants des sources que l'utilisateur a connectées et de celles qu'il a refusé de connecter.

Indiquez chaque source demandée dans l'une des listes : une réponse qui en omet une lève SdkError et n'envoie rien, et la demande de connexion reste ouverte. L'agent vérifie chaque source déclarée connectée et reçoit une notification si l'une d'elles ne l'est toujours pas.

ParamètreTypeValeur par défautDescription
connectedIterable[str]()Les identifiants des sources que l'utilisateur a connectées.
deniedIterable[str]()Les identifiants des sources que l'utilisateur a refusé de connecter.
Résultats des réponses

Résultats des réponses

Answered

Answered

class Answered(
    *,
    session_id: str,
    callback_id: str,
    answer: AllowApproval | DenyApproval | None = None,
)

Le callback était ouvert lors de sa lecture et a reçu une réponse.

ParamètreTypeValeur par défautDescription
session_idstrobligatoireL'identifiant de la session.
callback_idstrobligatoireL'identifiant du callback.
answerAllowApproval | DenyApproval | NoneNoneLa réponse à la demande d'approbation qui a été prise en compte. Il s'agit de celle d'un autre client si ce client a répondu en premier ; comparez-la donc avec la vôtre pour le déterminer. La valeur est None pour un appel d'outil client ou une demande de connexion, ou si la réponse prise en compte n'a pas pu être lue à temps ou est d'un type ajouté après votre version du SDK ; lisez le tour pour connaître le résultat.
AlreadySettled

AlreadySettled

class AlreadySettled(*, session_id: str, callback_id: str)

Une réponse désignait un callback qui n'est plus ouvert : il a reçu une réponse ou a été fermé. Rien n'a changé.

Un autre client peut avoir répondu en premier, le tour du callback peut être terminé, ou la session peut être terminée.

ParamètreTypeValeur par défautDescription
session_idstrobligatoireL'identifiant de la session.
callback_idstrobligatoireL'identifiant du callback.
NotFound

NotFound

class NotFound(*, session_id: str, callback_id: str)

Une réponse désignait un callback que la session n'a jamais ouvert et qui n'est ouvert chez aucun de ses sous-agents. Rien n'a changé.

Dès qu'un callback d'un sous-agent n'est plus ouvert, sa session racine renvoie NotFound. La session propre au sous-agent renvoie AlreadySettled.

ParamètreTypeValeur par défautDescription
session_idstrobligatoireL'identifiant de la session.
callback_idstrobligatoireL'identifiant du callback.