A2A protokol u 2026: Praktični vodič za komunikaciju između AI agenata u Pythonu

Praktični vodič za A2A (Agent2Agent) protokol u Pythonu — od Agent Card i Task životnog ciklusa, preko usporedbe s MCP-om, do implementacije servera i klijenta s primjerima za Google ADK i FastA2A.

Što je A2A protokol i zašto bi vas trebao zanimati?

A2A (Agent2Agent) protokol otvoreni je standard za komunikaciju između AI agenata koji je Google objavio u travnju 2025., a već u lipnju iste godine donirao Linux Foundation pod okrilje Agentic AI Foundation (AAIF). Do travnja 2026., preko 150 organizacija — uključujući Google, Microsoft, AWS, Salesforce, SAP i IBM — aktivno podržava ovaj protokol. Službeni GitHub repozitorij ima više od 22.000 zvjezdica, što govori samo za sebe.

Ali zašto je to uopće bitno?

Pa, u svijetu gdje se AI agenti sve češće koriste u produkciji, neizbježno je da više agenata — često izrađenih različitim alatima i od različitih dobavljača — mora surađivati. A2A protokol rješava upravo taj problem: omogućuje horizontalnu komunikaciju između agenata, neovisno o jeziku, okviru ili platformi na kojoj su izgrađeni. Dakle, vaš Python agent može bez problema razgovarati s agentom napisanim u Javi ili Go-u.

Ako ste već upoznati s MCP-om (Model Context Protocol), koji povezuje agente s alatima i izvorima podataka (vertikalna integracija), A2A je njegov prirodni komplement — povezuje agente međusobno. Zajedno, ova dva protokola čine temelj interoperabilnog agentičkog ekosustava.

Temeljni koncepti A2A protokola

A2A protokol koristi HTTP(S) s JSON-RPC 2.0 formatom poruka, uz podršku za gRPC (od verzije 0.3) i streaming putem Server-Sent Events (SSE). Specifikacija je trenutno na verziji 0.3 (stabilna), dok je v1.0 u fazi RC kandidata. Ajmo razložiti ključne koncepte.

Agent Card — digitalna posjetnica agenta

Svaki A2A agent objavljuje svoju Agent Card — JSON dokument dostupan na /.well-known/agent-card.json. Zamislite to kao digitalni CV vašeg agenta koji opisuje što zna i kako mu pristupiti:

  • Ime i opis — što agent radi
  • URL servisa — gdje agent prima zahtjeve
  • Vještine (skills) — popis specifičnih zadataka koje agent može obaviti
  • Mogućnosti (capabilities) — podržava li streaming, push obavijesti itd.
  • Autentifikacija — koji sigurnosni mehanizmi su potrebni

Ono što je ovdje stvarno elegantno jest automatsko otkrivanje — klijentski agent može dohvatiti Agent Card udaljenog agenta i na temelju vještina sam odlučiti s kojim agentom komunicirati. Nema ručnog konfiguriranja endpointova.

Message — jedinica komunikacije

Poruka (Message) predstavlja jednu komunikacijsku razmjenu između klijenta i agenta. Svaka poruka ima ulogu (role): "user" (klijent) ili "agent" (agent koji odgovara), te sadrži jedan ili više dijelova (Part):

  • TextPart — obični tekst
  • FilePart — datoteka (inline ili putem URI-ja)
  • DataPart — strukturirani JSON podaci

Jednostavno i čisto — ništa komplicirano tu nema.

Task — jedinica rada

Zadatak (Task) je temeljni radni element u A2A protokolu. Svaki zadatak ima jedinstveni ID i prolazi kroz životni ciklus koji je zapravo prilično intuitivan:

  1. submitted → zadatak je poslan
  2. working → agent obrađuje zadatak
  3. completed → uspješno završen
  4. input_required → agent čeka dodatni unos klijenta
  5. failed / canceled / rejected → terminalna stanja

Artifact — izlazni proizvod

Artefakt (Artifact) je rezultat koji agent generira po završetku zadatka — dokument, slika, strukturirani podaci. Artefakti se mogu slati inkrementalno putem streaminga, što je posebno korisno za velike izlaze.

JSON-RPC metode

A2A definira pregršt metoda za interakciju:

  • message/send — slanje poruke agentu
  • message/stream — slanje s real-time streamingom odgovora
  • tasks/get — dohvat statusa zadatka
  • tasks/cancel — otkazivanje zadatka
  • tasks/pushNotificationConfig/create — konfiguracija push obavijesti

