A2A-streaming en asynchrone taken voor langlopende agent-workflows

Langlopende A2A-taaken overleven chatsessies.

Inhoud

De meeste AI-agentdemonstraties gedragen zich nog steeds als chat-completies met extra stappen: je stuurt een prompt, wacht enkele seconden en ontvangt een antwoord in één reactie.

Echt agentwerk past vaak niet in dat patroon. Onderzoek, code reviews, inkoopanalyses, incidentonderzoek en meervoudige planning kunnen minuten of uren duren, halverwege verduidelijking nodig hebben, gedeeltelijke resultaten streamen, taken delegeren aan een andere agent en bestanden produceren in plaats van een enkel tekstantwoord. Daar komt het asynchrone model van het A2A-protocol binnen het bredere AI-systemen cluster om de hoek kijken, omdat A2A langlopend werk behandelt als een Taak met een levenscyclus in plaats van een eenmalige HTTP-reactie. Clients kunnen verbonden blijven via Server-Sent Events (SSE), de taakstatus pollsen of push-webhooks registreren wanneer ze geen verbinding open kunnen houden.

A2A-streaming en asynchrone taaklevenscyclus voor langlopende agentworkflows

Dit artikel behandelt operationeel ontwerp voor deze workflows, inclusief wanneer je moet streamen versus pollsen versus pushen, hoe input_required past in mens-in-de-loop-flows, foutafhandeling en wat je in productie moet instrumenteren. Voor Agent Cards, berichten, onderdelen en het volledige taakmodel, zie Wat is het A2A-protocol? Agent Cards en Taken uitgelegd.

Waarom langlopende A2A-agenttaken asynchroon ontwerp nodig hebben

Een synchroon request/response-mental model valt snel in duigen zodra agentwerk tools, delegatie, goedkeuringen en grote artefacten omvat. Een agenttaak kan intern meerdere MCP-servers aanroepen, subwerk delegeren aan een andere agent via A2A, wachten op menselijke goedkeuring, grote artefacten in chunks genereren, halverwege falen en gedeeltelijk herstel nodig hebben, en tokenkosten accumuleren over meerdere hops. HTTP-API’s kunnen dit benaderen met time-outs, achtergrondjobs en ad-hoc statusendpoints, maar A2A bakt taakidentiteit en status in het protocol zodat clients en gateways consistent kunnen redeneren over werk. Voor hoe deze lagen passen binnen een productie-assistent voordat je asynchrone A2A-grenzen toevoegt, zie AI-Assistent Architectuur: LLM, Geheugen, Tools, Routing, Observability.

Mijn bias is praktisch: maak geen Taak voor alles, omdat een éénregelsamenvatting geen levenscyclus nodig heeft. Gebruik een Taak wanneer werk stateful is, auditabel, langlopend, artefacten produceert, of input nodig heeft tijdens het proces. De vuistregel uit de uitleg geldt nog steeds: eenvoudige interacties kunnen een Bericht retourneren, terwijl complex werk een Taak moet retourneren.

A2A Taaklevenscyclus en Statusovergangen

Een A2A-Taak beweegt door statussen die clients op elk moment kunnen opvragen. De exacte naamgeving varieert iets per implementatie, maar het model is stabiel over servers die het protocol volgen.

stateDiagram-v2 [*] --> ingediend ingediend --> aanhetwerken aanhetwerken --> inputvereist inputvereist --> aanhetwerken aanhetwerken --> voltooid aanhetwerken --> gefaald aanhetwerken --> geannuleerd aanhetwerken --> afgewezen ingediend --> afgewezen inputvereist --> gefaald inputvereist --> geannuleerd voltooid --> [*] gefaald --> [*] geannuleerd --> [*] afgewezen --> [*]

De ingediend status betekent dat de client werk heeft verzonden en de agent het heeft geaccepteerd of in de wachtrij heeft geplaatst. In aanhetwerken verwerkt de agent actief, wat toolaanroepen, delegatie of streaming van gedeeltelijke output kan omvatten. De inputvereist status geeft aan dat de agent is gepauzeerd omdat deze meer input, verduidelijking of menselijke goedkeuring nodig heeft, en het is geen foutstatus. Voltooid is terminale succes met beschikbare artefacten; gefaald is een terminale fout waarvan details en gedeeltelijke artefacten afhankelijk zijn van de implementatie; geannuleerd betekent dat een client, gateway of gemachtigde aanroeper de taak heeft gestopt; en afgewezen betekent dat de agent de taak weigerde vanwege beleid, capaciteitsmismatch of authenticatie.

