Skip to main content

A2A Protocol Module

The Agent-to-Agent (A2A) module implements Google's A2A protocol for inter-agent communication and collaboration.

Overview

The A2A protocol enables:

  • Agent Discovery: Automatically find and connect to remote agents
  • Message Passing: Send messages between agents
  • Task Delegation: Delegate tasks to specialized agents
  • Capability Advertisement: Agents advertise their skills

Quick Start

from openstackai.a2a import A2AServer, A2AClient, AgentCard

# Server: Expose your agent
server = A2AServer(agent, port=8080)
server.start()

# Client: Connect to remote agent
client = A2AClient("http://remote-agent:8080")
result = await client.send("Research topic X")

Components

Protocol Types

TypeDescription
AgentCardAgent metadata and capabilities
A2AMessageMessage between agents
A2ATaskTask to be executed
A2AResponseTask execution result
TaskStatusStatus of task execution

Server Components

ComponentDescription
A2AServerHTTP server exposing agent
A2AEndpointEndpoint configuration

Client Components

ComponentDescription
A2AClientConnect to remote agents
RemoteAgentWrapper for remote agent

Registry

FunctionDescription
AgentRegistryCentral agent registry
register_agent()Register agent in registry
discover_agents()Find available agents

Architecture

┌─────────────────┐          ┌─────────────────┐
│ Agent A │ │ Agent B │
│ (A2AServer) │◄────────►│ (A2AClient) │
│ │ HTTP │ │
│ /.well-known/ │ │ │
│ agent-card │ │ │
└─────────────────┘ └─────────────────┘


┌─────────────────┐
│ AgentRegistry │
│ (Discovery) │
└─────────────────┘

Usage Patterns

1. Expose Agent as Server

from openstackai import Agent
from openstackai.a2a import A2AServer

# Create your agent
agent = Agent(
name="research-agent",
instructions="You are a research specialist."
)

# Expose via A2A
server = A2AServer(
agent=agent,
port=8080,
host="0.0.0.0"
)

# Start serving
server.start() # Blocking
# or
server.start_background() # Non-blocking

2. Connect to Remote Agent

from openstackai.a2a import A2AClient

# Connect to remote agent
client = A2AClient(
url="http://research-agent:8080",
api_key="optional-api-key"
)

# Get agent capabilities
card = client.get_card()
print(f"Agent: {card.name}")
print(f"Skills: {card.skills}")

# Send task
response = client.send(
message="Research quantum computing advances",
context={"depth": "detailed"}
)
print(response.content)

3. Multi-Agent Collaboration

from openstackai.a2a import A2AClient, discover_agents

# Discover available agents
agents = discover_agents("http://registry:8000")

# Find specialist
researcher = next(
a for a in agents
if "research" in a.skills
)

# Delegate task
client = A2AClient(researcher.url)
result = await client.send_task(
"Analyze market trends",
timeout=60.0
)

Agent Card

The Agent Card follows the A2A specification:

from openstackai.a2a import AgentCard

card = AgentCard(
name="my-agent",
description="A helpful assistant",
url="http://localhost:8080",
skills=["research", "analysis", "summarization"],
version="1.0.0",
provider="MyOrg"
)

# Serialize
data = card.to_dict()

# Endpoint: /.well-known/agent-card

Security

API Key Authentication

# Server with API key
server = A2AServer(
agent=agent,
api_key="secret-key"
)

# Client with API key
client = A2AClient(
url="http://agent:8080",
api_key="secret-key"
)

CORS Configuration

server = A2AServer(
agent=agent,
cors_origins=["https://myapp.com"]
)

See Also