A2A vs MCP: Dva komplementarna protokola

Iskreno, jedno od najčešćih pitanja koje se čuje u agentičkom ekosustavu 2026. glasi: „Trebam li A2A ili MCP?" Odgovor je — gotovo sigurno oboje. Ova dva protokola rješavaju različite probleme i dizajnirana su da rade zajedno.

DimenzijaA2A (Agent2Agent)MCP (Model Context Protocol)
SvrhaAgent ↔ Agent (horizontalna)Agent → Alat (vertikalna)
TvoracGoogle (travanj 2025.)Anthropic (krajem 2024.)
UpravljanjeLinux Foundation / AAIFLinux Foundation / AAIF
TransportHTTP/JSON-RPC 2.0, gRPC, SSEJSON-RPC 2.0 / stdio / SSE
OtkrivanjeAgent Card na /.well-known/Registracija MCP servera
ApstrakcijaNeprozirni agenti s vještinamaAlati, resursi, promptovi
Asinkrona podrškaNativna (push, dugotrajni zadaci)Pretežno sinkrona

Praktični primjer koji ovo pojašnjava: Zamislite maloprodajni AI sustav. Agent za inventar koristi MCP za pristup bazi podataka proizvoda (vertikalna veza s alatom). Kada otkrije da je zaliha niska, koristi A2A za komunikaciju s eksternim agentom dobavljača kako bi pokrenuo narudžbu dopune. MCP za podatke, A2A za koordinaciju.

Ima tu i jedna stvar koja se često previdi — ključna razlika u skalabilnosti. MCP alatni opisi mogu zauzeti cijeli kontekstni prozor LLM-a kako broj alata raste. A2A zaobilazi taj problem korištenjem Agent Cardova visokog nivoa apstrakcije umjesto detaljnih specifikacija alata. U praksi, to znači da možete imati stotine agenata a da ne „zatrpate" kontekst.

Postavljanje A2A servera u Pythonu — korak po korak

Dosta teorije — idemo konačno kodirati. Izgradit ćemo potpuno funkcionalan A2A sustav: agent koji analizira tekst i klijent koji s njim komunicira. Koristit ćemo službeni a2a-sdk paket.

Preduvjeti i instalacija

Trebate Python 3.10+ i sljedeće pakete:

pip install "a2a-sdk[http-server]" uvicorn httpx

Službeni SDK (a2a-sdk) održava Google pod Apache 2.0 licencom. Trenutno stabilna verzija je 0.3.x koja implementira A2A specifikaciju v0.3.

Kreiranje A2A agenta (server)

Kreirajte datoteku text_stats_agent.py. Krenimo od importova i pomoćne funkcije:

import uvicorn
from a2a.server.apps import A2AStarletteApplication
from a2a.server.agent_execution import AgentExecutor, RequestContext
from a2a.server.events import EventQueue
from a2a.server.request_handlers import DefaultRequestHandler
from a2a.server.tasks import InMemoryTaskStore, TaskUpdater
from a2a.types import AgentCapabilities, AgentCard, AgentSkill
from a2a.utils import new_agent_text_message


def analyze_text(text: str) -> str:
    """Analizira tekst i vraća statistiku."""
    words = text.split()
    word_count = len(words)
    if word_count == 0:
        return "Prazan unos — nema teksta za analizu."

    cleaned = [w.strip(".,!?;:\"'\u2018\u2019\u201c\u201d") for w in words]
    avg_word_len = sum(len(w) for w in cleaned) / word_count
    reading_time_sec = (word_count / 238) * 60

    freq: dict[str, int] = {}
    for w in cleaned:
        key = w.lower()
        freq[key] = freq.get(key, 0) + 1
    most_common = max(freq, key=lambda w: freq[w])

    return (
        f"Broj riječi: {word_count}\n"
        f"Prosječna duljina riječi: {avg_word_len:.1f} znakova\n"
        f"Procijenjeno vrijeme čitanja: {reading_time_sec:.0f} sekundi\n"
        f"Najčešća riječ: '{most_common}' ({freq[most_common]}x)"
    )


