Skip to content

AG-UI 协议完全学习指南

AG-UI(Agent-User Interaction Protocol,智能体用户交互协议)是由 CopilotKit 发布的开源、轻量级、基于事件的协议,用于标准化 AI Agent 与前端应用之间的实时交互。

┌─────────────────────────────────────────────────────────────────┐
│                     AI Agent 交互协议生态                        │
├─────────────────────────────────────────────────────────────────┤
│   MCP = AI 的"工具箱"接口(Agent↔工具)                          │
│   A2A = AI 的"同事间"通信(Agent↔Agent)                         │
│   AG-UI = AI 的"用户界面"桥梁(Agent↔用户) ← 本文重点           │
└─────────────────────────────────────────────────────────────────┘

一、核心基础(Foundation)

1.1 定义与核心定位 ★重点★

什么是 AG-UI?

AG-UI(Agent-User Interaction Protocol)是一个:

  • 开放的:完全开源,MIT 协议
  • 轻量级的:协议设计简洁,易于实现
  • 基于事件的:所有通信都通过标准化事件流进行

一句话定义

AG-UI 是一个开放、轻量、事件驱动的协议,通过标准 HTTP 或可选的二进制通道,以流式方式传输 JSON 事件,实现 AI Agent 与用户界面的实时交互。

核心定位图

         ┌─────────────────────────────────────┐
         │           前端应用 (UI)              │
         │   React / Vue / Mobile / Terminal   │
         └──────────────────┬──────────────────┘

                     ┌──────▼──────┐
                     │   AG-UI     │  ← 标准化协议层
                     │   Protocol  │
                     └──────┬──────┘

         ┌──────────────────▼──────────────────┐
         │           AI Agent 后端              │
         │  LangGraph / CrewAI / OpenAI / 自建  │
         └─────────────────────────────────────┘

1.2 设计初衷与核心问题 ★重点★

解决的核心痛点

问题传统方案AG-UI 解决方案
碎片化每个 Agent 框架有自己的 UI 接口统一的事件协议标准
实时性差请求-响应模式,用户等待结果流式事件,实时反馈
状态不同步Agent 状态与 UI 状态割裂双向状态同步机制
扩展性差紧耦合,换框架需重写 UI协议标准化,框架可替换

1.3 适用场景 ★重点★

✅ 适用场景

场景说明示例
AI 聊天应用需要流式输出、实时反馈ChatGPT 类应用
AI 协作工具人机协作、人在回路AI 辅助编程
多步骤工作流展示进度和中间状态数据分析、报告生成
生成式 UIAgent 动态生成界面表单生成、图表展示

❌ 不适用场景

场景原因替代方案
Agent 间通信AG-UI 专注于 Agent↔用户使用 A2A 协议
工具调用定义AG-UI 不定义工具能力使用 MCP 协议
简单 API 调用无需流式、无需状态同步标准 REST API

1.4 与其他协议的对比 ★重点★

对比维度AG-UIMCPA2A
发起者CopilotKitAnthropicGoogle
核心定位Agent↔用户交互Agent↔工具连接Agent↔Agent 协作
消息格式JSON 事件流JSON-RPC 2.0JSON-RPC 2.0
传输方式HTTP/SSE/WebSocketstdio/HTTP/SSEHTTP
核心能力流式聊天、状态同步工具调用、资源访问任务委派、Agent 发现

★ 核心记忆点:三者是互补关系,不是竞争关系!


二、技术规范(Technical Specification)

2.1 核心架构 ★重点★

┌─────────────────────────────────────────────────────────────────┐
│                       AG-UI 核心架构                            │
├─────────────────────────────────────────────────────────────────┤
│  Application (应用层)     → 用户界面(React/Vue/Mobile)        │
│  AG-UI Client (客户端层)  → HttpAgent、事件处理                 │
│  Protocol (协议层)        → HTTP SSE / WebSocket / Binary       │
│  Agent (代理层)           → LangGraph / CrewAI / OpenAI         │
│  Secure Proxy (可选)      → API Key 管理、安全代理              │
└─────────────────────────────────────────────────────────────────┘

核心设计原则

原则说明
事件驱动所有通信基于事件流,定义 16+ 种标准事件
双向交互支持 Agent↔前端双向通信
传输无关支持 SSE/WebSocket/HTTP
框架无关可对接任何 Agent 框架

2.2 数据传输格式 ★重点★ 【强制要求】

基础事件结构

typescript
interface BaseEvent {
  type: EventType;        // 【必选】事件类型
  timestamp?: number;     // 【可选】毫秒时间戳
  rawEvent?: any;         // 【可选】原始事件
}

事件类型枚举(16种核心事件)

