DX開発事業部の前野佑宜です。
AWS re:Invent 2025の2日目のAWSのCEO Matt Garman氏によるKeynote(Opening Keynote with Matt Garman (KEY001))では、Amazon Bedrock AgentCore Policyや、Amazon Bedrock AgentCore Evaluations がプレビュー版で登場した、というアナウンスがありました。
その傍ら、キーノートでは触れられていませんが、Amazon Bedrock AgentCore Runtimeに双方向ストリーミング(bi-directional streaming)なる機能が追加されました。(参照記事)
従来の処理の流れ
従来のAmazon Bedrock AgentCore Runtimeにおいては、以下のような流れで処理が行われておりました。
- クライアントがエンドポイントに対してHTTPリクエストを送る
- エージェントがリクエストを全て処理し終わるのを待つ
- 結果が返却される
つまり、指示を間違えたなどで途中で何か条件を変えたい場合は、一度処理が終わるまで待つ必要がありました。
今回のアップデートでできるようになったこと
WebSocket接続(wss://…./runtimes//ws)のコネクションを常に張っておいて、クライアント→エージェント、エージェント→クライアントというような両方向からデータのやり取りを行うことができるようになりました。
簡潔にイメージをまとめるとすると、「エージェントがレスポンスを返している間でも、人間同士での会話のようにユーザーが”指示Aではなく指示Bで”というようにツッコミを入れて話すことができるようになるもの」かと思われます。
早速試してみる
字面だけでは少しイメージが湧きづらかったため、早速試してみます。
amazon-bedrock-agentcore-samplesリポジトリも、今回のアップデートに早速対応していました。今回はこのリポジトリにあるサンプル06-bi-directional-streaming
を使わせていただきます。

(06-bi-directional-streamingの説明の項より引用)
ネイティブの Amazon Nova Sonic Python WebSocket サーバーがAgentCore に直接デプロイされる構成となっているようです。
また、本アプリケーションではgetDateToolという現在の日付や曜日を返すToolが組み込まれており、ユースケースに応じてToolを持たせることも可能です。
1.リポジトリをclone/初期セットアップ
上記リポジトリをcloneし、セットアップの指示に従って環境変数をセットしてあげます。

事前にスクリプトが用意されているようなので、デプロイスクリプトを実行します。(recommendedと記載されているOption1の方を使用しました。)

$ ./setup.sh sonic AgentCore BidiAgent Test Setup Using websocket folder: sonic Checking prerequisites... All prerequisites met Setting environment variables... AWS_REGION: us-east-1 ACCOUNT_ID: <your-account-id> ECR_REPO_NAME: agentcore_bidi_images AGENT_NAME: bidi_stream_agent IAM_ROLE_NAME: WebSocketBidiAgentRole Step 1: Setting up Python virtual environment... Virtual environment created Installing Python dependencies... [notice] A new release of pip is available: 24.3.1 → 25.3 [notice] To update, run: pip install —upgrade pip Dependencies installed Step 2: Building and pushing Docker image... Creating ECR repository (if needed)... REPOSITORY 2025-12-07T15:20:56.454000+09:00 MUTABLE <your-account-id> arn:aws:ecr:us-east-1:<your-account-id>:repository/agentcore_bidi_images agentcore_bidi_images ENCRYPTIONCONFIGURATION AES256 IMAGESCANNINGCONFIGURATION False Logging in to ECR... Login Succeeded Building and pushing Docker image from sonic/websocket... [+] Building 144.7s (13/13) FINISHED docker:default => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 490B 0.0s => [internal] load metadata for public.ecr.aws/docker/library/python:3.12-slim 10.3s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [1/7] FROM public.ecr.aws/docker/library/python:3.12-slim@sha256:b43ff04d5df04ad5cabb80890b7ef74e8410e3395b19af970dcd52d7 2.5s => => resolve public.ecr.aws/docker/library/python:3.12-slim@sha256:b43ff04d5df04ad5cabb80890b7ef74e8410e3395b19af970dcd52d7 0.0s ... (途中省略) ... => => naming to <your-account-id>.dkr.ecr.us-east-1.amazonaws.com/agentcore_bidi_images:bidi_stream_agent 0.0s => pushing <your-account-id>.dkr.ecr.us-east-1.amazonaws.com/agentcore_bidi_images:bidi_stream_agent with docker 92.5s ... (途中省略) ... Docker image built and pushed Step 3: Creating IAM role... Creating IAM role: WebSocketBidiAgentRole for account <your-account-id>... Creating IAM role... Role created Attaching policy... Policy attached Validating role... Role validated: arn:aws:iam::<your-account-id>:role/WebSocketBidiAgentRole IAM role creation complete Waiting 10 seconds for IAM role to propagate... Wait complete Step 4: Creating Bedrock Agent with SigV4... Creating agent: bidi_stream_agent_sigv4_9914 Attempt 1 of 3... Agent created successfully Agent created: arn:aws:bedrock-agentcore:us-east-1:<your-account-id>:runtime/bidi_stream_agent_sigv4_9914-hMOsll4bFC Saving configuration to ./sonic/setup_config.json... Configuration saved ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Setup Complete! ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Configuration Summary ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ AWS Configuration: Account ID: <your-account-id> Region: us-east-1 Agent Runtime: Agent Name: bidi_stream_agent_sigv4_9914 Agent ARN: arn:aws:bedrock-agentcore:us-east-1:<your-account-id>:runtime/bidi_stream_agent_sigv4_9914-hMOsll4bFC IAM Role: arn:aws:iam::<your-account-id>:role/WebSocketBidiAgentRole Container Image: ECR Repository: agentcore_bidi_images Image Tag: bidi_stream_agent Full Image URI: <your-account-id>.dkr.ecr.us-east-1.amazonaws.com/agentcore_bidi_images:bidi_stream_agent ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Next Steps ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1. Start the client (recommended): ./start_client.sh sonic 2. Or manually start the client: export AWS_REGION="us-east-1" python sonic/client/client.py —runtime-arn "arn:aws:bedrock-agentcore:us-east-1:<your-account-id>:runtime/bidi_stream_agent_sigv4_9914-hMOsll4bFC" 3. When done, clean up resources: ./cleanup.sh sonic
上記のような表示がされていれば、セットアップは完了です。
2.クライアントを立ち上げる
続いて、WebSocketクライアントを立ち上げるため、以下を実行します。
$ ./start_client.sh sonic
実行すると、localhost::8000にてブラウザが開きます。

Start Conversationをクリックすると、マイクを利用して、AIと(モデル: Nova Sonic 2)と会話を行うことができます。
実際に質問をしてみました。「Can you explain about Amazon Bedrock AgentCore?」という質問をしてみましたが、うまく返してくれませんでした。
よくよく考えるとAmazon Bedrock AgentCoreについては比較的新しいサービスであり、AIが元々持つナレッジの範囲外だなと思いましたので、別の質問でも試してみます。

「What is Amazon Bedrock?」と質問すると、以下のように回答を返してくれていることがわかりました。 回答内容は正しそうです。

おまけ: Websocketのテスト
こちらは、AI機能を搭載していない、シンプルなWebSocketの疎通テストです。
./setup_client.sh echo
を実行したのち
./start_client.sh echo
を実行します。
$ ./start_client.sh echo
Starting echo Client
Loading configuration from ./echo/setup_config.json...
Configuration loaded
Configuration:
Folder: echo
Agent ARN: arn:aws:bedrock-agentcore:us-east-1::runtime/bidi_stream_agent_sigv4_8e4b-Zk1cwL9hew
AWS Region: us-east-1
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Starting Client
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Starting Echo client...
DEBUG:asyncio:Using selector: KqueueSelector
DEBUG:botocore.hooks:Changing event name from creating-client-class.iot-data to creating-client-class.iot-data-plane
... (botocore hooks省略) ...
DEBUG:botocore.utils:IMDS ENDPOINT: http://169.254.169.254/
DEBUG:botocore.credentials:Looking for credentials via: env
DEBUG:botocore.credentials:Looking for credentials via: assume-role
DEBUG:botocore.credentials:Looking for credentials via: assume-role-with-web-identity
DEBUG:botocore.credentials:Looking for credentials via: sso
DEBUG:botocore.credentials:Looking for credentials via: shared-credentials-file
INFO:botocore.credentials:Found credentials in shared credentials file: ~/.aws/credentials
DEBUG:botocore.auth:Calculating signature using v4 auth.
DEBUG:botocore.auth:CanonicalRequest:
GET
/runtimes/arn%3Aaws%3Abedrock-agentcore%3Aus-east-1%3A%3Aruntime/bidi_stream_agent_sigv4_8e4b-Zk1cwL9hew/ws
qualifier=DEFAULT
host:bedrock-agentcore.us-east-1.amazonaws.com
x-amz-date:20251207T064353Z
host;x-amz-date
DEBUG:botocore.auth:StringToSign:
AWS4-HMAC-SHA256
20251207T064353Z
20251207/us-east-1/bedrock-agentcore/aws4_request
DEBUG:botocore.auth:Signature:
DEBUG:websockets.client:= connection is CONNECTING
DEBUG:websockets.client:> GET /runtimes/arn:aws:bedrock-agentcore:us-east-1::runtime/bidi_stream_agent_sigv4_8e4b-Zk1cwL9hew/ws?qualifier=DEFAULT HTTP/1.1
DEBUG:websockets.client:> Host: bedrock-agentcore.us-east-1.amazonaws.com
DEBUG:websockets.client:> Upgrade: websocket
DEBUG:websockets.client:> Connection: Upgrade
DEBUG:websockets.client:> Sec-WebSocket-Key:
DEBUG:websockets.client:> Sec-WebSocket-Version: 13
DEBUG:websockets.client:> Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
DEBUG:websockets.client:> Host: bedrock-agentcore.us-east-1.amazonaws.com
DEBUG:websockets.client:> X-Amz-Date: 20251207T064353Z
DEBUG:websockets.client:> Authorization: AWS4-HMAC-SHA256 Credential=/20251207/us-east-1/bedrock-agentcore/aws4_request, SignedHeaders=host;x-amz-date, Signature=
DEBUG:websockets.client:> Connection: Upgrade
DEBUG:websockets.client:> Upgrade: websocket
DEBUG:websockets.client:> Sec-WebSocket-Version: 13
DEBUG:websockets.client:> Sec-WebSocket-Key:
DEBUG:websockets.client:> User-Agent: AWS-SigV4-WebSocket-Client/1.0
DEBUG:websockets.client:> X-Amzn-Bedrock-AgentCore-Runtime-Session-Id:
DEBUG:websockets.client:< HTTP/1.1 101 Switching Protocols
DEBUG:websockets.client:< Date: Sun, 07 Dec 2025 06:43:57 GMT
DEBUG:websockets.client:< Connection: upgrade
DEBUG:websockets.client:< X-Amzn-Bedrock-AgentCore-Runtime-Session-Id:
DEBUG:websockets.client:< x-amz-request-id:
DEBUG:websockets.client:< upgrade: websocket
DEBUG:websockets.client:< sec-websocket-accept:
DEBUG:websockets.client:= connection is OPEN
WebSocket connected
DEBUG:websockets.client:> TEXT '{"msg": "Hello, World! Echo Test"}' [34 bytes]
Sent: {'msg': 'Hello, World! Echo Test'}
DEBUG:websockets.client: CLOSE 1000 (OK) [2 bytes]
DEBUG:websockets.client:= connection is CLOSING
DEBUG:websockets.client:< CLOSE 1000 (OK) [2 bytes]
DEBUG:websockets.client: EOF
DEBUG:websockets.client:= connection is CLOSED
DEBUG:websockets.client:x closing TCP connection
Expected Outputに記載の出力が表示されていれば、テストが成功したことになるとの記載があったので、正常に疎通確認が取れたことが分かります。

まとめ
今回は、Amazon Bedrock AgentCore RuntimeのWebSocketを使った双方向ストリーミングについて、サンプルの音声アプリケーションを動かしてみた記事を書いてみました。
私個人としては、割り込みの会話に対応できるようになることは興味深いなと感じました。
エージェントが誤った方向へ処理を進め始めた際、即座に「ストップ、代わりにBを実行して」というような指示に対応できるようになることで、LLMのタスク実行における手戻りや無駄な処理時間を大幅に削減できるようになることが期待できるなと思いました。
サンプルということもあり、比較的シンプルな作りになっていたので、これをカスタマイズして実際の業務視点で役立つようなアプリケーションを何か作ることができたらなと思います。
AgentCoreのドキュメント: Get started with WebSocket streaming in AgentCore RuntimeにおいてもWebSocket ストリーミングを使った、リアルタイムの双方向通信を実現するエージェントをデプロイする方法が解説されているので、こちらも併せてご覧ください。