Корпорація з п'ятьма підрозділами, кожен використовує свій AI-агент на різних фреймворках. Фінансовий агент на Python/LlamaIndex, юридичний на Node.js/LangChain, логістичний на Java/Semantic Kernel. Запустити єдиний портал для делегування завдань між ними — без A2A це перетворюється на підтримку N*M інтеграцій. Ми зіткнулися з цим завданням на одному з проєктів і обрали новий протокол A2A від Google. У цій статті розберемо, як ми налаштовували A2A-сервер та клієнт, і чому це рішення спрацювало.
Головна перевага A2A — стандартний Agent Card, який описує можливості агента в JSON. Це як OpenAPI, але для агентів. Завдяки цьому виявлення та делегування завдань стають тривіальними. Ми налаштували A2A під ключ за 2 дні і готові поділитися досвідом. Якщо у вас схоже завдання — пишіть, оцінимо ваш проєкт безплатно.
Які проблеми вирішує A2A?
Основний біль — різнорідність агентів. Кожна команда обирає свій стек, а інтеграція через кастомні API вимагає синхронізації контрактів, документації та обробки помилок. A2A стандартизує цей процес:
- Agent Card — єдиний опис можливостей (як OpenAPI).
- Єдиний транспорт — JSON-RPC 2.0, не залежний від мови.
- Стрімінг і пуш-повідомлення — для тривалих завдань.
Без A2A інтеграція нового агента в екосистему займає тижні, з A2A — 1 день. За нашими даними, A2A прискорює інтеграцію в 3 рази порівняно з кастомними REST API. На нашій практиці витрати на розробку знизилися на 60–70%, а інвестиції окупаються за 2–3 місяці.
Як A2A відрізняється від MCP?
MCP (Model Context Protocol) — протокол доступу до інструментів, а A2A — протокол спілкування між агентами. Вони доповнюють один одного: MCP надає контекст, A2A забезпечує координацію. В одному проєкті можна використовувати обидва.
| Параметр | A2A | MCP |
|---|---|---|
| Ціль | Комунікація між агентами | Доступ до інструментів та даних |
| Рівень | Міжагентний | Агент-інструмент |
| Транспорт | JSON-RPC 2.0 | JSON-RPC 2.0 / Streamable HTTP |
| Виявлення | Agent Card (/.well-known/) | Не вбудовано |
Які ключові концепції A2A потрібно знати?
Agent Card — JSON-документ з можливостями агента, що публікується на /.well-known/agent.json. Task — одиниця роботи зі статусами (submitted, working, completed, failed). Artifact — результат завдання (текст, файл, JSON). Push Notifications — сповіщення про зміну статусу через webhook.
Як налаштувати A2A-сервер?
- Опишіть Agent Card — JSON з ім'ям, описом, версією, навичками.
- Реалізуйте обробники завдань — для кожної навички напишіть функцію, що приймає
Taskі повертаєTaskз артефактами. - Підключіть стрімінг — якщо агент підтримує часткові результати.
- Запустіть сервер — використовуйте FastAPI з A2ARouter.
Приклад Agent Card
// GET /.well-known/agent.json
{
"name": "Financial Analysis Agent",
"description": "Агент фінансового аналізу корпоративних даних",
"url": "https://fin-agent.company.com",
"version": "1.0.0",
"capabilities": {
"streaming": true,
"pushNotifications": true,
"stateTransitionHistory": true
},
"authentication": {
"schemes": ["Bearer"]
},
"skills": [
{
"id": "financial_analysis",
"name": "Financial Analysis",
"description": "Аналіз фінансових даних, P&L, розрахунок KPI",
"inputModes": ["text"],
"outputModes": ["text", "application/json"],
"examples": [
"Проаналізуй виручку за Q1 поточного vs Q1 попереднього",
"Розрахуй EBITDA за підрозділами"
]
},
{
"id": "forecast",
"name": "Revenue Forecast",
"description": "Прогнозування виручки на основі історичних даних",
"inputModes": ["text", "application/json"],
"outputModes": ["text", "application/json"]
}
]
}
A2A-сервер на Python
# pip install a2a-sdk
from a2a.server.fastapi import A2AServer, A2ARouter
from a2a.types import AgentCard, AgentSkill, Task, TaskStatus, Artifact, TextArtifact
from fastapi import FastAPI
import uuid
# Agent Card
agent_card = AgentCard(
name="Financial Analysis Agent",
description="Агент фінансового аналізу",
url="https://fin-agent.company.com",
version="1.0.0",
skills=[
AgentSkill(
id="financial_analysis",
name="Financial Analysis",
description="Аналіз P&L, розрахунок KPI, виявлення аномалій",
)
],
)
app = FastAPI()
a2a_router = A2ARouter(agent_card=agent_card)
@a2a_router.on_task("financial_analysis")
async def handle_financial_task(task: Task) -> Task:
"""Обробник завдань фінансового аналізу"""
user_input = task.input.message.parts[0].text
result = await financial_agent.analyze(user_input)
task.artifacts = [
TextArtifact(
name="analysis_result",
parts=[{"type": "text", "text": result}],
)
]
task.status = TaskStatus(state="completed")
return task
@a2a_router.on_task("financial_analysis", streaming=True)
async def handle_streaming_task(task: Task):
"""Стрімінговий обробник"""
user_input = task.input.message.parts[0].text
async for chunk in financial_agent.stream_analyze(user_input):
yield TaskStatus(state="working"), TextArtifact(
name="partial_result",
parts=[{"type": "text", "text": chunk}],
)
app.include_router(a2a_router)
A2A-клієнт: делегування завдань
from a2a.client import A2AClient
# Виявлення агента
client = await A2AClient.from_url("https://fin-agent.company.com")
agent_card = client.agent_card
print(f"Агент: {agent_card.name}")
print(f"Навички: {[s.name for s in agent_card.skills]}")
# Відправка завдання
task = await client.send_task(
skill_id="financial_analysis",
message="Проаналізуй відхилення виручки від плану за березень поточного року",
)
# Очікування результату
completed_task = await client.wait_for_completion(task.id)
print(completed_task.artifacts[0].parts[0]["text"])
# Стрімінг
async for status, artifact in client.stream_task(
skill_id="financial_analysis",
message="Створи прогноз виручки на Q2 поточного року",
):
if artifact:
print(artifact.parts[0]["text"], end="", flush=True)
Інтеграція A2A з LangGraph
from langgraph.graph import StateGraph, END
from a2a.client import A2AClient
from typing import Optional, TypedDict
class OrchestratorState(TypedDict):
task: str
financial_result: Optional[str]
legal_result: Optional[str]
final_report: Optional[str]
# Нода, що делегує завдання зовнішньому A2A-агенту
async def delegate_to_financial_agent(state: OrchestratorState):
client = await A2AClient.from_url("https://fin-agent.company.com")
task = await client.send_task(
skill_id="financial_analysis",
message=state["task"],
)
completed = await client.wait_for_completion(task.id, timeout=120)
return {"financial_result": completed.artifacts[0].parts[0]["text"]}
async def delegate_to_legal_agent(state: OrchestratorState):
client = await A2AClient.from_url("https://legal-agent.legalteam.com")
task = await client.send_task(
skill_id="contract_review",
message=state["task"],
)
completed = await client.wait_for_completion(task.id, timeout=180)
return {"legal_result": completed.artifacts[0].parts[0]["text"]}
# Оркестратор об'єднує результати від двох зовнішніх агентів
graph = StateGraph(OrchestratorState)
graph.add_node("financial", delegate_to_financial_agent)
graph.add_node("legal", delegate_to_legal_agent)
graph.add_node("synthesize", synthesize_results)
# ...
Практичний кейс: корпоративний маркетплейс агентів
З нашої практики: холдинг з кількома підрозділами, кожен розробив спеціалізованих агентів (фінанси, юристи, HR, логістика) на різних фреймворках. A2A став інтеграційним шаром: оркестратор корпоративного порталу делегує завдання агентам через стандартний протокол, не знаючи про внутрішню реалізацію. Схема:
- Portal Agent (LangGraph) → Financial Agent (Python/LlamaIndex) через A2A
- Portal Agent → Legal Agent (Node.js/LangChain) через A2A
- Portal Agent → HR Agent (Java/Semantic Kernel) через A2A
Результати:
- Інтеграція нового агента в екосистему: 1 день (публікація Agent Card + реалізація A2A endpoint)
- Зміна внутрішньої реалізації агента прозора для оркестратора
- Кожна команда володіє своїм агентом, міжкомандна співпраця спрощена
- Економія часу при інтеграції нового агента становить до 70% порівняно з кастомним API
Специфікація A2A описує ці принципи. Наш досвід — 50+ AI-проєктів, 5 років на ринку. Ми гарантуємо, що інтеграція пройде без збоїв. Щоб обговорити ваш проєкт, напишіть нам — ми проведемо безплатний аудит ваших агентів та запропонуємо оптимальне рішення.
Що входить у налаштування A2A?
- Аудит поточних агентів та опис Agent Card
- Розробка A2A-сервера з FastAPI
- Налаштування A2A-клієнта в оркестраторі
- Тестування сценаріїв делегування
- Документація та навчання команди
- Підтримка після впровадження
Строки
- Налаштування A2A-сервера з агентом: 2–3 дні
- A2A-клієнт в оркестраторі: 1–2 дні
- Повноцінний маркетплейс з кількома агентами: 2–3 тижні
Зв'яжіться з нами для консультації — допоможемо обрати оптимальний протокол та налаштувати міжагентну взаємодію під ваш стек. Замовте налаштування A2A: напишіть нам, і ми підготуємо пропозицію для вашого проєкту.







