Skip to content

Commit a466645

Browse files
committed
added diagram. removed non-framework icons. made building blocks hover
1 parent 24b203d commit a466645

File tree

3 files changed

+121
-66
lines changed

3 files changed

+121
-66
lines changed

docs/Images/ag-ui-concept.png

1.16 MB
Loading

docs/Images/left-illustration.avif

46.6 KB
Binary file not shown.

docs/overview.mdx

Lines changed: 121 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,25 @@ title: AG-UI Overview
33
description:
44
---
55

6-
# AG‑UI: The Agent–User Interaction Protocol
6+
# The Agent–User Interaction (AG-UI) Protocol
77

88
*A horizontal standard to bring AI agents into user‑facing frontend applications.*
99

1010
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.
1111

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+
1216
---
1317

1418
## Built with the ecosystem
1519

1620
**First‑party partnerships & integrations**
1721

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+
1824
<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>
2925

3026
{/* LangGraph */}
3127
<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
5046
<span style={{fontSize: '0.75rem', fontWeight: '600', color: '#374151', textAlign: 'center'}}>Mastra</span>
5147
</div>
5248

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 */}
6450
<div style={{display: 'flex', flexDirection: 'column', alignItems: 'center', gap: '0.5rem'}}>
6551
<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)'}}>
6652
<svg width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="white" strokeWidth="2">
6753
<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"/>
6854
<path d="M7.5 4.21l4.5 2.6 4.5-2.6M12 6.81V17M3.27 6.96L12 12.01l8.73-5.05"/>
6955
</svg>
7056
</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>
7258
</div>
7359

7460
{/* ADK */}
@@ -138,53 +124,122 @@ AG‑UI is the boundary layer where AI agents and users meet. It standardizes ho
138124
</div>
139125
</div>
140126

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.*
142127

143128
---
144129

145130
## Building blocks (today & upcoming)
146131

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>
188243

189244
---
190245

@@ -249,7 +304,7 @@ AG-UI was born from an initial partnership between CopilotKit, LangGraph and Cre
249304

250305
```mermaid
251306
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]
253308
254309
B --> D[Protocol]
255310
B --> E[Runtime adapters]

0 commit comments

Comments
 (0)