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 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 = 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 ステータスをチェックしながらシナリオをシミュレートします。