本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
HTTP 协议合约
了解在代理应用程序中实现 HTTP 协议的要求。使用 HTTP 协议为传统 request/response 模式创建直接 REST API 端点,为实时双向流式传输连接创建 WebSocket 端点。
注意
HTTP (/invocations) 和 WebSocket (/ws) 端点均可使用端口 8080 部署在同一个容器上,从而允许单一代理实现支持传统 API 交互和实时双向流式传输。
有关示例代码,请参阅 AgentCore CLI 入门。
容器要求
您的代理必须部署为符合以下规格的容器化应用程序:
-
主机:
0.0.0.0 -
端口:
8080- HTTP-based 代理通信的标准端口 -
平台:ARM64 容器-与 AgentCore 运行时环境兼容所必需的
路径要求
/invocations-POST
这是具有 JSON 输入和 JSON/SSE 输出的主要代理交互端点。
目的
接收来自用户或应用程序的传入请求,并通过代理的业务逻辑处理这些请求
使用案例
该/invocations端点有几个关键用途:
-
直接的用户互动和对话
-
API 与外部系统的集成
-
批量处理多个请求
-
Real-time 长时间运行的操作的流式响应
请求格式示例
Content-Type: application/json { "prompt": "What's the weather today?" }
响应格式
根据用例,您的代理可以使用以下任一格式进行响应:
JSON 响应(非流式传输)
目的
为可以快速处理的请求提供完整的响应
使用案例
JSON 响应非常适合:
-
简单的问答场景
-
确定性计算
-
快速数据查询
-
状态确认
JSON 响应格式示例
Content-Type: application/json { "response": "Your agent's response here", "status": "success" }
SSE 回应(直播)
Server-sent 事件 (SSE) 允许您提供实时流媒体响应。有关更多信息,请参阅Server-sent 事件
目的
支持为长时间运行的操作提供增量响应并改善用户体验
使用案例
SSE 响应非常适合:
-
Real-time 对话体验
-
渐进式内容生成
-
Long-running 计算结果为中间结果
-
实时数据源和更新
SSE 响应格式示例
Content-Type: text/event-stream data: {"event": "partial response 1"} data: {"event": "partial response 2"} data: {"event": "final response"}
/ws- WebSocket (可选)
这是实时双向通信的主要 WebSocket 连接端点。
目的
接受 WebSocket 升级请求并保持持续连接以进行流媒体代理交互
使用案例
该/ws端点有几个关键用途:
-
Real-time 对话接口
-
具有即时反馈的交互式代理会话
-
使用双向通信进行流式数据处理
建立连接
WebSocket 连接从 HTTP 升级请求开始:
HTTP 升级请求示例
GET /ws HTTP/1.1 Host: agent-endpoint Connection: Upgrade Upgrade: websocket Sec-WebSocket-Version: 13 Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== X-Amzn-Bedrock-AgentCore-Runtime-Session-Id: session-uuid
WebSocket 升级响应示例
HTTP/1.1 101 Switching Protocols Connection: Upgrade Upgrade: websocket Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
消息处理要求
您的 WebSocket 终端必须处理:
-
接受连接:
await websocket.accept()致电建立连接 -
消息接收:根据您的应用程序要求支持文本或二进制消息类型
-
消息处理:根据代理的业务逻辑处理传入的消息
-
发送响应:使用
send_text()或发送相应的响应send_bytes() -
连接生命周期:管理连接建立、维护和终止
消息格式
短信
JSON 格式(推荐)
目的
代理交互的结构化数据交换
示例消息
{ "prompt": "Hello, can you help me with this question?", "session_id": "session-uuid", "message_type": "user_message" }
响应示例
{ "response": "I'd be happy to help you with your question!", "session_id": "session-uuid", "message_type": "agent_response" }
纯文本格式
目的
基于文本的简单通信
示例
Hello, can you help me with this question?
二进制消息
目的
支持非文本数据,例如图像、音频或其他二进制格式
使用案例
二进制消息支持多种场景:
-
Multi-modal 代理相互作用
-
文件上传和下载
-
压缩数据传输
-
二进制协议数据
处理要求
二进制消息处理需要:
-
用途
receive_bytes()和send_bytes()方法 -
实现适当的二进制数据处理
-
考虑邮件大小限制
连接生命周期
建立连接
-
HTTP 握手:客户端发送 WebSocket 升级请求
-
升级响应:代理接受并返回 101 个交换协议
-
WebSocket 活跃:双向通信开始
-
会话绑定:将连接与会话标识符关联起来
消息交换
-
连续循环:实现消息监听循环
-
消息处理:异步处理传入的消息
-
生成响应:发送相应的回复
-
错误处理:管理异常和连接问题
/ping-获取
目的
验证您的代理是否正常运行并已准备好处理请求
使用案例
该/ping端点有几个关键用途:
-
服务监控以检测和修复问题
-
通过 AWS的托管基础架构自动恢复
响应格式
返回表示代理人健康状况的状态码:
-
Content-Type :
application/json -
HTTP 状态码:
200对于运行正常,对不健康状态使用相应的错误代码
如果您的代理需要处理后台任务,则可以用/ping状态指示。如果 ping 状态为HealthyBusy,则运行时会话被视为活动会话。
Ping 响应格式示例
{ "status": "<status_value>" }
- 状态(必填)
-
Healthy-系统已准备好接受新工作HealthyBusy-系统正在运行,但目前正忙于异步任务。当状态为时HealthyBusy,运行时会话被视为活动会话并保持活动状态。 - 上次更新时间(可选)
-
status上次更改时的 Unix 时间戳(以秒为单位)。仅在实际状态更改时进行设置。警告
不要在每次 ping 时都设置
time_of_last_update为当前时间。每次 ping 都会向前移动的时间戳表示状态持续变化,这可以防止空闲会话超时触发——然后会话会一直持续到会话配额用尽为止MaxLifetime。如果您省略该字段,平台会自行跟踪状态变化。如果您使用 Bedrock AgentCore SDK,则会为您处理 ping 响应。
错误处理
与 A2A、MCP 和 AG-UI 协议不同,HTTP 协议不会将错误封装在协议特定的信封中。该服务直接以原生 HTTP 响应的形式返回错误:HTTP 状态码反映异常,x-amzn-ErrorType响应标头带有异常名称。下表列出了您可以收到的例外情况。
| HTTP 错误代码 | 运行时异常 (x-amzn-ErrorType) |
说明 |
|---|---|---|
|
400 |
ValidationException |
请求数据或参数无效 |
|
401 |
UnauthorizedException |
需要进行身份验证或凭据无效(OAuth-configured 代理) |
|
402 |
ServiceQuotaExceededException |
请求将超过服务配额 |
|
403 |
AccessDeniedException |
请求的操作权限不足 |
|
404 |
ResourceNotFoundException |
请求的资源不存在 |
|
409 |
ConflictException |
资源冲突-资源已经存在 |
|
409 |
RetryableConflictException |
会话操作正在进行中,请重试 |
|
424 |
RuntimeClientError |
您的代理的容器返回了 4xx 或 5xx 错误-请检查您的日志 CloudWatch |
|
429 |
ThrottlingException |
请求过多-已超过请求速率限制 |
|
500 |
InternalServerException |
处理请求时出现意外错误 |
ConflictException并且RetryableConflictException都返回 HTTP 409。标x-amzn-ErrorType题和消息将它们区分开来。当第二项操作以服务正在配置或拆除的会话为目标时,该服务返回 RetryableConflictException (Session operation in progress, please retry)。这种情况是暂时的,可以重试。使用短暂的指数退避重试。启用默认重试后, AWS SDK 会自动重试此异常。如果您在没有 AWS SDK 的情况下直接调用 API,则必须自己重试。
注意
ServiceQuotaExceededException在此原生 HTTP 表面上返回 HTTP 402。在 A2A 协议上,它返回 HTTP 429,与限制相同 HTTP 状态。在 MCP 协议上,它共享限制 JSON-RPC 错误代码 (-32003),但返回 HTTP 200。 AG-UI 它使用不同的 SERVICE_QUOTA_EXCEEDED SSE 代码并返回 HTTP 429。
OAuth 身份验证响应
OAuth-configured 代理遵循 RFC 6749 (OAuth 2.0) 身份验证标准。
401 未经授权
缺少授权标头时返回。
包括 WWW-Authenticate 标题:
WWW-Authenticate: Bearer resource_metadata="https://bedrock-agentcore.{region}.amazonaws.com/runtimes/{ESCAPED_ARN}/invocations/.well-known/oauth-protected-resource?qualifier={QUALIFIER}"
注意
SigV4-configured 代理返回 HTTP 403 ACCESS_DENIED 时出现错误,并且不包含WWW-Authenticate标头。