View a markdown version of this page

使用 Amazon Bedrock AgentCore 运行时处理异步代理和长时间运行的代理 - Amazon Bedrock AgentCore

使用 Amazon Bedrock AgentCore 运行时处理异步代理和长时间运行的代理

Amazon Bedrock AgentCore Runtime 可以处理异步处理和长时间运行的代理。异步任务允许您的代理在响应客户端后继续处理,并在不阻塞响应的情况下处理长时间运行的操作。通过异步处理,您的代理可以:

  • 开始一项可能需要几分钟或几小时的任务

  • 立即回复用户说 “我已经开始研究这个问题了”

  • 继续在后台处理

  • 允许用户稍后再回来查看结果

重要概念

异步处理模型

Amazon Bedrock AgentCore SDK 通过统一的 API 支持同步和异步处理。这为客户和代理开发人员创建了一种灵活的实现模式。代理客户端可以使用相同的 API,而无需区分客户端的同步和异步。由于能够在调用之间调用相同的会话,代理开发人员可以重复使用上下文,并在此上下文的基础上逐步构建,而无需实现复杂的任务管理逻辑。

运行时会话生命周期管理

代理代码使用 “/ping” 端点运行状况来传达其处理状态。/ping终端节点必须返回包含以下 JSON 有效负载的 HTTP 200 响应:

{"status": "HealthyBusy"}

响应包含一个必填字段和一个可选字段:

  • status(必填)—"Healthy"(空闲,等待请求)或"HealthyBusy"(处理后台任务)。平台使用此字段来确定会话是否仍处于活动状态。

  • time_of_last_update(可选)— Unix 时间戳,以status上次更改时的秒为单位。仅在实际状态更改时进行设置,而不是在每次 ping 时进行设置。

处于空闲状态 ("Healthy") 15 分钟的会话将自动终止。返回的会话在空闲超时后"HealthyBusy"仍处于活动状态。

警告

如果包含time_of_last_update,则不要在每次 ping 时将其设置为当前时间。每次 ping 时都会向前推进的时间戳表示状态会持续变化,从而防止空闲会话超时触发——然后会话会一直持续到MaxLifetime会话配额耗尽。省略该字段(平台自行跟踪状态变化)或仅在状态实际发生变化时才对其进行更新。如果您使用 Bedrock AgentCore SDK,则由您自己处理。

实现异步任务

要开始使用,请安装bedrock-agentcore软件包:

pip install bedrock-agentcore

AgentCore SDK 为集成异步处理提供了以下选项。

API based task management
  1. 要构建执行异步任务的交互式代理,您需要add_async_task在启动任务和任务完成complete_async_task时调用。SDK 会自动处理任务跟踪并管理 Ping 状态。

    # Start tracking a task manually task_id = app.add_async_task("data_processing") # Do work... # Mark task as complete app.complete_async_task(task_id)
Custom ping handler
  1. 您可以实现自己的自定义 ping 处理程序来管理运行时会话的状态。代理的运行状况通过 /ping 端点报告:

    @app.ping def custom_status(): if system_busy(): return PingStatus.HEALTHY_BUSY return PingStatus.HEALTHY

    状态值:

    • “健康”:为新工作做好准备

    • “HealthyBusy“: 正在处理后台任务

重要

确保@app.entrypoint处理程序不执行阻塞操作,因为这也可能阻塞 /ping 运行状况检查端点。使用单独的线程或异步方法来阻塞操作。

完整示例

首先,安装所需的软件包:

pip install strands-agents

然后,使用以下代码创建一个 Python 文件:

import threading import time from strands import Agent, tool from bedrock_agentcore.runtime import BedrockAgentCoreApp # Initialize app with debug mode for task management app = BedrockAgentCoreApp() @tool def start_background_task(duration: int = 5) -> str: """Start a simple background task that runs for specified duration.""" # Start tracking the async task task_id = app.add_async_task("background_processing", {"duration": duration}) # Run task in background thread def background_work(): time.sleep(duration) # Simulate work app.complete_async_task(task_id) # Mark as complete threading.Thread(target=background_work, daemon=True).start() return f"Started background task (ID: {task_id}) for {duration} seconds. Agent status is now BUSY." # Create agent with the tool agent = Agent(tools=[start_background_task]) @app.entrypoint def main(payload): """Main entrypoint - handles user messages.""" user_message = payload.get("prompt", "Try: start_background_task(3)") return {"message": agent(user_message).message} if __name__ == "__main__": print("🚀 Simple Async Strands Example") print("Test: curl -X POST http://localhost:8080/invocations -H 'Content-Type: application/json' -d '{\"prompt\": \"start a 3 second task\"}'") app.run()

此示例演示:

  • 创建异步运行的后台任务

  • 使用和跟踪任务add_async_task的状态 complete_async_task

  • 在继续处理的同时立即回复用户

  • 自动管理代理的健康状态

常见问题和解决方案

Long-running 15 分钟后代理被终止

当应用程序为单线程且 ping 线程被阻塞时,可能会发生这种情况。

  • 检查调用路径中的阻塞调用是否在单独的线程中或异步非阻塞中

  • 在本地运行异步代理服务器,并在检查 ping 状态的同时模拟场景。