AG-UI 协议参考

更新时间:
复制 MD 格式

本文说明托管 Harness 的 AG-UI 接口。接入步骤参见 管理 Agent。

接口与鉴权

agent_endpoint 表示 Endpoint 基础地址。

请求头

操作

方法与路径

响应

发起请求或重连

POST {agent_endpoint}/ag-ui/agent

SSE 事件流

停止执行

POST {agent_endpoint}/ag-ui/agent/stop

成功返回 204 No Content

名称

要求

说明

Content-Type

必填

application/json

Accept

建议填写

调用 AG-UI 时使用 text/event-stream

x-api-key

API Key 认证时必填

Agent Endpoint 的 API Key

X-AgentCore-Session-ID

必填

会话 ID,取值必须与 RunAgentInput.threadId 一致

请求参数

请求体

{
  "threadId": "session-001",
  "runId": "run-001",
  "messages": [
    {
      "id": "message-001",
      "role": "user",
      "content": "请用三个要点介绍你的功能。"
    }
  ],
  "state": {},
  "tools": [],
  "context": [],
  "forwardedProps": {}
}

字段

类型

说明

threadId

string

必填。会话 ID,同一段对话保持不变

runId

string

必填。本次执行的 ID,每次新请求使用新的值

messages

array

必填。提交给 Agent 的消息,普通调用至少包含本轮用户输入

state

object

状态数据,无需传入时填写 {}

tools

array

本次声明的客户端工具,无需传入时填写 []

context

array

补充上下文,无需传入时填写 []

forwardedProps

object

扩展属性,无需传入时填写 {};Attach 参数放在这里

parentRunId

string

可选。关联的父执行 ID

消息字段

developer 消息按 system 消息处理。activity 和 reasoning 类型的历史消息不会作为本轮模型输入。

字段

说明

id

消息 ID。新消息使用新 ID,重复携带已有消息时保持原 ID

role

消息角色,支持 user、assistant、system、developer 和 tool

content

文本字符串,或由文本、图片等内容组成的数组

name

可选。消息发送方名称

toolCallId

tool 消息需要填写,用于关联工具调用

多模态输入

用户消息可以包含文本、图片、音频、视频或文档,实际支持情况取决于所选 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 支持。

事件

主要字段

含义及处理方式

RUN_STARTED

threadId、runId

本次执行开始

TEXT_MESSAGE_START

messageId、role

开始一条消息

TEXT_MESSAGE_CONTENT

messageId、delta

将文本片段追加到对应消息

TEXT_MESSAGE_END

messageId

这条消息结束,继续等待执行结果

REASONING_START、REASONING_MESSAGE_START、REASONING_MESSAGE_CONTENT、REASONING_MESSAGE_END、REASONING_END

messageId、delta

思考过程,单独处理,不拼接到回答正文

REASONING_ENCRYPTED_VALUE

entityId、encryptedValue

加密的思考数据,不作为可读文本展示

TOOL_CALL_START

toolCallId、toolCallName

开始一次工具调用

TOOL_CALL_ARGS

toolCallId、delta

工具参数片段,接收完整后再解析

TOOL_CALL_END

toolCallId

工具参数发送结束,不代表工具执行成功

TOOL_CALL_RESULT

toolCallId、content

工具执行结果,content 为字符串

CUSTOM

name、value

扩展事件;name=agentcore.usage 时,value 为 Token 用量

RUN_FINISHED

threadId、runId、outcome,可选 result

检查 outcome.type,为 success 时表示本次执行成功结束

RUN_ERROR

code、message

本次执行失败或被取消

结果处理

  1. 检查 HTTP 状态码和响应类型,再开始解析 SSE。

  2. 按空行拆分完整事件。

  3. 按 messageId 拼接文本,按 toolCallId 拼接工具参数和记录结果;不同消息和工具的事件可能交错出现。

  4. 每条事件完整处理后,保存其 id,供断线重连使用。

  5. 收到 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。

多轮对话

会话调度与历史保存规则参见会话管理。

调用

threadId

runId

新消息 ID

第一轮

session-001

run-001

message-001

第二轮

session-001

run-002

message-002

新会话

session-002

run-003

message-003

断线重连

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 状态码

常见错误码

说明

400

INVALID_JSON

请求体不是合法 JSON

400

INVALID_AG_UI_REQUEST

请求字段或类型不符合要求

400

SESSION_ID_MISMATCH

请求头与请求体中的会话 ID 不一致

400

INVALID_ATTACH、INVALID_STOP

重连或停止参数不正确

404

RUN_NOT_FOUND

找不到要重连或停止的执行

409

RUN_ALREADY_EXISTS

本次执行 ID 已存在

409

RUN_ALREADY_TERMINAL

要重连的执行已经结束

409

RUN_ALREADY_ATTACHED

已有连接在接收本次执行的事件

409

RUN_ATTACH_UNSUPPORTED

当前 Harness 不支持重连

409

SESSION_UNAVAILABLE

会话正在关闭或不可用

413

PAYLOAD_TOO_LARGE

请求内容过大

429

SESSION_QUEUE_FULL

请求队列已满

429

RUNTIME_CAPACITY_EXCEEDED

执行容量已满

503

RUNTIME_NOT_READY、RUNTIME_DRAINING

运行环境尚未就绪或正在停止接收新请求

建立事件流之后

执行失败或被取消时,通过 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 扩展。