A2A Protocol Specification (Python)

Überblick

Das A2A A2A Protocoltokoll 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 senden
  • message/stream - Streaming-Nachricht an Agent senden

Aufgabenbezogene Methoden

  • tasks/get - Aufgabendetails abrufen
  • tasks/cancel - Aufgabe abbrechen
  • tasks/resubscribe - Aufgaben-Updates erneut abonnieren

Push-Benachrichtigungskonfigurationsmethoden

  • tasks/pushNotificationConfig/set - Push-Benachrichtigungskonfiguration festlegen
  • tasks/pushNotificationConfig/get - Push-Benachrichtigungskonfiguration abrufen
  • tasks/pushNotificationConfig/list - Push-Benachrichtigungskonfigurationen auflisten
  • tasks/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:

  1. Agentenerweiterungen - Benutzerdefinierte Fähigkeiten über AgentExtension deklarieren
  2. Metadatenfelder - Die meisten Objekte enthalten ein optionales metadata-Feld
  3. Benutzerdefinierte Transportprotokolle - Unterstützung neuer Transportmethoden über AgentInterface
  4. 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.

Featured Products

Tools and services from the A2A ecosystem directory.

FromFlow

The Discord bot maker your server actually needs

AINo-Code
Magic Layers

Turn any flat image into named, editable layers—separate text, subjects, decorations, and backgrounds in just a few clicks.

AIDesign
Try OC Maker

Start with a simple prompt, then let our AI OC Maker turn your idea into anime characters, fantasy OCs, roleplay avatars, and full-body character designs.

AI OC Makeroriginal character generator
LongRuay

Live Like a Millionaire for 30 Days

aientertainment
Lanta AI

Free AI Video Generator Online

AI

Related Articles

Explore more content related to this topic