@@ -3,29 +3,25 @@ title: AG-UI Overview
3
3
description :
4
4
---
5
5
6
- # AG‑UI: The Agent–User Interaction Protocol
6
+ # The Agent–User Interaction (AG-UI) Protocol
7
7
8
8
* A horizontal standard to bring AI agents into user‑facing frontend applications.*
9
9
10
10
AG‑UI is the boundary layer where AI agents and users meet. It standardizes how agent state, UI intents, and user interactions flow between your model/agent runtime and your app's frontend—so you can ship reliable, debuggable, user‑friendly agentic features fast.
11
11
12
+ <div style = { {textAlign: ' center' , margin: ' 2rem 0' }} >
13
+ <img src = " /images/ag-ui-concept.png" alt = " AG-UI Architecture Illustration" style = { {maxWidth: ' 100%' , height: ' auto' , borderRadius: ' 8px' }} />
14
+ </div >
15
+
12
16
---
13
17
14
18
## Built with the ecosystem
15
19
16
20
** First‑party partnerships & integrations**
17
21
22
+ * AG‑UI works across leading agent frameworks and frontend stacks, with shared vocabulary and primitives that keep your UX consistent as your agents evolve.*
23
+
18
24
<div style = { {display: ' grid' , gridTemplateColumns: ' repeat(auto-fit, minmax(120px, 1fr))' , gap: ' 0.75rem' , margin: ' 2rem 0' , maxWidth: ' 800px' }} >
19
- { /* Direct to LLM */ }
20
- <div style = { {display: ' flex' , flexDirection: ' column' , alignItems: ' center' , gap: ' 0.5rem' }} >
21
- <div style = { {width: ' 64px' , height: ' 64px' , borderRadius: ' 16px' , backgroundColor: ' #10B981' , display: ' flex' , alignItems: ' center' , justifyContent: ' center' , boxShadow: ' 0 4px 12px rgba(16, 185, 129, 0.25)' }} >
22
- <svg width = " 32" height = " 32" viewBox = " 0 0 24 24" fill = " none" xmlns = " http://www.w3.org/2000/svg" >
23
- <path d = " M12 2L13.09 8.26L20 9L15 14L16.18 21L12 17.77L7.82 21L9 14L2 9L8.91 8.26L12 2Z" fill = " white" />
24
- <path d = " M12 16L10.5 22L12 20.5L13.5 22L12 16Z" fill = " white" opacity = " 0.6" />
25
- </svg >
26
- </div >
27
- <span style = { {fontSize: ' 0.75rem' , fontWeight: ' 600' , color: ' #374151' , textAlign: ' center' }} >Direct to LLM</span >
28
- </div >
29
25
30
26
{ /* LangGraph */ }
31
27
<div style = { {display: ' flex' , flexDirection: ' column' , alignItems: ' center' , gap: ' 0.5rem' }} >
@@ -50,25 +46,15 @@ AG‑UI is the boundary layer where AI agents and users meet. It standardizes ho
50
46
<span style = { {fontSize: ' 0.75rem' , fontWeight: ' 600' , color: ' #374151' , textAlign: ' center' }} >Mastra</span >
51
47
</div >
52
48
53
- { /* CrewAI Crews */ }
54
- <div style = { {display: ' flex' , flexDirection: ' column' , alignItems: ' center' , gap: ' 0.5rem' }} >
55
- <div style = { {width: ' 64px' , height: ' 64px' , borderRadius: ' 16px' , backgroundColor: ' #F97316' , display: ' flex' , alignItems: ' center' , justifyContent: ' center' , boxShadow: ' 0 4px 12px rgba(249, 115, 22, 0.25)' }} >
56
- <svg width = " 32" height = " 32" viewBox = " 0 0 24 24" fill = " white" >
57
- <path d = " M12 2c5.523 0 10 4.477 10 10s-4.477 10-10 10S2 17.523 2 12 6.477 2 12 2zm0 2a8 8 0 1 0 0 16 8 8 0 0 0 0-16zm0 2a6 6 0 1 1 0 12 6 6 0 0 1 0-12zm0 2a4 4 0 1 0 0 8 4 4 0 0 0 0-8zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4z" />
58
- </svg >
59
- </div >
60
- <span style = { {fontSize: ' 0.75rem' , fontWeight: ' 600' , color: ' #374151' , textAlign: ' center' }} >CrewAI Crews</span >
61
- </div >
62
-
63
- { /* CrewAI Flows */ }
49
+ { /* CrewAI */ }
64
50
<div style = { {display: ' flex' , flexDirection: ' column' , alignItems: ' center' , gap: ' 0.5rem' }} >
65
51
<div style = { {width: ' 64px' , height: ' 64px' , borderRadius: ' 16px' , backgroundColor: ' #F97316' , display: ' flex' , alignItems: ' center' , justifyContent: ' center' , boxShadow: ' 0 4px 12px rgba(249, 115, 22, 0.25)' }} >
66
52
<svg width = " 32" height = " 32" viewBox = " 0 0 24 24" fill = " none" stroke = " white" strokeWidth = " 2" >
67
53
<path d = " M21 16V8a2 2 0 0 0-1-1.73L12 2 4 6.27A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73L12 22l8-4.27A2 2 0 0 0 21 16z" />
68
54
<path d = " M7.5 4.21l4.5 2.6 4.5-2.6M12 6.81V17M3.27 6.96L12 12.01l8.73-5.05" />
69
55
</svg >
70
56
</div >
71
- <span style = { {fontSize: ' 0.75rem' , fontWeight: ' 600' , color: ' #374151' , textAlign: ' center' }} >CrewAI Flows </span >
57
+ <span style = { {fontSize: ' 0.75rem' , fontWeight: ' 600' , color: ' #374151' , textAlign: ' center' }} >CrewAI</span >
72
58
</div >
73
59
74
60
{ /* ADK */ }
@@ -138,53 +124,122 @@ AG‑UI is the boundary layer where AI agents and users meet. It standardizes ho
138
124
</div >
139
125
</div >
140
126
141
- * AG‑UI works across leading agent frameworks and frontend stacks, with shared vocabulary and primitives that keep your UX consistent as your agents evolve.*
142
127
143
128
---
144
129
145
130
## Building blocks (today & upcoming)
146
131
147
- <AccordionGroup >
148
- <Accordion title = " Streaming chat" >
149
- Token‑level and tool‑event streaming for responsive UIs.
150
- </Accordion >
151
-
152
- <Accordion title = " Static generative UI" >
153
- Render model output into stable, typed components.
154
- </Accordion >
155
-
156
- <Accordion title = " Declarative generative UI" >
157
- Let agents propose UI trees; app decides what to mount.
158
- </Accordion >
159
-
160
- <Accordion title = " Frontend tools" >
161
- Safe, typed tool calls that bridge agent logic to app actions.
162
- </Accordion >
163
-
164
- <Accordion title = " Interrupts & human‑in‑the‑loop" >
165
- Pause, approve, edit, or steer mid‑flow.
166
- </Accordion >
167
-
168
- <Accordion title = " In‑chat + in‑app interactions" >
169
- Chat commands alongside regular app controls.
170
- </Accordion >
171
-
172
- <Accordion title = " Attachments & multimodality" >
173
- Files, images, audio, and structured payloads.
174
- </Accordion >
175
-
176
- <Accordion title = " Thinking steps" >
177
- Expose summaries/redactions of chain‑of‑thought artifacts to users, safely.
178
- </Accordion >
179
-
180
- <Accordion title = " Sub‑agent calls" >
181
- Orchestrate nested agents and delegate specialized tasks.
182
- </Accordion >
183
-
184
- <Accordion title = " Agent steering" >
185
- Guardrails, policies, and UX affordances to keep agents on track.
186
- </Accordion >
187
- </AccordionGroup >
132
+ <div style = { {display: ' flex' , flexDirection: ' column' , gap: ' 0.5rem' , margin: ' 1.5rem 0' }} >
133
+ <div style = { {border: ' 1px solid #e5e7eb' , borderRadius: ' 8px' , overflow: ' hidden' , transition: ' all 0.3s ease' , cursor: ' pointer' }} onMouseEnter = { (e ) => { e .currentTarget .style .borderColor = ' #3b82f6' ; e .currentTarget .style .boxShadow = ' 0 4px 12px rgba(59, 130, 246, 0.15)' ; e .currentTarget .querySelector (' .content' ).style .maxHeight = ' 200px' ; e .currentTarget .querySelector (' .content' ).style .opacity = ' 1' ; }} onMouseLeave = { (e ) => { e .currentTarget .style .borderColor = ' #e5e7eb' ; e .currentTarget .style .boxShadow = ' none' ; e .currentTarget .querySelector (' .content' ).style .maxHeight = ' 0px' ; e .currentTarget .querySelector (' .content' ).style .opacity = ' 0' ; }} >
134
+ <div style = { {padding: ' 1rem 1.5rem' , backgroundColor: ' #f9fafb' , fontWeight: ' 600' , color: ' #374151' }} >
135
+ Streaming chat
136
+ </div >
137
+ <div className = " content" style = { {maxHeight: ' 0px' , opacity: ' 0' , overflow: ' hidden' , transition: ' all 0.3s ease' , padding: ' 0 1.5rem' , backgroundColor: ' #ffffff' }} >
138
+ <div style = { {padding: ' 1rem 0' , color: ' #6b7280' , lineHeight: ' 1.6' }} >
139
+ Token‑level and tool‑event streaming for responsive UIs.
140
+ </div >
141
+ </div >
142
+ </div >
143
+
144
+ <div style = { {border: ' 1px solid #e5e7eb' , borderRadius: ' 8px' , overflow: ' hidden' , transition: ' all 0.3s ease' , cursor: ' pointer' }} onMouseEnter = { (e ) => { e .currentTarget .style .borderColor = ' #3b82f6' ; e .currentTarget .style .boxShadow = ' 0 4px 12px rgba(59, 130, 246, 0.15)' ; e .currentTarget .querySelector (' .content' ).style .maxHeight = ' 200px' ; e .currentTarget .querySelector (' .content' ).style .opacity = ' 1' ; }} onMouseLeave = { (e ) => { e .currentTarget .style .borderColor = ' #e5e7eb' ; e .currentTarget .style .boxShadow = ' none' ; e .currentTarget .querySelector (' .content' ).style .maxHeight = ' 0px' ; e .currentTarget .querySelector (' .content' ).style .opacity = ' 0' ; }} >
145
+ <div style = { {padding: ' 1rem 1.5rem' , backgroundColor: ' #f9fafb' , fontWeight: ' 600' , color: ' #374151' }} >
146
+ Static generative UI
147
+ </div >
148
+ <div className = " content" style = { {maxHeight: ' 0px' , opacity: ' 0' , overflow: ' hidden' , transition: ' all 0.3s ease' , padding: ' 0 1.5rem' , backgroundColor: ' #ffffff' }} >
149
+ <div style = { {padding: ' 1rem 0' , color: ' #6b7280' , lineHeight: ' 1.6' }} >
150
+ Render model output into stable, typed components.
151
+ </div >
152
+ </div >
153
+ </div >
154
+
155
+ <div style = { {border: ' 1px solid #e5e7eb' , borderRadius: ' 8px' , overflow: ' hidden' , transition: ' all 0.3s ease' , cursor: ' pointer' }} onMouseEnter = { (e ) => { e .currentTarget .style .borderColor = ' #3b82f6' ; e .currentTarget .style .boxShadow = ' 0 4px 12px rgba(59, 130, 246, 0.15)' ; e .currentTarget .querySelector (' .content' ).style .maxHeight = ' 200px' ; e .currentTarget .querySelector (' .content' ).style .opacity = ' 1' ; }} onMouseLeave = { (e ) => { e .currentTarget .style .borderColor = ' #e5e7eb' ; e .currentTarget .style .boxShadow = ' none' ; e .currentTarget .querySelector (' .content' ).style .maxHeight = ' 0px' ; e .currentTarget .querySelector (' .content' ).style .opacity = ' 0' ; }} >
156
+ <div style = { {padding: ' 1rem 1.5rem' , backgroundColor: ' #f9fafb' , fontWeight: ' 600' , color: ' #374151' }} >
157
+ Declarative generative UI
158
+ </div >
159
+ <div className = " content" style = { {maxHeight: ' 0px' , opacity: ' 0' , overflow: ' hidden' , transition: ' all 0.3s ease' , padding: ' 0 1.5rem' , backgroundColor: ' #ffffff' }} >
160
+ <div style = { {padding: ' 1rem 0' , color: ' #6b7280' , lineHeight: ' 1.6' }} >
161
+ Let agents propose UI trees; app decides what to mount.
162
+ </div >
163
+ </div >
164
+ </div >
165
+
166
+ <div style = { {border: ' 1px solid #e5e7eb' , borderRadius: ' 8px' , overflow: ' hidden' , transition: ' all 0.3s ease' , cursor: ' pointer' }} onMouseEnter = { (e ) => { e .currentTarget .style .borderColor = ' #3b82f6' ; e .currentTarget .style .boxShadow = ' 0 4px 12px rgba(59, 130, 246, 0.15)' ; e .currentTarget .querySelector (' .content' ).style .maxHeight = ' 200px' ; e .currentTarget .querySelector (' .content' ).style .opacity = ' 1' ; }} onMouseLeave = { (e ) => { e .currentTarget .style .borderColor = ' #e5e7eb' ; e .currentTarget .style .boxShadow = ' none' ; e .currentTarget .querySelector (' .content' ).style .maxHeight = ' 0px' ; e .currentTarget .querySelector (' .content' ).style .opacity = ' 0' ; }} >
167
+ <div style = { {padding: ' 1rem 1.5rem' , backgroundColor: ' #f9fafb' , fontWeight: ' 600' , color: ' #374151' }} >
168
+ Frontend tools
169
+ </div >
170
+ <div className = " content" style = { {maxHeight: ' 0px' , opacity: ' 0' , overflow: ' hidden' , transition: ' all 0.3s ease' , padding: ' 0 1.5rem' , backgroundColor: ' #ffffff' }} >
171
+ <div style = { {padding: ' 1rem 0' , color: ' #6b7280' , lineHeight: ' 1.6' }} >
172
+ Safe, typed tool calls that bridge agent logic to app actions.
173
+ </div >
174
+ </div >
175
+ </div >
176
+
177
+ <div style = { {border: ' 1px solid #e5e7eb' , borderRadius: ' 8px' , overflow: ' hidden' , transition: ' all 0.3s ease' , cursor: ' pointer' }} onMouseEnter = { (e ) => { e .currentTarget .style .borderColor = ' #3b82f6' ; e .currentTarget .style .boxShadow = ' 0 4px 12px rgba(59, 130, 246, 0.15)' ; e .currentTarget .querySelector (' .content' ).style .maxHeight = ' 200px' ; e .currentTarget .querySelector (' .content' ).style .opacity = ' 1' ; }} onMouseLeave = { (e ) => { e .currentTarget .style .borderColor = ' #e5e7eb' ; e .currentTarget .style .boxShadow = ' none' ; e .currentTarget .querySelector (' .content' ).style .maxHeight = ' 0px' ; e .currentTarget .querySelector (' .content' ).style .opacity = ' 0' ; }} >
178
+ <div style = { {padding: ' 1rem 1.5rem' , backgroundColor: ' #f9fafb' , fontWeight: ' 600' , color: ' #374151' }} >
179
+ Interrupts & human‑in‑the‑loop
180
+ </div >
181
+ <div className = " content" style = { {maxHeight: ' 0px' , opacity: ' 0' , overflow: ' hidden' , transition: ' all 0.3s ease' , padding: ' 0 1.5rem' , backgroundColor: ' #ffffff' }} >
182
+ <div style = { {padding: ' 1rem 0' , color: ' #6b7280' , lineHeight: ' 1.6' }} >
183
+ Pause, approve, edit, or steer mid‑flow.
184
+ </div >
185
+ </div >
186
+ </div >
187
+
188
+ <div style = { {border: ' 1px solid #e5e7eb' , borderRadius: ' 8px' , overflow: ' hidden' , transition: ' all 0.3s ease' , cursor: ' pointer' }} onMouseEnter = { (e ) => { e .currentTarget .style .borderColor = ' #3b82f6' ; e .currentTarget .style .boxShadow = ' 0 4px 12px rgba(59, 130, 246, 0.15)' ; e .currentTarget .querySelector (' .content' ).style .maxHeight = ' 200px' ; e .currentTarget .querySelector (' .content' ).style .opacity = ' 1' ; }} onMouseLeave = { (e ) => { e .currentTarget .style .borderColor = ' #e5e7eb' ; e .currentTarget .style .boxShadow = ' none' ; e .currentTarget .querySelector (' .content' ).style .maxHeight = ' 0px' ; e .currentTarget .querySelector (' .content' ).style .opacity = ' 0' ; }} >
189
+ <div style = { {padding: ' 1rem 1.5rem' , backgroundColor: ' #f9fafb' , fontWeight: ' 600' , color: ' #374151' }} >
190
+ In‑chat + in‑app interactions
191
+ </div >
192
+ <div className = " content" style = { {maxHeight: ' 0px' , opacity: ' 0' , overflow: ' hidden' , transition: ' all 0.3s ease' , padding: ' 0 1.5rem' , backgroundColor: ' #ffffff' }} >
193
+ <div style = { {padding: ' 1rem 0' , color: ' #6b7280' , lineHeight: ' 1.6' }} >
194
+ Chat commands alongside regular app controls.
195
+ </div >
196
+ </div >
197
+ </div >
198
+
199
+ <div style = { {border: ' 1px solid #e5e7eb' , borderRadius: ' 8px' , overflow: ' hidden' , transition: ' all 0.3s ease' , cursor: ' pointer' }} onMouseEnter = { (e ) => { e .currentTarget .style .borderColor = ' #3b82f6' ; e .currentTarget .style .boxShadow = ' 0 4px 12px rgba(59, 130, 246, 0.15)' ; e .currentTarget .querySelector (' .content' ).style .maxHeight = ' 200px' ; e .currentTarget .querySelector (' .content' ).style .opacity = ' 1' ; }} onMouseLeave = { (e ) => { e .currentTarget .style .borderColor = ' #e5e7eb' ; e .currentTarget .style .boxShadow = ' none' ; e .currentTarget .querySelector (' .content' ).style .maxHeight = ' 0px' ; e .currentTarget .querySelector (' .content' ).style .opacity = ' 0' ; }} >
200
+ <div style = { {padding: ' 1rem 1.5rem' , backgroundColor: ' #f9fafb' , fontWeight: ' 600' , color: ' #374151' }} >
201
+ Attachments & multimodality
202
+ </div >
203
+ <div className = " content" style = { {maxHeight: ' 0px' , opacity: ' 0' , overflow: ' hidden' , transition: ' all 0.3s ease' , padding: ' 0 1.5rem' , backgroundColor: ' #ffffff' }} >
204
+ <div style = { {padding: ' 1rem 0' , color: ' #6b7280' , lineHeight: ' 1.6' }} >
205
+ Files, images, audio, and structured payloads.
206
+ </div >
207
+ </div >
208
+ </div >
209
+
210
+ <div style = { {border: ' 1px solid #e5e7eb' , borderRadius: ' 8px' , overflow: ' hidden' , transition: ' all 0.3s ease' , cursor: ' pointer' }} onMouseEnter = { (e ) => { e .currentTarget .style .borderColor = ' #3b82f6' ; e .currentTarget .style .boxShadow = ' 0 4px 12px rgba(59, 130, 246, 0.15)' ; e .currentTarget .querySelector (' .content' ).style .maxHeight = ' 200px' ; e .currentTarget .querySelector (' .content' ).style .opacity = ' 1' ; }} onMouseLeave = { (e ) => { e .currentTarget .style .borderColor = ' #e5e7eb' ; e .currentTarget .style .boxShadow = ' none' ; e .currentTarget .querySelector (' .content' ).style .maxHeight = ' 0px' ; e .currentTarget .querySelector (' .content' ).style .opacity = ' 0' ; }} >
211
+ <div style = { {padding: ' 1rem 1.5rem' , backgroundColor: ' #f9fafb' , fontWeight: ' 600' , color: ' #374151' }} >
212
+ Thinking steps
213
+ </div >
214
+ <div className = " content" style = { {maxHeight: ' 0px' , opacity: ' 0' , overflow: ' hidden' , transition: ' all 0.3s ease' , padding: ' 0 1.5rem' , backgroundColor: ' #ffffff' }} >
215
+ <div style = { {padding: ' 1rem 0' , color: ' #6b7280' , lineHeight: ' 1.6' }} >
216
+ Expose summaries/redactions of chain‑of‑thought artifacts to users, safely.
217
+ </div >
218
+ </div >
219
+ </div >
220
+
221
+ <div style = { {border: ' 1px solid #e5e7eb' , borderRadius: ' 8px' , overflow: ' hidden' , transition: ' all 0.3s ease' , cursor: ' pointer' }} onMouseEnter = { (e ) => { e .currentTarget .style .borderColor = ' #3b82f6' ; e .currentTarget .style .boxShadow = ' 0 4px 12px rgba(59, 130, 246, 0.15)' ; e .currentTarget .querySelector (' .content' ).style .maxHeight = ' 200px' ; e .currentTarget .querySelector (' .content' ).style .opacity = ' 1' ; }} onMouseLeave = { (e ) => { e .currentTarget .style .borderColor = ' #e5e7eb' ; e .currentTarget .style .boxShadow = ' none' ; e .currentTarget .querySelector (' .content' ).style .maxHeight = ' 0px' ; e .currentTarget .querySelector (' .content' ).style .opacity = ' 0' ; }} >
222
+ <div style = { {padding: ' 1rem 1.5rem' , backgroundColor: ' #f9fafb' , fontWeight: ' 600' , color: ' #374151' }} >
223
+ Sub‑agent calls
224
+ </div >
225
+ <div className = " content" style = { {maxHeight: ' 0px' , opacity: ' 0' , overflow: ' hidden' , transition: ' all 0.3s ease' , padding: ' 0 1.5rem' , backgroundColor: ' #ffffff' }} >
226
+ <div style = { {padding: ' 1rem 0' , color: ' #6b7280' , lineHeight: ' 1.6' }} >
227
+ Orchestrate nested agents and delegate specialized tasks.
228
+ </div >
229
+ </div >
230
+ </div >
231
+
232
+ <div style = { {border: ' 1px solid #e5e7eb' , borderRadius: ' 8px' , overflow: ' hidden' , transition: ' all 0.3s ease' , cursor: ' pointer' }} onMouseEnter = { (e ) => { e .currentTarget .style .borderColor = ' #3b82f6' ; e .currentTarget .style .boxShadow = ' 0 4px 12px rgba(59, 130, 246, 0.15)' ; e .currentTarget .querySelector (' .content' ).style .maxHeight = ' 200px' ; e .currentTarget .querySelector (' .content' ).style .opacity = ' 1' ; }} onMouseLeave = { (e ) => { e .currentTarget .style .borderColor = ' #e5e7eb' ; e .currentTarget .style .boxShadow = ' none' ; e .currentTarget .querySelector (' .content' ).style .maxHeight = ' 0px' ; e .currentTarget .querySelector (' .content' ).style .opacity = ' 0' ; }} >
233
+ <div style = { {padding: ' 1rem 1.5rem' , backgroundColor: ' #f9fafb' , fontWeight: ' 600' , color: ' #374151' }} >
234
+ Agent steering
235
+ </div >
236
+ <div className = " content" style = { {maxHeight: ' 0px' , opacity: ' 0' , overflow: ' hidden' , transition: ' all 0.3s ease' , padding: ' 0 1.5rem' , backgroundColor: ' #ffffff' }} >
237
+ <div style = { {padding: ' 1rem 0' , color: ' #6b7280' , lineHeight: ' 1.6' }} >
238
+ Guardrails, policies, and UX affordances to keep agents on track.
239
+ </div >
240
+ </div >
241
+ </div >
242
+ </div >
188
243
189
244
---
190
245
@@ -249,7 +304,7 @@ AG-UI was born from an initial partnership between CopilotKit, LangGraph and Cre
249
304
250
305
``` mermaid
251
306
graph LR
252
- A[Agents ] <--> B[AG‑UI Boundary] <--> C[App UI/State]
307
+ A[Agentic App ] <--> B[AG‑UI Boundary] <--> C[App UI/State]
253
308
254
309
B --> D[Protocol]
255
310
B --> E[Runtime adapters]
0 commit comments