Wanneer inputvereist een workflow pauzeert versus faalt

Behandel inputvereist als een bewuste pauze, niet als een uitzondering. De agent vertelt je dat deze niet kan doorgaan zonder iets van jou, of het nu een ontbrekende parameter is, een bevestiging van beleid, of een handtekening van een manager op een risicovolle actie. Een workflow faalt wanneer de taak gefaald of afgewezen bereikt, of wanneer een aanroeper een time-out overschrijdt terwijl hij wacht op input die nooit aankomt, dus je moet expliciete time-outs ontwerpen voor menselijke stappen in plaats van goedkeuringen onbepaald te laten wachten.

Een goedkeuring die drie dagen wacht zonder escalatie is een vastgelopen workflow, geen geduldige, en vastgelopen workflows verstoppen taakopslag en maken observability-dashboards moeilijker leesbaar.

Wie een A2A-taak kan annuleren

Annuleringautoriteit moet worden gedefinieerd tijdens het ontwerp, niet tijdens een incident. De client kan doorgaans taken annuleren die deze heeft gemaakt; een gateway kan namens tenants annuleren bij overtredingen van beleid of budgetlimieten; en een upstream-agent kan gedelegeerd werk annuleren bij orchestratie over A2A als het protocol en beleid het toestaan. Log wie heeft geannuleerd en waarom, omdat in multi-agent-ketens weeswerk een veelvoorkomende bron is van verrassende tokenrekeningen.

Mens-in-de-loop met inputvereist taakstatussen

inputvereist is een van de meest onderbenutte ontwerpfuncties van A2A, en veel teams behandelen het als een foutcode terwijl het eigenlijk een first-class workflowstatus is. In productie zul je gevallen tegenkomen waarin de agent moet stoppen, zoals budget besteden aan een ambigu verzoek, een onherroepelijke actie uitvoeren, toegang krijgen tot gevoelige data zonder scopebevestiging, of delegeren aan een specialist die expliciete gebruikersintentie nodig heeft. Model deze als bewuste overgangen naar inputvereist, met een duidelijk bericht dat uitlegt wat er nodig is.

Goedkeuringsflows voor riskante A2A-delegatie

Wanneer Agent A via A2A delegeert naar Agent B en Agent B inputvereist bereikt voor menselijke goedkeuring, moeten drie systemen het eens zijn over wat er daarna gebeurt. De downstream-agent pauzeert en exposeert wat deze nodig heeft, de orchestrator of gateway presenteert die pauze aan de gebruiker, en het antwoord van de gebruiker hervat de taak via een nieuw bericht. De vergelijking A2A vs MCP legt uit waarom delegatie over agentgrenzen een ander probleem is dan tooltoegang, en waarom goedkeuringssemantiek op de taaklaag moet behoren in plaats van binnen een enkele MCP-aanroep. Goedkeur niet stil automatisch omdat de UX onhandig is, omdat dure fouten meestal komen van gemaksshortcuts in plaats van van ontbrekende modellen.

UX-patronen voor gepauzeerde A2A-taken

Blokkerende wacht betekent dat de UI een spinner of goedkeuringskaart toont tot de taak inputvereist verlaat, wat goed werkt voor korte menselijke stappen. Niet-blokkerende wacht betekent dat de client de taak-ID registreert, de gebruiker ergens anders laat doorgaan, en polling of push gebruikt om te notify wanneer input weer nodig is, wat vereist is voor mobiel, e-mailgekoppelde goedkeuringen of multi-tab-assistents. Time-out wanneer mensen traag zijn betekent het definiëren van een SLA per stap en, na N uur, overgaan naar gefaald of escaleren naar een andere wachtrij, omdat onbegrensde wachttijden taakopslag verstoppen en observability-dashboards verwarren.

Hoe een A2A-gateway inputvereist behandelt

