Waarom agentische apps AG-UI nodig hebben
Voordat we naar de code kijken, leg ik uit waarom we überhaupt een nieuw protocol nodig hadden. Het komt neer op het fundamentele verschil tussen een functie en een agent.
De beperking van request/response
In traditionele webontwikkeling zijn interacties transactioneel. Je vraagt om een gebruikersprofiel en de server stuurt het terug. Het is een eenmalige uitwisseling.
Agents zijn echter onvoorspelbaar en kosten tijd. Als je een agent vraagt om "te debuggen waarom je CI-pijplijn ineens faalt na de merge van een teamgenoot", krijg je niet meteen een JSON-object terug. In plaats daarvan kan de agent:
- De laatste 50 commitlogs van GitHub ophalen (Action).
- Opmerken dat er een nieuwe dependency is toegevoegd zonder het lockfile te updaten (Observation).
- Die pakketversie kruisen met bekende CVE's (Reasoning).
- Vragen of je de merge wilt terugdraaien of vooruit wilt patchen (Human-in-the-loop).
Ik leg dit later uit in de sectie "Eventtypes", maar weet voor nu dat een standaard HTTP-verzoek zou time-outen terwijl dit allemaal gebeurt. Je hebt een manier nodig om deze gedeeltelijke updates te streamen, zodat de gebruiker niet naar een bevroren scherm staart.
De specifieke behoeften van agents
Agents hebben een bidirectionele informatiestroom nodig die verder gaat dan tekst. Ze moeten de State synchroniseren.
Stel je een agent voor die je helpt een rapport te schrijven. Het is niet alleen chatten; het is een document bewerken. Jij en de agent kunnen tegelijk typen. AG-UI behandelt dit door het "document" als gedeelde state te zien, met efficiënte updates om je scherm en het geheugen van de agent synchroon te houden zonder elkaars werk te overschrijven.
Hoe agents en UI's communiceren
AG-UI vervangt het oude Remote Procedure Call (RPC)-model door een Event-Sourcing-model. In plaats van te wachten op een definitief antwoord, stuurt de agent een gestage stroom events die beschrijven wat hij doet.
De eventstroom
Zie de AG-UI-stroom als een nieuwsticker voor het brein van je agent. De clientapplicatie (je frontend) abonneert zich op deze ticker en werkt de UI bij op basis van wat hij ziet. Deze aanpak ontkoppelt de logica: je React-frontend hoeft niet te weten hoe de agent denkt, alleen wat hij moet tonen.

AG-UI vermijdt de wachtrij. Afbeelding door de auteur.
Kern-eventtypes
Het protocol definieert standaard eventtypes die bijna elk interactiescenario afdekken. Dit zijn de belangrijkste die je zult zien:
-
TEXT_MESSAGE_*: Events die gegenereerde tekst stuk voor stuk streamen. Dit bestaat typisch uit_START,_CONTENT(de tokenstroom) en_END-events, die samen het bekende "typ"-effect creëren. -
TOOL_CALL: Signaleert dat de agent iets wil doen, zoals het weer checken of een database bevragen. Cruciaal: AG-UI kan de argumenten van de toolaanroep streamen, zodat je UI formulieren kan vooraf invullen nog vóór de agent klaar is met "praten". -
STATE_DELTA: Dit is de krachtpatser voor samenwerking. In plaats van telkens het hele document te versturen als er een letter verandert, stuurt de agent een kleine "diff" (zoals "voeg 'hallo' toe op index 5"). -
INTERRUPT: De veiligheidsklep. Als een agent een gevoelige actie raakt (zoals "Database verwijderen"), zendt hij een interrupt-event uit. De flow pauzeert totdat de gebruiker een goedkeurings-event terugstuurt.
Multimodaliteit en denkstappen
Het protocol is niet beperkt tot tekst. Het ondersteunt multimodaliteit, waarmee ik bedoel: beelden, audio en bestandsbijlagen streamen naast het gesprek. Het standaardiseert ook denkstappen door de interne gedachten van de agent (reasoning traces) te scheiden van het uiteindelijke publieke antwoord. Je ziet een vergelijkbaar patroon bij tools zoals ChatGPT, waar voortgangsindicatoren of tussenstappen los staan van het eindantwoord. Dit laat je kiezen of je gebruikers de uitvoeringsvoortgang laat zien of alleen het eindresultaat.
AG-UI-bouwstenen
Nu je de flow begrijpt, bekijken we de specifieke features die AG-UI krachtig maken voor developers.
Generatieve UI
Tekst is prima, maar soms is een grafiek beter. Met generatieve UI kan een agent tijdens runtime besluiten om een UI-component te tonen in plaats van tekst.

