chore: a2a agent card docs, refine existing a2a docs

This commit is contained in:
Greyson LaLonde
2026-01-14 22:46:53 -05:00
committed by GitHub
parent 22f1812824
commit 641c336b2c
2 changed files with 189 additions and 48 deletions

View File

@@ -1,43 +1,48 @@
--- ---
title: Agent-to-Agent (A2A) Protocol title: Agent-to-Agent (A2A) Protocol
description: Enable CrewAI agents to delegate tasks to remote A2A-compliant agents for specialized handling description: Agents delegate tasks to remote A2A agents and/or operate as A2A-compliant server agents.
icon: network-wired icon: network-wired
mode: "wide" mode: "wide"
--- ---
## A2A Agent Delegation ## A2A Agent Delegation
CrewAI supports the Agent-to-Agent (A2A) protocol, allowing agents to delegate tasks to remote specialized agents. The agent's LLM automatically decides whether to handle a task directly or delegate to an A2A agent based on the task requirements. CrewAI treats [A2A protocol](https://a2a-protocol.org/latest/) as a first-class delegation primitive, enabling agents to delegate tasks, request information, and collaborate with remote agents, as well as act as A2A-compliant server agents.
In client mode, agents autonomously choose between local execution and remote delegation based on task requirements.
<Note>
A2A delegation requires the `a2a-sdk` package. Install with: `uv add 'crewai[a2a]'` or `pip install 'crewai[a2a]'`
</Note>
## How It Works ## How It Works
When an agent is configured with A2A capabilities: When an agent is configured with A2A capabilities:
1. The LLM analyzes each task 1. The Agent analyzes each task
2. It decides to either: 2. It decides to either:
- Handle the task directly using its own capabilities - Handle the task directly using its own capabilities
- Delegate to a remote A2A agent for specialized handling - Delegate to a remote A2A agent for specialized handling
3. If delegating, the agent communicates with the remote A2A agent through the protocol 3. If delegating, the agent communicates with the remote A2A agent through the protocol
4. Results are returned to the CrewAI workflow 4. Results are returned to the CrewAI workflow
<Note>
A2A delegation requires the `a2a-sdk` package. Install with: `uv add 'crewai[a2a]'` or `pip install 'crewai[a2a]'`
</Note>
## Basic Configuration ## Basic Configuration
<Warning>
`crewai.a2a.config.A2AConfig` is deprecated and will be removed in v2.0.0. Use `A2AClientConfig` for connecting to remote agents and/or `A2AServerConfig` for exposing agents as servers.
</Warning>
Configure an agent for A2A delegation by setting the `a2a` parameter: Configure an agent for A2A delegation by setting the `a2a` parameter:
```python Code ```python Code
from crewai import Agent, Crew, Task from crewai import Agent, Crew, Task
from crewai.a2a import A2AConfig from crewai.a2a import A2AClientConfig
agent = Agent( agent = Agent(
role="Research Coordinator", role="Research Coordinator",
goal="Coordinate research tasks efficiently", goal="Coordinate research tasks efficiently",
backstory="Expert at delegating to specialized research agents", backstory="Expert at delegating to specialized research agents",
llm="gpt-4o", llm="gpt-4o",
a2a=A2AConfig( a2a=A2AClientConfig(
endpoint="https://example.com/.well-known/agent-card.json", endpoint="https://example.com/.well-known/agent-card.json",
timeout=120, timeout=120,
max_turns=10 max_turns=10
@@ -54,9 +59,9 @@ crew = Crew(agents=[agent], tasks=[task], verbose=True)
result = crew.kickoff() result = crew.kickoff()
``` ```
## Configuration Options ## Client Configuration Options
The `A2AConfig` class accepts the following parameters: The `A2AClientConfig` class accepts the following parameters:
<ParamField path="endpoint" type="str" required> <ParamField path="endpoint" type="str" required>
The A2A agent endpoint URL (typically points to `.well-known/agent-card.json`) The A2A agent endpoint URL (typically points to `.well-known/agent-card.json`)
@@ -95,14 +100,30 @@ The `A2AConfig` class accepts the following parameters:
Transport protocol for A2A communication. Options: `JSONRPC` (default), `GRPC`, or `HTTP+JSON`. Transport protocol for A2A communication. Options: `JSONRPC` (default), `GRPC`, or `HTTP+JSON`.
</ParamField> </ParamField>
<ParamField path="accepted_output_modes" type="list[str]" default='["application/json"]'>
Media types the client can accept in responses.
</ParamField>
<ParamField path="supported_transports" type="list[str]" default='["JSONRPC"]'>
Ordered list of transport protocols the client supports.
</ParamField>
<ParamField path="use_client_preference" type="bool" default="False">
Whether to prioritize client transport preferences over server.
</ParamField>
<ParamField path="extensions" type="list[str]" default="[]">
Extension URIs the client supports.
</ParamField>
## Authentication ## Authentication
For A2A agents that require authentication, use one of the provided auth schemes: For A2A agents that require authentication, use one of the provided auth schemes:
<Tabs> <Tabs>
<Tab title="Bearer Token"> <Tab title="Bearer Token">
```python Code ```python bearer_token_auth.py lines
from crewai.a2a import A2AConfig from crewai.a2a import A2AClientConfig
from crewai.a2a.auth import BearerTokenAuth from crewai.a2a.auth import BearerTokenAuth
agent = Agent( agent = Agent(
@@ -110,18 +131,18 @@ agent = Agent(
goal="Coordinate tasks with secured agents", goal="Coordinate tasks with secured agents",
backstory="Manages secure agent communications", backstory="Manages secure agent communications",
llm="gpt-4o", llm="gpt-4o",
a2a=A2AConfig( a2a=A2AClientConfig(
endpoint="https://secure-agent.example.com/.well-known/agent-card.json", endpoint="https://secure-agent.example.com/.well-known/agent-card.json",
auth=BearerTokenAuth(token="your-bearer-token"), auth=BearerTokenAuth(token="your-bearer-token"),
timeout=120 timeout=120
) )
) )
``` ```
</Tab> </Tab>
<Tab title="API Key"> <Tab title="API Key">
```python Code ```python api_key_auth.py lines
from crewai.a2a import A2AConfig from crewai.a2a import A2AClientConfig
from crewai.a2a.auth import APIKeyAuth from crewai.a2a.auth import APIKeyAuth
agent = Agent( agent = Agent(
@@ -129,7 +150,7 @@ agent = Agent(
goal="Coordinate with API-based agents", goal="Coordinate with API-based agents",
backstory="Manages API-authenticated communications", backstory="Manages API-authenticated communications",
llm="gpt-4o", llm="gpt-4o",
a2a=A2AConfig( a2a=A2AClientConfig(
endpoint="https://api-agent.example.com/.well-known/agent-card.json", endpoint="https://api-agent.example.com/.well-known/agent-card.json",
auth=APIKeyAuth( auth=APIKeyAuth(
api_key="your-api-key", api_key="your-api-key",
@@ -139,12 +160,12 @@ agent = Agent(
timeout=120 timeout=120
) )
) )
``` ```
</Tab> </Tab>
<Tab title="OAuth2"> <Tab title="OAuth2">
```python Code ```python oauth2_auth.py lines
from crewai.a2a import A2AConfig from crewai.a2a import A2AClientConfig
from crewai.a2a.auth import OAuth2ClientCredentials from crewai.a2a.auth import OAuth2ClientCredentials
agent = Agent( agent = Agent(
@@ -152,7 +173,7 @@ agent = Agent(
goal="Coordinate with OAuth-secured agents", goal="Coordinate with OAuth-secured agents",
backstory="Manages OAuth-authenticated communications", backstory="Manages OAuth-authenticated communications",
llm="gpt-4o", llm="gpt-4o",
a2a=A2AConfig( a2a=A2AClientConfig(
endpoint="https://oauth-agent.example.com/.well-known/agent-card.json", endpoint="https://oauth-agent.example.com/.well-known/agent-card.json",
auth=OAuth2ClientCredentials( auth=OAuth2ClientCredentials(
token_url="https://auth.example.com/oauth/token", token_url="https://auth.example.com/oauth/token",
@@ -163,12 +184,12 @@ agent = Agent(
timeout=120 timeout=120
) )
) )
``` ```
</Tab> </Tab>
<Tab title="HTTP Basic"> <Tab title="HTTP Basic">
```python Code ```python http_basic_auth.py lines
from crewai.a2a import A2AConfig from crewai.a2a import A2AClientConfig
from crewai.a2a.auth import HTTPBasicAuth from crewai.a2a.auth import HTTPBasicAuth
agent = Agent( agent = Agent(
@@ -176,7 +197,7 @@ agent = Agent(
goal="Coordinate with basic auth agents", goal="Coordinate with basic auth agents",
backstory="Manages basic authentication communications", backstory="Manages basic authentication communications",
llm="gpt-4o", llm="gpt-4o",
a2a=A2AConfig( a2a=A2AClientConfig(
endpoint="https://basic-agent.example.com/.well-known/agent-card.json", endpoint="https://basic-agent.example.com/.well-known/agent-card.json",
auth=HTTPBasicAuth( auth=HTTPBasicAuth(
username="your-username", username="your-username",
@@ -185,7 +206,7 @@ agent = Agent(
timeout=120 timeout=120
) )
) )
``` ```
</Tab> </Tab>
</Tabs> </Tabs>
@@ -194,7 +215,7 @@ agent = Agent(
Configure multiple A2A agents for delegation by passing a list: Configure multiple A2A agents for delegation by passing a list:
```python Code ```python Code
from crewai.a2a import A2AConfig from crewai.a2a import A2AClientConfig
from crewai.a2a.auth import BearerTokenAuth from crewai.a2a.auth import BearerTokenAuth
agent = Agent( agent = Agent(
@@ -203,11 +224,11 @@ agent = Agent(
backstory="Expert at delegating to the right specialist", backstory="Expert at delegating to the right specialist",
llm="gpt-4o", llm="gpt-4o",
a2a=[ a2a=[
A2AConfig( A2AClientConfig(
endpoint="https://research.example.com/.well-known/agent-card.json", endpoint="https://research.example.com/.well-known/agent-card.json",
timeout=120 timeout=120
), ),
A2AConfig( A2AClientConfig(
endpoint="https://data.example.com/.well-known/agent-card.json", endpoint="https://data.example.com/.well-known/agent-card.json",
auth=BearerTokenAuth(token="data-token"), auth=BearerTokenAuth(token="data-token"),
timeout=90 timeout=90
@@ -223,7 +244,7 @@ The LLM will automatically choose which A2A agent to delegate to based on the ta
Control how agent connection failures are handled using the `fail_fast` parameter: Control how agent connection failures are handled using the `fail_fast` parameter:
```python Code ```python Code
from crewai.a2a import A2AConfig from crewai.a2a import A2AClientConfig
# Fail immediately on connection errors (default) # Fail immediately on connection errors (default)
agent = Agent( agent = Agent(
@@ -231,7 +252,7 @@ agent = Agent(
goal="Coordinate research tasks", goal="Coordinate research tasks",
backstory="Expert at delegation", backstory="Expert at delegation",
llm="gpt-4o", llm="gpt-4o",
a2a=A2AConfig( a2a=A2AClientConfig(
endpoint="https://research.example.com/.well-known/agent-card.json", endpoint="https://research.example.com/.well-known/agent-card.json",
fail_fast=True fail_fast=True
) )
@@ -244,11 +265,11 @@ agent = Agent(
backstory="Expert at working with available resources", backstory="Expert at working with available resources",
llm="gpt-4o", llm="gpt-4o",
a2a=[ a2a=[
A2AConfig( A2AClientConfig(
endpoint="https://primary.example.com/.well-known/agent-card.json", endpoint="https://primary.example.com/.well-known/agent-card.json",
fail_fast=False fail_fast=False
), ),
A2AConfig( A2AClientConfig(
endpoint="https://backup.example.com/.well-known/agent-card.json", endpoint="https://backup.example.com/.well-known/agent-card.json",
fail_fast=False fail_fast=False
) )
@@ -267,8 +288,8 @@ Control how your agent receives task status updates from remote A2A agents:
<Tabs> <Tabs>
<Tab title="Streaming (Default)"> <Tab title="Streaming (Default)">
```python Code ```python streaming_config.py lines
from crewai.a2a import A2AConfig from crewai.a2a import A2AClientConfig
from crewai.a2a.updates import StreamingConfig from crewai.a2a.updates import StreamingConfig
agent = Agent( agent = Agent(
@@ -276,17 +297,17 @@ agent = Agent(
goal="Coordinate research tasks", goal="Coordinate research tasks",
backstory="Expert at delegation", backstory="Expert at delegation",
llm="gpt-4o", llm="gpt-4o",
a2a=A2AConfig( a2a=A2AClientConfig(
endpoint="https://research.example.com/.well-known/agent-card.json", endpoint="https://research.example.com/.well-known/agent-card.json",
updates=StreamingConfig() updates=StreamingConfig()
) )
) )
``` ```
</Tab> </Tab>
<Tab title="Polling"> <Tab title="Polling">
```python Code ```python polling_config.py lines
from crewai.a2a import A2AConfig from crewai.a2a import A2AClientConfig
from crewai.a2a.updates import PollingConfig from crewai.a2a.updates import PollingConfig
agent = Agent( agent = Agent(
@@ -294,7 +315,7 @@ agent = Agent(
goal="Coordinate research tasks", goal="Coordinate research tasks",
backstory="Expert at delegation", backstory="Expert at delegation",
llm="gpt-4o", llm="gpt-4o",
a2a=A2AConfig( a2a=A2AClientConfig(
endpoint="https://research.example.com/.well-known/agent-card.json", endpoint="https://research.example.com/.well-known/agent-card.json",
updates=PollingConfig( updates=PollingConfig(
interval=2.0, interval=2.0,
@@ -303,12 +324,12 @@ agent = Agent(
) )
) )
) )
``` ```
</Tab> </Tab>
<Tab title="Push Notifications"> <Tab title="Push Notifications">
```python Code ```python push_notifications_config.py lines
from crewai.a2a import A2AConfig from crewai.a2a import A2AClientConfig
from crewai.a2a.updates import PushNotificationConfig from crewai.a2a.updates import PushNotificationConfig
agent = Agent( agent = Agent(
@@ -316,19 +337,137 @@ agent = Agent(
goal="Coordinate research tasks", goal="Coordinate research tasks",
backstory="Expert at delegation", backstory="Expert at delegation",
llm="gpt-4o", llm="gpt-4o",
a2a=A2AConfig( a2a=A2AClientConfig(
endpoint="https://research.example.com/.well-known/agent-card.json", endpoint="https://research.example.com/.well-known/agent-card.json",
updates=PushNotificationConfig( updates=PushNotificationConfig(
url={base_url}/a2a/callback", url="{base_url}/a2a/callback",
token="your-validation-token", token="your-validation-token",
timeout=300.0 timeout=300.0
) )
) )
) )
``` ```
</Tab> </Tab>
</Tabs> </Tabs>
## Exposing Agents as A2A Servers
You can expose your CrewAI agents as A2A-compliant servers, allowing other A2A clients to delegate tasks to them.
### Server Configuration
Add an `A2AServerConfig` to your agent to enable server capabilities:
```python a2a_server_agent.py lines
from crewai import Agent
from crewai.a2a import A2AServerConfig
agent = Agent(
role="Data Analyst",
goal="Analyze datasets and provide insights",
backstory="Expert data scientist with statistical analysis skills",
llm="gpt-4o",
a2a=A2AServerConfig(url="https://your-server.com")
)
```
### Server Configuration Options
<ParamField path="name" type="str" default="None">
Human-readable name for the agent. Defaults to the agent's role if not provided.
</ParamField>
<ParamField path="description" type="str" default="None">
Human-readable description. Defaults to the agent's goal and backstory if not provided.
</ParamField>
<ParamField path="version" type="str" default="1.0.0">
Version string for the agent card.
</ParamField>
<ParamField path="skills" type="list[AgentSkill]" default="[]">
List of agent skills. Auto-generated from agent tools if not provided.
</ParamField>
<ParamField path="capabilities" type="AgentCapabilities" default="AgentCapabilities(streaming=True, push_notifications=False)">
Declaration of optional capabilities supported by the agent.
</ParamField>
<ParamField path="default_input_modes" type="list[str]" default='["text/plain", "application/json"]'>
Supported input MIME types.
</ParamField>
<ParamField path="default_output_modes" type="list[str]" default='["text/plain", "application/json"]'>
Supported output MIME types.
</ParamField>
<ParamField path="url" type="str" default="None">
Preferred endpoint URL. If set, overrides the URL passed to `to_agent_card()`.
</ParamField>
<ParamField path="preferred_transport" type="Literal['JSONRPC', 'GRPC', 'HTTP+JSON']" default="JSONRPC">
Transport protocol for the preferred endpoint.
</ParamField>
<ParamField path="protocol_version" type="str" default="0.3">
A2A protocol version this agent supports.
</ParamField>
<ParamField path="provider" type="AgentProvider" default="None">
Information about the agent's service provider.
</ParamField>
<ParamField path="documentation_url" type="str" default="None">
URL to the agent's documentation.
</ParamField>
<ParamField path="icon_url" type="str" default="None">
URL to an icon for the agent.
</ParamField>
<ParamField path="additional_interfaces" type="list[AgentInterface]" default="[]">
Additional supported interfaces (transport and URL combinations).
</ParamField>
<ParamField path="security" type="list[dict[str, list[str]]]" default="[]">
Security requirement objects for all agent interactions.
</ParamField>
<ParamField path="security_schemes" type="dict[str, SecurityScheme]" default="{}">
Security schemes available to authorize requests.
</ParamField>
<ParamField path="supports_authenticated_extended_card" type="bool" default="False">
Whether agent provides extended card to authenticated users.
</ParamField>
<ParamField path="signatures" type="list[AgentCardSignature]" default="[]">
JSON Web Signatures for the AgentCard.
</ParamField>
### Combined Client and Server
An agent can act as both client and server by providing both configurations:
```python Code
from crewai import Agent
from crewai.a2a import A2AClientConfig, A2AServerConfig
agent = Agent(
role="Research Coordinator",
goal="Coordinate research and serve analysis requests",
backstory="Expert at delegation and analysis",
llm="gpt-4o",
a2a=[
A2AClientConfig(
endpoint="https://specialist.example.com/.well-known/agent-card.json",
timeout=120
),
A2AServerConfig(url="https://your-server.com")
]
)
```
## Best Practices ## Best Practices
<CardGroup cols={2}> <CardGroup cols={2}>

View File

@@ -1,8 +1,10 @@
"""Agent-to-Agent (A2A) protocol communication module for CrewAI.""" """Agent-to-Agent (A2A) protocol communication module for CrewAI."""
from crewai.a2a.config import A2AConfig from crewai.a2a.config import A2AClientConfig, A2AConfig, A2AServerConfig
__all__ = [ __all__ = [
"A2AClientConfig",
"A2AConfig", "A2AConfig",
"A2AServerConfig",
] ]