Files
Holt Skinner af2ee80fde docs: Fix formatting/spelling errors in Docs (#676)
* docs: Update formatting of logging information

- Remove duplicates

* Fix formatting/spelling issues in Express Mode page

* Fix code formatting

* Rename "Google Cloud's" -> Google Cloud per branding guidelines

* Spelling fix on A2A

* Formatting fixes in a2a consuming

* Fix typo/formatting error on API Reference homepage

* Remove custom anchors in CONTRIBUTING.md because GFM doesn't support them

* Add imports to A2A Samples and update agent.json to agent-card.json

---------

Co-authored-by: Joe Fernandez <joefernandez@users.noreply.github.com>
2025-09-10 08:18:12 -07:00

257 lines
12 KiB
Markdown

# Introduction to A2A
As you build more complex agentic systems, you will find that a single agent
is often not enough. You will want to create specialized agents that can
collaborate to solve a problem. The [**Agent2Agent (A2A) Protocol**](https://a2a-protocol.org) is the
standard that allows these agents to communicate with each other.
## When to Use A2A vs. Local Sub-Agents
- **Local Sub-Agents:** These are agents that run *within the same application
process* as your main agent. They are like internal modules or libraries, used
to organize your code into logical, reusable components. Communication between
a main agent and its local sub-agents is very fast because it happens
directly in memory, without network overhead.
- **Remote Agents (A2A):** These are independent agents that run as separate
services, communicating over a network. A2A defines the standard protocol
for this communication.
Consider using **A2A** when:
- The agent you need to talk to is a **separate, standalone service** (e.g., a
specialized financial modeling agent).
- The agent is maintained by a **different team or organization**.
- You need to connect agents written in **different programming languages or
agent frameworks**.
- You want to enforce a **strong, formal contract** (the A2A protocol) between
your system's components.
### When to Use A2A: Concrete Examples
- **Integrating with a Third-Party Service:** Your main agent needs to get
real-time stock prices from an external financial data provider. This
provider exposes its data through an A2A-compatible agent.
- **Microservices Architecture:** You have a large system broken down into
smaller, independent services (e.g., an Order Processing Agent, an Inventory
Management Agent, a Shipping Agent). A2A is ideal for these services to
communicate with each other across network boundaries.
- **Cross-Language Communication:** Your core business logic is in a Python
agent, but you have a legacy system or a specialized component written in Java
that you want to integrate as an agent. A2A provides the standardized
communication layer.
- **Formal API Enforcement:** You are building a platform where different teams
contribute agents, and you need a strict contract for how these agents
interact to ensure compatibility and stability.
### When NOT to Use A2A: Concrete Examples (Prefer Local Sub-Agents)
- **Internal Code Organization:** You are breaking down a complex task within a
single agent into smaller, manageable functions or modules (e.g., a
`DataValidator` sub-agent that cleans input data before processing). These are
best handled as local sub-agents for performance and simplicity.
- **Performance-Critical Internal Operations:** A sub-agent is responsible for a
high-frequency, low-latency operation that is tightly coupled with the main
agent's execution (e.g., a `RealTimeAnalytics` sub-agent that processes data
streams within the same application).
- **Shared Memory/Context:** When sub-agents need direct access to the main
agent's internal state or shared memory for efficiency, A2A's network
overhead and serialization/deserialization would be counterproductive.
- **Simple Helper Functions:** For small, reusable pieces of logic that don't
require independent deployment or complex state management, a simple function
or class within the same agent is more appropriate than a separate A2A agent.
## The A2A Workflow in ADK: A Simplified View
Agent Development Kit (ADK) simplifies the process of building and connecting
agents using the A2A protocol. Here's a straightforward breakdown of how it
works:
1. **Making an Agent Accessible (Exposing):** You start with an existing ADK
agent that you want other agents to be able to interact with. The ADK
provides a simple way to "expose" this agent, turning it into an
**A2AServer**. This server acts as a public interface, allowing other agents
to send requests to your agent over a network. Think of it like setting up a
web server for your agent.
2. **Connecting to an Accessible Agent (Consuming):** In a separate agent
(which could be running on the same machine or a different one), you'll use
a special ADK component called `RemoteA2aAgent`. This `RemoteA2aAgent` acts
as a client that knows how to communicate with the **A2AServer** you
exposed earlier. It handles all the complexities of network communication,
authentication, and data formatting behind the scenes.
From your perspective as a developer, once you've set up this connection,
interacting with the remote agent feels just like interacting with a local tool
or function. The ADK abstracts away the network layer, making distributed agent
systems as easy to work with as local ones.
## Visualizing the A2A Workflow
To further clarify the A2A workflow, let's look at the "before and after" for
both exposing and consuming agents, and then the combined system.
### Exposing an Agent
**Before Exposing:**
Your agent code runs as a standalone component, but in this scenario, you want
to expose it so that other remote agents can interact with your agent.
```text
+-------------------+
| Your Agent Code |
| (Standalone) |
+-------------------+
```
**After Exposing:**
Your agent code is integrated with an `A2AServer` (an ADK component), making it
accessible over a network to other remote agents.
```text
+-----------------+
| A2A Server |
| (ADK Component) |<--------+
+-----------------+ |
| |
v |
+-------------------+ |
| Your Agent Code | |
| (Now Accessible) | |
+-------------------+ |
|
| (Network Communication)
v
+-----------------------------+
| Remote Agent(s) |
| (Can now communicate) |
+-----------------------------+
```
### Consuming an Agent
**Before Consuming:**
Your agent (referred to as the "Root Agent" in this context) is the application
you are developing that needs to interact with a remote agent. Before
consuming, it lacks the direct mechanism to do so.
```text
+----------------------+ +-------------------------------------------------------------+
| Root Agent | | Remote Agent |
| (Your existing code) | | (External Service that you want your Root Agent to talk to) |
+----------------------+ +-------------------------------------------------------------+
```
**After Consuming:**
Your Root Agent uses a `RemoteA2aAgent` (an ADK component that acts as a
client-side proxy for the remote agent) to establish communication with the
remote agent.
```text
+----------------------+ +-----------------------------------+
| Root Agent | | RemoteA2aAgent |
| (Your existing code) |<------->| (ADK Client Proxy) |
+----------------------+ | |
| +-----------------------------+ |
| | Remote Agent | |
| | (External Service) | |
| +-----------------------------+ |
+-----------------------------------+
(Now talks to remote agent via RemoteA2aAgent)
```
### Final System (Combined View)
This diagram shows how the consuming and exposing parts connect to form a
complete A2A system.
```text
Consuming Side:
+----------------------+ +-----------------------------------+
| Root Agent | | RemoteA2aAgent |
| (Your existing code) |<------->| (ADK Client Proxy) |
+----------------------+ | |
| +-----------------------------+ |
| | Remote Agent | |
| | (External Service) | |
| +-----------------------------+ |
+-----------------------------------+
|
| (Network Communication)
v
Exposing Side:
+-----------------+
| A2A Server |
| (ADK Component) |
+-----------------+
|
v
+-------------------+
| Your Agent Code |
| (Exposed Service) |
+-------------------+
```
## Concrete Use Case: Customer Service and Product Catalog Agents
Let's consider a practical example: a **Customer Service Agent** that needs to
retrieve product information from a separate **Product Catalog Agent**.
### Before A2A
Initially, your Customer Service Agent might not have a direct, standardized
way to query the Product Catalog Agent, especially if it's a separate service
or managed by a different team.
```text
+-------------------------+ +--------------------------+
| Customer Service Agent | | Product Catalog Agent |
| (Needs Product Info) | | (Contains Product Data) |
+-------------------------+ +--------------------------+
(No direct, standardized communication)
```
### After A2A
By using the A2A Protocol, the Product Catalog Agent can expose its
functionality as an A2A service. Your Customer Service Agent can then easily
consume this service using ADK's `RemoteA2aAgent`.
```text
+-------------------------+ +-----------------------------------+
| Customer Service Agent | | RemoteA2aAgent |
| (Your Root Agent) |<------->| (ADK Client Proxy) |
+-------------------------+ | |
| +-----------------------------+ |
| | Product Catalog Agent | |
| | (External Service) | |
| +-----------------------------+ |
+-----------------------------------+
|
| (Network Communication)
v
+-----------------+
| A2A Server |
| (ADK Component) |
+-----------------+
|
v
+------------------------+
| Product Catalog Agent |
| (Exposed Service) |
+------------------------+
```
In this setup, first, the Product Catalog Agent needs to be exposed via an A2A
Server. Then, the Customer Service Agent can simply call methods on the
`RemoteA2aAgent` as if it were a tool, and the ADK handles all the underlying
communication to the Product Catalog Agent. This allows for clear separation of
concerns and easy integration of specialized agents.
## Next Steps
Now that you understand the "why" of A2A, let's dive into the "how."
- **Continue to the next guide:**
[Quickstart: Exposing Your Agent](./quickstart-exposing.md)