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.
| Nom | Rôle |
|---|---|
ApprovalHandler | Une fonction synchrone ou asynchrone de signature (ctx, request) qui répond à une demande d'approbation : AllowApproval, DenyApproval ou KeepCallbackOpen() pour la laisser ouverte. |
ApprovalRequest | Un appel d'outil en attente d'approbation. |
ApprovalTool | L'outil concerné par une demande d'approbation. |
AllowApproval | Autoriser cet appel une seule fois, ou les appels correspondants pour le reste de la session. |
DenyApproval | Refuser cet appel. |
KeepCallbackOpen | La valeur que renvoie un gestionnaire de callback pour laisser le callback ouvert et permettre à quelqu'un d'y répondre plus tard. |
SignInRequest | Une source que la demande de connexion invite l'utilisateur à connecter. |
SignInAnswer | La réponse à un OpenSignIn : les identifiants des sources que l'utilisateur a connectées et de celles qu'il a refusé de connecter. |
Answered | Le callback était ouvert lors de sa lecture et a reçu une réponse. |
AlreadySettled | Une réponse désignait un callback qui n'est plus ouvert : il a reçu une réponse ou a été fermé. |
NotFound | 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. |
ApprovalHandlerApprovalHandler
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()outurn.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 defpeut utiliserawait. - 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.sessiondé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.
ApprovalRequestApprovalRequest
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.
ApprovalToolApprovalTool
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ètre | Type | Valeur par défaut | Description |
|---|---|---|---|
id | str | obligatoire | L'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". |
name | str | obligatoire | Le 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. |
kind | Literal['builtin', 'client', 'mcp', 'connector', 'plugin'] | UnknownValue | obligatoire | L'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. |
description | str | None | None | La description de l'outil, telle que le modèle la lit ; None pour les outils intégrés. |
input_schema | dict[str, JsonValue] | None | None | Le 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_schema | dict[str, JsonValue] | None | None | Le 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. |
definition | PythonTool[..., Any] | ClientTool[..., Any] | ToolDefinition | None | None | La 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. |
annotations | ToolAnnotations | ToolAnnotations() | 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. |
AllowApprovalAllowApproval
class AllowApproval(*, scope: Literal['once', 'session'] = 'once')Autoriser cet appel une seule fois, ou les appels correspondants pour le reste de la session.
| Attribut | Type | Description |
|---|---|---|
decision | Literal['allow'] | Toujours "allow". |
DenyApprovalDenyApproval
class DenyApproval()Refuser cet appel.
| Attribut | Type | Description |
|---|---|---|
decision | Literal['deny'] | Toujours "deny". |
KeepCallbackOpenKeepCallbackOpen
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
SignInRequestSignInRequest
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ètre | Type | Valeur par défaut | Description |
|---|---|---|---|
source | Literal['connector', 'mcp'] | UnknownValue | obligatoire | "connector" pour un connecteur Mistral, "mcp" pour un serveur MCP, ou un UnknownValue pour une source ajoutée après votre version du SDK. |
id | str | obligatoire | L'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"). |
name | str | obligatoire | Le nom à afficher à l'utilisateur : son nom d'affichage si Mistral en possède un, sinon son identifiant. |
mode | Literal['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. |
SignInAnswerSignInAnswer
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.
Résultats des réponses
AnsweredAnswered
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.
AlreadySettledAlreadySettled
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.
NotFoundNotFound
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.