
Clone Code
git clone https://github.com/google-a2a/a2a-samples
cd a2a-samples/samples/java
This project is a Java implementation example of the Agent2Agent (A2A) protocol, providing complete client and server SDKs, along with an AI-powered translation service demonstration application.
Project Architecture
This project uses a Maven multi-module architecture, containing the following three core modules:
samples/java/
├── model/ # A2A Protocol Data Models
├── server/ # A2A Server SDK & Translation Service
├── client/ # A2A Client SDK & Example Code
└── pom.xml # Parent Maven Configuration File
Module Details
🎯 Model Module (model/)
Core data models for the A2A protocol, providing complete data structures for JSON-RPC 2.0 and A2A protocol:
- Message Models:
Message,Part,TextPart,Artifact - Task Models:
Task,TaskStatus,TaskState - Agent Models:
AgentCard,AgentCapabilities,AgentSkill - JSON-RPC Models:
JSONRPCRequest,JSONRPCResponse,JSONRPCError - Event Models:
TaskStatusUpdateEvent,TaskArtifactUpdateEvent
🚀 Server Module (server/)
Spring Boot-based A2A server SDK, integrated with Spring AI framework:
-
Core Components:
A2AServer: Main server class managing agent behaviorA2AController: REST controller implementing A2A protocol endpointsTaskHandler: Task processing interfaceA2AServerConfiguration: AI translation bot configuration
-
Key Features:
- Complete JSON-RPC 2.0 support
- Agent card publishing (
/.well-known/agent-card) - Task management (send, query, cancel)
- Streaming response support (Server-Sent Events)
- Spring AI integration supporting OpenAI and other models
📱 Client Module (client/)
Pure Java A2A client SDK with translation client examples:
-
Core Components:
A2AClient: Main client class handling all A2A operationsStreamingEventListener: Streaming event listener interfaceA2AClientException: A2A-specific exception handlingA2AClientExample: Complete translation client example
-
Key Features:
- JSON-RPC 2.0 client implementation
- Agent discovery and capability querying
- Synchronous/asynchronous task operations
- Streaming response handling
- Connection pooling and error recovery
Core Functionality Implementation
🤖 AI Translation Service
The project implements an intelligent translation agent supporting multi-language translation:
Translation Logic:
- Chinese → English
- English → Chinese
- Other languages → English
Technical Features:
- Based on Spring AI ChatClient
- Supports OpenAI, Azure OpenAI, and other models
- Context-aware natural language translation
- Real-time streaming responses
🔄 A2A Protocol Implementation
Complete implementation of A2A protocol specifications:
Core Operations:
tasks/send: Send task messagestasks/get: Query task statustasks/cancel: Cancel task execution
Protocol Features:
- JSON-RPC 2.0 communication
- Agent capability discovery
- Task status tracking
- Streaming event push
- Standardized error codes
📡 Communication Mechanisms
Synchronous Communication:
- HTTP POST
/a2a- Standard JSON-RPC requests - HTTP GET
/.well-known/agent-card- Agent information retrieval
Streaming Communication:
- HTTP POST
/a2a/stream- Server-Sent Events - Real-time task status updates
- Automatic reconnection and error recovery
How to Run
Requirements
- Java: 17 or higher
Step 1: Compile the Project
Execute compilation in the project root directory:
cd samples/java
./mvnw clean install -DskipTests
Step 2: Configure Environment Variables
Set AI model-related environment variables (required for translation functionality):
# OpenAI Configuration
export OPENAI_API_KEY="your-openai-api-key"
export OPENAI_BASE_URL="https://api.openai.com"
export OPENAI_CHAT_MODEL="gpt-4o"
# Or GCP OpenAI Configuration
export OPENAI_API_KEY="your-gcp-api-key"
export OPENAI_BASE_URL="https://{location}-aiplatform.googleapis.com/v1/projects/{project_id}/locations/{location}/endpoints/openapi"
export OPENAI_CHAT_MODEL="gemini-2.5-pro-preview-05-06"
OpenRouter Configuration
export OPENAI_API_KEY="sk-or-v1-"
export OPENAI_BASE_URL="https://openrouter.ai/api"
export OPENAI_CHAT_MODEL="openai/gpt-4o-2024-11-20"
Pay attention to OPENAI_BASE_URL, there is no /v1 in the URL.
Step 3: Start the Translation Server
Start the A2A translation server:
cd server
../mvnw spring-boot:run
The server will start at http://localhost:8080, providing the following endpoints:
http://localhost:8080/.well-known/agent-card- Agent informationhttp://localhost:8080/a2a- A2A protocol endpointhttp://localhost:8080/a2a/stream- Streaming endpoint
Validate the Agent Card:
Step 4: Run the Translation Client
In a new terminal window, run the client example:
cd client
../mvnw exec:java -Dexec.mainClass="com.google.a2a.client.A2AClientExample"
Sequence Diagram
The following sequence diagram illustrates the complete interaction flow of the A2A Java sample application, based on the A2AClientExample.java:
sequenceDiagram
participant Example as A2AClientExample
participant Client as A2AClient
participant Server as A2A Server<br/>(localhost:8080)
Note over Example,Server: A2A Java Sample Sequence Diagram
%% 1. Initialize Client
Example->>Client: new A2AClient("http://localhost:8080")
activate Client
%% 2. Get Agent Card
Example->>Client: getAgentCard()
Client->>Server: GET /.well-known/agent-card
Server-->>Client: AgentCard (name, description, version, skills)
Client-->>Example: AgentCard
Note over Example: Print agent information
%% 3. French to Chinese Translation
Example->>Client: sendTask(frenchToChineseParams)
Note right of Example: TextPart: "Bonjour le monde!<br/>Comment allez-vous?"
Client->>Server: POST /a2a<br/>JSON-RPC: tasks/send
Server-->>Client: Task (id, status, history)
Client-->>Example: JSONRPCResponse<Task>
Note over Example: Print translation result
%% 4. Chinese to English Translation
Example->>Client: sendTask(chineseParams)
Note right of Example: TextPart: "你好,世界!<br/>欢迎使用AI翻译机器人。"
Client->>Server: POST /a2a<br/>JSON-RPC: tasks/send
Server-->>Client: Task (id, status, history)
Client-->>Example: JSONRPCResponse<Task>
Note over Example: Print translation result
%% 5. Streaming Translation
Example->>Client: sendTaskStreaming(frenchParams, StreamingEventListener)
Note right of Example: TextPart: "Bonjour le monde!<br/>Comment allez-vous?"
Client->>Server: POST /a2a/stream<br/>Server-Sent Events
activate Server
loop Streaming Response
Server-->>Client: SSE Event (translation progress)
Client-->>Example: onEvent(event)
Note over Example: Print real-time translation events
end
Server-->>Client: SSE Complete
deactivate Server
Client-->>Example: onComplete()
Note over Example: Streaming translation completed
%% 6. Query Task Status
Example->>Client: getTask(queryParams)
Note right of Example: Query French translation task status
Client->>Server: POST /a2a<br/>JSON-RPC: tasks/get
Server-->>Client: Task (updated status)
Client-->>Example: JSONRPCResponse<Task>
Note over Example: Print task status
%% 7. Send Task to be Canceled
Example->>Client: sendTask(cancelParams)
Note right of Example: TextPart: "Diese Übersetzung<br/>wird abgebrochen." (German)
Client->>Server: POST /a2a<br/>JSON-RPC: tasks/send
Server-->>Client: Task (id, status)
Client-->>Example: JSONRPCResponse<Task>
%% 8. Cancel Task
Example->>Client: cancelTask(cancelTaskParams)
Client->>Server: POST /a2a<br/>JSON-RPC: tasks/cancel
Server-->>Client: Task (canceled status)
Client-->>Example: JSONRPCResponse<Task>
Note over Example: Print cancellation result
deactivate Client
Note over Example,Server: Example program execution completed
Key Interaction Patterns
The sequence diagram demonstrates the following core interaction patterns:
- Client Initialization: Creating an
A2AClientinstance connected to the local server - Agent Discovery: Retrieving agent information via the
/.well-known/agent-cardendpoint - Multi-language Translation Examples:
- French → Chinese translation
- Chinese → English translation
- German → English streaming translation
- Task Management:
- Querying task status
- Canceling task execution
Communication Mechanisms
- Synchronous Translation: Using
POST /a2aendpoint with JSON-RPC requests - Streaming Translation: Using
POST /a2a/streamendpoint with Server-Sent Events (SSE) - Status Queries: Using
tasks/getmethod to check task execution status - Task Cancellation: Using
tasks/cancelmethod to cancel running tasks
API Usage Examples
Get Agent Information
curl -X GET http://localhost:8080/.well-known/agent-card \
-H "Accept: application/json"
Send Translation Task
curl -X POST http://localhost:8080/a2a \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": "request-1",
"method": "tasks/send",
"params": {
"id": "translation-task-1",
"message": {
"messageId": "msg-1",
"kind": "message",
"role": "user",
"parts": [
{
"kind": "text",
"text": "Hello, world!"
}
]
}
}
}'
Streaming Translation
curl -X POST http://localhost:8080/a2a/stream \
-H "Content-Type: application/json" \
-H "Accept: text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": "stream-request-1",
"method": "tasks/send",
"params": {
"id": "streaming-translation-task",
"message": {
"messageId": "stream-msg-1",
"kind": "message",
"role": "user",
"parts": [
{
"kind": "text",
"text": "Hello world!"
}
]
}
}
}'
Related Articles
Explore more content related to this topic
A2A Sample Methods and JSON Responses
Detailed guide showcasing A2A Protocol's core methods, from basic task management to advanced features like streaming and structured data handling, with practical JSON examples.
A2UI Introduction - Declarative UI Protocol for Agent-Driven Interfaces
Discover A2UI, the declarative UI protocol that enables AI agents to generate rich, interactive user interfaces. Learn how A2UI works, who it's for, how to use it, and see real-world examples from Google Opal, Gemini Enterprise, and Flutter GenUI SDK.
Agent Gateway Protocol (AGP): Practical Tutorial and Specification
Learn the Agent Gateway Protocol (AGP): what it is, problems it solves, core spec (capability announcements, intent payloads, routing and error codes), routing algorithm, and how to run a working simulation.
Integrating A2A Protocol - Intelligent Agent Communication Solution for BeeAI Framework
Using A2A protocol instead of ACP is a better choice for BeeAI, reducing protocol fragmentation and improving ecosystem integration.
A2A vs ACP Protocol Comparison Analysis Report
A2A (Agent2Agent Protocol) and ACP (Agent Communication Protocol) represent two mainstream technical approaches in AI multi-agent system communication: 'cross-platform interoperability' and 'local/edge autonomy' respectively. A2A, with its powerful cross-vendor interconnection capabilities and rich task collaboration mechanisms, has become the preferred choice for cloud-based and distributed multi-agent scenarios; while ACP, with its low-latency, local-first, cloud-independent characteristics, is suitable for privacy-sensitive, bandwidth-constrained, or edge computing environments. Both protocols have their own focus in protocol design, ecosystem construction, and standardization governance, and are expected to further converge in openness in the future. Developers are advised to choose the most suitable protocol stack based on actual business needs.