Als je een A2A-gateway draait, beslis dan of deze inputvereist-events transparant doorstuurt, pauzes van meerdere downstream-agents aggregatieert in één gebruikersprompt, of afdwingt dat bepaalde vaardigheden altijd goedkeuring vereisen voordat ze inputvereist verlaten. Auth en beleid voor goedgekeurde acties behoren in een apart beveiligingsartikel; ga nu uit dat elke hervatte taak dezelfde gebruikersidentiteit en scope moet dragen als het oorspronkelijke verzoek.

Kies tussen Sync, SSE-streaming, Polling of Push-meldingen

A2A ondersteunt meerdere interactiemodi, en de juiste keuze hangt af van clientcapaciteiten en latentiebehoeften in plaats van van welke modus het meest modern klinkt.

Modus Beste voor Clientvereisten Afwegingen
Sync (SendMessage, korte Taak) Snel werk, directe Berichten Eenvoudige HTTP-client Time-outs bij trage agents
SSE-streaming Live voortgang, incrementele artefacten Langlopende verbinding Proxies, mobiele achtergrondlimieten
Polling (GetTask) Batch-clients, eenvoudige integraties Timer + taak-ID Hogere latentie, meer requests
Push-webhooks Mobiel, serverless, meervoudige uren taken HTTPS-ontvanger + verificatie Asynchrone complexiteit, beveiligingsversterking

Lees eerst Agent Card-capaciteitsvlaggen

Voordat je een modus kiest, lees de Agent Card van de agent, omdat streaming capabilities.streaming: true vereist en push-meldingondersteuning apart wordt geadverteerd. Clients die aannemen dat elke agent streamt, zullen breken tegen minimale implementaties, dus onderhandeling is niet ceremonieel: het voorkomt runtime-fouten wanneer een specialistagent alleen poll-gebaseerde statuscontroles ondersteunt.

Wanneer assistant-side polling gebruiken rond A2A

Je assistant-runtime kan A2A-taakpolling omhullen in een scheduler-loop in plaats van ruwe protocoldetails aan de gebruiker te exposuren. Dat patroon overlapt met algemene polling-agents, die achtergrondprocessen zijn die wakker worden, status controleren en handelen. Voor duurzame scheduling, idempotentie en wachtrijpatronen buiten A2A specifiek, zie Polling Agents in AI-Assistents: 11 Implementatiepatronen. Gebruik assistant-polling wanneer je veel A2A-taken orchestreert vanuit een enkel controlepaneel, en gebruik native A2A-streaming of push wanneer de client direct verbinding maakt met de agentgrens.

A2A Server-Sent Events (SSE) Streaming

SSE is het primaire realtime-kanaal van A2A. De client roept SendStreamingMessage aan, opent een HTTP-verbinding en ontvangt een text/event-stream-reactie tot de taak een terminale of onderbroken status bereikt. Elke event-payload is JSON-RPC-vormig, en typische resultaattypes omvatten een Taak-snapshot, een TaskStatusUpdateEvent voor levenscyclusovergangen en tussentijdse agentberichten, en een TaskArtifactUpdateEvent voor chunked artefactlevering met append en lastChunk hints voor reconstructie.

sequenceDiagram participant Client participant A2A Server Client->>A2A Server: SendStreamingMessage A2A Server-->>Client: HTTP 200 text/event-stream loop Tot terminaal of inputvereist A2A Server-->>Client: TaskStatusUpdateEvent A2A Server-->>Client: TaskArtifactUpdateEvent (optioneel) end A2A Server-->>Client: Sluit stream Note over Client,A2A Server: Bij disconnect voor terminale status,
client kan SubscribeToTask aanroepen

Streaming voortgangupdates en gedeeltelijke artefacten

Streaming blinkt uit wanneer gebruikers werk moeten zien gebeuren, of het nu stapcounters zijn (“3 van 7 bronnen beoordeeld”), gedeeltelijke tekstgeneratie, incrementele bestandchunks voor grote rapporten, of statusovergangen van aanhetwerken naar inputvereist zonder polling. Ontwerp UI rond eventtypes in plaats van rond een enkele finale blob, want als je alleen output toont wanneer voltooid aankomt, kun je net zo goed pollsen.

SSE-verbindingen die vallen en herabonnement

