本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用亚马逊 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 为集成异步处理提供以下选项。
例
重要
确保@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 状态时模拟场景。