AG-UI streamt events; A2UI definieert componenten. Afbeelding door de auteur.
Er is hier een onderscheid dat vaak verwarring geeft (ik kom hierop terug in de frameworksectie): AG-UI is het bezorgmechanisme (transportlaag) en A2UI (Agent-to-User Interface) is de UI-definitie (payload). Een agent kan een AG-UI-TOOL_CALL-event gebruiken om een A2UI-payload te vervoeren, een declaratieve JSON-boom die een UI-component beschrijft (zoals een "Aandelenkoerskaart"). Je frontend ontvangt dit en rendert de daadwerkelijke grafiek.
Gedeelde state met JSON Patch
Gedeelde state afhandelen is lastig. Als de agent elke seconde een massief contextobject van 5 MB stuurt, wordt je app tergend traag.
AG-UI lost dit op met JSON Patch (RFC 6902). Zoals ik eerder noemde over statesynchronisatie, wanneer de agent een waarde in zijn geheugen verandert, berekent hij het verschil en stuurt een STATE_DELTA-event.
[
{
"op": "replace",
"path": "/user/status",
"value": "active"
}
]
De client ontvangt deze lichte instructie en past die toe op zijn lokale state. Deze efficiëntie maakt realtime samenwerking met agents mogelijk.
AG-UI in het protocollandschap
Misschien heb je gehoord van andere protocollen zoals MCP (Model Context Protocol). Het is belangrijk te weten waar AG-UI in de stack past, zodat je niet het verkeerde gereedschap voor de klus gebruikt.
De agentische stack
Ik zie het als een communicatie-driehoek:
- MCP (Agent ↔ Tools): Dit verbindt de agent met de backendwereld: databases, GitHub-repo's en interne API's. Het draait om informatie verkrijgen.
- A2A (Agent ↔ Agent): Hiermee kunnen agents met elkaar praten en taken delegeren aan subagents.
- AG-UI (Agent ↔ Gebruiker): Dit is de "laatste kilometer". Het verbindt de intelligentie van de agent met de mens.