Netwerken vallen, laptops slapen en loadbalancers idle-time-out SSE-verbindingen, dus lange streams hebben herstellogica nodig in plaats van optimistische aannames. A2A biedt SubscribeToTask zodat clients kunnen herconnecteren met een lopende taakstream, en je client-SDK moet taskId lokaal persistent maken, streamsluiting voor terminale status detecteren, herabonneren met backoff, en events de-dupliceren als de server overlappende status replayt. Zonder herabonnementslogica voelen lange taken fragiel aan in productie, zelfs wanneer de agentbackend gezond is.

A2A Push-meldingen en Webhooks

Push past bij scenario’s waar SSE een slechte match is, zoals mobiele apps op de achtergrond, serverless-handlers, of taken die uren of dagen duren. De client levert een PushNotificationConfig met een url (HTTPS-webhook aan de clientkant), een optionele token voor het valideren van inkomende POSTs, en optionele authentication-details voor hoe de A2A-server authenticatie uitvoert bij de webhook. Configuratie kan meereizen met de initiële SendMessage of SendStreamingMessage-aanroep, of later worden toegevoegd via CreateTaskPushNotificationConfig voor een bestaande taak.

sequenceDiagram participant Client participant A2A Server participant Webhook Client->>A2A Server: SendMessage + PushNotificationConfig A2A Server-->>Client: taskId Note over A2A Server: Taak loopt asynchroon A2A Server->>Webhook: POST statuswijzigingsmelding Webhook->>A2A Server: GetTask(taskId) A2A Server-->>Webhook: Bijgewerkte Taak + artefacten Webhook->>Client: Hervat workflow / notify gebruiker

Wanneer een significante update plaatsvindt, POST de A2A-server naar de webhook en de client roept typisch GetTask aan met de gemelde taskId om de volledige bijgewerkte Taak en artefacten op te halen. Push is een signaal, geen volledige payloadtransport.

Wanneer push wint van een open SSE-verbinding

Voorkeur push wanneer de client geen SSE kan handhaven (mobiel, edge-functies), wanneer updates zeldzaam zijn en mijlpuntgebaseerd in plaats van token-per-token, of wanneer je wilt dat de server een gescheiden workflow-engine wakker maakt. Voorkeur SSE wanneer gebruikers live voortgang bekijken, wanneer artefacten streamen in veel kleine chunks, of wanneer latentie onder een paar seconden belangrijk is.

Push-meldingen correleren met A2A-taken

Elke push-handler moet loggen en propagatie van de taskId, een trace- of correlatie-ID van het oorspronkelijke verzoek, het eventtype of statusovergang, en een timestamp van de melding zodat verouderde events kunnen worden afgewezen. Replay-aanvallen en dubbele leveringen gebeuren in productie, dus idempotente handlers zijn niet optioneel.

Push-endpoint beveiligingsoverzicht

Push introduceert SSRF-risico op de server wanneer kwaadwillende clients interne URLs registreren, en impersonatie-risico op de client wanneer valse POSTs aankomen bij de webhook. Mitigaties omvatten URL-toestemmingen, eigenaarsverificatie, signed JWTs met JWKS, timestampcontroles en validatie van de config-token. Het volledige threatmodel, identiteitslagen en gatewaycontroles staan in A2A en MCP Agent Beveiliging: Identiteit, Delegatie en Audit Trails; tot je dat hebt gelezen, behandel webhookverificatie met dezelfde ernst als betalingscallbacks.

Asynchrone A2A Workflowpatronen

Fire-and-follow taakinleiding

De client leidt een taak in, ontvangt direct een taak-ID en disconnect, en pollst later GetTask of wacht op push. Dit is het standaardpatroon voor serverless en batchpipelines, maar je moet de taak-ID in duurzame opslag persistent maken voordat je de gebruiker acknowledge, omdat serverless-invocaties die de ID vergeten het werk verliezen.

Taak hervatten na inputvereist

Na inputvereist stuurt de gebruiker een nieuw bericht tegen dezelfde taak en de agent overgaat terug naar aanhetwerken. Ontwerp berichten zodat hervattingcontext expliciet is, want “Goedgekeurd: doorgaan met leverancier X” wint van een kale “ja” wanneer je moet auditen wat zes uur later is goedgekeurd.

Gekoppelde A2A-delegatie met tussenliggende artefacten

