A2A Protocol Specification (Python)

Überblick
Das A2A (Agent2Agent) Protokoll ist ein auf JSON-RPC 2.0 basierendes Kommunikationsprotokoll, das für die Interaktion zwischen intelligenten Agenten entwickelt wurde. Dieses Protokoll definiert Kernfunktionalitäten einschließlich Agentenfähigkeitsdeklaration, Nachrichtenübertragung, Aufgabenverwaltung und Sicherheitsauthentifizierung.
Dieses Dokument basiert auf der Datei a2a-python/src/a2a/types.py
und bietet eine detaillierte Einführung in alle Datenstrukturen und Objektbeziehungen des A2A-Protokolls.
Protokollversion
Aktuelle Protokollversion: 0.2.5
Kernkonzepte
1. Agent
Der Agent ist die Hauptentität des A2A-Protokolls und besitzt spezifische Fähigkeiten und Kompetenzen zur Bearbeitung von Benutzeranfragen und Ausführung von Aufgaben.
2. Aufgabe
Die Aufgabe ist die vom Agenten ausgeführte Arbeitseinheit, charakterisiert durch Lebenszyklus-Statusverwaltung und Verlaufsaufzeichnung.
3. Nachricht
Die Nachricht ist die grundlegende Einheit für den Informationsaustausch zwischen Benutzer und Agent und unterstützt mehrere Inhaltstypen.
4. JSON-RPC 2.0
Das A2A-Protokoll basiert auf dem JSON-RPC 2.0-Standard und bietet ein standardisiertes Anfrage-Antwort-Kommunikationsmuster.
Datenstruktur-Details
Grundtypen
A2A
class A2A(RootModel[Any]):
root: Any
Wurzeltyp des Protokolls, kann beliebige Daten enthalten.
Role (Aufzählung)
class Role(str, Enum):
"""Rolle des Nachrichtensenders"""
agent = 'agent' # Agent
user = 'user' # Benutzer
TaskState (Aufzählung)
class TaskState(str, Enum):
"""Mögliche Zustände der Aufgabe"""
submitted = 'submitted' # Eingereicht
working = 'working' # In Bearbeitung
input_required = 'input-required' # Eingabe erforderlich
completed = 'completed' # Abgeschlossen
canceled = 'canceled' # Abgebrochen
failed = 'failed' # Fehlgeschlagen
rejected = 'rejected' # Abgelehnt
auth_required = 'auth-required' # Authentifizierung erforderlich
unknown = 'unknown' # Unbekannter Status
Agentenbezogene Typen
AgentCard
class AgentCard(A2ABaseModel):
"""Agentenkarte - enthält wichtige Informationen des Agenten"""
name: str # Agentenname
description: str # Agentenbeschreibung
version: str # Agentenversion
url: str # Agenten-URL
protocolVersion: str | None = '0.2.5' # Protokollversion
skills: list[AgentSkill] # Fähigkeitenliste
capabilities: AgentCapabilities # Fähigkeitsdeklaration
defaultInputModes: list[str] # Standard-Eingabemodi
defaultOutputModes: list[str] # Standard-Ausgabemodi
provider: AgentProvider | None = None # Dienstanbieter
security: list[dict[str, list[str]]] | None = None # Sicherheitsanforderungen
securitySchemes: dict[str, SecurityScheme] | None = None # Sicherheitsschemata
# ... andere Felder
AgentSkill
class AgentSkill(A2ABaseModel):
"""Agentenfähigkeit - vom Agenten ausführbare Fähigkeitseinheit"""
id: str # Eindeutige Fähigkeitskennung
name: str # Fähigkeitsname
description: str # Fähigkeitsbeschreibung
tags: list[str] # Fähigkeits-Tags
examples: list[str] | None = None # Verwendungsbeispiele
inputModes: list[str] | None = None # Eingabemodi
outputModes: list[str] | None = None # Ausgabemodi
AgentCapabilities
class AgentCapabilities(A2ABaseModel):
"""Agentenfähigkeitsdefinition"""
extensions: list[AgentExtension] | None = None # Unterstützte Erweiterungen
pushNotifications: bool | None = None # Push-Benachrichtigungsunterstützung
stateTransitionHistory: bool | None = None # Statusübergangsverlauf
streaming: bool | None = None # Streaming-Unterstützung
AgentExtension
class AgentExtension(A2ABaseModel):
"""Agentenerweiterungsdeklaration"""
uri: str # Erweiterungs-URI
description: str | None = None # Erweiterungsbeschreibung
params: dict[str, Any] | None = None # Erweiterungsparameter
required: bool | None = None # Erforderlich oder nicht
AgentProvider
class AgentProvider(A2ABaseModel):
"""Agenten-Dienstanbieter"""
organization: str # Organisationsname
url: str # Organisations-URL
AgentInterface
class AgentInterface(A2ABaseModel):
"""Agentenschnittstellendeklaration"""
transport: str # Transportprotokoll (JSONRPC, GRPC, HTTP+JSON)
url: str # Schnittstellen-URL
Nachrichtenbezogene Typen
Message
class Message(A2ABaseModel):
"""Zwischen Benutzer und Agent ausgetauschte Nachrichten"""
messageId: str # Nachrichten-ID
role: Role # Rolle des Senders
parts: list[Part] # Nachrichteninhalts-Teile
kind: Literal['message'] = 'message' # Ereignistyp
taskId: str | None = None # Zugehörige Aufgaben-ID
contextId: str | None = None # Kontext-ID
referenceTaskIds: list[str] | None = None # Referenzierte Aufgaben-ID-Liste
extensions: list[str] | None = None # Erweiterungs-URI-Liste
metadata: dict[str, Any] | None = None # Metadaten
Part (Union-Typ)
class Part(RootModel[TextPart | FilePart | DataPart]):
"""Nachrichtenteil - Text, Datei oder strukturierte Daten"""
root: TextPart | FilePart | DataPart
TextPart
class TextPart(A2ABaseModel):
"""Text-Nachrichtenteil"""
kind: Literal['text'] = 'text' # Teiltyp
text: str # Textinhalt
metadata: dict[str, Any] | None = None # Metadaten
FilePart
class FilePart(A2ABaseModel):
"""Datei-Nachrichtenteil"""
kind: Literal['file'] = 'file' # Teiltyp
file: FileWithBytes | FileWithUri # Dateiinhalt
metadata: dict[str, Any] | None = None # Metadaten
DataPart
class DataPart(A2ABaseModel):
"""Strukturierte Daten-Nachrichtenteil"""
kind: Literal['data'] = 'data' # Teiltyp
data: dict[str, Any] # Strukturierte Daten
metadata: dict[str, Any] | None = None # Metadaten
Dateitypen
FileWithBytes
class FileWithBytes(A2ABaseModel):
"""Datei mit Byte-Inhalt"""
bytes: str # base64-kodierter Dateiinhalt
name: str | None = None # Dateiname
mimeType: str | None = None # MIME-Typ
FileWithUri
class FileWithUri(A2ABaseModel):
"""Datei mit URI"""
uri: str # Datei-URL
name: str | None = None # Dateiname
mimeType: str | None = None # MIME-Typ
Aufgabenbezogene Typen
Task
class Task(A2ABaseModel):
"""Aufgabenentität"""
id: str # Eindeutige Aufgabenkennung
contextId: str # Kontext-ID
status: TaskStatus # Aufgabenstatus
kind: Literal['task'] = 'task' # Ereignistyp
history: list[Message] | None = None # Nachrichtenverlauf
artifacts: list[Artifact] | None = None # Generierte Artefakte
metadata: dict[str, Any] | None = None # Metadaten
TaskStatus
class TaskStatus(A2ABaseModel):
"""Aufgabenstatus und zugehörige Nachricht"""
state: TaskState # Aufgabenzustand
message: Message | None = None # Status-Update-Nachricht
timestamp: str | None = None # Zeitstempel (ISO 8601)
Artifact
class Artifact(A2ABaseModel):
"""Von der Aufgabe generiertes Artefakt"""
artifactId: str # Artefakt-ID
parts: list[Part] # Artefaktinhalts-Teile
name: str | None = None # Artefaktname
description: str | None = None # Artefaktbeschreibung
extensions: list[str] | None = None # Erweiterungs-URI-Liste
metadata: dict[str, Any] | None = None # Metadaten
JSON-RPC-bezogene Typen
JSONRPCMessage (Basisklasse)
class JSONRPCMessage(A2ABaseModel):
"""JSON-RPC 2.0 Nachrichten-Basisklasse"""
jsonrpc: Literal['2.0'] = '2.0' # Protokollversion
id: str | int | None = None # Anfrage/Antwort-ID
JSONRPCRequest
class JSONRPCRequest(A2ABaseModel):
"""JSON-RPC 2.0 Anfrageobjekt"""
jsonrpc: Literal['2.0'] = '2.0' # Protokollversion
method: str # Methodenname
params: dict[str, Any] | None = None # Parameter
id: str | int | None = None # Anfrage-ID
JSONRPCSuccessResponse
class JSONRPCSuccessResponse(A2ABaseModel):
"""JSON-RPC 2.0 Erfolgsantwortobjekt"""
jsonrpc: Literal['2.0'] = '2.0' # Protokollversion
result: Any # Ergebnisdaten
id: str | int | None = None # Antwort-ID
JSONRPCErrorResponse
class JSONRPCErrorResponse(A2ABaseModel):
"""JSON-RPC 2.0 Fehlerantwortobjekt"""
jsonrpc: Literal['2.0'] = '2.0' # Protokollversion
error: JSONRPCError | [specific error type] # Fehlerinformationen
id: str | int | None = None # Antwort-ID
Fehlertypen
Das A2A-Protokoll definiert mehrere Fehlertypen, alle von Standard-JSON-RPC-Fehlern abgeleitet:
Standard-JSON-RPC-Fehler
JSONParseError
class JSONParseError(A2ABaseModel):
"""JSON-Parsing-Fehler"""
code: Literal[-32700] = -32700
message: str | None = 'Invalid JSON payload'
data: Any | None = None
InvalidRequestError
class InvalidRequestError(A2ABaseModel):
"""Ungültige Anfragefehler"""
code: Literal[-32600] = -32600
message: str | None = 'Request payload validation error'
data: Any | None = None
MethodNotFoundError
class MethodNotFoundError(A2ABaseModel):
"""Methode nicht gefunden Fehler"""
code: Literal[-32601] = -32601
message: str | None = 'Method not found'
data: Any | None = None
InvalidParamsError
class InvalidParamsError(A2ABaseModel):
"""Ungültige Parameter Fehler"""
code: Literal[-32602] = -32602
message: str | None = 'Invalid parameters'
data: Any | None = None
InternalError
class InternalError(A2ABaseModel):
"""Interner Fehler"""
code: Literal[-32603] = -32603
message: str | None = 'Internal error'
data: Any | None = None
A2A-spezifische Fehler
TaskNotFoundError
class TaskNotFoundError(A2ABaseModel):
"""Aufgabe nicht gefunden Fehler"""
code: Literal[-32001] = -32001
message: str | None = 'Task not found'
data: Any | None = None
TaskNotCancelableError
class TaskNotCancelableError(A2ABaseModel):
"""Aufgabe nicht abbrechbar Fehler"""
code: Literal[-32002] = -32002
message: str | None = 'Task cannot be canceled'
data: Any | None = None
PushNotificationNotSupportedError
class PushNotificationNotSupportedError(A2ABaseModel):
"""Push-Benachrichtigung nicht unterstützt Fehler"""
code: Literal[-32003] = -32003
message: str | None = 'Push Notification is not supported'
data: Any | None = None
UnsupportedOperationError
class UnsupportedOperationError(A2ABaseModel):
"""Nicht unterstützte Operation Fehler"""
code: Literal[-32004] = -32004
message: str | None = 'This operation is not supported'
data: Any | None = None
ContentTypeNotSupportedError
class ContentTypeNotSupportedError(A2ABaseModel):
"""Inhaltstyp nicht unterstützt Fehler"""
code: Literal[-32005] = -32005
message: str | None = 'Incompatible content types'
data: Any | None = None
InvalidAgentResponseError
class InvalidAgentResponseError(A2ABaseModel):
"""Ungültige Agentenantwort Fehler"""
code: Literal[-32006] = -32006
message: str | None = 'Invalid agent response'
data: Any | None = None
Sicherheitsauthentifizierungsbezogene Typen
SecurityScheme (Union-Typ)
class SecurityScheme(RootModel[
APIKeySecurityScheme |
HTTPAuthSecurityScheme |
OAuth2SecurityScheme |
OpenIdConnectSecurityScheme
]):
"""Sicherheitsschema - unterstützt mehrere Authentifizierungsmethoden"""
APIKeySecurityScheme
class APIKeySecurityScheme(A2ABaseModel):
"""API-Schlüssel-Sicherheitsschema"""
type: Literal['apiKey'] = 'apiKey'
name: str # Parametername
in_: In # Ort (header/query/cookie)
description: str | None = None # Beschreibung
HTTPAuthSecurityScheme
class HTTPAuthSecurityScheme(A2ABaseModel):
"""HTTP-Authentifizierungs-Sicherheitsschema"""
type: Literal['http'] = 'http'
scheme: str # Authentifizierungsschema (Basic, Bearer usw.)
bearerFormat: str | None = None # Bearer-Token-Format
description: str | None = None # Beschreibung
OAuth2SecurityScheme
class OAuth2SecurityScheme(A2ABaseModel):
"""OAuth2.0-Sicherheitsschema"""
type: Literal['oauth2'] = 'oauth2'
flows: OAuthFlows # OAuth-Flow-Einstellungen
description: str | None = None # Beschreibung
OpenIdConnectSecurityScheme
class OpenIdConnectSecurityScheme(A2ABaseModel):
"""OpenID Connect-Sicherheitsschema"""
type: Literal['openIdConnect'] = 'openIdConnect'
openIdConnectUrl: str # OpenID Connect-Discovery-URL
description: str | None = None # Beschreibung
OAuth-Flow-Typen
OAuthFlows
class OAuthFlows(A2ABaseModel):
"""OAuth-Flow-Einstellungen"""
implicit: ImplicitOAuthFlow | None = None # Impliziter Flow
password: PasswordOAuthFlow | None = None # Passwort-Flow
clientCredentials: ClientCredentialsOAuthFlow | None = None # Client-Credentials-Flow
authorizationCode: AuthorizationCodeOAuthFlow | None = None # Authorization-Code-Flow
Push-Benachrichtigungsbezogene Typen
PushNotificationConfig
class PushNotificationConfig(A2ABaseModel):
"""Push-Benachrichtigungskonfiguration"""
url: str # Push-URL
id: str | None = None # Push-Benachrichtigungs-ID
token: str | None = None # Sitzungstoken
authentication: PushNotificationAuthenticationInfo | None = None # Authentifizierungsinformationen
PushNotificationAuthenticationInfo
class PushNotificationAuthenticationInfo(A2ABaseModel):
"""Push-Benachrichtigungs-Authentifizierungsinformationen"""
schemes: list[str] # Unterstützte Authentifizierungsschemata
credentials: str | None = None # Authentifizierungsinformationen
Anfrage- und Antworttypen
Nachrichtensendung
SendMessageRequest
class SendMessageRequest(A2ABaseModel):
"""Nachrichtensendungsanfrage"""
jsonrpc: Literal['2.0'] = '2.0'
method: Literal['message/send'] = 'message/send'
params: MessageSendParams
id: str | int
MessageSendParams
class MessageSendParams(A2ABaseModel):
"""Nachrichtensendungsparameter"""
message: Message # Zu sendende Nachricht
configuration: MessageSendConfiguration | None = None # Sendungseinstellungen
metadata: dict[str, Any] | None = None # Metadaten
MessageSendConfiguration
class MessageSendConfiguration(A2ABaseModel):
"""Nachrichtensendungskonfiguration"""
acceptedOutputModes: list[str] # Akzeptierte Ausgabemodi
blocking: bool | None = None # Anfrage blockieren oder nicht
historyLength: int | None = None # Nachrichtenverlaufslänge
pushNotificationConfig: PushNotificationConfig | None = None # Push-Benachrichtigungseinstellungen
Aufgabenoperationen
GetTaskRequest
class GetTaskRequest(A2ABaseModel):
"""Aufgabenabrufanfrage"""
jsonrpc: Literal['2.0'] = '2.0'
method: Literal['tasks/get'] = 'tasks/get'
params: TaskQueryParams
id: str | int
TaskQueryParams
class TaskQueryParams(A2ABaseModel):
"""Aufgabenabfrageparameter"""
id: str # Aufgaben-ID
historyLength: int | None = None # Verlaufslänge
metadata: dict[str, Any] | None = None # Metadaten
CancelTaskRequest
class CancelTaskRequest(A2ABaseModel):
"""Aufgabenabbruchanfrage"""
jsonrpc: Literal['2.0'] = '2.0'
method: Literal['tasks/cancel'] = 'tasks/cancel'
params: TaskIdParams
id: str | int
Ereignistypen
TaskStatusUpdateEvent
class TaskStatusUpdateEvent(A2ABaseModel):
"""Aufgabenstatus-Update-Ereignis"""
kind: Literal['status-update'] = 'status-update'
taskId: str # Aufgaben-ID
contextId: str # Kontext-ID
status: TaskStatus # Aufgabenstatus
final: bool # Finales Ereignis oder nicht
metadata: dict[str, Any] | None = None # Metadaten
TaskArtifactUpdateEvent
class TaskArtifactUpdateEvent(A2ABaseModel):
"""Aufgabenartefakt-Update-Ereignis"""
kind: Literal['artifact-update'] = 'artifact-update'
taskId: str # Aufgaben-ID
contextId: str # Kontext-ID
artifact: Artifact # Artefakt
append: bool | None = None # Anhängen oder nicht
lastChunk: bool | None = None # Letzter Chunk oder nicht
metadata: dict[str, Any] | None = None # Metadaten
Objektbeziehungsdiagramm
graph TB
%% Hauptentitäten
AgentCard[AgentCard<br/>Agentenkarte]
Task[Task<br/>Aufgabe]
Message[Message<br/>Nachricht]
%% Agentenbezogen
AgentSkill[AgentSkill<br/>Agentenfähigkeit]
AgentCapabilities[AgentCapabilities<br/>Agentenfähigkeiten]
AgentProvider[AgentProvider<br/>Dienstanbieter]
AgentExtension[AgentExtension<br/>Agentenerweiterung]
AgentInterface[AgentInterface<br/>Agentenschnittstelle]
%% Nachrichteninhalt
Part[Part<br/>Nachrichtenteil]
TextPart[TextPart<br/>Textteil]
FilePart[FilePart<br/>Dateiteil]
DataPart[DataPart<br/>Datenteil]
%% Dateitypen
FileWithBytes[FileWithBytes<br/>Byte-Datei]
FileWithUri[FileWithUri<br/>URI-Datei]
%% Aufgabenbezogen
TaskStatus[TaskStatus<br/>Aufgabenstatus]
Artifact[Artifact<br/>Artefakt]
%% JSON-RPC
JSONRPCRequest[JSONRPCRequest<br/>JSON-RPC-Anfrage]
JSONRPCResponse[JSONRPCResponse<br/>JSON-RPC-Antwort]
%% Sicherheitsauthentifizierung
SecurityScheme[SecurityScheme<br/>Sicherheitsschema]
APIKeySecurityScheme[APIKeySecurityScheme<br/>API-Schlüssel-Schema]
HTTPAuthSecurityScheme[HTTPAuthSecurityScheme<br/>HTTP-Auth-Schema]
OAuth2SecurityScheme[OAuth2SecurityScheme<br/>OAuth2-Schema]
OpenIdConnectSecurityScheme[OpenIdConnectSecurityScheme<br/>OpenID Connect-Schema]
%% Push-Benachrichtigungen
PushNotificationConfig[PushNotificationConfig<br/>Push-Benachrichtigungskonfiguration]
PushNotificationAuthenticationInfo[PushNotificationAuthenticationInfo<br/>Push-Auth-Informationen]
%% Fehlertypen
A2AError[A2AError<br/>A2A-Fehler]
JSONRPCError[JSONRPCError<br/>JSON-RPC-Fehler]
%% Ereignisse
TaskStatusUpdateEvent[TaskStatusUpdateEvent<br/>Status-Update-Ereignis]
TaskArtifactUpdateEvent[TaskArtifactUpdateEvent<br/>Artefakt-Update-Ereignis]
%% Beziehungsverbindungen
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
%% Stile
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
Protokoll-Flussdiagramm
sequenceDiagram
participant Client as Client
participant Agent as Agent
Note over Client,Agent: 1. Agentenerkennung und Fähigkeitsabfrage
Client->>Agent: GET /agent-card
Agent->>Client: AgentCard (Fähigkeiten, Kompetenzen, Sicherheitsanforderungen)
Note over Client,Agent: 2. Authentifizierung (falls erforderlich)
Client->>Agent: Authentifizierungsanfrage (gemäß SecurityScheme)
Agent->>Client: Authentifizierungsantwort
Note over Client,Agent: 3. Nachrichtensendung und Aufgabenerstellung
Client->>Agent: SendMessageRequest
Note right of Agent: Aufgabenerstellung<br/>Status: submitted
Agent->>Client: SendMessageResponse (Task)
Note over Client,Agent: 4. Aufgabenverarbeitung (optionale Push-Benachrichtigung)
loop Aufgabenverarbeitung
Note right of Agent: Aufgabenstatus-Update<br/>working -> completed
alt Push-Benachrichtigungsunterstützung
Agent->>Client: TaskStatusUpdateEvent
else Polling-Modus
Client->>Agent: GetTaskRequest
Agent->>Client: GetTaskResponse (aktualisierte Task)
end
end
Note over Client,Agent: 5. Finales Ergebnis abrufen
Client->>Agent: GetTaskRequest
Agent->>Client: Task (mit Artifacts und vollständigem Verlauf)
Aufgabenstatus-Übergangsdiagramm
stateDiagram-v2
[*] --> submitted: Aufgabenerstellung
submitted --> working: Verarbeitung beginnt
submitted --> rejected: Aufgabe abgelehnt
submitted --> auth_required: Authentifizierung erforderlich
working --> completed: Verarbeitung abgeschlossen
working --> failed: Verarbeitung fehlgeschlagen
working --> input_required: Benutzereingabe erforderlich
working --> canceled: Benutzerabbruch
input_required --> working: Benutzereingabe erhalten
input_required --> canceled: Benutzerabbruch
auth_required --> working: Authentifizierung erfolgreich
auth_required --> rejected: Authentifizierung fehlgeschlagen
completed --> [*]
failed --> [*]
canceled --> [*]
rejected --> [*]
unknown --> working: Statuswiederherstellung
unknown --> failed: Wiederherstellung unmöglich
Nachrichtenteil-Typ-Hierarchiediagramm
flowchart TD
Part["Part<br/>Nachrichtenteil-Basisklasse"]
Part --> TextPart["TextPart<br/>Textteil<br/>kind: text"]
Part --> FilePart["FilePart<br/>Dateiteil<br/>kind: file"]
Part --> DataPart["DataPart<br/>Datenteil<br/>kind: data"]
FilePart --> FileContent{"Dateiinhalt"}
FileContent --> FileWithBytes["FileWithBytes<br/>Enthält base64-Byte-Daten"]
FileContent --> FileWithUri["FileWithUri<br/>Enthält Datei-URI"]
TextPart --> TextContent["text: str<br/>Textinhalt"]
DataPart --> DataContent["data: dict[str, Any]<br/>Strukturierte Daten"]
FileWithBytes --> BytesContent["bytes: str<br/>base64-kodierter Inhalt"]
FileWithUri --> UriContent["uri: str<br/>Datei-URL"]
%% Gemeinsame Eigenschaften
Part --> Metadata["metadata: dict[str, Any]<br/>Optionale Metadaten"]
FileWithBytes --> FileMetadata["name: str<br/>mimeType: str<br/>Dateimetadaten"]
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
Sicherheitsschema-Typdiagramm
flowchart TD
SecurityScheme["SecurityScheme<br/>Sicherheitsschema-Union-Typ"]
SecurityScheme --> APIKeySecurityScheme["APIKeySecurityScheme<br/>API-Schlüssel-Authentifizierung<br/>type: apiKey"]
SecurityScheme --> HTTPAuthSecurityScheme["HTTPAuthSecurityScheme<br/>HTTP-Authentifizierung<br/>type: http"]
SecurityScheme --> OAuth2SecurityScheme["OAuth2SecurityScheme<br/>OAuth2-Authentifizierung<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
Fehlercode-Zuordnungstabelle
Fehlercode | Fehlertyp | Beschreibung | Anwendungsfall |
---|---|---|---|
-32700 | JSONParseError | JSON-Parsing-Fehler | Ungültiges JSON-Format |
-32600 | InvalidRequestError | Ungültige Anfrage | Anfrageformat entspricht nicht der Spezifikation |
-32601 | MethodNotFoundError | Methode nicht gefunden | Aufruf nicht existierender Methode |
-32602 | InvalidParamsError | Ungültige Parameter | Methodenparameter nicht korrekt |
-32603 | InternalError | Interner Fehler | Server-interner Verarbeitungsfehler |
-32001 | TaskNotFoundError | Aufgabe nicht gefunden | Angeforderte Aufgaben-ID existiert nicht |
-32002 | TaskNotCancelableError | Aufgabe nicht abbrechbar | Aufgabenstatus erlaubt keine Stornierung |
-32003 | PushNotificationNotSupportedError | Push-Benachrichtigung nicht unterstützt | Agent unterstützt keine Push-Benachrichtigungen |
-32004 | UnsupportedOperationError | Operation nicht unterstützt | Agent unterstützt angeforderte Operation nicht |
-32005 | ContentTypeNotSupportedError | Inhaltstyp nicht unterstützt | Angeforderter Inhaltstyp entspricht nicht den Agentenfähigkeiten |
-32006 | InvalidAgentResponseError | Ungültige Agentenantwort | Agent hat Antwort mit falschem Format zurückgegeben |
Liste unterstützter Methoden
Das A2A-Protokoll definiert die folgenden Standardmethoden:
Nachrichtenbezogene Methoden
message/send
- Nachricht an Agent sendenmessage/stream
- Streaming-Nachricht an Agent senden
Aufgabenbezogene Methoden
tasks/get
- Aufgabendetails abrufentasks/cancel
- Aufgabe abbrechentasks/resubscribe
- Aufgaben-Updates erneut abonnieren
Push-Benachrichtigungskonfigurationsmethoden
tasks/pushNotificationConfig/set
- Push-Benachrichtigungskonfiguration festlegentasks/pushNotificationConfig/get
- Push-Benachrichtigungskonfiguration abrufentasks/pushNotificationConfig/list
- Push-Benachrichtigungskonfigurationen auflistentasks/pushNotificationConfig/delete
- Push-Benachrichtigungskonfiguration löschen
Verwendungsbeispiele
1. Einfache Textnachricht senden
from a2a.types import SendMessageRequest, MessageSendParams, Message, TextPart, Part
# Textnachrichtenteil erstellen
text_part = TextPart(text="Hallo, wie kann ich Ihnen helfen?")
part = Part(root=text_part)
# Nachricht erstellen
message = Message(
messageId="msg-001",
role="user",
parts=[part]
)
# Sendungsparameter erstellen
params = MessageSendParams(message=message)
# Anfrage erstellen
request = SendMessageRequest(
id="req-001",
params=params
)
2. Nachricht mit Datei senden
from a2a.types import FilePart, FileWithBytes
import base64
# Datei lesen und kodieren
with open("document.pdf", "rb") as f:
file_bytes = base64.b64encode(f.read()).decode()
# Dateiteil erstellen
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)
# Nachricht mit Datei erstellen
message = Message(
messageId="msg-002",
role="user",
parts=[part]
)
3. Aufgabenstatus-Abfrage
from a2a.types import GetTaskRequest, TaskQueryParams
# Aufgabenabfrageanfrage erstellen
request = GetTaskRequest(
id="req-002",
params=TaskQueryParams(
id="task-001",
historyLength=10 # Neueste 10 Nachrichtenverlauf abrufen
)
)
4. Push-Benachrichtigungskonfiguration
from a2a.types import (
SetTaskPushNotificationConfigRequest,
TaskPushNotificationConfig,
PushNotificationConfig,
PushNotificationAuthenticationInfo
)
# Push-Benachrichtigungskonfiguration erstellen
push_config = PushNotificationConfig(
url="https://my-app.com/webhook/task-updates",
authentication=PushNotificationAuthenticationInfo(
schemes=["Bearer"],
credentials="my-auth-token"
)
)
# Aufgaben-Push-Konfiguration erstellen
task_push_config = TaskPushNotificationConfig(
taskId="task-001",
pushNotificationConfig=push_config
)
# Konfigurationsanfrage erstellen
request = SetTaskPushNotificationConfigRequest(
id="req-003",
params=task_push_config
)
Best Practices
1. Fehlerbehandlung
- Immer das Fehlerfeld der Antwort überprüfen
- Angemessene Wiederholungsstrategie basierend auf Fehlercode implementieren
- Aussagekräftige Fehlermeldungen für Benutzer bereitstellen
2. Aufgabenverwaltung
- Push-Benachrichtigungen anstelle von Polling für Aufgaben-Updates verwenden
- Aufgaben-Timeout-Mechanismus implementieren
- Aufgaben-IDs für spätere Abfragen speichern
3. Sicherheit
- HTTPS-Transport verwenden
- Authentifizierungsschemata ordnungsgemäß implementieren
- API-Schlüssel und Token regelmäßig rotieren
4. Leistungsoptimierung
- Streaming für große Antwortverarbeitung verwenden
- Nachrichtenverlaufslänge begrenzen
- Client-seitiges Caching implementieren
Erweiterbarkeit
Das A2A-Protokoll unterstützt Erweiterungen durch die folgenden Mechanismen:
- Agentenerweiterungen - Benutzerdefinierte Fähigkeiten über
AgentExtension
deklarieren - Metadatenfelder - Die meisten Objekte enthalten ein optionales
metadata
-Feld - Benutzerdefinierte Transportprotokolle - Unterstützung neuer Transportmethoden über
AgentInterface
- Erweiterungs-URIs - Referenzierung von Erweiterungsspezifikationen in Nachrichten und Artefakten
Zusammenfassung
Das A2A-Protokoll bietet ein umfassendes Framework für Kommunikation und Zusammenarbeit zwischen intelligenten Agenten. Basierend auf JSON-RPC 2.0 bietet es standardisierte Nachrichtenübertragung, Aufgabenverwaltung, Sicherheitsauthentifizierung und Erweiterungsmechanismen.
Hauptmerkmale:
- Standardisierte Kommunikation: JSON-RPC 2.0-basiertes Anfrage-Antwort-Muster
- Reiche Inhaltsunterstützung: Unterstützung für Text, Dateien und strukturierte Daten
- Flexible Sicherheit: Unterstützung mehrerer Authentifizierungsmethoden
- Echtzeit-Updates: Push-Benachrichtigungsmechanismus
- Robuste Fehlerbehandlung: Umfassende Fehlercodes und Nachrichten
- Gute Erweiterbarkeit: Erweiterungsmechanismen und Metadatenunterstützung
Dieses Protokoll bietet Entwicklern eine solide Grundlage für den Aufbau leistungsstarker agentenbasierter Anwendungen.