class TextStatsExecutor(AgentExecutor):
    """Izvršitelj koji analizira tekst i vraća statistiku."""

    async def execute(
        self, context: RequestContext, event_queue: EventQueue
    ) -> None:
        updater = TaskUpdater(
            event_queue=event_queue,
            task_id=context.task_id,
            context_id=context.context_id,
        )
        # Označi da agent radi na zadatku
        await updater.start_work()

        # Dohvati korisnički unos i analiziraj
        user_input = context.get_user_input()
        result = analyze_text(user_input)

        # Pošalji rezultat i označi zadatak kao završen
        await event_queue.enqueue_event(new_agent_text_message(result))
        await updater.complete()

    async def cancel(
        self, context: RequestContext, event_queue: EventQueue
    ) -> None:
        raise NotImplementedError("Otkazivanje nije podržano")


# Definicija vještine agenta
skill = AgentSkill(
    id="text_stats",
    name="Statistika teksta",
    description="Analizira tekst i vraća broj riječi, prosječnu duljinu i vrijeme čitanja.",
    tags=["text", "analysis", "nlp"],
    examples=[
        "Analiziraj ovaj tekst.",
        "Koliko riječi ima u ovom odlomku?",
    ],
)

# Agent Card — opis agenta za otkrivanje
agent_card = AgentCard(
    name="Text Stats Agent",
    description="Agent specijalist za izračun statistike tekstualnog sadržaja.",
    url="http://localhost:9999/",
    version="1.0.0",
    default_input_modes=["text"],
    default_output_modes=["text"],
    capabilities=AgentCapabilities(streaming=False),
    skills=[skill],
)

# Kreiranje A2A aplikacije
app = A2AStarletteApplication(
    agent_card=agent_card,
    http_handler=DefaultRequestHandler(
        agent_executor=TextStatsExecutor(),
        task_store=InMemoryTaskStore(),
    ),
)

if __name__ == "__main__":
    uvicorn.run(app.build(), host="0.0.0.0", port=9999)

Pokrenite server:

python text_stats_agent.py

Agent je sada dostupan na http://localhost:9999, a njegova Agent Card na http://localhost:9999/.well-known/agent-card.json. Možete to brzo provjeriti curl-om ako želite vidjeti kako Agent Card izgleda u praksi.

Kreiranje A2A klijenta

Sad dolazi zabavni dio — klijent koji automatski otkriva agenta i komunicira s njim. Kreirajte datoteku client.py:

import asyncio
import httpx
from a2a.client import A2ACardResolver, ClientFactory, ClientConfig
from a2a.client import create_text_message_object

SAMPLE_TEXT = """
A2A protokol omogućuje AI agentima međusobnu komunikaciju
neovisno o okviru ili platformi na kojoj su izgrađeni.
Ovo je revolucionaran korak prema interoperabilnom
agentičkom ekosustavu.
"""


async def main():
    base_url = "http://localhost:9999"

    async with httpx.AsyncClient() as http:
        # 1. Otkrivanje agenta putem Agent Card
        resolver = A2ACardResolver(httpx_client=http, base_url=base_url)
        card = await resolver.get_agent_card()
        print(f"Otkriven agent: {card.name}")
        print(f"Vještine: {[s.name for s in card.skills]}\n")

        # 2. Kreiranje klijenta i slanje poruke
        factory = ClientFactory(config=ClientConfig(httpx_client=http))
        client = factory.create(card)
        message = create_text_message_object(
            content=SAMPLE_TEXT.strip()
        )

        # 3. Obrada odgovora
        async for event in client.send_message(message):
            if isinstance(event, tuple):
                task, _ = event
                if task.history:
                    for msg in task.history:
                        if msg.role.value == "agent":
                            for part in msg.parts:
                                if hasattr(part.root, "text"):
                                    print("Rezultat od agenta:")
                                    print(part.root.text)


asyncio.run(main())

U drugom terminalu pokrenite klijenta:

python client.py

Klijent će automatski otkriti agenta putem Agent Card, poslati tekst na analizu i ispisati rezultat. Cijeli proces — otkrivanje, slanje, primanje — odvija se u svega par sekundi.

Integracija s okvirima: Google ADK i FastA2A

Ručno korištenje SDK-a korisno je za razumijevanje protokola, ali realno — u praksi ćete vjerojatno posegnuti za jednim od okvira s ugrađenom A2A podrškom. I tu stvari postaju stvarno jednostavne.

Google ADK (Agent Development Kit)

Google ADK nudi najjednostavniji put do A2A servera. Doslovno jedna funkcija pretvara bilo kojeg ADK agenta u A2A kompatibilan servis:

pip install "google-adk[a2a]"
from google.adk.a2a.utils.agent_to_a2a import to_a2a
from google.adk import Agent

# Definirajte ADK agenta
root_agent = Agent(
    model="gemini-flash-latest",
    name="helper_agent",
    instruction="Ti si koristan asistent koji odgovara na pitanja.",
)

