前后端通信协议
HTTP Agent 完全兼容 AG-UI 协议,使用 SSE 实现前后端实时流式通信。
可直接使用 AG-UI TypeScript SDK 的 HttpAgent 进行接入:
import { HttpAgent } from "@ag-ui/client";
const agent = new HttpAgent({
url: "https://your-endpoint/send-message",
headers: {
Authorization: "Bearer your-api-key",
},
});
POST /send-message
请求体
请求体遵循 AG-UI 协议的 RunAgentInput 结构:
interface RunAgentInput {
threadId: string; // 会话线程 ID
runId: string; // 本次运行的唯一 ID
parentRunId?: string; // 可选,父运行 ID(用于分支/回溯场景)
state?: any; // 可选,当前状态
messages: Message[]; // 消息历史
tools: Tool[]; // 客户端工具列表
context: Context[]; // 上下文信息
forwardedProps?: any; // 可选,透传属性
}
说明:
threadId整个对话保持一致,服务端通过该 ID 维护会话状态runId每次调用生成新的唯一 IDmessages消息列表
消息类型
type Message =
| DeveloperMessage
| SystemMessage
| AssistantMessage
| UserMessage
| ToolMessage;
interface DeveloperMessage {
id: string;
role: "developer";
content: string;
name?: string;
}
interface SystemMessage {
id: string;
role: "system";
content: string;
name?: string;
}
interface AssistantMessage {
id: string;
role: "assistant";
content?: string;
name?: string;
toolCalls?: ToolCall[];
}
interface UserMessage {
id: string;
role: "user";
content: string | InputContent[];
name?: string;
}
interface ToolMessage {
id: string;
role: "tool";
content: string;
toolCallId: string;
error?: string;
}
interface ToolCall {
id: string;
type: "function";
function: { name: string; arguments: string };
}
// 多模态输入内容
type InputContent =
| { type: "text"; text: string }
| { type: "binary"; mimeType: string; id?: string; url?: string; data?: string; filename?: string };
工具定义
interface Tool {
name: string;
description: string;
parameters: any; // JSON Schema
}
上下文定义
interface Context {
description: string;
value: string;
}
示例请求:
{
"threadId": "550e8400-e29b-41d4-a716-446655440000",
"runId": "run_001",
"messages": [
{ "id": "msg_1", "role": "user", "content": "今天北京天气怎么样?" }
],
"tools": [
{
"name": "get_weather",
"description": "获取指定城市的天气",
"parameters": {
"type": "object",
"properties": { "city": { "type": "string" } },
"required": ["city"]
}
}
],
"context": [],
"state": {}
}
响应事件
响应为 SSE(Server-Sent Events) 流,格式如下:
- 每个事件:
data: {json}\n\n(JSON 后跟两个换行符)
AG-UI 协议定义了以下事件类型:
| 事件类型 | 说明 |
|---|---|
RUN_STARTED | Agent 运行开始 |
RUN_FINISHED | Agent 运行结束 |
RUN_ERROR | Agent 运行错误 |
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 | 状态增量更新(JSON Patch) |
MESSAGES_SNAPSHOT | 消息历史快照 |
STEP_STARTED | 步骤开始 |
STEP_FINISHED | 步骤结束 |
TOOL_CALL_ARGS 拼接规则:
工具参数以流式增量传输,客户端需将同一 toolCallId 的多个 TOOL_CALL_ARGS 事件的 delta 字段按顺序拼接,最终得到完整的 JSON 字符串。
// 事件流
data: {"type":"TOOL_CALL_ARGS","toolCallId":"call_1","delta":"{\"cit"}
data: {"type":"TOOL_CALL_ARGS","toolCallId":"call_1","delta":"y\":\"北"}
data: {"type":"TOOL_CALL_ARGS","toolCallId":"call_1","delta":"京\"}"}
// 拼接结果
"{\"city\":\"北京\"}" → JSON.parse() → { city: "北京" }
注意: 当存在多个并行工具调用时,不同 toolCallId 的事件可能交错出现,客户端应使用 toolCallId 区分和追踪每个工具调用。
事件结构
// 生命周期事件
interface RunStartedEvent {
type: "RUN_STARTED";
threadId: string;
runId: string;
parentRunId?: string;
timestamp?: number;
}
interface RunFinishedEvent {
type: "RUN_FINISHED";
threadId: string;
runId: string;
result?: any;
timestamp?: number;
}
interface RunErrorEvent {
type: "RUN_ERROR";
message: string;
code?: string;
timestamp?: number;
}
// 文本消息事件
interface TextMessageStartEvent {
type: "TEXT_MESSAGE_START";
messageId: string;
role: "developer" | "system" | "assistant" | "user";
}
interface TextMessageContentEvent {
type: "TEXT_MESSAGE_CONTENT";
messageId: string;
delta: string; // 非空文本增量
}
interface TextMessageEndEvent {
type: "TEXT_MESSAGE_END";
messageId: string;
}
// 工具调用事件
interface ToolCallStartEvent {
type: "TOOL_CALL_START";
toolCallId: string;
toolCallName: string;
parentMessageId?: string;
}
interface ToolCallArgsEvent {
type: "TOOL_CALL_ARGS";
toolCallId: string;
delta: string;
}
interface ToolCallEndEvent {
type: "TOOL_CALL_END";
toolCallId: string;
}
interface ToolCallResultEvent {
type: "TOOL_CALL_RESULT";
messageId: string;
toolCallId: string;
content: string;
}
// 状态管理事件
interface StateSnapshotEvent {
type: "STATE_SNAPSHOT";
snapshot: any;
}
interface StateDeltaEvent {
type: "STATE_DELTA";
delta: JsonPatchOperation[]; // RFC 6902 JSON Patch
}
interface MessagesSnapshotEvent {
type: "MESSAGES_SNAPSHOT";
messages: Message[];
}
// 步骤事件
interface StepStartedEvent {
type: "STEP_STARTED";
stepName: string;
}
interface StepFinishedEvent {
type: "STEP_FINISHED";
stepName: string;
}
响应示例
data: {"type":"RUN_STARTED","threadId":"thread_001","runId":"run_001"}
data: {"type":"TEXT_MESSAGE_START","messageId":"msg_1","role":"assistant"}
data: {"type":"TEXT_MESSAGE_CONTENT","messageId":"msg_1","delta":"让我查询一下"}
data: {"type":"TEXT_MESSAGE_END","messageId":"msg_1"}
data: {"type":"TOOL_CALL_START","toolCallId":"call_123","toolCallName":"get_weather","parentMessageId":"msg_1"}
data: {"type":"TOOL_CALL_ARGS","toolCallId":"call_123","delta":"{\"city\":\"北京\"}"}
data: {"type":"TOOL_CALL_END","toolCallId":"call_123"}
data: {"type":"TOOL_CALL_RESULT","messageId":"msg_2","toolCallId":"call_123","content":"晴天,25°C"}
data: {"type":"TEXT_MESSAGE_START","messageId":"msg_3","role":"assistant"}
data: {"type":"TEXT_MESSAGE_CONTENT","messageId":"msg_3","delta":"北京今天是晴天,温度25°C。"}
data: {"type":"TEXT_MESSAGE_END","messageId":"msg_3"}
data: {"type":"RUN_FINISHED","threadId":"thread_001","runId":"run_001"}