Overweeg een researchworkflow waar een orchestrator Taak T1 bezit en retrieval, samenvatting en verificatie delegeert aan specialistagents, elk met zijn eigen taak-ID en artefacten onderweg.

flowchart TD U[Gebruiker] --> O[Orchestrator Taak T1] O -->|A2A| R[Retrieval-agent T2] R --> A2[artefact: ruwe bronnen] O -->|A2A| S[Samenvattingsagent T3] S --> A3[artefact: concept samenvatting] O -->|A2A| V[Verificatieagent T4] V --> A4[artefact: feitencheckrapport] O --> F[eindartefact: aanbevelingsmemo]

Elke hop heeft zijn eigen taak-ID en statemachine, dus de orchestrator moet downstream-taken onafhankelijk streamen of pollsen, tussenliggende artefacten persistent maken voordat de volgende hop begint, en graceful falen als T3 voltooit maar T4 het concept afwijst. Multi-Agent Orchestratiepatronen behandelt topologiekeuze wanneer die specialisten als aparte services draaien in plaats van in één runtime. Gedeeltelijke voortgang is waardevol, en een gefaalde verificatie moet geen bruikbaar concept verwijderen zonder duidelijke reden.

Duurzame taakopslag voor vertraagde voltooiing

Taakstatus en artefacten moeten procesherstarts overleven. Als je agent draait in Kubernetes, ga er dan van uit dat pods sterven midden in een taak en back-up taakrecords en artefact-blobs naar een store die de agentcontainer niet exclusief bezit.

Foutafhandeling voor langlopende A2A-workflows

Langlopende workflows falen op voorspelbare manieren door time-outs, retries, gedeeltelijke artefacten en onveilige annulering, en elk heeft een expliciet beleid nodig in plaats van ad-hoc afhandeling in clientcode.

Per-hop en end-to-end timeoutbudgetten

Stel time-outs in op twee niveaus: een per-hop maximum voor één agenttaak voor escalatie of annulering, en een end-to-end maximum voor de gebruikerszichtbare workflow. Een retrieval-agent die hangt, moet de hele orchestrator niet blokkeren tot de browser van de gebruiker time-out geeft.

Retries en idempotentie voor A2A-taken

Retries zonder idempotentie dupliceren side-effecten zoals dubbele belastingen, dubbele tickets en herhaalde e-mails. Gebruik stabiele clientbericht-IDs of idempotentiesleutels waar het protocol het toestaat, en voor business-mutaties lijn je af op Idempotentie in Gedispatche Systemen Dat Echt Werkt. Retry alleen transiënte fouten zoals netwerkblips of 503s, en retry niet afgewezen of beleidsovertredingen blindelings omdat je kosten verhoogt en downstream-agents irritert.

Gedeeltelijke artefactherstelbeleid

Wanneer een taak faalt na het produceren van gedeeltelijke artefacten, definieer dan of je gedeeltelijke output aan de gebruiker exposeert met een duidelijke “onvolledig”-label, hervatting toestaat vanaf het laatste goede checkpoint, of gedeeltelijke output verwijdert wanneer deze kan misleiden in medische, juridische of financiële contexten.

Veilige annulering over delegatieketens

Annuleer downstream-taken wanneer een upstream-gebruiker abort, gebruik een delegatiegraaf zodat annulering propageert, en log geannuleerde taken die al kosten hebben veroorzaakt omdat financiele teams dat merken.

Observability voor Asynchrone A2A-workflows

Je kunt multi-agent asynchroon werk niet debuggen tenzij je het kunt traceren over grenzen, wat betekent dat je identifiers op elke hop moet correleren in plaats van te vertrouwen op gestructureerde logs. Minimum correlatievelden omvatten een trace-ID per gebruiker-initiëerde workflow, een taak-ID per agenttaak inclusief gedelegeerde kinderen, een agent-ID voor de Agent Card of service die de hop heeft afgehandeld, en een parent taak-ID die delegatieketens koppelt.