# Jedna linija ga pretvara u A2A server
a2a_app = to_a2a(root_agent, port=8001)

Funkcija to_a2a() automatski konfigurira AgentExecutor, InMemoryTaskStore, DefaultRequestHandler i generira Agent Card putem AgentCardBuilder. ADK v1.0.0 je stabilan i spreman za produkciju — tako da ne morate brinuti o „beta" problemima.

Pydantic FastA2A

Pydantic tim nudi fasta2a — ASGI baziranu A2A implementaciju koja se besprijekorno integrira s Pydantic AI. Ako ste fan Pydantica (a tko nije?), ovo će vam se svidjeti:

pip install fasta2a
from pydantic_ai import Agent

agent = Agent("openai:gpt-4", instructions="Budi koncizan i precizan.")

# Jedna linija — A2A server spreman
app = agent.to_a2a()

Pokrenite s uvicorn module:app --host 0.0.0.0 --port 8000. FastA2A koristi tri zamjenjive komponente: Storage (pohrana zadataka), Broker (raspoređivanje) i Worker (izvršavanje), što omogućuje razdvajanje web servera i radnog procesa na različite strojeve. Za ozbiljnije deploymente, to je jako praktično.

Podrška u drugim okvirima

Ekosustav raste brzo:

  • CrewAI — nativna podrška od verzije 1.10.1 (45.900+ zvjezdica na GitHubu)
  • LangChain — integracija putem langchain-adk i A2A endpoint podrške
  • OpenAgents — nativna podrška za MCP + A2A

Produkcijske razmatranja

Sve ovo lijepo funkcionira lokalno, ali prije nego stavite A2A agente u produkciju, postoji par stvari koje morate riješiti. Evo najvažnijih.

Autentifikacija i sigurnost

A2A podržava deklaraciju sigurnosnih zahtjeva izravno u Agent Card koristeći OpenAPI kompatibilne sigurnosne sheme:

  • OAuth 2.0 — preporučeni pristup za produkciju (koristite client credentials flow s kratkoživućim tokenima)
  • OpenID Connect — za scenarije koji zahtijevaju CIBA tok za autonomne agente
  • API ključevi — za jednostavnije scenarije
  • Mutual TLS (mTLS) — za visokosigurnosna okruženja

U produkciji obavezno koristite HTTPS s TLS 1.3+. A2A v1.0 RC uvodi i potpisane Agent Cardove putem JWS-a za kriptografsku verifikaciju identiteta — što je posebno važno ako agenti komuniciraju preko javnog interneta.

Streaming i dugotrajni zadaci

Nisu svi zadaci gotovi za par sekundi. Za one koji traju minutama, satima (ili čak danima), A2A nudi solidne mehanizme:

  • SSE streaming — real-time ažuriranja putem TaskStatusUpdateEvent i TaskArtifactUpdateEvent
  • Ponovno povezivanje — klijent se može odspojiti i ponovno spojiti, provjeravajući status putem tasks/get
  • Push obavijesti — server šalje HTTP POST na webhook URL klijenta kada se status promijeni

Jedna napomena o push obavijestima — implementirajte SSRF zaštitu: validirajte webhook URL-ove, koristite challenge-response verifikaciju i jedinstvene event ID-jeve (JWT jti) za sprječavanje duplikata. Ovo se lako previdi, ali je ključno za sigurnost.

Skaliranje i perzistencija

Za produkcijske scenarije, InMemoryTaskStore zamijenite trajnom pohranom. SDK nudi gotove implementacije:

# PostgreSQL backend za perzistenciju zadataka
pip install "a2a-sdk[postgresql]"

Dodatne produkcijske mogućnosti u v1.0 RC uključuju:

  • Multi-tenancy podrška — izolacija podataka između korisnika
  • OpenTelemetry integracija — putem a2a-sdk[telemetry]
  • Technology Compatibility Kit (TCK) — za testiranje usklađenosti implementacije

Arhitekturni obrazac: A2A + MCP u praksi

Najmoćniji scenarij koristi oba protokola zajedno. Evo jedne arhitekture za sustav korisničke podrške koja odlično ilustrira sinergiju:

┌─────────────────────────────────────────────────┐
│              Orchestrator Agent                  │
│         (prima korisničke upite)                 │
└──────┬──────────────┬──────────────┬─────────────┘
       │ A2A          │ A2A          │ A2A
       ▼              ▼              ▼