De Protocoldrie-eenheid die agents verbindt. Afbeelding door de auteur.
AG-UI maakt het niet uit hoe de agent de data heeft gekregen (dat is MCP's taak, zoals hierboven genoemd); het gaat hem alleen om hoe hij die data aan jou toont.
AG-UI implementeren
Laten we kijken hoe dit er in de praktijk uitziet. Developers werken doorgaans op drie manieren met AG-UI: 1) agentische apps bouwen (een frontend aan een agent koppelen), 2) integraties bouwen (een framework compatibel maken) of 3) clients bouwen (nieuwe frontends creëren). De meesten van jullie vallen in de eerste categorie.
Ik leg zo de code uit, maar begrijp eerst dat je de ruwe protocolhandlers meestal niet zelf schrijft. Bibliotheken verzorgen de verpakking. Het begrijpen van de flow is wel nodig om te debuggen.
Het eventkanaal opzetten
De meeste implementaties gebruiken Server-Sent Events (SSE) omdat ze simpel zijn, firewallvriendelijk en perfect voor eenrichtingsstreaming van server naar client. Ik hintte hier eerder op, maar SSE is de sleutel die dit protocol zo lichtgewicht maakt vergeleken met WebSockets.
In een typische setup (zoals met het Microsoft Agent Framework of CopilotKit) stelt je server een endpoint bloot dat de verbinding opwaardeert naar een stream.
Eenvoudige eventabonnementen
Hier is een conceptueel voorbeeld van hoe een frontendclient naar de stream luistert. Let op hoe we verschillende eventtypes afhandelen om de UI bij te werken.
// Connect to the AG-UI stream
const eventSource = new EventSource('/api/agent/stream');
eventSource.onmessage = (event) => {
const data = JSON.parse(event.data);
switch (data.type) {
case 'TEXT_MESSAGE_CONTENT':
// Append text to the chat window
updateChatLog(data.content);
break;
case 'TOOL_CALL_START':
// Show a "Processing..." indicator or the specific tool UI
showToolIndicator(data.tool_name);
break;
case 'STATE_DELTA':
// Apply the JSON patch to our local state store
applyPatch(localState, data.patch);
break;
case 'INTERRUPT':
// Prompt the user for permission
showApprovalModal(data.message);
break;
}
};
Dit patroon verbergt de complexiteit van de interne logica van de agent. Je frontend is gewoon een "speler" voor de events die de agent verstuurt.
Integraties en ecosysteemondersteuning
Je hoeft dit niet allemaal from scratch te bouwen. Het ecosysteem wordt snel volwassener, waarbij grote platforms en frameworks naar vergelijkbare eventgestuurde interactiepatronen toegroeien.
De "Gouden Driehoek" van tools
Microsoft beschrijft een "Gouden Driehoek" voor agentontwikkeling:
- DevUI: Voor het visualiseren van het denkproces van de agent (debuggen).
- OpenTelemetry: Voor het meten van performance en kosten.
- AG-UI: Voor de verbinding met de gebruiker.
Ondersteunde frameworks
Het ecosysteem breidt snel uit. Naast de grote spelers groeit de ondersteuning overal:
-
Microsoft Agent Framework: Heeft native middleware voor ASP.NET Core (
Microsoft.Agents.AI.Hosting.AGUI). -
CopilotKit: Werkt als de "browser" voor AG-UI en levert een volledige React-frontend die deze events out-of-the-box kan renderen.
-
Python-ecosysteem: Frameworks zoals LangGraph, CrewAI, Mastra, Pydantic AI, Agno en LlamaIndex kunnen allemaal als AG-UI-endpoints worden blootgesteld.
-
SDK's: Terwijl TypeScript en Python dominant zijn, zijn SDK's actief of in ontwikkeling voor Kotlin, Go, Dart, Java en Rust.
Betrouwbaarheid, debuggen en security
Een rechtstreekse communicatielijn tussen een AI en een browser openen brengt risico's met zich mee. Zo houd je je applicatie veilig.
De vertrouwde frontendserver
Laat een client nooit direct verbinden met je ruwe agentruntime. Zoals ik benadrukte in de sectie "Waarom agentische apps AG-UI nodig hebben": gebruik altijd een vertrouwde frontendserver (BFF-patroon). Deze server fungeert als poortwachter. Hij voegt authenticatie, rate limiting en inputvalidatie toe voordat hij het bericht van de gebruiker aan de agent doorgeeft.
Beveiligingsoverwegingen
Prompt injection
Kwaadwillende gebruikers kunnen proberen de instructies van je agent te overschrijven via prompt injection-aanvallen. Zoals ik eerder al aangaf, moet je middleware inputs opschonen.
Ongeautoriseerde toolaanroepen
Dat een agent kan een bestand verwijderen, betekent niet dat de huidige gebruiker dat ook mag. Je vertrouwde server moet de tools die voor de agent beschikbaar zijn filteren op basis van de rechten van de gebruiker.
State-beveiliging
Omdat state wordt gedeeld via JSON-patches, wees alert op prototype pollution. Zorg dat je patchbibliotheek wijzigingen aan beschermde properties zoals __proto__ verbiedt.
Debuggen met de Dojo
Als je agent zich vreemd gedraagt, gebruik de AG-UI Dojo. Het is een testsuite waarmee je de ruwe eventstroom kunt visualiseren. Zo spoor je problemen op zoals onjuiste JSON-patches of toolaanroepen die wel vuren maar geen resultaat teruggeven.
Conclusie
We hebben de architectuur, de eventtypes en de implementatiepatronen van AG-UI behandeld.
Ik besef dat de gemiddelde solodeveloper of iemand bij een klein bedrijf niet realistisch gezien "AG-UI gaat adopteren" en ineens "de frontend van de backend loskoppelt". Dit vergt forse architectuurkeuzes, draagvlak bij meerdere teams en middelen die de meesten niet hebben.
Maar AG-UI begrijpen is waardevol, ook als je het niet implementeert. Als je agentframeworks evalueert of beslist om in-house te bouwen of een platform te gebruiken, helpt weten hoe "goede" communicatie tussen agent en UI eruitziet je om beter te oordelen. Je herkent wanneer een tool je in breekbare patronen dwingt.
Wil je dieper duiken in het bouwen van dit soort systemen? Bekijk dan onze cursussen Introduction to AI Agents en Building Scalable Agentic Systems om je skills naar het volgende niveau te brengen.

