View a markdown version of this page

使用亚马逊 Bedrock AgentCore Runtime 处理异步和长时间运行的代理 - 亚马逊基岩 AgentCore

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用亚马逊 Bedrock AgentCore Runtime 处理异步和长时间运行的代理

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

  • 启动可能需要几分钟或几小时的任务

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

  • 继续在后台处理

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

重要概念

异步处理模型

亚马逊 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 = str(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 状态时模拟场景。