┌──────────┐   ┌──────────┐   ┌──────────┐
│ Agent za │   │ Agent za │   │ Agent za │
│ naplatu  │   │ tech.    │   │ povrate  │
│          │   │ podršku  │   │          │
└────┬─────┘   └────┬─────┘   └────┬─────┘
     │ MCP          │ MCP          │ MCP
     ▼              ▼              ▼
┌──────────┐   ┌──────────┐   ┌──────────┐
│ Stripe   │   │ Knowledge│   │ ERP      │
│ API      │   │ Base     │   │ sustav   │
└──────────┘   └──────────┘   └──────────┘

U ovoj arhitekturi:

  • Orchestrator koristi A2A za delegiranje zadataka specijaliziranim agentima ovisno o vrsti upita
  • Svaki specijalizirani agent koristi MCP za pristup svojim specifičnim alatima i izvorima podataka
  • Agenti mogu biti izgrađeni različitim okvirima (ADK, LangChain, CrewAI) i komunicirati bez problema zahvaljujući A2A standardu

Ljepota ovog pristupa je u tome što možete zamijeniti bilo kojeg agenta novom implementacijom bez da išta drugo mijenjate — dokle god poštuje A2A specifikaciju, ostali agenti neće ni primijetiti razliku.

Ekosustav i budućnost A2A protokola

A2A protokol doživio je eksplozivan rast u prvoj godini postojanja. Gartner izvještava o porastu od 1.445% u upitima o višeagentnim sustavima od Q1 2024. do Q2 2025., a prema njihovim predviđanjima, 40% poslovnih aplikacija uključivat će AI agente specifične za zadatke do kraja 2026.

Službeni SDK-ovi dostupni su za pet jezika: Python, JavaScript, Java, Go i .NET. Protokol je pod upravljanjem Linux Foundation s 146 članova u AAIF-u (stanje: ožujak 2026.), a stabilna verzija 1.0 očekuje se u svibnju–lipnju 2026.

Uz A2A raste i ekosustav pratećih protokola poput AP2 (Agent Payments Protocol) za sigurno procesiranje plaćanja između agenata. To je zanimljiv signal — ne gradi se samo komunikacijska infrastruktura, već potpuna infrastruktura za autonomnu međuagentsku ekonomiju. Uzbudljiva vremena, bez sumnje.

Često postavljana pitanja (FAQ)

Koja je razlika između A2A i MCP protokola?

A2A (Agent2Agent) omogućuje horizontalnu komunikaciju između AI agenata — agent s agentom. MCP (Model Context Protocol) omogućuje vertikalnu integraciju — agent s alatima, bazama podataka i API-jima. Ukratko: koristite MCP za pristup resursima, a A2A za koordinaciju između agenata. Oba protokola su sada pod upravljanjem Linux Foundation.

Kako izgraditi A2A agenta u Pythonu?

Instalirajte a2a-sdk[http-server], implementirajte AgentExecutor klasu s metodom execute(), definirajte AgentCard s vještinama i mogućnostima, te kreirajte A2AStarletteApplication. Pokrenite server s Uvicornom. Za brži pristup, koristite Google ADK ili Pydantic FastA2A koji nude jednolinjsku integraciju.

Što je Agent Card i kako funkcionira?

Agent Card je JSON dokument koji agent objavljuje na /.well-known/agent-card.json. Sadrži ime, opis, URL, vještine, mogućnosti i sigurnosne zahtjeve agenta. Drugi agenti koriste Agent Card za automatsko otkrivanje i odlučivanje s kojim agentom komunicirati — slično tome kako web servisi koriste OpenAPI specifikacije.

Podržava li A2A protokol streaming i dugotrajne zadatke?

Da, A2A ima nativnu podršku za oboje. Streaming koristi Server-Sent Events (SSE) za real-time ažuriranja statusa i artefakata. Za dugotrajne zadatke, klijent se može odspojiti i ponovno povezati, provjeriti status putem tasks/get, ili konfigurirati push obavijesti putem webhookova.

Koji okviri podržavaju A2A protokol u 2026.?

Google ADK ima nativnu A2A podršku (google-adk[a2a]), Pydantic AI nudi FastA2A integraciju, CrewAI podržava A2A od verzije 1.10.1, a LangChain pruža integraciju putem langchain-adk. Službeni Python SDK (a2a-sdk) omogućuje izgradnju A2A agenata bez ovisnosti o specifičnom okviru.

O Autoru Editorial Team

Our team of expert writers and editors.