Commencez avec le streaming bidirectionnel en utilisant WebSocket
Amazon Bedrock AgentCore Runtime vous permet de déployer des agents qui prennent WebSocket en charge le streaming pour une communication bidirectionnelle en temps réel. Ce guide vous explique comment créer, tester et déployer votre premier agent de streaming bidirectionnel à l'aide WebSocket de.
Dans cette section, vous allez apprendre :
-
Comment AgentCore Runtime prend en charge WebSocket les connexions
-
Comment créer une application d'agent dotée de fonctionnalités de diffusion bidirectionnelle
-
Comment tester votre agent localement
-
Comment déployer votre agent sur AWS
-
Comment appeler votre agent déployé
-
Comment utiliser les sessions avec WebSocket connexions
Pour plus d'informations sur le WebSocket protocole, consultez la WebSocket RFC 6455
Rubriques
Comment AgentCore Runtime prend en charge WebSocket les connexions
AgentCore Le WebSocket support de Runtime permet des connexions de streaming persistantes et bidirectionnelles entre les clients et les agents. AgentCore Runtime s'attend à ce que les conteneurs implémentent des WebSocket points de terminaison sur le port 8080 au niveau du /ws chemin, conformément aux pratiques standard des WebSocket serveurs.
AgentCore Le WebSocket support de Runtime fournit les mêmes fonctionnalités sans serveur, d'isolation de session, d'identité et d'observabilité que. InvokeAgentRuntime En outre, il permet le streaming bidirectionnel en temps réel et à faible latence des messages via des WebSocket connexions utilisant l'authentification Sigv4 ou OAuth 2.0, ce qui le rend idéal pour les applications telles que les agents vocaux conversationnels en temps réel.
WebSocket Librairies prises en charge
Le streaming bidirectionnel utilisant WebSockets AgentCore Runtime prend en charge les applications utilisant n'importe quelle bibliothèque de WebSocket langues. Les seules exigences sont que les clients se connectent au point de terminaison du service via une connexion de WebSocket protocole :
wss://bedrock-agentcore.<region>.amazonaws.com/runtimes/<agentRuntimeArn>/ws
Cette flexibilité vous permet d'utiliser votre WebSocket implémentation préférée dans différents langages de programmation et frameworks, garantissant ainsi la compatibilité avec les bases de code et les flux de développement existants.
Utilisation WebSocket avec AgentCore Runtime
Dans ce didacticiel de démarrage, vous allez créer, tester et déployer une application d'agent qui prend en charge le streaming bidirectionnel à l'aide du SDK Python bedrock-agentcore et de la CLI pour le déploiement. AgentCore
Rubriques
Étape 1 : Configuration du projet et installation des dépendances
Étape 2 : Création de votre agent de streaming bidirectionnel
Étape 3 : testez votre agent de streaming bidirectionnel localement
Étape 4 : Déployer votre agent de streaming bidirectionnel sur AgentCore Runtime
Étape 5 : Invoquez votre agent de streaming bidirectionnel déployé
Conditions préalables
Avant de commencer, assurez-vous d'avoir :
-
AWS Compte avec informations d'identification configurées. Pour configurer vos AWS informations d'identification, consultez la section Configuration et paramètres des fichiers d'identification dans la AWS CLI.
-
Python 3.10+ installé
-
AWS Autorisations : pour créer et déployer un agent avec la AgentCore CLI, vous devez disposer des autorisations appropriées. Pour plus d'informations, consultez la section Utiliser la AgentCore CLI.
Étape 1 : Configuration du projet et installation des dépendances
Créez un dossier de projet et installez les packages requis :
mkdir agentcore-runtime-quickstart-websocket cd agentcore-runtime-quickstart-websocket python3 -m venv .venv source .venv/bin/activate
Mettez à jour pip vers la dernière version :
pip install --upgrade pip
Installez les packages requis suivants :
-
bedrock-agentcore - Le AgentCore SDK Amazon Bedrock pour créer des agents d'intelligence artificielle, la dépendance à la bibliothèque python est incluse
websockets
pip install bedrock-agentcore
Étape 2 : Création de votre agent de streaming bidirectionnel
Créez un fichier source pour le code de votre agent de streaming bidirectionnel nomméwebsocket_echo_agent.py. Ajoutez le code suivant :
from bedrock_agentcore import BedrockAgentCoreApp app = BedrockAgentCoreApp() @app.websocket async def websocket_handler(websocket, context): """Simple echo WebSocket handler.""" await websocket.accept() try: data = await websocket.receive_json() # Echo back await websocket.send_json({"echo": data}) except Exception as e: print(f"Error: {e}") finally: await websocket.close() if __name__ == "__main__": app.run(log_level="info")
Créez requirements.txt et ajoutez les éléments suivants :
bedrock-agentcore
La dépendance à websockets la bibliothèque Python est incluse
Comprendre le code
-
BedrockAgentCoreApp: crée une application d'agent qui étend Starlette pour le déploiement d'agents d'intelligence artificielle, en fournissant des fonctionnalités d' WebSocket assistance, de routage HTTP, de middleware et de gestion des exceptions
-
WebSocket Décorateur : le
@app.websocketdécorateur gère automatiquement les connexions sur le/wschemin du port 8080 -
Echo Logic : renvoie les données reçues en utilisant
{"echo": data} -
Gestion des erreurs : utilise la structure try/except /finally pour garantir une journalisation correcte des erreurs et une fermeture progressive de la connexion.
Étape 3 : testez votre agent de streaming bidirectionnel localement
Démarrez votre agent de streaming bidirectionnel
Ouvrez une fenêtre de terminal et lancez votre agent de streaming bidirectionnel à l'aide de la commande suivante :
python websocket_echo_agent.py
Vous devriez voir une sortie indiquant que le serveur fonctionne sur le port 8080.
Tester WebSocket la connexion
Créez un WebSocket client local nommé websocket_agent_client.py :
import asyncio import websockets import json async def local_websocket(): uri = "ws://localhost:8080/ws" try: async with websockets.connect(uri) as websocket: # Send a message await websocket.send(json.dumps({"inputText": "Hello WebSocket!"})) # Receive the echo response response = await websocket.recv() print(f"Received: {response}") except Exception as e: print(f"Connection failed: {e}") if __name__ == "__main__": asyncio.run(local_websocket())
Testez votre agent de streaming bidirectionnel localement en ouvrant une autre fenêtre de terminal et en exécutant le client :
python websocket_agent_client.py
Succès : vous devriez voir une réponse du typeReceived: {"echo":{"inputText":"Hello WebSocket!"}}. Dans la fenêtre du terminal qui exécute l'agent, entrez Ctrl+C pour arrêter l'agent.
Étape 4 : Déployer votre agent de streaming bidirectionnel sur AgentCore Runtime
Installation des outils de déploiement
Installez la AgentCore CLI :
npm install -g @aws/agentcore
Vérifiez l'installation :
agentcore --help
Créez un projet et déployez-le sur AWS
Créez un nouveau projet pour votre agent de streaming bidirectionnel :
agentcore create
Déployez votre agent :
agentcore deploy
Note
Exécutez ces commandes depuis le répertoire de votre projet (agentcore-runtime-quickstart-websocket) où se trouvent vos fichiers d'agent.
Après le déploiement, vous recevrez un ARN d'exécution de l'agent qui ressemble à :
arn:aws:bedrock-agentcore:us-west-2:accountId:runtime/websocket_echo_agent-xyz123
Enregistrez cet ARN car vous en aurez besoin pour appeler votre agent déployé.
Étape 5 : Invoquez votre agent de streaming bidirectionnel déployé
Configurer les variables d’environnement
Configurez les variables d'environnement requises :
-
Exportez l'ARN de votre agent :
export AGENT_ARN="arn:aws:bedrock-agentcore:us-west-2:accountId:runtime/websocket_echo_agent-xyz123" -
Si vous utilisez OAuth, exportez votre jeton porteur :
export BEARER_TOKEN="your_oauth_token_here"
Méthodes d’authentification
L'action InvokeAgentRuntimeWithWebSocketStream API établit une WebSocket connexion qui prend en charge le streaming bidirectionnel entre le client et l'agent. Vous pouvez authentifier les WebSocket connexions à l'aide des méthodes suivantes :
-
AWS En-têtes Signature Version 4 : signez les en-têtes de demande de WebSocket poignée de main à l'aide de vos informations d'identification AWS
-
AWS Pre-signed URL de la version 4 de la signature : créez une WebSocket URL présignée avec la signature SigV4 fournie comme paramètres de requête
-
Jeton OAuth Bearer : transmettez un jeton OAuth dans l'en-tête d'autorisation pour l'intégration du fournisseur d'identité externe
Astuce
Vérifiez que vous disposez des bedrock-agentcore:InvokeAgentRuntimeWithWebSocketStream autorisations nécessaires.
Connectez-vous à l'aide d'en-têtes signés SigV4
L'exemple suivant montre comment établir une WebSocket connexion et communiquer avec un environnement d'exécution d'agent à l'aide d'en-têtes signés Sigv4 :
from bedrock_agentcore.runtime import AgentCoreRuntimeClient import websockets import asyncio import json import os async def main(): # Get runtime ARN from environment variable runtime_arn = os.getenv('AGENT_ARN') if not runtime_arn: raise ValueError("AGENT_ARN environment variable is required") # Initialize client client = AgentCoreRuntimeClient(region="us-west-2") # Generate WebSocket connection with authentication ws_url, headers = client.generate_ws_connection( runtime_arn=runtime_arn ) try: async with websockets.connect(ws_url, additional_headers=headers) as ws: # Send message await ws.send(json.dumps({"inputText": "Hello!"})) # Receive response response = await ws.recv() print(f"Received: {response}") except websockets.exceptions.InvalidStatus as e: print(f"WebSocket handshake failed with status code: {e.response.status_code}") print(f"Response headers: {e.response.headers}") print(f"Response body: {e.response.body.decode()}") except Exception as e: print(f"Connection failed: {e}") if __name__ == "__main__": asyncio.run(main())
Exécutez le client pour tester votre agent déployé :
python websocket_agent_client_sigv4_headers.py
Succès : vous devriez voir une réponse du type :
Received: {"echo":{"inputText":"Hello!"}}
Connectez-vous à l'aide d'une URL pré-signée (SigV4 via les paramètres de requête)
L'exemple suivant montre comment créer une WebSocket URL avec des paramètres de requête Sigv4 et établir une connexion :
from bedrock_agentcore.runtime import AgentCoreRuntimeClient import websockets import asyncio import json import os async def main(): runtime_arn = os.getenv('AGENT_ARN') if not runtime_arn: raise ValueError("AGENT_ARN environment variable is required") client = AgentCoreRuntimeClient(region="us-west-2") # Generate WebSocket pre-signed URL (with SigV4 via query parameters) # wss://...amazonaws.com/runtimes/.../ws?X-Amz-Algorithm=AWS4-HMAC-SHA256 # &X-Amz-Credential=...&X-Amz-Date=...&X-Amz-Expires=300 # &X-Amz-SignedHeaders=...&X-Amz-Signature=... sigv4_url = client.generate_presigned_url( runtime_arn=runtime_arn, expires=300 # 5 minutes ) try: async with websockets.connect(sigv4_url) as ws: await ws.send(json.dumps({"inputText": "Hello!"})) response = await ws.recv() print(f"Received: {response}") except websockets.exceptions.InvalidStatus as e: print(f"WebSocket handshake failed with status code: {e.response.status_code}") print(f"Response headers: {e.response.headers}") print(f"Response body: {e.response.body.decode()}") except Exception as e: print(f"Connection failed: {e}") if __name__ == "__main__": asyncio.run(main())
Exécutez le client pour tester votre agent déployé :
python websocket_agent_client_sigv4_query_parameters.py
Succès : vous devriez voir une réponse du type :
Received: {"echo":{"inputText":"Hello!"}}
Connectez-vous à l'aide d'OAuth
AgentCore Runtime prend en charge l'authentification par jeton OAuth Bearer pour les connexions. WebSocket Pour utiliser l'authentification OAuth, vous devez configurer l'environnement d'exécution de votre agent avec l'autorisation JWT, comme décrit dans la section Exemple d'autorisation entrante JWT et d'accès sortant OAuth de la section Authentifier et autoriser avec authentification entrante et authentification sortante.
Une fois que vous avez terminé la configuration OAuth et obtenu un jeton porteur en suivant l'étape 4 : Utilisez le jeton porteur pour appeler votre agent dans le guide OAuth, vous pouvez utiliser ce jeton pour établir des connexions. WebSocket
Client Python avec OAuth
L'exemple suivant montre comment établir une WebSocket connexion depuis Python à l'aide d'OAuth :
from bedrock_agentcore.runtime import AgentCoreRuntimeClient import websockets import asyncio import json import os async def main(): # Get runtime ARN from environment variable runtime_arn = os.getenv('AGENT_ARN') if not runtime_arn: raise ValueError("AGENT_ARN environment variable is required") # Get OAuth bearer token from environment variable bearer_token = os.getenv('BEARER_TOKEN') if not bearer_token: raise ValueError("BEARER_TOKEN environment variable required for OAuth") # Initialize client client = AgentCoreRuntimeClient(region="us-west-2") # Generate WebSocket connection with OAuth ws_url, headers = client.generate_ws_connection_oauth( runtime_arn=runtime_arn, bearer_token=bearer_token ) try: async with websockets.connect(ws_url, additional_headers=headers) as ws: # Send message await ws.send(json.dumps({"inputText": "Hello!"})) # Receive response response = await ws.recv() print(f"Received: {response}") except websockets.exceptions.InvalidStatus as e: print(f"WebSocket handshake failed with status code: {e.response.status_code}") print(f"Response headers: {e.response.headers}") print(f"Response body: {e.response.body.decode()}") except Exception as e: print(f"Connection failed: {e}") if __name__ == "__main__": asyncio.run(main())
Exécutez le client pour tester votre agent déployé :
python websocket_agent_client_oauth.py
Succès : vous devriez voir une réponse du type :
Received: {"echo":{"inputText":"Hello!"}}
JavaScript Client de navigateur avec OAuth
L' WebSocket API native du navigateur ne fournit pas de méthode pour définir des en-têtes personnalisés lors de la poignée de main. Pour prendre en charge l'authentification OAuth depuis les navigateurs, AgentCore Runtime accepte le jeton porteur intégré dans l'Sec-WebSocket-Protocolen-tête lors de la poignée de main. WebSocket
Le jeton doit être codé en base64url et préfixé par le sous-protocole Sentinelbase64UrlBearerAuthorization., suivi du sous-protocole Sentinel. base64UrlBearerAuthorization
L'exemple suivant montre comment établir une WebSocket connexion depuis un navigateur à JavaScript l'aide d'OAuth :
<!DOCTYPE html> <html> <body> <button onclick="connect()">Connect</button> <div id="output"></div> <script> function connect() { const bearerToken = "your_oauth_token_here"; const runtimeArn = "arn:aws:bedrock-agentcore:us-west-2:accountId:runtime/agent-xyz123"; // Base64url encode token const base64url = btoa(bearerToken) .replace(/\+/g, '-') .replace(/\//g, '_') .replace(/=/g, ''); const ws = new WebSocket( `wss://bedrock-agentcore.us-west-2.amazonaws.com/runtimes/${runtimeArn}/ws`, [`base64UrlBearerAuthorization.${base64url}`, "base64UrlBearerAuthorization"] ); ws.onopen = () => ws.send(JSON.stringify({ inputText: "Hello!" })); ws.onmessage = (e) => document.getElementById("output").innerText = e.data; } </script> </body> </html>
Note
Cette méthode d'authentification est destinée aux clients basés sur un navigateur pour lesquels il n'est pas possible de définir des en-têtes personnalisés. Pour les clients autres que les navigateurs (Python, Node.js serveurs, etc.), utilisez l'authentification par en-tête OAuth illustrée dans le client Python avec OAuth.
Note
Les sous-protocoles autres que ceux qui ne base64UrlBearerAuthorization sont pas encore pris en charge.
Important
Il s'agit d'un exemple de référence. Il n'est pas recommandé de coder des jetons en dur dans le code de production.
Gestion de session
Le fait de fournir un session_id (X-Amzn-Bedrock-AgentCore-Runtime-Session-Id) sur la WebSocket connexion (sous forme de paramètre de requête URL ou d'en-tête de demande) achemine la connexion vers une session d'exécution isolée. L'agent peut accéder au contexte de conversation stocké dans cette session, afin de garantir la continuité d'une conversation en faisant référence aux interactions précédentes. Les différents identifiants de session accèdent à des contextes isolés distincts, garantissant ainsi une isolation complète entre les utilisateurs ou les conversations.
Pour une gestion complète du cycle de vie des sessions, y compris le suivi, le nettoyage et la gestion des erreurs, voir Utiliser des sessions isolées pour les agents.
Utilisation de sessions avec WebSocket connexions
Pour utiliser des sessions avec des WebSocket connexions, générez un identifiant de session unique pour chaque utilisateur ou conversation et transmettez-le lors de l'établissement de la connexion :
Exemple
Astuce
Pour de meilleurs résultats, utilisez un UUID ou un autre identifiant unique pour vos identifiants de session afin d'éviter les collisions entre différents utilisateurs ou conversations.
En utilisant le même identifiant de session pour les WebSocket connexions associées, vous vous assurez que le contexte est maintenu tout au long de la même conversation, ce qui permet à votre agent de fournir des réponses cohérentes qui s'appuient sur les interactions précédentes.
Cycle de vie des sessions avec WebSocket connexions
Pour WebSocket les connexions, le délai d'inactivité de la session est réinitialisé chaque fois qu'un message est actif entre le client et l'agent. Cela inclut tout échange de WebSocket messages tel que l'envoi de données d'un client à un agent, la réception de réponses d'un agent à un autre ou WebSocket ping/pong des cadres. Cela signifie que les WebSocket conversations actives maintiendront la session active tant que les messages continueront à circuler, empêchant ainsi la fin prématurée de la session pendant les interactions en cours.
Pour plus d'informations sur la configuration des paramètres du cycle de vie, consultez Configurer les paramètres AgentCore du cycle de vie d'Amazon Bedrock. Pour un contrôle plus direct du cycle de vie des sessions via l'état de santé des agents, consultez la section Gestion du cycle de vie des sessions d'exécution.
Arrêter la session d'exécution
Pour arrêter une session en cours avant la configuration IdleRuntimeSessionTimeout (15 minutes par défaut), voir Arrêter une session en cours.
Observabilité
Amazon Bedrock AgentCore Observability vous permet de suivre, de déboguer et de surveiller les agents que vous hébergez dans Amazon Bedrock Runtime. AgentCore Activez d'abord CloudWatch Transaction Search en suivant les instructions de la section Activer l'observabilité du AgentCore runtime Amazon Bedrock. Pour observer votre agent, consultez Afficher les données d'observabilité de vos agents Amazon Bedrock AgentCore .
Pour WebSocket les connexions, une trace représente la session de connexion complète plutôt que des échanges de messages individuels.
En-têtes personnalisés
Les en-têtes personnalisés vous permettent de transmettre les informations contextuelles de votre application directement au code de votre agent lors de la connexion initiale WebSocket . Pour obtenir des informations complètes sur la prise en charge, la configuration et les limites des en-têtes personnalisés, consultez Transmettre des en-têtes personnalisés à Amazon Bedrock Runtime AgentCore .
En outre, les en-têtes préfixés par X-Amzn-Bedrock-AgentCore-Runtime-Custom- peuvent être transmis en tant que paramètres de requête d'URL dans WebSocket les connexions.
Par exemple, vous pouvez transmettre des en-têtes personnalisés en tant que paramètres de requête dans l' WebSocket URL :
wss://bedrock-agentcore.<region>.amazonaws.com/runtimes/<agentRuntimeArn>/ws?X-Amzn-Bedrock-AgentCore-Runtime-Custom-TestHeader=query-param-test-value
Le conteneur de l'application de l'agent recevra les en-têtes suivants :
"headers": { "x-amzn-bedrock-agentcore-runtime-custom-testheader": "query-param-test-value" }
Annexe
Rubriques
Considérations sur la sécurité
Astuce
Pour une vue consolidée de toutes les recommandations de sécurité relatives à Runtime, consultez la section Bonnes pratiques en matière de sécurité pour AgentCore Runtime.
- Authentification
-
Toutes les WebSocket connexions nécessitent une AWS authentification appropriée via Sigv4 ou OAuth 2.0
- Isolation de session
-
Chaque session s'exécute dans des environnements d'exécution isolés dotés de ressources dédiées
- Sécurité du transport
-
Toutes les connexions utilisent WSS (WebSocket Secure) sur HTTPS pour les communications cryptées
- Contrôle d’accès
-
Les politiques IAM contrôlent les autorisations de WebSocket connexion et l'accès à des agents spécifiques
Résolution des problèmes
WebSocket-specific Problèmes courants
Les problèmes courants que vous pouvez rencontrer sont les suivants :
- Défaillances de connexion
-
Vérifiez que votre application d'agent traite les demandes de connexion sur
/ws - Incompatibilité des méthodes d'authentification
-
Assurez-vous que votre client utilise la même méthode d'authentification (OAuth ou Sigv4) que celle avec laquelle l'agent a été configuré
- Connexion fermée en raison d'un dépassement de la limite
-
Les connexions sont automatiquement fermées si les limites sont dépassées, telles que la fréquence d'images des messages ou les limites de taille des trames de message. Pour obtenir des informations complètes sur les limites, consultez la section Quotas pour Amazon Bedrock AgentCore
- Taille du cadre du message dépassée
-
Configurez la fragmentation des trames de message ou implémentez le découpage pour rester en dessous de la limite de taille de trame de 32 Ko. Divisez les gros messages en petits morceaux avant de les envoyer
- Défaillances du bilan de santé
-
Assurez-vous que votre conteneur d'agents implémente le
/pingpoint de terminaison tel que spécifié dans le contrat de protocole HTTP. Ce point de terminaison vérifie que votre agent est opérationnel et prêt à traiter les demandes, ce qui permet la surveillance des services et la restauration automatique
Gestion des erreurs
WebSocket les connexions utilisent des codes de fermeture standard pour la communication d'erreur. Les codes de fermeture courants incluent :
-
1000- Fermeture normale -
1001- Je m'en vais -
1008- Politique violée (limite dépassée) -
1009- Le message est trop gros (limite de taille de trame de message dépassée) -
1011- Erreur du serveur
WebSocket par rapport aux autres protocoles
Quand utiliser WebSocket :
-
Real-time conversations vocales avec diffusion audio immédiate pour un flux de conversation naturel
-
Flux de données audio/text bidirectionnel/binaire (diffusion de fragments de données du client à l'agent et vice versa)
-
Gestion des interruptions (l'utilisateur peut interrompre l'agent en cours de conversation)
Quand utiliser le protocole HTTP :
-
HTTP pour les modèles de demande-réponse sans besoin de streaming bidirectionnel
Autres exemples de mise en route
Pour d'autres exemples d'utilisation du streaming WebSocket bidirectionnel avec AgentCore Runtime, consultez les exemples de streaming WebSocket GitHub bidirectionnel
-
Implémentation de Sonic (Python) : WebSocket implémentation native d'Amazon Nova Sonic avec conversations audio en temps réel, sélection vocale et prise en charge des interruptions
-
Implémentation des Strands (Python) : Framework-based implémentation à l'aide des Strands BidiAgent pour des conversations audio simplifiées en temps réel avec gestion automatique des sessions et intégration d'outils
-
Implémentation d'Echo (Python) : serveur d'écho simple pour tester WebSocket la connectivité et l'authentification