A2A Protocol Specification (Python)

Aperçu
Le protocole A2A (Agent2Agent) est un protocole de communication basé sur JSON-RPC 2.0 conçu pour l'interaction entre agents intelligents. Ce protocole définit les fonctionnalités principales incluant la déclaration de capacités d'agent, le passage de messages, la gestion des tâches, l'authentification de sécurité.
Ce document est basé sur le fichier a2a-python/src/a2a/types.py
et fournit une introduction détaillée à toutes les structures de données et relations d'objets du protocole A2A.
Version du Protocole
Version actuelle du protocole : 0.2.5
Concepts Principaux
1. Agent
L'agent est l'entité principale du protocole A2A, possédant des compétences et capacités spécifiques pour traiter les demandes des utilisateurs et exécuter des tâches.
2. Tâche
La tâche est l'unité de travail exécutée par l'agent, caractérisée par la gestion du statut du cycle de vie et l'enregistrement de l'historique.
3. Message
Le message est l'unité de base pour l'échange d'informations entre l'utilisateur et l'agent, supportant plusieurs types de contenu.
4. JSON-RPC 2.0
Le protocole A2A est basé sur la norme JSON-RPC 2.0, fournissant un modèle de communication standardisé demande-réponse.
Détails des Structures de Données
Types de Base
A2A
class A2A(RootModel[Any]):
root: Any
Type racine du protocole, peut contenir toute donnée.
Role (énumération)
class Role(str, Enum):
"""Rôle de l'expéditeur du message"""
agent = 'agent' # Agent
user = 'user' # Utilisateur
TaskState (énumération)
class TaskState(str, Enum):
"""États possibles de la tâche"""
submitted = 'submitted' # Soumise
working = 'working' # En cours
input_required = 'input-required' # Entrée requise
completed = 'completed' # Terminée
canceled = 'canceled' # Annulée
failed = 'failed' # Échouée
rejected = 'rejected' # Rejetée
auth_required = 'auth-required' # Authentification requise
unknown = 'unknown' # État inconnu
Types Liés aux Agents
AgentCard
class AgentCard(A2ABaseModel):
"""Carte d'agent - contient les informations importantes de l'agent"""
name: str # Nom de l'agent
description: str # Description de l'agent
version: str # Version de l'agent
url: str # URL de l'agent
protocolVersion: str | None = '0.2.5' # Version du protocole
skills: list[AgentSkill] # Liste des compétences
capabilities: AgentCapabilities # Déclaration des capacités
defaultInputModes: list[str] # Modes d'entrée par défaut
defaultOutputModes: list[str] # Modes de sortie par défaut
provider: AgentProvider | None = None # Fournisseur de service
security: list[dict[str, list[str]]] | None = None # Exigences de sécurité
securitySchemes: dict[str, SecurityScheme] | None = None # Schémas de sécurité
# ... autres champs
AgentSkill
class AgentSkill(A2ABaseModel):
"""Compétence d'agent - unité de capacité exécutable par l'agent"""
id: str # Identifiant unique de la compétence
name: str # Nom de la compétence
description: str # Description de la compétence
tags: list[str] # Tags de la compétence
examples: list[str] | None = None # Exemples d'utilisation
inputModes: list[str] | None = None # Modes d'entrée
outputModes: list[str] | None = None # Modes de sortie
AgentCapabilities
class AgentCapabilities(A2ABaseModel):
"""Définition des capacités de l'agent"""
extensions: list[AgentExtension] | None = None # Extensions supportées
pushNotifications: bool | None = None # Support des notifications push
stateTransitionHistory: bool | None = None # Historique des transitions d'état
streaming: bool | None = None # Support du streaming
AgentExtension
class AgentExtension(A2ABaseModel):
"""Déclaration d'extension d'agent"""
uri: str # URI de l'extension
description: str | None = None # Description de l'extension
params: dict[str, Any] | None = None # Paramètres de l'extension
required: bool | None = None # Requis ou non
AgentProvider
class AgentProvider(A2ABaseModel):
"""Fournisseur de service d'agent"""
organization: str # Nom de l'organisation
url: str # URL de l'organisation
AgentInterface
class AgentInterface(A2ABaseModel):
"""Déclaration d'interface d'agent"""
transport: str # Protocole de transport (JSONRPC, GRPC, HTTP+JSON)
url: str # URL de l'interface
Types Liés aux Messages
Message
class Message(A2ABaseModel):
"""Messages échangés entre l'utilisateur et l'agent"""
messageId: str # ID du message
role: Role # Rôle de l'expéditeur
parts: list[Part] # Parties du contenu du message
kind: Literal['message'] = 'message' # Type d'événement
taskId: str | None = None # ID de tâche associé
contextId: str | None = None # ID de contexte
referenceTaskIds: list[str] | None = None # Liste des ID de tâches référencées
extensions: list[str] | None = None # Liste des URI d'extension
metadata: dict[str, Any] | None = None # Métadonnées
Part (type union)
class Part(RootModel[TextPart | FilePart | DataPart]):
"""Partie de message - texte, fichier ou données structurées"""
root: TextPart | FilePart | DataPart
TextPart
class TextPart(A2ABaseModel):
"""Partie de message texte"""
kind: Literal['text'] = 'text' # Type de partie
text: str # Contenu texte
metadata: dict[str, Any] | None = None # Métadonnées
FilePart
class FilePart(A2ABaseModel):
"""Partie de message fichier"""
kind: Literal['file'] = 'file' # Type de partie
file: FileWithBytes | FileWithUri # Contenu du fichier
metadata: dict[str, Any] | None = None # Métadonnées
DataPart
class DataPart(A2ABaseModel):
"""Partie de message données structurées"""
kind: Literal['data'] = 'data' # Type de partie
data: dict[str, Any] # Données structurées
metadata: dict[str, Any] | None = None # Métadonnées
Types de Fichiers
FileWithBytes
class FileWithBytes(A2ABaseModel):
"""Fichier avec contenu en bytes"""
bytes: str # Contenu du fichier encodé en base64
name: str | None = None # Nom du fichier
mimeType: str | None = None # Type MIME
FileWithUri
class FileWithUri(A2ABaseModel):
"""Fichier avec URI"""
uri: str # URL du fichier
name: str | None = None # Nom du fichier
mimeType: str | None = None # Type MIME
Types Liés aux Tâches
Task
class Task(A2ABaseModel):
"""Entité de tâche"""
id: str # Identifiant unique de la tâche
contextId: str # ID de contexte
status: TaskStatus # Statut de la tâche
kind: Literal['task'] = 'task' # Type d'événement
history: list[Message] | None = None # Historique des messages
artifacts: list[Artifact] | None = None # Artefacts générés
metadata: dict[str, Any] | None = None # Métadonnées
TaskStatus
class TaskStatus(A2ABaseModel):
"""Statut de la tâche et message associé"""
state: TaskState # État de la tâche
message: Message | None = None # Message de mise à jour du statut
timestamp: str | None = None # Horodatage (ISO 8601)
Artifact
class Artifact(A2ABaseModel):
"""Artefact généré par la tâche"""
artifactId: str # ID de l'artefact
parts: list[Part] # Parties du contenu de l'artefact
name: str | None = None # Nom de l'artefact
description: str | None = None # Description de l'artefact
extensions: list[str] | None = None # Liste des URI d'extension
metadata: dict[str, Any] | None = None # Métadonnées
Types Liés à JSON-RPC
JSONRPCMessage (classe de base)
class JSONRPCMessage(A2ABaseModel):
"""Classe de base des messages JSON-RPC 2.0"""
jsonrpc: Literal['2.0'] = '2.0' # Version du protocole
id: str | int | None = None # ID de demande/réponse
JSONRPCRequest
class JSONRPCRequest(A2ABaseModel):
"""Objet de demande JSON-RPC 2.0"""
jsonrpc: Literal['2.0'] = '2.0' # Version du protocole
method: str # Nom de la méthode
params: dict[str, Any] | None = None # Paramètres
id: str | int | None = None # ID de demande
JSONRPCSuccessResponse
class JSONRPCSuccessResponse(A2ABaseModel):
"""Objet de réponse de succès JSON-RPC 2.0"""
jsonrpc: Literal['2.0'] = '2.0' # Version du protocole
result: Any # Données de résultat
id: str | int | None = None # ID de réponse
JSONRPCErrorResponse
class JSONRPCErrorResponse(A2ABaseModel):
"""Objet de réponse d'erreur JSON-RPC 2.0"""
jsonrpc: Literal['2.0'] = '2.0' # Version du protocole
error: JSONRPCError | [specific error type] # Informations d'erreur
id: str | int | None = None # ID de réponse
Types d'Erreurs
Le protocole A2A définit plusieurs types d'erreurs, tous hérités des erreurs JSON-RPC standard :
Erreurs JSON-RPC Standard
JSONParseError
class JSONParseError(A2ABaseModel):
"""Erreur d'analyse JSON"""
code: Literal[-32700] = -32700
message: str | None = 'Invalid JSON payload'
data: Any | None = None
InvalidRequestError
class InvalidRequestError(A2ABaseModel):
"""Erreur de demande invalide"""
code: Literal[-32600] = -32600
message: str | None = 'Request payload validation error'
data: Any | None = None
MethodNotFoundError
class MethodNotFoundError(A2ABaseModel):
"""Erreur méthode non trouvée"""
code: Literal[-32601] = -32601
message: str | None = 'Method not found'
data: Any | None = None
InvalidParamsError
class InvalidParamsError(A2ABaseModel):
"""Erreur de paramètres invalides"""
code: Literal[-32602] = -32602
message: str | None = 'Invalid parameters'
data: Any | None = None
InternalError
class InternalError(A2ABaseModel):
"""Erreur interne"""
code: Literal[-32603] = -32603
message: str | None = 'Internal error'
data: Any | None = None
Erreurs Spécifiques A2A
TaskNotFoundError
class TaskNotFoundError(A2ABaseModel):
"""Erreur tâche non trouvée"""
code: Literal[-32001] = -32001
message: str | None = 'Task not found'
data: Any | None = None
TaskNotCancelableError
class TaskNotCancelableError(A2ABaseModel):
"""Erreur tâche non annulable"""
code: Literal[-32002] = -32002
message: str | None = 'Task cannot be canceled'
data: Any | None = None
PushNotificationNotSupportedError
class PushNotificationNotSupportedError(A2ABaseModel):
"""Erreur notification push non supportée"""
code: Literal[-32003] = -32003
message: str | None = 'Push Notification is not supported'
data: Any | None = None
UnsupportedOperationError
class UnsupportedOperationError(A2ABaseModel):
"""Erreur opération non supportée"""
code: Literal[-32004] = -32004
message: str | None = 'This operation is not supported'
data: Any | None = None
ContentTypeNotSupportedError
class ContentTypeNotSupportedError(A2ABaseModel):
"""Erreur type de contenu non supporté"""
code: Literal[-32005] = -32005
message: str | None = 'Incompatible content types'
data: Any | None = None
InvalidAgentResponseError
class InvalidAgentResponseError(A2ABaseModel):
"""Erreur réponse d'agent invalide"""
code: Literal[-32006] = -32006
message: str | None = 'Invalid agent response'
data: Any | None = None
Types Liés à l'Authentification de Sécurité
SecurityScheme (type union)
class SecurityScheme(RootModel[
APIKeySecurityScheme |
HTTPAuthSecurityScheme |
OAuth2SecurityScheme |
OpenIdConnectSecurityScheme
]):
"""Schéma de sécurité - supporte plusieurs méthodes d'authentification"""
APIKeySecurityScheme
class APIKeySecurityScheme(A2ABaseModel):
"""Schéma de sécurité par clé API"""
type: Literal['apiKey'] = 'apiKey'
name: str # Nom du paramètre
in_: In # Emplacement (header/query/cookie)
description: str | None = None # Description
HTTPAuthSecurityScheme
class HTTPAuthSecurityScheme(A2ABaseModel):
"""Schéma de sécurité d'authentification HTTP"""
type: Literal['http'] = 'http'
scheme: str # Schéma d'authentification (Basic, Bearer, etc.)
bearerFormat: str | None = None # Format du token Bearer
description: str | None = None # Description
OAuth2SecurityScheme
class OAuth2SecurityScheme(A2ABaseModel):
"""Schéma de sécurité OAuth2.0"""
type: Literal['oauth2'] = 'oauth2'
flows: OAuthFlows # Configuration des flux OAuth
description: str | None = None # Description
OpenIdConnectSecurityScheme
class OpenIdConnectSecurityScheme(A2ABaseModel):
"""Schéma de sécurité OpenID Connect"""
type: Literal['openIdConnect'] = 'openIdConnect'
openIdConnectUrl: str # URL de découverte OpenID Connect
description: str | None = None # Description
Types de Flux OAuth
OAuthFlows
class OAuthFlows(A2ABaseModel):
"""Configuration des flux OAuth"""
implicit: ImplicitOAuthFlow | None = None # Flux implicite
password: PasswordOAuthFlow | None = None # Flux par mot de passe
clientCredentials: ClientCredentialsOAuthFlow | None = None # Flux par identifiants client
authorizationCode: AuthorizationCodeOAuthFlow | None = None # Flux par code d'autorisation
Types Liés aux Notifications Push
PushNotificationConfig
class PushNotificationConfig(A2ABaseModel):
"""Configuration des notifications push"""
url: str # URL push
id: str | None = None # ID de notification push
token: str | None = None # Token de session
authentication: PushNotificationAuthenticationInfo | None = None # Informations d'authentification
PushNotificationAuthenticationInfo
class PushNotificationAuthenticationInfo(A2ABaseModel):
"""Informations d'authentification des notifications push"""
schemes: list[str] # Schémas d'authentification supportés
credentials: str | None = None # Informations d'authentification
Types de Demandes et Réponses
Envoi de Messages
SendMessageRequest
class SendMessageRequest(A2ABaseModel):
"""Demande d'envoi de message"""
jsonrpc: Literal['2.0'] = '2.0'
method: Literal['message/send'] = 'message/send'
params: MessageSendParams
id: str | int
MessageSendParams
class MessageSendParams(A2ABaseModel):
"""Paramètres d'envoi de message"""
message: Message # Message à envoyer
configuration: MessageSendConfiguration | None = None # Configuration d'envoi
metadata: dict[str, Any] | None = None # Métadonnées
MessageSendConfiguration
class MessageSendConfiguration(A2ABaseModel):
"""Configuration d'envoi de message"""
acceptedOutputModes: list[str] # Modes de sortie acceptés
blocking: bool | None = None # Bloquer la demande ou non
historyLength: int | None = None # Longueur de l'historique des messages
pushNotificationConfig: PushNotificationConfig | None = None # Configuration des notifications push
Opérations sur les Tâches
GetTaskRequest
class GetTaskRequest(A2ABaseModel):
"""Demande d'obtention de tâche"""
jsonrpc: Literal['2.0'] = '2.0'
method: Literal['tasks/get'] = 'tasks/get'
params: TaskQueryParams
id: str | int
TaskQueryParams
class TaskQueryParams(A2ABaseModel):
"""Paramètres de requête de tâche"""
id: str # ID de tâche
historyLength: int | None = None # Longueur de l'historique
metadata: dict[str, Any] | None = None # Métadonnées
CancelTaskRequest
class CancelTaskRequest(A2ABaseModel):
"""Demande d'annulation de tâche"""
jsonrpc: Literal['2.0'] = '2.0'
method: Literal['tasks/cancel'] = 'tasks/cancel'
params: TaskIdParams
id: str | int
Types d'Événements
TaskStatusUpdateEvent
class TaskStatusUpdateEvent(A2ABaseModel):
"""Événement de mise à jour du statut de tâche"""
kind: Literal['status-update'] = 'status-update'
taskId: str # ID de tâche
contextId: str # ID de contexte
status: TaskStatus # Statut de la tâche
final: bool # Événement final ou non
metadata: dict[str, Any] | None = None # Métadonnées
TaskArtifactUpdateEvent
class TaskArtifactUpdateEvent(A2ABaseModel):
"""Événement de mise à jour d'artefact de tâche"""
kind: Literal['artifact-update'] = 'artifact-update'
taskId: str # ID de tâche
contextId: str # ID de contexte
artifact: Artifact # Artefact
append: bool | None = None # Ajouter ou non
lastChunk: bool | None = None # Dernier chunk ou non
metadata: dict[str, Any] | None = None # Métadonnées
Diagramme de Relations d'Objets
graph TB
%% Entités principales
AgentCard[AgentCard<br/>Carte d'Agent]
Task[Task<br/>Tâche]
Message[Message<br/>Message]
%% Liés aux agents
AgentSkill[AgentSkill<br/>Compétence d'Agent]
AgentCapabilities[AgentCapabilities<br/>Capacités d'Agent]
AgentProvider[AgentProvider<br/>Fournisseur de Service]
AgentExtension[AgentExtension<br/>Extension d'Agent]
AgentInterface[AgentInterface<br/>Interface d'Agent]
%% Contenu des messages
Part[Part<br/>Partie de Message]
TextPart[TextPart<br/>Partie Texte]
FilePart[FilePart<br/>Partie Fichier]
DataPart[DataPart<br/>Partie Données]
%% Types de fichiers
FileWithBytes[FileWithBytes<br/>Fichier Bytes]
FileWithUri[FileWithUri<br/>Fichier URI]
%% Liés aux tâches
TaskStatus[TaskStatus<br/>Statut de Tâche]
Artifact[Artifact<br/>Artefact]
%% JSON-RPC
JSONRPCRequest[JSONRPCRequest<br/>Demande JSON-RPC]
JSONRPCResponse[JSONRPCResponse<br/>Réponse JSON-RPC]
%% Authentification de sécurité
SecurityScheme[SecurityScheme<br/>Schéma de Sécurité]
APIKeySecurityScheme[APIKeySecurityScheme<br/>Schéma Clé API]
HTTPAuthSecurityScheme[HTTPAuthSecurityScheme<br/>Schéma Auth HTTP]
OAuth2SecurityScheme[OAuth2SecurityScheme<br/>Schéma OAuth2]
OpenIdConnectSecurityScheme[OpenIdConnectSecurityScheme<br/>Schéma OpenID Connect]
%% Notifications push
PushNotificationConfig[PushNotificationConfig<br/>Config Notification Push]
PushNotificationAuthenticationInfo[PushNotificationAuthenticationInfo<br/>Info Auth Push]
%% Types d'erreurs
A2AError[A2AError<br/>Erreur A2A]
JSONRPCError[JSONRPCError<br/>Erreur JSON-RPC]
%% Événements
TaskStatusUpdateEvent[TaskStatusUpdateEvent<br/>Événement Mise à Jour Statut]
TaskArtifactUpdateEvent[TaskArtifactUpdateEvent<br/>Événement Mise à Jour Artefact]
%% Connexions de relations
AgentCard --> AgentSkill
AgentCard --> AgentCapabilities
AgentCard --> AgentProvider
AgentCard --> AgentInterface
AgentCard --> SecurityScheme
AgentCapabilities --> AgentExtension
Task --> TaskStatus
Task --> Message
Task --> Artifact
Message --> Part
Part --> TextPart
Part --> FilePart
Part --> DataPart
FilePart --> FileWithBytes
FilePart --> FileWithUri
Artifact --> Part
SecurityScheme --> APIKeySecurityScheme
SecurityScheme --> HTTPAuthSecurityScheme
SecurityScheme --> OAuth2SecurityScheme
SecurityScheme --> OpenIdConnectSecurityScheme
PushNotificationConfig --> PushNotificationAuthenticationInfo
TaskStatusUpdateEvent --> TaskStatus
TaskArtifactUpdateEvent --> Artifact
JSONRPCResponse --> A2AError
A2AError --> JSONRPCError
%% Styles
classDef coreEntity fill:#e1f5fe
classDef agentRelated fill:#f3e5f5
classDef messageRelated fill:#e8f5e8
classDef taskRelated fill:#fff3e0
classDef securityRelated fill:#fce4ec
classDef errorRelated fill:#ffebee
classDef eventRelated fill:#f1f8e9
class AgentCard,Task,Message coreEntity
class AgentSkill,AgentCapabilities,AgentProvider,AgentExtension,AgentInterface agentRelated
class Part,TextPart,FilePart,DataPart,FileWithBytes,FileWithUri messageRelated
class TaskStatus,Artifact taskRelated
class SecurityScheme,APIKeySecurityScheme,HTTPAuthSecurityScheme,OAuth2SecurityScheme,OpenIdConnectSecurityScheme,PushNotificationConfig,PushNotificationAuthenticationInfo securityRelated
class A2AError,JSONRPCError errorRelated
class TaskStatusUpdateEvent,TaskArtifactUpdateEvent eventRelated
Diagramme de Flux du Protocole
sequenceDiagram
participant Client as Client
participant Agent as Agent
Note over Client,Agent: 1. Découverte d'agent et requête de capacités
Client->>Agent: GET /agent-card
Agent->>Client: AgentCard (compétences, capacités, exigences de sécurité)
Note over Client,Agent: 2. Authentification (si nécessaire)
Client->>Agent: Demande d'authentification (selon SecurityScheme)
Agent->>Client: Réponse d'authentification
Note over Client,Agent: 3. Envoi de message et création de tâche
Client->>Agent: SendMessageRequest
Note right of Agent: Création de tâche<br/>Statut: submitted
Agent->>Client: SendMessageResponse (Task)
Note over Client,Agent: 4. Traitement de tâche (notification push optionnelle)
loop Traitement de tâche
Note right of Agent: Mise à jour statut tâche<br/>working -> completed
alt Support notification push
Agent->>Client: TaskStatusUpdateEvent
else Mode polling
Client->>Agent: GetTaskRequest
Agent->>Client: GetTaskResponse (Task mise à jour)
end
end
Note over Client,Agent: 5. Obtention du résultat final
Client->>Agent: GetTaskRequest
Agent->>Client: Task (avec Artifacts et historique complet)
Diagramme de Transition d'État des Tâches
stateDiagram-v2
[*] --> submitted: Création de tâche
submitted --> working: Début du traitement
submitted --> rejected: Tâche rejetée
submitted --> auth_required: Authentification requise
working --> completed: Traitement terminé
working --> failed: Traitement échoué
working --> input_required: Entrée utilisateur requise
working --> canceled: Annulation utilisateur
input_required --> working: Entrée utilisateur reçue
input_required --> canceled: Annulation utilisateur
auth_required --> working: Authentification réussie
auth_required --> rejected: Authentification échouée
completed --> [*]
failed --> [*]
canceled --> [*]
rejected --> [*]
unknown --> working: Récupération d'état
unknown --> failed: Récupération impossible
Diagramme de Hiérarchie des Types de Parties de Message
flowchart TD
Part["Part<br/>Classe de base partie de message"]
Part --> TextPart["TextPart<br/>Partie texte<br/>kind: text"]
Part --> FilePart["FilePart<br/>Partie fichier<br/>kind: file"]
Part --> DataPart["DataPart<br/>Partie données<br/>kind: data"]
FilePart --> FileContent{"Contenu fichier"}
FileContent --> FileWithBytes["FileWithBytes<br/>Contient données bytes base64"]
FileContent --> FileWithUri["FileWithUri<br/>Contient URI fichier"]
TextPart --> TextContent["text: str<br/>Contenu texte"]
DataPart --> DataContent["data: dict[str, Any]<br/>Données structurées"]
FileWithBytes --> BytesContent["bytes: str<br/>Contenu encodé base64"]
FileWithUri --> UriContent["uri: str<br/>URL fichier"]
%% Propriétés communes
Part --> Metadata["metadata: dict[str, Any]<br/>Métadonnées optionnelles"]
FileWithBytes --> FileMetadata["name: str<br/>mimeType: str<br/>Métadonnées fichier"]
FileWithUri --> FileMetadata
classDef baseClass fill:#e3f2fd
classDef textClass fill:#e8f5e8
classDef fileClass fill:#fff3e0
classDef dataClass fill:#f3e5f5
classDef metaClass fill:#f5f5f5
class Part baseClass
class TextPart,TextContent textClass
class FilePart,FileWithBytes,FileWithUri,BytesContent,UriContent fileClass
class DataPart,DataContent dataClass
class Metadata,FileMetadata metaClass
Diagramme des Types de Schémas de Sécurité
flowchart TD
SecurityScheme["SecurityScheme<br/>Type union schéma de sécurité"]
SecurityScheme --> APIKeySecurityScheme["APIKeySecurityScheme<br/>Authentification par clé API<br/>type: apiKey"]
SecurityScheme --> HTTPAuthSecurityScheme["HTTPAuthSecurityScheme<br/>Authentification HTTP<br/>type: http"]
SecurityScheme --> OAuth2SecurityScheme["OAuth2SecurityScheme<br/>Authentification OAuth2<br/>type: oauth2"]
SecurityScheme --> OpenIdConnectSecurityScheme["OpenIdConnectSecurityScheme<br/>OpenID Connect<br/>type: openIdConnect"]
APIKeySecurityScheme --> APIKeyDetails["name: str<br/>in: header|query|cookie"]
HTTPAuthSecurityScheme --> HTTPDetails["scheme: str<br/>bearerFormat: str"]
OAuth2SecurityScheme --> OAuthFlows["flows: OAuthFlows"]
OpenIdConnectSecurityScheme --> OIDCDetails["openIdConnectUrl: str"]
OAuthFlows --> ImplicitFlow["implicit: ImplicitOAuthFlow"]
OAuthFlows --> PasswordFlow["password: PasswordOAuthFlow"]
OAuthFlows --> ClientCredentialsFlow["clientCredentials: ClientCredentialsOAuthFlow"]
OAuthFlows --> AuthorizationCodeFlow["authorizationCode: AuthorizationCodeOAuthFlow"]
ImplicitFlow --> ImplicitDetails["authorizationUrl: str<br/>scopes: dict[str, str]"]
PasswordFlow --> PasswordDetails["tokenUrl: str<br/>scopes: dict[str, str]"]
ClientCredentialsFlow --> ClientDetails["tokenUrl: str<br/>scopes: dict[str, str]"]
AuthorizationCodeFlow --> AuthCodeDetails["authorizationUrl: str<br/>tokenUrl: str<br/>scopes: dict[str, str]"]
classDef baseClass fill:#e3f2fd
classDef apiKeyClass fill:#e8f5e8
classDef httpClass fill:#fff3e0
classDef oauthClass fill:#f3e5f5
classDef oidcClass fill:#fce4ec
class SecurityScheme baseClass
class APIKeySecurityScheme,APIKeyDetails apiKeyClass
class HTTPAuthSecurityScheme,HTTPDetails httpClass
class OAuth2SecurityScheme,OAuthFlows,ImplicitFlow,PasswordFlow,ClientCredentialsFlow,AuthorizationCodeFlow,ImplicitDetails,PasswordDetails,ClientDetails,AuthCodeDetails oauthClass
class OpenIdConnectSecurityScheme,OIDCDetails oidcClass
Tableau de Mappage des Codes d'Erreur
Code d'Erreur | Type d'Erreur | Description | Cas d'Usage |
---|---|---|---|
-32700 | JSONParseError | Erreur d'analyse JSON | Format JSON invalide |
-32600 | InvalidRequestError | Demande invalide | Format de demande non conforme aux spécifications |
-32601 | MethodNotFoundError | Méthode non trouvée | Appel de méthode inexistante |
-32602 | InvalidParamsError | Paramètres invalides | Paramètres de méthode incorrects |
-32603 | InternalError | Erreur interne | Erreur de traitement interne du serveur |
-32001 | TaskNotFoundError | Tâche non trouvée | ID de tâche demandé inexistant |
-32002 | TaskNotCancelableError | Tâche non annulable | État de tâche ne permettant pas l'annulation |
-32003 | PushNotificationNotSupportedError | Notification push non supportée | Agent ne supportant pas les notifications push |
-32004 | UnsupportedOperationError | Opération non supportée | Agent ne supportant pas l'opération demandée |
-32005 | ContentTypeNotSupportedError | Type de contenu non supporté | Type de contenu demandé ne correspondant pas aux capacités de l'agent |
-32006 | InvalidAgentResponseError | Réponse d'agent invalide | Agent ayant retourné une réponse de format incorrect |
Liste des Méthodes Supportées
Le protocole A2A définit les méthodes standard suivantes :
Méthodes Liées aux Messages
message/send
- Envoyer un message à l'agentmessage/stream
- Envoyer un message en streaming à l'agent
Méthodes Liées aux Tâches
tasks/get
- Obtenir les détails d'une tâchetasks/cancel
- Annuler une tâchetasks/resubscribe
- Se réabonner aux mises à jour de tâche
Méthodes de Configuration des Notifications Push
tasks/pushNotificationConfig/set
- Définir la configuration des notifications pushtasks/pushNotificationConfig/get
- Obtenir la configuration des notifications pushtasks/pushNotificationConfig/list
- Lister les configurations des notifications pushtasks/pushNotificationConfig/delete
- Supprimer la configuration des notifications push
Exemples d'Usage
1. Envoyer un Message Texte Simple
from a2a.types import SendMessageRequest, MessageSendParams, Message, TextPart, Part
# Créer une partie de message texte
text_part = TextPart(text="Bonjour, comment puis-je vous aider ?")
part = Part(root=text_part)
# Créer un message
message = Message(
messageId="msg-001",
role="user",
parts=[part]
)
# Créer les paramètres d'envoi
params = MessageSendParams(message=message)
# Créer la demande
request = SendMessageRequest(
id="req-001",
params=params
)
2. Envoyer un Message avec Fichier
from a2a.types import FilePart, FileWithBytes
import base64
# Lire et encoder le fichier
with open("document.pdf", "rb") as f:
file_bytes = base64.b64encode(f.read()).decode()
# Créer une partie fichier
file_with_bytes = FileWithBytes(
bytes=file_bytes,
name="document.pdf",
mimeType="application/pdf"
)
file_part = FilePart(file=file_with_bytes)
part = Part(root=file_part)
# Créer un message avec fichier
message = Message(
messageId="msg-002",
role="user",
parts=[part]
)
3. Requête de Statut de Tâche
from a2a.types import GetTaskRequest, TaskQueryParams
# Créer une demande de requête de tâche
request = GetTaskRequest(
id="req-002",
params=TaskQueryParams(
id="task-001",
historyLength=10 # Obtenir les 10 derniers messages d'historique
)
)
4. Configuration des Notifications Push
from a2a.types import (
SetTaskPushNotificationConfigRequest,
TaskPushNotificationConfig,
PushNotificationConfig,
PushNotificationAuthenticationInfo
)
# Créer la configuration des notifications push
push_config = PushNotificationConfig(
url="https://my-app.com/webhook/task-updates",
authentication=PushNotificationAuthenticationInfo(
schemes=["Bearer"],
credentials="my-auth-token"
)
)
# Créer la configuration push de tâche
task_push_config = TaskPushNotificationConfig(
taskId="task-001",
pushNotificationConfig=push_config
)
# Créer la demande de configuration
request = SetTaskPushNotificationConfigRequest(
id="req-003",
params=task_push_config
)
Meilleures Pratiques
1. Gestion des Erreurs
- Toujours vérifier le champ d'erreur de la réponse
- Implémenter une stratégie de nouvelle tentative appropriée basée sur le code d'erreur
- Fournir des messages d'erreur significatifs à l'utilisateur
2. Gestion des Tâches
- Utiliser les notifications push plutôt que le polling pour les mises à jour de tâche
- Implémenter un mécanisme de timeout pour les tâches
- Sauvegarder les ID de tâche pour les requêtes ultérieures
3. Sécurité
- Utiliser le transport HTTPS
- Implémenter correctement les schémas d'authentification
- Faire tourner régulièrement les clés API et tokens
4. Optimisation des Performances
- Utiliser le streaming pour le traitement de grandes réponses
- Limiter la longueur de l'historique des messages
- Implémenter la mise en cache côté client
Extensibilité
Le protocole A2A supporte l'extension à travers les mécanismes suivants :
- Extensions d'Agent - Déclarer des capacités personnalisées via
AgentExtension
- Champs de Métadonnées - La plupart des objets incluent un champ
metadata
optionnel - Protocoles de Transport Personnalisés - Support de nouvelles méthodes de transport via
AgentInterface
- URI d'Extension - Référencer des spécifications d'extension dans les messages et artefacts
Résumé
Le protocole A2A fournit un cadre complet pour la communication et la collaboration entre agents intelligents. Basé sur JSON-RPC 2.0, il offre un passage de messages standardisé, une gestion des tâches, une authentification de sécurité et des mécanismes d'extensibilité.
Caractéristiques principales :
- Communication Standardisée : Modèle demande-réponse basé sur JSON-RPC 2.0
- Support de Contenu Riche : Support pour texte, fichiers et données structurées
- Sécurité Flexible : Support de multiples méthodes d'authentification
- Mises à Jour en Temps Réel : Mécanisme de notifications push
- Gestion d'Erreurs Robuste : Codes d'erreur et messages complets
- Bonne Extensibilité : Mécanismes d'extension et support de métadonnées
Ce protocole fournit aux développeurs une base solide pour construire des applications puissantes basées sur des agents.