
Клонирование кода
git clone https://github.com/google-a2a/a2a-samples
cd a2a-samples/samples/java
Этот проект представляет собой пример реализации протокола Agent2Agent (A2A) на Java, предоставляющий полные клиентские и серверные SDK, а также демонстрационное приложение сервиса перевода с использованием ИИ.
Архитектура проекта
Этот проект использует многомодульную архитектуру Maven, содержащую следующие три основных модуля:
samples/java/
├── model/ # Модели данных протокола A2A
├── server/ # A2A Server SDK и сервис перевода
├── client/ # A2A Client SDK и примеры кода
└── pom.xml # Родительский файл конфигурации Maven
Детали модулей
🎯 Модуль Model (model/)
Основные модели данных для протокола A2A, предоставляющие полные структуры данных для JSON-RPC 2.0 и протокола A2A:
- Модели сообщений:
Message,Part,TextPart,Artifact - Модели задач:
Task,TaskStatus,TaskState - Модели агентов:
AgentCard,AgentCapabilities,AgentSkill - Модели JSON-RPC:
JSONRPCRequest,JSONRPCResponse,JSONRPCError - Модели событий:
TaskStatusUpdateEvent,TaskArtifactUpdateEvent
🚀 Модуль Server (server/)
A2A серверный SDK на основе Spring Boot, интегрированный с фреймворком Spring AI:
-
Основные компоненты:
A2AServer: Основной серверный класс, управляющий поведением агентаA2AController: REST-контроллер, реализующий конечные точки протокола A2ATaskHandler: Интерфейс обработки задачA2AServerConfiguration: Конфигурация AI-бота для перевода
-
Ключевые функции:
- Полная поддержка JSON-RPC 2.0
- Публикация карточки агента (
/.well-known/agent-card) - Управление задачами (отправка, запрос, отмена)
- Поддержка потоковых ответов (Server-Sent Events)
- Интеграция Spring AI с поддержкой OpenAI и других моделей
📱 Модуль Client (client/)
Чистый Java A2A клиентский SDK с примерами клиента перевода:
-
Основные компоненты:
A2AClient: Основной клиентский класс, обрабатывающий все операции A2AStreamingEventListener: Интерфейс слушателя потоковых событийA2AClientException: Обработка исключений, специфичных для A2AA2AClientExample: Полный пример клиента перевода
-
Ключевые функции:
- Реализация клиента JSON-RPC 2.0
- Обнаружение агентов и запрос возможностей
- Синхронные/асинхронные операции с задачами
- Обработка потоковых ответов
- Пулинг соединений и восстановление после ошибок
Реализация основной функциональности
🤖 Сервис AI-перевода
Проект реализует интеллектуального агента перевода, поддерживающего многоязычный перевод:
Логика перевода:
- Китайский → Английский
- Английский → Китайский
- Другие языки → Английский
Технические особенности:
- Основан на Spring AI ChatClient
- Поддерживает OpenAI, Azure OpenAI и другие модели
- Контекстно-зависимый перевод естественного языка
- Потоковые ответы в реальном времени
🔄 Реализация протокола A2A
Полная реализация спецификаций протокола A2A:
Основные операции:
tasks/send: Отправка сообщений задачtasks/get: Запрос статуса задачиtasks/cancel: Отмена выполнения задачи
Функции протокола:
- Коммуникация JSON-RPC 2.0
- Обнаружение возможностей агента
- Отслеживание статуса задач
- Потоковая отправка событий
- Стандартизированные коды ошибок
📡 Механизмы коммуникации
Синхронная коммуникация:
- HTTP POST
/a2a- Стандартные JSON-RPC запросы - HTTP GET
/.well-known/agent-card- Получение информации об агенте
Потоковая коммуникация:
- HTTP POST
/a2a/stream- Server-Sent Events - Обновления статуса задач в реальном времени
- Автоматическое переподключение и восстановление после ошибок
Как запустить
Требования
- Java: 17 или выше
Шаг 1: Компиляция проекта
Выполните компиляцию в корневой директории проекта:
cd samples/java
./mvnw clean install -DskipTests
Шаг 2: Настройка переменных окружения
Установите переменные окружения, связанные с AI-моделью (необходимо для функциональности перевода):
# Конфигурация OpenAI
export OPENAI_API_KEY="your-openai-api-key"
export OPENAI_BASE_URL="https://api.openai.com"
export OPENAI_CHAT_MODEL="gpt-4o"
# Или конфигурация GCP OpenAI
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
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"
Обратите внимание на OPENAI_BASE_URL, в URL нет /v1.
Шаг 3: Запуск сервера перевода
Запустите A2A сервер перевода:
cd server
../mvnw spring-boot:run
Сервер запустится на http://localhost:8080, предоставляя следующие конечные точки:
http://localhost:8080/.well-known/agent-card- Информация об агентеhttp://localhost:8080/a2a- Конечная точка протокола A2Ahttp://localhost:8080/a2a/stream- Потоковая конечная точка
Валидация карточки агента:
- Валидатор протокола A2A
- Руководство: Как валидировать карточку агента
Шаг 4: Запуск клиента перевода
В новом окне терминала запустите пример клиента:
cd client
../mvnw exec:java -Dexec.mainClass="com.google.a2a.client.A2AClientExample"
Диаграмма последовательности
Следующая диаграмма последовательности иллюстрирует полный поток взаимодействия примера приложения A2A Java, основанного на 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
%% 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: Вывод информации об агенте
%% 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: Вывод результата перевода
%% 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: Вывод результата перевода
%% 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 (прогресс перевода)
Client-->>Example: onEvent(event)
Note over Example: Вывод событий перевода в реальном времени
end
Server-->>Client: SSE Complete
deactivate Server
Client-->>Example: onComplete()
Note over Example: Потоковый перевод завершен
%% 6. Query Task Status
Example->>Client: getTask(queryParams)
Note right of Example: Запрос статуса задачи французского перевода
Client->>Server: POST /a2a<br/>JSON-RPC: tasks/get
Server-->>Client: Task (обновленный статус)
Client-->>Example: JSONRPCResponse<Task>
Note over Example: Вывод статуса задачи
%% 7. Send Task to be Canceled
Example->>Client: sendTask(cancelParams)
Note right of Example: TextPart: "Diese Übersetzung<br/>wird abgebrochen." (немецкий)
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 (статус отменен)
Client-->>Example: JSONRPCResponse<Task>
Note over Example: Вывод результата отмены
deactivate Client
Note over Example,Server: Выполнение примера программы завершено
Ключевые паттерны взаимодействия
Диаграмма последовательности демонстрирует следующие основные паттерны взаимодействия:
- Инициализация клиента: Создание экземпляра
A2AClient, подключенного к локальному серверу - Обнаружение агента: Получение информации об агенте через конечную точку
/.well-known/agent-card - Примеры многоязычного перевода:
- Французский → Китайский перевод
- Китайский → Английский перевод
- Немецкий → Английский потоковый перевод
- Управление задачами:
- Запрос статуса задачи
- Отмена выполнения задачи
Механизмы коммуникации
- Синхронный перевод: Использование конечной точки
POST /a2aс JSON-RPC запросами - Потоковый перевод: Использование конечной точки
POST /a2a/streamс Server-Sent Events (SSE) - Запросы статуса: Использование метода
tasks/getдля проверки статуса выполнения задачи - Отмена задач: Использование метода
tasks/cancelдля отмены выполняющихся задач
Примеры использования API
Получение информации об агенте
curl -X GET http://localhost:8080/.well-known/agent-card \
-H "Accept: application/json"
Отправка задачи перевода
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!"
}
]
}
}
}'
Потоковый перевод
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
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.
Building an A2A Currency Agent with LangGraph
This guide provides a detailed explanation of how to build an A2A-compliant agent using LangGraph and the Google Gemini model. We'll walk through the Currency Agent example from the A2A Python SDK, explaining each component, the flow of data, and how the A2A protocol facilitates agent interactions.