ag2-ag-ui
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseAG-UI integration
AG-UI集成
When to use
何时使用
- The user is building a web UI (React / Next.js / anything HTTP+SSE) that should talk to an AG2 agent.
- They want streaming text, reasoning, tool-call rendering, shared state sync, or sub-task step tracking surfaced to the frontend with a standard protocol — not a custom REST/WebSocket contract.
- They're using or considering CopilotKit (the recommended React client).
For a custom narrow-purpose API where you own the contract end-to-end, skip AG-UI and write a plain endpoint instead.
- 用户正在构建一个Web UI(React / Next.js / 任何支持HTTP+SSE的框架),需要与AG2 Agent交互。
- 他们希望通过标准协议向前端提供流式文本、推理过程、工具调用渲染、共享状态同步或子任务步骤跟踪功能,而非自定义REST/WebSocket协议。
- 他们正在使用或考虑使用CopilotKit(推荐的React客户端)。
如果是自定义的专用API,且你完全掌控协议两端,则无需使用AG-UI,直接编写普通端点即可。
Supported AG-UI features
支持的AG-UI功能
| Feature | Status |
|---|---|
Run lifecycle ( | ✓ |
Streaming text events ( | ✓ |
Reasoning events ( | ✓ |
Backend tool lifecycle ( | ✓ |
Frontend-tool dispatch ( | ✓ |
Shared-state snapshots ( | ✓ |
Sub-task steps ( | ✓ |
| Human input checkpoints surfaced as AG-UI events | ✗ — no human-input event family; |
| 功能 | 状态 |
|---|---|
运行生命周期( | ✓ |
流式文本事件( | ✓ |
推理事件( | ✓ |
后端工具生命周期( | ✓ |
前端工具调度(针对 | ✓ |
共享状态快照( | ✓ |
子任务步骤( | ✓ |
| 作为AG-UI事件呈现的人工输入检查点 | ✗ — 无人工输入事件系列; |
Installation
安装
bash
pip install "ag2[ag-ui]"Required. Run this install before delivering the code. If you cannot run commands, state the exactcommand.pip install
bash
pip install "ag2[ag-ui]"必须执行。在交付代码前运行此安装命令。如果无法执行命令,请明确说明的具体指令。pip install
60-second recipe — FastAPI server
60秒快速实现 — FastAPI服务器
python
from fastapi import FastAPI, Header
from fastapi.responses import StreamingResponse
from ag2 import Agent
from ag2.ag_ui import AGUIStream, RunAgentInput
from ag2.config import OpenAIConfig
agent = Agent(
name="support_bot",
prompt="You help users with billing questions.",
config=OpenAIConfig(model="gpt-4o-mini"),
)
stream = AGUIStream(agent)
app = FastAPI()
@app.post("/chat")
async def run_agent(message: RunAgentInput, accept: str | None = Header(None)) -> StreamingResponse:
return StreamingResponse(
stream.dispatch(message, accept=accept),
media_type=accept or "text/event-stream",
)bash
uvicorn run_ag_ui:app --reload --port 8000Test:
bash
curl -N -X POST http://127.0.0.1:8000/chat \
-H "Content-Type: application/json" \
-H "Accept: text/event-stream" \
-d '{"thread_id":"t1","run_id":"r1","messages":[{"id":"m1","role":"user","content":"Hello"}],"state":{},"context":[],"tools":[]}'python
from fastapi import FastAPI, Header
from fastapi.responses import StreamingResponse
from ag2 import Agent
from ag2.ag_ui import AGUIStream, RunAgentInput
from ag2.config import OpenAIConfig
agent = Agent(
name="support_bot",
prompt="You help users with billing questions.",
config=OpenAIConfig(model="gpt-4o-mini"),
)
stream = AGUIStream(agent)
app = FastAPI()
@app.post("/chat")
async def run_agent(message: RunAgentInput, accept: str | None = Header(None)) -> StreamingResponse:
return StreamingResponse(
stream.dispatch(message, accept=accept),
media_type=accept or "text/event-stream",
)bash
uvicorn run_ag_ui:app --reload --port 8000测试:
bash
curl -N -X POST http://127.0.0.1:8000/chat \
-H "Content-Type: application/json" \
-H "Accept: text/event-stream" \
-d '{"thread_id":"t1","run_id":"r1","messages":[{"id":"m1","role":"user","content":"Hello"}],"state":{},"context":[],"tools":[]}'Lower-friction alternative — build_asgi()
build_asgi()更简便的替代方案 — build_asgi()
build_asgi()If you don't need custom auth / middleware, mount the ASGI endpoint directly:
python
from ag2.ag_ui import AGUIStream
from fastapi import FastAPI
app = FastAPI()
stream = AGUIStream(agent)
app.mount("/chat", stream.build_asgi())如果不需要自定义认证/中间件,可以直接挂载ASGI端点:
python
from ag2.ag_ui import AGUIStream
from fastapi import FastAPI
app = FastAPI()
stream = AGUIStream(agent)
app.mount("/chat", stream.build_asgi())CopilotKit frontend (recommended for React / Next.js)
CopilotKit前端(推荐用于React / Next.js)
Two ways to start:
bash
undefined两种启动方式:
bash
undefinedOption A — CopilotKit bootstrap
选项A — CopilotKit快速初始化
npx copilotkit@latest create -f ag2
npx copilotkit@latest create -f ag2
Option B — clone the reference starter
选项B — 克隆参考启动模板
The starter layout:
ag2-copilotkit-starter/
├── agent-py/ # Python backend (AG2 + AG-UI)
└── ui-react/ # React + CopilotKit frontend
Backend serves `/chat` on port 8008 by default. The Next.js route at `ui-react/app/api/copilotkit/route.ts` bridges the UI to the backend:
```tsx
import { HttpAgent } from "@ag-ui/client";
import { CopilotRuntime, ExperimentalEmptyAdapter, copilotRuntimeNextJSAppRouterEndpoint } from "@copilotkit/runtime";
import { NextRequest } from "next/server";
const agent = new HttpAgent({ url: "http://localhost:8008/chat" });
const runtime = new CopilotRuntime({ agents: { weather_agent: agent } });
export async function POST(req: NextRequest) {
const { handleRequest } = copilotRuntimeNextJSAppRouterEndpoint({
runtime,
serviceAdapter: new ExperimentalEmptyAdapter(),
endpoint: "/api/copilotkit",
});
return handleRequest(req);
}Wrap your app:
tsx
import { CopilotKit } from "@copilotkit/react-core";
import "@copilotkit/react-ui/styles.css";
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="en">
<body>
<CopilotKit agent="weather_agent" runtimeUrl="/api/copilotkit">
{children}
</CopilotKit>
</body>
</html>
);
}Render chat (), and use in client components to render generative UI tied to backend tool calls.
<CopilotChat />useCopilotAction({...})
启动模板结构:
ag2-copilotkit-starter/
├── agent-py/ # Python后端(AG2 + AG-UI)
└── ui-react/ # React + CopilotKit前端
后端默认在8008端口提供`/chat`服务。Next.js路由`ui-react/app/api/copilotkit/route.ts`负责将UI与后端连接:
```tsx
import { HttpAgent } from "@ag-ui/client";
import { CopilotRuntime, ExperimentalEmptyAdapter, copilotRuntimeNextJSAppRouterEndpoint } from "@copilotkit/runtime";
import { NextRequest } from "next/server";
const agent = new HttpAgent({ url: "http://localhost:8008/chat" });
const runtime = new CopilotRuntime({ agents: { weather_agent: agent } });
export async function POST(req: NextRequest) {
const { handleRequest } = copilotRuntimeNextJSAppRouterEndpoint({
runtime,
serviceAdapter: new ExperimentalEmptyAdapter(),
endpoint: "/api/copilotkit",
});
return handleRequest(req);
}包装你的应用:
tsx
import { CopilotKit } from "@copilotkit/react-core";
import "@copilotkit/react-ui/styles.css";
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="en">
<body>
<CopilotKit agent="weather_agent" runtimeUrl="/api/copilotkit">
{children}
</CopilotKit>
</body>
</html>
);
}渲染聊天组件(),并在客户端组件中使用渲染与后端工具调用关联的生成式UI。
<CopilotChat />useCopilotAction({...})Production checklist
生产环境检查清单
- CORS — allow your frontend origin on the AG-UI backend (,
POST, auth headers).OPTIONS - Auth — protect both (Next.js route) and backend
/api/copilotkit. Don't rely on client-only secrets./chat - SSE buffering — verify backend response is and that proxy layers (Nginx, CloudFront, etc.) don't buffer SSE.
Content-Type: text/event-stream - Timeouts / retries — conservative values for long-running tool workflows; only retry idempotent requests.
- Tool inputs are untrusted — validate and authorize server-side before invoking privileged tools. Log tool execution with request IDs.
- Tool name parity — frontend
useCopilotActionmust match backendnamename exactly.@tool
- CORS — 在AG-UI后端允许你的前端源(支持、
POST及认证头)。OPTIONS - 认证 — 保护(Next.js路由)和后端
/api/copilotkit端点。不要依赖仅客户端的密钥。/chat - SSE缓冲 — 验证后端响应的为
Content-Type,且代理层(Nginx、CloudFront等)不会缓冲SSE。text/event-stream - 超时/重试 — 针对长时间运行的工具流程设置保守值;仅重试幂等请求。
- 工具输入不可信 — 在调用特权工具前,在服务器端验证并授权。使用请求ID记录工具执行情况。
- 工具名称一致性 — 前端中的
useCopilotAction必须与后端name的名称完全匹配。@tool
Going deeper
深入学习
- —
website/docs/user-guide/ag-ui/index.mdx, supported events, basic server.AGUIStream - — full React + CopilotKit walkthrough (file layout, route, layout, chat component, weather-card example).
website/docs/user-guide/ag-ui/copilotkit-quickstart.mdx - AG-UI protocol: https://docs.ag-ui.com/introduction
- Reference starter: https://github.com/ag2ai/ag2-copilotkit-starter
- For protocol-level testing: AG2 Dojo profile https://dojo.ag-ui.com/ag2/feature/agentic_chat
- — 介绍
website/docs/user-guide/ag-ui/index.mdx、支持的事件及基础服务器配置。AGUIStream - — 完整的React + CopilotKit入门指南(文件结构、路由、布局、聊天组件、天气卡片示例)。
website/docs/user-guide/ag-ui/copilotkit-quickstart.mdx - AG-UI协议文档:https://docs.ag-ui.com/introduction
- 参考启动模板:https://github.com/ag2ai/ag2-copilotkit-starter
- 协议级测试:AG2 Dojo配置文件 https://dojo.ag-ui.com/ag2/feature/agentic_chat
Common pitfalls
常见陷阱
- Missing extra —
ag-uiis required; without itpip install "ag2[ag-ui]"will fail.from ag2.ag_ui import AGUIStream - CORS blocked — frontend can't hit the backend in dev. Add to the FastAPI app for the dev origin.
CORSMiddleware - No streaming output — proxy or issue. Test with raw
Content-Typefirst to isolate.curl -N - Tool UI not rendering — tool name on the React side () doesn't exactly match the backend
useCopilotAction({ name: "..." })name.@tool - Putting the endpoint behind a SSE-incompatible proxy — many proxies buffer event-stream responses by default. Disable buffering on the route.
- Trying to use with classic
AGUIStream— the description here coversConversableAgent. Classic AG2 agents can be exposed differently; check the AG2 docs for that path.ag2.Agent
- 缺少扩展包 — 必须执行
ag-ui;否则pip install "ag2[ag-ui]"会执行失败。from ag2.ag_ui import AGUIStream - CORS被阻止 — 开发环境中前端无法访问后端。为FastAPI应用添加,允许开发源访问。
CORSMiddleware - 无流式输出 — 代理或问题。先使用原始
Content-Type命令测试以排查问题。curl -N - 工具UI未渲染 — React端的工具名称()与后端
useCopilotAction({ name: "..." })的名称不完全匹配。@tool - 将端点放置在不兼容SSE的代理后 — 许多代理默认会缓冲事件流响应。需禁用该路由的缓冲功能。
- 尝试将与经典
AGUIStream配合使用 — 本文描述的内容针对ConversableAgent。经典AG2 Agent的暴露方式不同;请查看AG2文档获取相关方法。ag2.Agent