Comience con la transmisión bidireccional con WebSocket
Amazon Bedrock AgentCore Runtime le permite implementar agentes que admiten la WebSocket transmisión para una comunicación bidireccional en tiempo real. Esta guía explica cómo crear, probar e implementar su primer agente de streaming bidireccional utilizando. WebSocket
En esta sección, aprenderá lo siguiente:
-
Cómo admite AgentCore WebSocket Runtime las conexiones
-
¿Cómo crear una aplicación de agente con capacidades de transmisión bidireccional
-
¿Cómo probar a su agente localmente
-
Cómo desplegar a su agente en AWS
-
¿Cómo invocar a su agente desplegado
-
¿Cómo usar las sesiones con conexiones WebSocket
Para obtener más información sobre el WebSocket protocolo, consulte el WebSocket RFC 6455
Temas
Cómo admite AgentCore Runtime las conexiones WebSocket
AgentCore El WebSocket soporte de Runtime permite conexiones de transmisión bidireccionales y persistentes entre clientes y agentes. AgentCore Runtime espera que los contenedores implementen WebSocket puntos finales en el puerto de la /ws ruta, lo que se ajusta 8080 a las prácticas estándar WebSocket de los servidores.
AgentCore El WebSocket soporte de Runtime proporciona las mismas capacidades sin servidor, aislamiento de sesiones, identidad y observabilidad que. InvokeAgentRuntime Además, permite la transmisión bidireccional de mensajes en tiempo real y de baja latencia a través de WebSocket conexiones mediante la autenticación SiGv4 u OAuth 2.0, lo que lo hace ideal para aplicaciones como los agentes de voz conversacionales en tiempo real.
Bibliotecas compatibles WebSocket
La transmisión bidireccional que se utiliza WebSockets en AgentCore Runtime admite aplicaciones que utilizan cualquier biblioteca de WebSocket idiomas. Los únicos requisitos son que los clientes se conecten al punto final del servicio mediante una conexión de WebSocket protocolo:
wss://bedrock-agentcore.<region>.amazonaws.com/runtimes/<agentRuntimeArn>/ws
Esta flexibilidad le permite utilizar la WebSocket implementación que prefiera en diferentes lenguajes y marcos de programación, lo que garantiza la compatibilidad con las bases de código y los flujos de trabajo de desarrollo existentes.
Se utiliza WebSocket con Runtime AgentCore
En este tutorial de introducción, creará, probará e implementará una aplicación de agente que admita la transmisión bidireccional mediante el SDK de Python fundamental y la CLI para la implementación. AgentCore
Temas
Requisitos previos
Antes de empezar, asegúrese de que dispone de lo siguiente:
-
AWS Cuenta con credenciales configuradas. Para configurar sus AWS credenciales, consulte Configuración y configuración del archivo de credenciales en la AWS CLI.
-
Python 3.10+ instalado
-
AWS Permisos: para crear e implementar un agente con la AgentCore CLI, debe tener los permisos adecuados. Para obtener más información, consulte Uso de la AgentCore CLI.
Paso 1: Configurar el proyecto e instalar las dependencias
Cree una carpeta de proyecto e instale los paquetes necesarios:
mkdir agentcore-runtime-quickstart-websocket cd agentcore-runtime-quickstart-websocket python3 -m venv .venv source .venv/bin/activate
Actualice pip a la última versión:
pip install --upgrade pip
Instale los siguientes paquetes necesarios:
-
bedrock-agentcore: el SDK de Amazon AgentCore Bedrock para crear agentes de IA, incluye la dependencia de la biblioteca de Python
websockets
pip install bedrock-agentcore
Paso 2: Crea tu agente de streaming bidireccional
Cree un archivo fuente para su agente de streaming bidireccional con el nombre en clave. websocket_echo_agent.py Añada el código siguiente:
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")
Cree requirements.txt y añada lo siguiente:
bedrock-agentcore
Se incluye la dependencia websockets de la biblioteca de Python
Entender el código
-
BedrockAgentCoreApp: Crea una aplicación de agente que amplía Starlette para el despliegue de agentes de IA y proporciona funciones de WebSocket soporte, enrutamiento HTTP, middleware y gestión de excepciones
-
WebSocket Decorador: el
@app.websocketdecorador gestiona automáticamente las conexiones en la ruta del puerto 8080/ws -
Echo Logic: devuelve los datos recibidos mediante
{"echo": data} -
Gestión de errores: utiliza la estructura try/except /finally para garantizar un registro de errores adecuado y un cierre de conexión correcto.
Paso 3: Pruebe su agente de transmisión bidireccional localmente
Inicie su agente de streaming bidireccional
Abre una ventana de terminal e inicia tu agente de streaming bidireccional con el siguiente comando:
python websocket_echo_agent.py
Debería ver un resultado que indica que el servidor se está ejecutando en el puerto 8080.
Pruebe la conexión WebSocket
Cree un WebSocket cliente local llamadowebsocket_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())
Pruebe su agente de streaming bidireccional de forma local abriendo otra ventana de terminal y ejecutando el cliente:
python websocket_agent_client.py
Éxito: deberías ver una respuesta comoReceived: {"echo":{"inputText":"Hello WebSocket!"}}. En la ventana de la terminal en la que se ejecuta el agente, ingresa Ctrl+C para detenerlo.
Paso 4: Implemente su agente de streaming bidireccional en Runtime AgentCore
Instale las herramientas de despliegue
Instale la AgentCore CLI:
npm install -g @aws/agentcore
Verifique la instalación:
agentcore --help
Cree un proyecto e impleméntelo en AWS
Cree un nuevo proyecto para su agente de streaming bidireccional:
agentcore create
Despliega a tu agente:
agentcore deploy
nota
Ejecute estos comandos desde el directorio de su proyecto (agentcore-runtime-quickstart-websocket) donde se encuentran los archivos del agente.
Tras la implementación, recibirá un ARN de tiempo de ejecución del agente con el siguiente aspecto:
arn:aws:bedrock-agentcore:us-west-2:accountId:runtime/websocket_echo_agent-xyz123
Guarde este ARN, ya que lo necesitará para invocar el agente desplegado.
Paso 5: invoque el agente de streaming bidireccional desplegado
Configure las variables de entorno
Configure las variables de entorno necesarias:
-
Exporte el ARN de su agente:
export AGENT_ARN="arn:aws:bedrock-agentcore:us-west-2:accountId:runtime/websocket_echo_agent-xyz123" -
Si utilizas OAuth, exporta tu token de portador:
export BEARER_TOKEN="your_oauth_token_here"
Métodos de autenticación
La acción InvokeAgentRuntimeWithWebSocketStream de la API establece una WebSocket conexión que admite la transmisión bidireccional entre el cliente y el agente. Puede autenticar WebSocket las conexiones mediante los siguientes métodos:
-
AWS Encabezados exclusivos de la versión 4: firme los encabezados de las solicitudes de WebSocket apretón de manos con sus credenciales AWS
-
AWS URL de la versión 4 de la firma: cree una Pre-signed URL prefirmada con WebSocket la firma SigV4 como parámetros de consulta
-
Token portador de OAuth: pasa un token de OAuth al encabezado de autorización para la integración de un proveedor de identidad externo
sugerencia
Asegúrate de tener permisos. bedrock-agentcore:InvokeAgentRuntimeWithWebSocketStream
Conéctese mediante encabezados firmados SiGv4
El siguiente ejemplo muestra cómo establecer una WebSocket conexión y comunicarse con un agente en tiempo de ejecución mediante encabezados firmados por 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())
Ejecute el cliente para probar el agente desplegado:
python websocket_agent_client_sigv4_headers.py
Éxito: deberías ver una respuesta como la siguiente:
Received: {"echo":{"inputText":"Hello!"}}
Connect mediante una URL prefirmada (SiGv4 mediante parámetros de consulta)
El siguiente ejemplo muestra cómo crear una WebSocket URL con parámetros de consulta SigV4 y establecer una conexión:
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())
Ejecute el cliente para probar el agente desplegado:
python websocket_agent_client_sigv4_query_parameters.py
Éxito: deberías ver una respuesta como la siguiente:
Received: {"echo":{"inputText":"Hello!"}}
Conéctate mediante OAuth
AgentCore Runtime admite la autenticación con el token OAuth Bearer para las conexiones. WebSocket Para usar la autenticación OAuth, debes configurar el tiempo de ejecución del agente con la autorización JWT, tal y como se describe en la sección de ejemplos de autorización entrante de JWT y acceso saliente de OAuth de Autenticar y autorizar con autenticación entrante y autenticación saliente.
Una vez que hayas completado la configuración de OAuth y hayas obtenido un token de portador siguiendo el paso 4: Usa el token de portador para invocar a tu agente en la guía de OAuth, puedes usar ese token para establecer WebSocket conexiones.
Cliente Python con OAuth
El siguiente ejemplo muestra cómo establecer una WebSocket conexión desde Python mediante 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())
Ejecute el cliente para probar el agente desplegado:
python websocket_agent_client_oauth.py
Éxito: deberías ver una respuesta como la siguiente:
Received: {"echo":{"inputText":"Hello!"}}
JavaScript Cliente de navegador con OAuth
La WebSocket API nativa del navegador no proporciona un método para configurar encabezados personalizados durante el apretón de manos. Para admitir la autenticación OAuth desde los navegadores, AgentCore Runtime acepta el token portador incrustado en el encabezado durante el Sec-WebSocket-Protocol apretón de manos. WebSocket
El token debe estar codificado en base64url y tener el prefijo del subprotocolo centinela, seguido del subprotocolo centinela. base64UrlBearerAuthorization. base64UrlBearerAuthorization
El siguiente ejemplo muestra cómo establecer una conexión desde el navegador mediante OAuth: WebSocket JavaScript
<!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>
nota
Este método de autenticación es para clientes basados en navegador en los que no es posible configurar encabezados personalizados. Para los clientes que no son de navegador (Python, Node.js servidores, etc.), usa la autenticación de encabezado OAuth que se muestra en el cliente Python con OAuth.
nota
Aún no se admiten otros subprotocolos. base64UrlBearerAuthorization
importante
Este es un ejemplo de referencia. No se recomienda codificar los tokens en el código de producción.
Administración de sesiones
Si se proporciona un session_id (X-Amzn-Bedrock-AgentCore-Runtime-Session-Id) en la WebSocket conexión (como parámetro de consulta de URL o encabezado de solicitud), se enruta la conexión a una sesión de tiempo de ejecución aislada. El agente puede acceder al contexto de la conversación almacenado en esa sesión para implementar la continuidad de una conversación haciendo referencia a las interacciones anteriores. Los distintos identificadores de sesión acceden a distintos contextos aislados, lo que garantiza un aislamiento total entre los usuarios o las conversaciones.
Para obtener información sobre una gestión integral del ciclo de vida de las sesiones, que incluye el seguimiento, la limpieza y la gestión de errores, consulte Utilizar sesiones aisladas para los agentes.
Uso de sesiones con conexiones WebSocket
Para usar sesiones con WebSocket conexiones, genere un identificador de sesión único para cada usuario o conversación y páselo al establecer la conexión:
ejemplo
sugerencia
Para obtener mejores resultados, usa un UUID u otro identificador único como identificador de sesión para evitar colisiones entre distintos usuarios o conversaciones.
Al utilizar el mismo ID de sesión para WebSocket las conexiones relacionadas, se asegura de que se mantenga el contexto en la misma conversación, lo que permite al agente ofrecer respuestas coherentes basadas en interacciones anteriores.
Ciclo de vida de la sesión con WebSocket conexiones
En el WebSocket caso de las conexiones, el tiempo de espera de inactividad de la sesión se restablece cada vez que hay actividad de mensajes entre el cliente y el agente. Esto incluye cualquier intercambio de WebSocket mensajes, como el envío de datos del cliente al agente, la recepción de respuestas del agente al cliente o los WebSocket ping/pong marcos. Esto significa que WebSocket las conversaciones activas mantendrán activa la sesión mientras los mensajes sigan fluyendo, lo que evitará que la sesión se cierre prematuramente durante las interacciones en curso.
Para obtener más información sobre cómo configurar los ajustes del ciclo de vida, consulte Configurar los ajustes AgentCore del ciclo de vida de Amazon Bedrock. Para obtener un control más directo del ciclo de vida de la sesión mediante el estado del agente, consulte Gestión del ciclo de vida de las sesiones en tiempo de ejecución.
Detenga la sesión en ejecución
Para detener una sesión en ejecución antes de la configuración IdleRuntimeSessionTimeout (el valor predeterminado es de 15 minutos), consulte Detener una sesión en ejecución.
Observabilidad
Amazon Bedrock AgentCore Observability le ayuda a rastrear, depurar y supervisar los agentes que aloja en Amazon Bedrock Runtime. AgentCore En primer lugar, active la búsqueda de CloudWatch transacciones siguiendo las instrucciones de Habilitar la observabilidad en tiempo de AgentCore ejecución de Amazon Bedrock. Para observar a su agente, consulte Ver datos de observabilidad de sus agentes de Amazon Bedrock AgentCore .
En el WebSocket caso de las conexiones, un rastreo representa la sesión de conexión completa y no los intercambios de mensajes individuales.
Encabezados personalizados
Los encabezados personalizados le permiten pasar la información contextual de la aplicación directamente al código de agente en la WebSocket conexión inicial. Para obtener información completa sobre el soporte, la configuración y las limitaciones de los encabezados personalizados, consulte Transferir encabezados personalizados a Amazon Bedrock Runtime AgentCore .
Además, los encabezados con el prefijo se X-Amzn-Bedrock-AgentCore-Runtime-Custom- pueden pasar como parámetros de consulta de URL en las conexiones. WebSocket
Por ejemplo, puede pasar encabezados personalizados como parámetros de consulta en la URL: WebSocket
wss://bedrock-agentcore.<region>.amazonaws.com/runtimes/<agentRuntimeArn>/ws?X-Amzn-Bedrock-AgentCore-Runtime-Custom-TestHeader=query-param-test-value
El contenedor de aplicaciones del agente los recibirá como encabezados:
"headers": { "x-amzn-bedrock-agentcore-runtime-custom-testheader": "query-param-test-value" }
Apéndice
Temas
Consideraciones de seguridad
sugerencia
Para obtener una vista consolidada de todas las recomendaciones de seguridad en Runtime, consulte las prácticas recomendadas de seguridad para AgentCore Runtime.
- Autenticación
-
Todas las WebSocket conexiones requieren una AWS autenticación adecuada mediante SigV4 o OAuth 2.0
- Aislamiento de sesiones
-
Cada sesión se ejecuta en entornos de ejecución aislados con recursos dedicados
- Seguridad de transporte
-
Todas las conexiones utilizan WSS (WebSocket seguro) a través de HTTPS para la comunicación cifrada
- Control de acceso
-
Las políticas de IAM controlan los permisos de WebSocket conexión y el acceso a agentes específicos
Resolución de problemas
Problemas comunes WebSocket-specific
Los siguientes son problemas comunes que pueden surgir:
- Fallos de conexión
-
Compruebe que la aplicación de su agente procese las solicitudes de conexión en
/ws - El método de autenticación no coincide
-
Asegúrese de que su cliente utilice el mismo método de autenticación (OAuth o SigV4) con el que se configuró el agente
- La conexión se cerró debido a que se excedió el límite
-
Las conexiones se cierran automáticamente si se superan los límites, como la velocidad de fotogramas de los mensajes o los límites de tamaño de los fotogramas de los mensajes. Para obtener información completa sobre los límites, consulte Cuotas para Amazon Bedrock AgentCore
- Se ha superado el tamaño del marco del mensaje
-
Configure la fragmentación del marco del mensaje o implemente la fragmentación para mantenerse por debajo del límite de 32 KB del marco. Divida los mensajes grandes en trozos más pequeños antes de enviarlos
- Fallos en los chequeos de salud
-
Asegúrese de que su contenedor de agentes implemente el
/pingpunto final tal como se especifica en el contrato de protocolo HTTP. Este punto final verifica que su agente esté operativo y preparado para gestionar las solicitudes, lo que permite la supervisión del servicio y la recuperación automática
Gestión de errores
WebSocket las conexiones utilizan códigos de cierre estándar para la comunicación de errores. Los códigos de cierre más comunes incluyen:
-
1000- Cierre normal -
1001- ¿Se va -
1008- Política violada (se ha superado el límite) -
1009- El mensaje es demasiado grande (se ha superado el límite de tamaño del marco del mensaje) -
1011- Error en el servidor
WebSocket frente a otros protocolos
Cuándo usar WebSocket:
-
Real-time conversaciones de voz con transmisión de audio inmediata para un flujo de conversación natural
-
Flujo de datos audio/text bidireccional/binario (transmisión de fragmentos de datos del cliente al agente y viceversa)
-
Gestión de interrupciones (el usuario puede interrumpir al agente en mitad de una conversación)
Cuándo usar HTTP:
-
HTTP para patrones de solicitud-respuesta sin necesidad de transmisión bidireccional
Ejemplos adicionales de introducción
Para ver ejemplos adicionales que utilizan la transmisión WebSocket bidireccional con AgentCore Runtime, consulte los ejemplos de transmisión WebSocket GitHub bidireccional
-
Implementación de Sonic (Python): WebSocket implementación nativa de Amazon Nova Sonic con conversaciones de audio en tiempo real, selección de voz y soporte de interrupciones
-
Implementación de Strands (Python): Framework-based implementación que utiliza Strands BidiAgent para conversaciones de audio simplificadas en tiempo real con administración automática de sesiones e integración de herramientas
-
Implementación de Echo (Python): servidor de eco simple para probar la WebSocket conectividad y la autenticación