Log elke statusovergang met timestamps, en log artefactcreatie-events met grootte en hash in plaats van noodzakelijkerwijs volledige inhoud wanneer PII-beleid van toepassing is. Attribueer kosten en latentie per hop, omdat multi-agent-workflows tokenbesteding verbergen tot de rekening arriveert en per-taak kostenlabels “welke specialist is duur?” beantwoordbaar maken. Voor metrics, tracing-backends en LLM-specifieke instrumentatiepatronen, zie Observability voor LLM-systemen en de bredere Observability pijler voor hoe die signalen passen in een productie-telemetry stack. Wanneer een gebruiker vraagt “waarom deed de agent dat?”, moet je antwoord een trace zijn die orchestrator, A2A-hops, MCP-tool-aanroepen en elke inputvereist-pauze bespannen in plaats van een schouderophalen en een log grep.

Productiechecklist voor A2A-streaming en Asynchrone Taken

Voordat je langlopende A2A-paden naar productie stuurt, verifieer de volgende gebieden.

Agent Card en capaciteiten

  • capabilities.streaming weerspiegelt daadwerkelijke SSE-ondersteuning
  • Push-meldingondersteuning gedocumenteerd indien geïmplementeerd
  • Vaardigheden die menselijke goedkeuring vereisen documenteren verwacht inputvereist-gedrag

Clientmodi

  • SSE-client handhaaft herabonnement via SubscribeToTask
  • Poll-interval backt-off onder load
  • Push-webhook verifieert authenticiteit en wijst verouderde events af

Duurzaamheid

  • Taakstatus overleeft agentprocesherstarts
  • Artefacten opgeslagen buiten ephemeral container-bestandssysteem
  • Tussenliggende artefacten beschikbaar voor gedeeltelijk herstel

Fouten en beleid

  • Per-hop en end-to-end timeoutbudgetten gedefinieerd
  • Retries idempotent voor muterende operaties
  • Annulering propageert over delegatie-edges

Observability

  • trace-ID + taak-ID + agent-ID op elke hop
  • Statusovergangen gelogd
  • Kostenattributie per taak of per agent

Loadtesting

  • SSE via je reverse proxy (buffering breekt streams)
  • Concurrente lange taken zonder geheugenlekken op open verbindingen
  • Push-floodafhandeling zonder webhook-overload

Conclusie

De waarde van A2A komt het duidelijkst naar voren wanneer werk niet past in een enkele synchrone API-aanroep, omdat streaming, asynchrone taken, push-meldingen en expliciete taakstatussen zijn hoe het protocol echte agentworkloads zoals onderzoek, delegatie, goedkeuringen en grote artefacten handhaaft zonder te doen alsof alles in één HTTP-roundtrip voltooit. Begin met de eenvoudigste modus die werkt, voeg SSE toe wanneer gebruikers live voortgang nodig hebben, voeg push toe wanneer verbindingen niet open kunnen blijven, behandel inputvereist als een first-class ontwerptool in plaats van een fout, en instrumenteer elke hop zodat multi-agent asynchrone workflows je vermogen om ze uit te leggen niet voorbijlopen.

Veelgestelde Vragen

Wanneer moet je A2A-streaming gebruiken in plaats van polling? Gebruik streaming wanneer de client een open HTTP-verbinding kan handhaven en je low-latency voortgangupdates of incrementele artefacten nodig hebt. Gebruik polling wanneer verbindingen onbetrouwbaar zijn, clients batch-georiënteerd zijn, of je alleen periodieke statuscontroles nodig hebt op langlopende taken.

Wat betekent inputvereist in een A2A-taak? Het is een pauzestatus waarbij de agent meer informatie of menselijke goedkeuring nodig heeft. Ontwerp UX en time-outs expliciet rond dit in plaats van het te behandelen als een fout.

Hoe werken A2A push-meldingen? Registreer een PushNotificationConfig met een HTTPS-webhook. De server POST bij significante updates; de client roept GetTask aan om volledige status en artefacten op te halen.

Hoe moet je gefaalde A2A-taken retryen? Retry transiënte fouten met idempotentiesleutels, respecteer timeoutbudgetten en retry niet blindelings terminale statussen zoals afgewezen of beleidsovertredingen.

Wat moet je loggen voor langlopende A2A-workflows? Correleer trace-ID, taak-ID en agent-ID over hops. Log statusovergangen, artefacten, delegatie, goedkeuringen en per-stap kosten zodat je de volledige workflow kunt reconstrueren.

Bronnen

Abonneren

Ontvang nieuwe berichten over systemen, infrastructuur en AI-engineering.