AG-UI 协议参考
本文说明托管 Harness 的 AG-UI 接口。接入步骤参见 管理 Agent。
接口与鉴权
agent_endpoint 表示 Endpoint 基础地址。
请求头
操作 | 方法与路径 | 响应 |
发起请求或重连 |
| SSE 事件流 |
停止执行 |
| 成功返回 |
名称 | 要求 | 说明 |
| 必填 |
|
| 建议填写 | 调用 AG-UI 时使用 |
| API Key 认证时必填 | Agent Endpoint 的 API Key |
| 必填 | 会话 ID,取值必须与 |
请求参数
请求体
{
"threadId": "session-001",
"runId": "run-001",
"messages": [
{
"id": "message-001",
"role": "user",
"content": "请用三个要点介绍你的功能。"
}
],
"state": {},
"tools": [],
"context": [],
"forwardedProps": {}
}字段 | 类型 | 说明 |
| string | 必填。会话 ID,同一段对话保持不变 |
| string | 必填。本次执行的 ID,每次新请求使用新的值 |
| array | 必填。提交给 Agent 的消息,普通调用至少包含本轮用户输入 |
| object | 状态数据,无需传入时填写 |
| array | 本次声明的客户端工具,无需传入时填写 |
| array | 补充上下文,无需传入时填写 |
| object | 扩展属性,无需传入时填写 |
| string | 可选。关联的父执行 ID |
消息字段
developer 消息按 system 消息处理。activity 和 reasoning 类型的历史消息不会作为本轮模型输入。
字段 | 说明 |
| 消息 ID。新消息使用新 ID,重复携带已有消息时保持原 ID |
| 消息角色,支持 |
| 文本字符串,或由文本、图片等内容组成的数组 |
| 可选。消息发送方名称 |
|
|
多模态输入
用户消息可以包含文本、图片、音频、视频或文档,实际支持情况取决于所选 Harness 和模型。
以下是一条图片消息,放在请求的 messages 数组中:
{
"id": "message-002",
"role": "user",
"content": [
{"type": "text", "text": "分析图片中的异常信息"},
{
"type": "image",
"source": {
"type": "url",
"value": "https://example.com/error.png",
"mimeType": "image/png"
}
}
]
}传入 Base64 内容时,使用 source.type=data,数据填写到 source.value。其他内容类型为 audio、video 和 document。
客户端工具
tools 声明调用方提供的工具,与控制台绑定的 MCP 工具不同。单个工具示例:
{
"name": "get_order",
"description": "按订单号查询订单",
"parameters": {
"type": "object",
"properties": {
"orderId": {"type": "string"}
},
"required": ["orderId"]
}
}所选 Harness 或 Agent 配置不支持客户端工具时,请求可能返回 EXECUTOR_INPUT_UNSUPPORTED。
返回事件
SSE 格式
AG-UI 固定返回 SSE,不提供 stream:false 开关。需要一次性展示完整答案时,应用应先接收并拼接文本,确认执行成功后再展示。
响应头示例:
HTTP/1.1 200 OK
Content-Type: text/event-stream
Cache-Control: no-cache
X-AgentCore-Session-ID: session-001每个事件由 id 和 data 组成,事件之间用空行分隔。data 是 JSON;首次调用的 RUN_STARTED 使用 id: 0,后续事件 ID 递增。
文本回复示例:
id: 0
data: {"type":"RUN_STARTED","threadId":"session-001","runId":"run-001"}
id: 1
data: {"type":"TEXT_MESSAGE_START","messageId":"assistant-001","role":"assistant"}
id: 2
data: {"type":"TEXT_MESSAGE_CONTENT","messageId":"assistant-001","delta":"可以帮助处理问答、文件和工具调用。"}
id: 3
data: {"type":"TEXT_MESSAGE_END","messageId":"assistant-001"}
id: 4
data: {"type":"RUN_FINISHED","threadId":"session-001","runId":"run-001","outcome":{"type":"success"}}事件类型
outcome.type=interrupt 表示执行需要外部输入,该行为需要所选 Harness 支持。
事件 | 主要字段 | 含义及处理方式 |
|
| 本次执行开始 |
|
| 开始一条消息 |
|
| 将文本片段追加到对应消息 |
|
| 这条消息结束,继续等待执行结果 |
|
| 思考过程,单独处理,不拼接到回答正文 |
|
| 加密的思考数据,不作为可读文本展示 |
|
| 开始一次工具调用 |
|
| 工具参数片段,接收完整后再解析 |
|
| 工具参数发送结束,不代表工具执行成功 |
|
| 工具执行结果, |
|
| 扩展事件; |
|
| 检查 |
|
| 本次执行失败或被取消 |
结果处理
检查 HTTP 状态码和响应类型,再开始解析 SSE。
按空行拆分完整事件。
按
messageId拼接文本,按toolCallId拼接工具参数和记录结果;不同消息和工具的事件可能交错出现。每条事件完整处理后,保存其
id,供断线重连使用。收到
RUN_FINISHED时检查outcome;收到RUN_ERROR时记录错误。
连接关闭时仍未收到结束事件,应记录为连接中断。
文件结果
启用文件发布能力时,文件通过临时下载链接返回。TOOL_CALL_RESULT.content 为 JSON 字符串,解析后的结构如下:
{
"status": "success",
"files": [
{
"fileName": "report.csv",
"mimeType": "text/csv",
"downloadUrl": "https://example.com/temporary-download-link",
"expiresInSeconds": 3600
}
]
}文件发布失败时返回 status=error 和错误信息;未经转换的非文本输出可能触发 AG_UI_OUTPUT_UNSUPPORTED。
多轮对话
会话调度与历史保存规则参见会话管理。
调用 |
|
| 新消息 ID |
第一轮 |
|
|
|
第二轮 |
|
|
|
新会话 |
|
|
|
断线重连
Attach 用于重新接收原请求的事件,不会重新执行请求,需要所选 Harness 支持。
向同一个 AG-UI 地址发送以下请求,保持原 threadId 和 runId,将 afterSequence 设置为最后一条已完整处理的事件 ID:
{
"threadId": "session-001",
"runId": "run-001",
"messages": [],
"state": {},
"tools": [],
"context": [],
"forwardedProps": {
"agentcore": {
"attach": {"afterSequence": 12}
}
}
}重连后只返回 id > afterSequence 的事件。afterSequence 必须是非负安全整数。
使用限制:
原请求仍在执行、运行进程未重启,且事件缓存尚未清理。
同一次执行只能有一个外部连接接收事件。
重连失败后,应先确认原请求的执行情况。更换 runId 重发可能导致重复执行。
停止执行
明确停止执行时,调用 Stop 接口,不要仅关闭连接:
curl --request POST "${AGENTCORE_ENDPOINT%/}/ag-ui/agent/stop" \
--header "x-api-key: ${AGENTCORE_ENDPOINT_API_KEY}" \
--header 'Content-Type: application/json' \
--data '{"threadId":"session-001","runId":"run-001"}'使用最初发起请求时的 threadId 和 runId。成功返回 204 No Content,原事件流可能收到 RUN_ERROR,错误码为 RUN_CANCELLED。
执行结束记录仍保留时,重复停止返回 204;目标不存在或记录已清理时,返回 404 RUN_NOT_FOUND。
错误处理
建立事件流之前
请求失败时,通过 HTTP 状态码和 JSON 返回错误:
{
"error": {
"code": "SESSION_ID_MISMATCH",
"message": "X-AgentCore-Session-ID must equal RunAgentInput.threadId."
}
}认证、访问权限和网关限制还可能在请求到达 Agent 前返回错误,应同时检查 Endpoint 配置和实际响应。
HTTP 状态码 | 常见错误码 | 说明 |
|
| 请求体不是合法 JSON |
|
| 请求字段或类型不符合要求 |
|
| 请求头与请求体中的会话 ID 不一致 |
|
| 重连或停止参数不正确 |
|
| 找不到要重连或停止的执行 |
|
| 本次执行 ID 已存在 |
|
| 要重连的执行已经结束 |
|
| 已有连接在接收本次执行的事件 |
|
| 当前 Harness 不支持重连 |
|
| 会话正在关闭或不可用 |
|
| 请求内容过大 |
|
| 请求队列已满 |
|
| 执行容量已满 |
|
| 运行环境尚未就绪或正在停止接收新请求 |
建立事件流之后
执行失败或被取消时,通过 RUN_ERROR 返回错误,再关闭事件流:
id: 6
data: {"type":"RUN_ERROR","code":"RUN_CANCELLED","message":"Run cancelled."}使用限制
不保证返回状态快照、消息快照、计划或 Activity 事件。
state、context等输入字段是否参与执行,取决于所选 Harness。Runtime 的请求体上限为 96 MiB,单个附件解码后上限为 64 MiB,单个 SSE 事件上限为 1 MiB;入口网关还可能设置更低的限制。
AG-UI 的通用事件定义参见官方事件说明。本文中的 Attach 参数、Stop 接口和 agentcore.usage 为 AgentCore 扩展。