类别事件说明
生命周期RUN_STARTED, RUN_FINISHED, RUN_ERROR, STEP_STARTED, STEP_FINISHED运行控制
文本消息TEXT_MESSAGE_START, TEXT_MESSAGE_CONTENT, TEXT_MESSAGE_END流式文本
工具调用TOOL_CALL_START, TOOL_CALL_ARGS, TOOL_CALL_END, TOOL_CALL_RESULT工具执行
状态管理STATE_SNAPSHOT, STATE_DELTA, MESSAGES_SNAPSHOT状态同步
特殊事件RAW, CUSTOM扩展能力

2.3 通信协议 ★重点★

支持的传输方式

传输方式特点适用场景
HTTP SSE单向流式、兼容性好Web 应用、调试
HTTP Binary高性能、节省带宽生产环境
WebSocket双向实时、低延迟实时协作

SSE 事件格式 【强制要求】

data: {"type":"RUN_STARTED","threadId":"t1","runId":"r1"}\n\n
data: {"type":"TEXT_MESSAGE_CONTENT","messageId":"m1","delta":"Hello"}\n\n
data: {"type":"RUN_FINISHED","threadId":"t1","runId":"r1"}\n\n

三、交互流程(Interaction Flow)

3.1 完整交互链路 ★重点★

用户输入 → RUN_STARTED → [文本流/工具调用/状态更新] → RUN_FINISHED

                         STEP_STARTED → STEP_FINISHED(可选)

3.2 核心事件详解 ★重点★

3.2.1 生命周期事件

json
// RUN_STARTED
{"type": "RUN_STARTED", "threadId": "t1", "runId": "r1"}

// RUN_FINISHED
{"type": "RUN_FINISHED", "threadId": "t1", "runId": "r1", "result": {...}}

// RUN_ERROR
{"type": "RUN_ERROR", "message": "API rate limit", "code": "RATE_LIMIT"}

3.2.2 文本消息事件(Start → Content* → End)

json
{"type": "TEXT_MESSAGE_START", "messageId": "m1", "role": "assistant"}
{"type": "TEXT_MESSAGE_CONTENT", "messageId": "m1", "delta": "你好"}
{"type": "TEXT_MESSAGE_CONTENT", "messageId": "m1", "delta": ",我是AI"}
{"type": "TEXT_MESSAGE_END", "messageId": "m1"}

3.2.3 工具调用事件(Start → Args* → End → Result)

json
{"type": "TOOL_CALL_START", "toolCallId": "c1", "toolCallName": "search"}
{"type": "TOOL_CALL_ARGS", "toolCallId": "c1", "delta": "{\"query\":\"天气\"}"}
{"type": "TOOL_CALL_END", "toolCallId": "c1"}
{"type": "TOOL_CALL_RESULT", "toolCallId": "c1", "content": "晴天 25°C"}

3.2.4 状态管理事件

json
// 完整快照
{"type": "STATE_SNAPSHOT", "snapshot": {"user": {...}, "task": {...}}}

// 增量更新(JSON Patch RFC 6902)
{"type": "STATE_DELTA", "delta": [
  {"op": "replace", "path": "/task/progress", "value": 75}
]}

3.3 错误处理与重连

错误码含义处理方式
RATE_LIMITAPI 限流指数退避重试
TIMEOUT请求超时立即重试
CONNECTION_LOST连接丢失自动重连

四、开发适配(Development)

4.1 支持的框架生态 ★重点★

类别框架
Agent 框架LangGraph, CrewAI, Google ADK, AWS Strands, Pydantic AI
SDKTypeScript, Python, Kotlin, Go, Java, Rust
客户端CopilotKit, React Native, Terminal

4.2 Python 服务端示例 ★重点★

python
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
import json, uuid
from datetime import datetime

app = FastAPI()

def timestamp():
    return int(datetime.now().timestamp() * 1000)

def encode_event(event: dict) -> str:
    return f"data: {json.dumps(event)}\n\n"

async def generate_events(messages: list):
    run_id, msg_id = str(uuid.uuid4()), str(uuid.uuid4())
    
    # 1. RUN_STARTED
    yield encode_event({"type": "RUN_STARTED", "runId": run_id})
    
    # 2. TEXT_MESSAGE_START
    yield encode_event({"type": "TEXT_MESSAGE_START", 
                        "messageId": msg_id, "role": "assistant"})
    
    # 3. TEXT_MESSAGE_CONTENT(模拟流式输出)
    for word in ["你好", ",", "我是", "AI", "助手", "!"]:
        yield encode_event({"type": "TEXT_MESSAGE_CONTENT",
                            "messageId": msg_id, "delta": word})
    
    # 4. TEXT_MESSAGE_END
    yield encode_event({"type": "TEXT_MESSAGE_END", "messageId": msg_id})
    
    # 5. RUN_FINISHED
    yield encode_event({"type": "RUN_FINISHED", "runId": run_id})