Ik ben een data-engineer en communitybouwer die werkt aan datapijplijnen, cloud en AI-tools, en tegelijkertijd praktische, impactvolle tutorials schrijft voor DataCamp en beginnende developers.
AG-UI FAQ's
Maakt streamen de agent echt sneller?
Het laat de AI niet sneller denken, maar het laat het voor de gebruiker sneller aanvoelen. Het eerste woord binnen 200 ms zien verschijnen houdt mensen betrokken, zelfs als het volledige antwoord tien seconden duurt. Het is net zo goed een psychologisch trucje als een technische aanpak.
Wat als ik later spraakondersteuning wil toevoegen?
Je bent dan al halverwege. Omdat AG-UI de content scheidt van de weergave, kun je gewoon een Text-to-Speech-service inpluggen om de TEXT_MESSAGE_*-events voor te lezen zodra ze binnenkomen. Het protocol regelt de datastroom; jij kiest alleen hoe je die rendert.
Is dit lastig te debuggen als er iets stukgaat?
Eigenlijk kan het makkelijker zijn dan traditionele code. Omdat alles een event is, kun je letterlijk een bug "replayen". Als een gebruiker een crash meldt, pak je hun eventlog en laat je die door je ontwikkelomgeving lopen om precies te zien wat er gebeurde.
Zit ik hiermee vast aan een specifieke leverancier?
Nee, en dat is het mooiste. AG-UI is een open standaard, geen product. Je kunt je backend wisselen van LangChain naar Microsoft Semantic Kernel zonder je frontendverbindingslogica te herschrijven.
Hoe ga ik om met updates van het protocol?
Het protocol gebruikt semantische versies. De meeste bibliotheken zijn forward-compatible gebouwd, wat betekent dat als de server een nieuw eventtype stuurt dat je client niet kent, die het meestal gewoon negeert in plaats van te crashen.
Kan ik AG-UI-agents lokaal draaien zonder cloud-backend?
Zeker. AG-UI is slechts een communicatiepatroon, geen service. Je kunt zowel de agent als de frontend op je laptop draaien als je wilt. Sommige developers gebruiken dit voor offline demo's of privacygevoelige toepassingen.
Wat als mijn server traag is en events eindeloos op zich laten wachten?
Het mooie van streamen is dat langzaam beter is dan vastlopen. Zelfs als je agent 30 seconden nodig heeft om af te ronden, ziet de gebruiker elke paar honderd milliseconden voortgang. Vergelijk dat met een REST-call waarbij ze 30 seconden naar een spinner staren en denken dat het gecrasht is.
Kunnen meerdere gebruikers tegelijk met dezelfde agent praten?
Ja, maar je moet sessies isoleren. Elke gebruiker krijgt zijn eigen eventstream (meestal gekoppeld aan een sessie-ID of WebSocket-verbinding). De agent kan honderden gebruikers tegelijk bedienen, net zoals een webserver meerdere HTTP-verzoeken afhandelt.
Hoe voorkom ik dat iemand mijn agent bestookt met verzoeken?
Standaard rate limiting geldt hier. Je vertrouwde frontendserver moet verzoeken per gebruiker afknijpen (bijv. max. 10 berichten per minuut). Omdat AG-UI over HTTP of WebSockets loopt, kun je dezelfde tools gebruiken als voor API-rate limiting.
Hoe schrijf ik geautomatiseerde tests voor een AG-UI-agent?
Je kunt de eventstream mocken. Neem de events van een echte sessie op in een bestand en speel ze daarna af in je testsuite om te verifiëren dat je frontend ze goed afhandelt. Het lijkt op snapshot testing, maar dan voor conversaties in plaats van UI-componenten.
De verschuiving van simpele tekstgenererende bots naar autonome agents heeft de traditionele manier van software bouwen doorbroken. Vroeger stuurde je een verzoek en kreeg je een antwoord. Maar agent-capabele modellen (zoals de nieuwe GPT-5.2-Codex, om er een te noemen) werken niet zo. Ze redeneren, plannen, gebruiken tools en kunnen minuten nodig hebben om een taak af te ronden. Ze geven voortgangssignalen en vragen om toestemming voordat ze een dashboard realtime kunnen bijwerken.
Proberen om deze vloeiende, langlopende interacties in een standaard REST-API te persen, is alsof je een livevideo via e-mail probeert te streamen. Het resultaat is meestal een brij aan maatwerkcode die je frontend strak aan je backend kluistert, waardoor het lastig wordt om van tools te wisselen of op te schalen.
Deze gids introduceert het Agent-User Interaction (AG-UI) Protocol, een echte standaard die aan terrein wint en is ontworpen om deze "interactiesilo" op te lossen. Ik laat je zien hoe AG-UI een universele taal creëert voor agents en UI's, hoe het complexe state afhandelt en hoe je het kunt gebruiken om robuuste agentische applicaties te bouwen.
Nog een opmerking vooraf: de terminologie in dit artikel kan vreemd aanvoelen als je niet thuis bent in backend/frontend webontwikkeling en API-ontwerp-patronen.