使用 Amazon Bedrock AgentCore 執行期處理非同步和長時間執行的代理程式
Amazon Bedrock AgentCore 執行期可以處理非同步處理和長時間執行的代理程式。非同步任務可讓您的代理程式在回應用戶端後繼續處理,並處理長時間執行的操作,而不會封鎖回應。透過非同步處理,您的代理程式可以:
-
啟動可能需要幾分鐘或數小時的任務
-
立即回應使用者說「我已經開始處理」
-
在背景繼續處理
-
允許使用者稍後回來查看結果
重要概念
非同步處理模型
Amazon Bedrock AgentCore SDK 透過統一 API 支援同步和非同步處理。這可為用戶端和代理程式開發人員建立靈活的實作模式。代理程式用戶端可以使用相同的 API,而無需在用戶端上區分同步和非同步。透過在調用之間調用相同的工作階段,代理程式開發人員可以重複使用內容,並累加以此內容為基礎建置,而無需實作複雜的任務管理邏輯。
執行階段工作階段生命週期管理
客服人員程式碼會使用「/ping」端點運作狀態來傳達其處理狀態。/ping 端點必須傳回具有下列 JSON 承載的 HTTP 200 回應:
{"status": "HealthyBusy"}
回應包含必要欄位和選用欄位:
-
status(必要) —"Healthy"(閒置、等待請求) 或"HealthyBusy"(處理背景任務)。平台會使用此欄位來判斷工作階段是否仍然作用中。 -
time_of_last_update(選用) —status上次變更時的 Unix 時間戳記,以秒為單位。僅在實際狀態變更時設定,而不是在每個 ping 上設定。
閒置狀態 ("Healthy") 達 15 分鐘的工作階段會自動終止。傳回的工作階段在閒置逾時後"HealthyBusy"仍然有效。
警告
如果您包含 time_of_last_update,請勿在每個 ping 上將其設定為目前時間。在每個 ping 上推進的時間戳記會發出持續狀態變更,防止閒置工作階段逾時永遠觸發 — 然後工作階段會保留到 ,MaxLifetime並可以耗盡工作階段配額。省略 欄位 (平台會自行追蹤狀態變更),或只在狀態實際變更時更新。如果您使用 Bedrock AgentCore 開發套件,則會為您處理。
實作非同步任務
若要開始使用,請安裝 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 = 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 -
在處理繼續時立即回應使用者
-
自動管理客服人員的運作狀態
常見問題與解決方案
長時間執行的代理程式會在 15 分鐘後終止
當應用程式為單一執行緒且 ping 執行緒遭到封鎖時,可能會發生這種情況。
-
檢查呼叫路徑中的封鎖呼叫是否位於單獨的執行緒或非同步非封鎖中
-
在本機執行非同步代理程式伺服器,並在檢查 ping 狀態時模擬案例。