@app.post("/agent")
async def run_agent(request: dict):
    return StreamingResponse(
        generate_events(request.get("messages", [])),
        media_type="text/event-stream",
        headers={"Cache-Control": "no-cache", "X-Accel-Buffering": "no"}
    )

4.3 TypeScript 客户端示例

typescript
class AGUIClient {
  private baseUrl: string;
  
  async run(input: { messages: any[] }) {
    const response = await fetch(`${this.baseUrl}/agent`, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(input),
    });
    
    const reader = response.body?.getReader();
    const decoder = new TextDecoder();
    let buffer = '';
    
    while (true) {
      const { done, value } = await reader.read();
      if (done) break;
      
      buffer += decoder.decode(value, { stream: true });
      const lines = buffer.split('\n\n');
      buffer = lines.pop() || '';
      
      for (const line of lines) {
        if (line.startsWith('data: ')) {
          const event = JSON.parse(line.slice(6));
          this.handleEvent(event);
        }
      }
    }
  }
  
  handleEvent(event: any) {
    switch (event.type) {
      case 'TEXT_MESSAGE_CONTENT':
        process.stdout.write(event.delta);
        break;
      case 'RUN_ERROR':
        console.error('Error:', event.message);
        break;
    }
  }
}

五、实战与问题排查

5.1 典型落地场景

场景关键事件流
AI 聊天RUN_STARTED → TEXT_MESSAGE_* → RUN_FINISHED
AI 编程RUN_STARTED → TOOL_CALL_* → TEXT_MESSAGE_* → RUN_FINISHED
多步骤任务RUN_STARTED → STEP_* → STEP_* → RUN_FINISHED

5.2 常见问题排查 ★重点★

问题 1:事件延迟/批量到达

bash
# 检查点:
1. 响应头是否正确:Content-Type: text/event-stream
2. 是否禁用缓冲:X-Accel-Buffering: no
3. Nginx 配置:proxy_buffering off

问题 2:连接频繁断开

python
# 解决方案:添加心跳
async def event_generator_with_heartbeat():
    while True:
        yield "data: {...}\n\n"
        await asyncio.sleep(15)
        yield ": keepalive\n\n"  # 心跳(注释行)

问题 3:状态同步异常

python
# 解决方案:使用 JSON Patch 库
import jsonpatch
patch = jsonpatch.JsonPatch(delta['delta'])
new_state = patch.apply(current_state)

5.3 调试工具

工具用途
curlcurl -N http://localhost:8000/agent ...
Chrome DevToolsNetwork → EventStream 标签
AG-UI Inspector官方可视化调试工具

六、核心知识点速记清单

📋 30秒速记

项目内容
协议全称Agent-User Interaction Protocol
发起组织CopilotKit
核心特性开放、轻量、事件驱动
传输方式HTTP SSE / WebSocket / Binary
消息格式流式 JSON 事件
核心定位AI Agent ↔ 前端应用的桥梁
事件数量16+ 种标准事件
状态同步快照 + JSON Patch 增量

📋 公式总结

AG-UI = 事件驱动 + 流式传输 + 双向状态同步

事件流模式:
- 文本:START → CONTENT* → END
- 工具:START → ARGS* → END → RESULT
- 生命周期:RUN_STARTED → [...] → RUN_FINISHED/ERROR

协议关系:
- MCP:Agent ↔ 工具(垂直)
- A2A:Agent ↔ Agent(水平)
- AG-UI:Agent ↔ 用户(前端)

七、开发避坑指南

❌ 常见错误

错误正确做法
SSE 不加 \n\n每个事件必须以 \n\n 结尾
忘记禁用缓冲设置 X-Accel-Buffering: no
不处理断线重连实现指数退避重试
状态直接覆盖区分 SNAPSHOT(覆盖)和 DELTA(补丁)
忽略 RUN_ERROR必须处理并提示用户

✅ 最佳实践

实践说明
使用心跳每 15-30 秒发送 : keepalive\n\n
事件顺序处理按接收顺序处理,ID 关联同一流
优雅降级SSE 不支持时回退到轮询
状态压缩大状态用 DELTA,初始化用 SNAPSHOT

八、学习资源

官方资源

资源地址
官方文档https://docs.ag-ui.com
GitHubhttps://github.com/ag-ui-protocol/ag-ui
Discord官方社区交流

快速开始

bash
# 创建 AG-UI 应用
npx create-ag-ui-app my-agent-app

# 安装 Python SDK
pip install ag-ui

总结:AG-UI 是 AI Agent 生态中连接 Agent 与用户界面的关键协议,与 MCP(工具连接)、A2A(Agent 协作)形成完整的协议三角。掌握 AG-UI 的事件驱动模型和状态同步机制,是构建现代 AI 应用的必备技能。