React a Agente TypeScript Strands
Nx Plugin for AWS proporciona un generador para integrar rápidamente tu TypeScript Strands Agent con un sitio web de React. Configura toda la configuración necesaria para conectarse a tu agente a través de tRPC sobre WebSocket, incluyendo soporte de autenticación de AWS IAM y Cognito. La integración proporciona seguridad de tipos completa de extremo a extremo entre tu frontend y el enrutador tRPC del agente.
Requisitos previos
Sección titulada «Requisitos previos»Antes de usar este generador, asegúrate de tener:
- Un sitio web de React (generado usando el generador
ts#react-website) - Un TypeScript Strands Agent (generado usando el generador
ts#strands-agent) - Cognito Auth agregado a través del generador
ts#react-website-auth
Ejecutar el generador
Sección titulada «Ejecutar el generador»- Instale el Nx Console VSCode Plugin si aún no lo ha hecho
- Abra la consola Nx en VSCode
- Haga clic en
Generate (UI)en la sección "Common Nx Commands" - Busque
@aws/nx-plugin - connection - Complete los parámetros requeridos
- Haga clic en
Generate
pnpm nx g @aws/nx-plugin:connectionyarn nx g @aws/nx-plugin:connectionnpx nx g @aws/nx-plugin:connectionbunx nx g @aws/nx-plugin:connectionTambién puede realizar una ejecución en seco para ver qué archivos se cambiarían
pnpm nx g @aws/nx-plugin:connection --dry-runyarn nx g @aws/nx-plugin:connection --dry-runnpx nx g @aws/nx-plugin:connection --dry-runbunx nx g @aws/nx-plugin:connection --dry-runSe te pedirá que selecciones tu sitio web de React como el proyecto de origen y el proyecto que contiene tu Strands Agent como el proyecto de destino. Si tu proyecto de destino contiene múltiples componentes (como múltiples agentes u otros tipos de componentes), se te pedirá que especifiques un targetComponent para desambiguar.
Opciones
Sección titulada «Opciones»| Parámetro | Tipo | Predeterminado | Descripción |
|---|---|---|---|
| sourceProject Requerido | string | - | El proyecto de origen |
| targetProject Requerido | string | - | El proyecto de destino al que conectar |
| sourceComponent | string | - | El componente de origen desde el que conectar (nombre del componente, ruta relativa a la raíz del proyecto de origen, o id del generador). Use '.' para seleccionar explícitamente el proyecto como origen. |
| targetComponent | string | - | El componente de destino al que conectar (nombre del componente, ruta relativa a la raíz del proyecto de destino, o id del generador). Use '.' para seleccionar explícitamente el proyecto como destino. |
Salida del generador
Sección titulada «Salida del generador»El generador crea la siguiente estructura en tu aplicación React:
Directoriosrc
Directoriocomponents
- <AgentName>AgentClientProvider.tsx Configura el cliente tRPC WebSocket y los enlaces al enrutador tRPC de tu agente
- QueryClientProvider.tsx Proveedor del cliente TanStack React Query
Directoriohooks
- useSigV4.tsx Hook para firmar solicitudes con SigV4 (solo IAM)
- use<AgentName>Agent.tsx Hooks que devuelven el proxy de opciones tRPC y el cliente tRPC vanilla
Además, instala las dependencias requeridas:
@trpc/client@trpc/tanstack-react-query@tanstack/react-queryaws4fetch(si se usa autenticación IAM)
Cómo funciona
Sección titulada «Cómo funciona»Conexión WebSocket
Sección titulada «Conexión WebSocket»El cliente generado se conecta a tu Strands Agent a través de tRPC sobre WebSocket. El agente expone un enrutador tRPC (incluyendo la suscripción invoke para transmitir respuestas del agente) sobre un endpoint WebSocket.
- Desplegado: El ARN del runtime del agente se carga desde Runtime Configuration. El ARN se convierte a una URL WebSocket siguiendo el protocolo WebSocket de Bedrock AgentCore Runtime:
wss://bedrock-agentcore.<region>.amazonaws.com/runtimes/<encoded-arn>/ws - Desarrollo local: Al ejecutar con
serve-local, la anulación de configuración del runtime establece el valor a una URLws://local (por ejemplo,ws://localhost:8081/ws), y el cliente se conecta directamente
Autenticación
Sección titulada «Autenticación»El código generado maneja la autenticación dependiendo de la configuración de tu agente:
- IAM (predeterminado): Usa URLs prefirmadas AWS SigV4 para autenticar la conexión WebSocket. Las credenciales se obtienen del Cognito Identity Pool configurado con la autenticación de tu sitio web. En modo
serve-local, la firma se omite automáticamente cuandoruntime-config.jsonno está presente - Cognito: Incrusta el token de acceso JWT en el encabezado
Sec-WebSocket-Protocolcomo un token bearer codificado en base64url, siguiendo el protocolo de autenticación WebSocket de AgentCore
Infraestructura
Sección titulada «Infraestructura»Si tu agente usa autenticación IAM, el rol autenticado del Cognito Identity Pool debe tener el permiso bedrock-agentcore:InvokeAgentRuntimeWithWebSocketStream para invocar agentes a través de WebSocket:
const identity = new UserIdentity(this, 'Identity');const myAgent = new MyAgent(this, 'MyAgent');
identity.identityPool.authenticatedRole.addToPrincipalPolicy( new PolicyStatement({ actions: ['bedrock-agentcore:InvokeAgentRuntimeWithWebSocketStream'], resources: [myAgent.agentCoreRuntime.agentRuntimeArn], }),);Si tu agente usa autenticación Cognito, no necesitas definir ninguna infraestructura adicional para conectar tu sitio web a tu agente.
Usando el código generado
Sección titulada «Usando el código generado»Usando TanStack Query
Sección titulada «Usando TanStack Query»El caso de uso más común es transmitir la respuesta del agente usando la suscripción invoke con el hook use<AgentName>Agent, que devuelve un proxy de opciones tRPC para usar con TanStack Query:
import { useSubscription } from '@trpc/tanstack-react-query';import { useMyAgentAgent } from './hooks/useMyAgentAgent';
function ChatComponent() { const trpc = useMyAgentAgent();
const subscription = useSubscription( trpc.invoke.subscriptionOptions( { message: 'What can you help me with?' }, { enabled: true, onStarted: () => { console.log('Agent started responding'); }, onData: (token) => { console.log('Received token:', token); }, onError: (error) => { console.error('Agent error:', error); }, }, ), );
return ( <div> <p>Status: {subscription.status}</p> {subscription.data && <p>Latest token: {subscription.data}</p>} {subscription.error && <p>Error: {subscription.error.message}</p>} </div> );}Usando el cliente tRPC Vanilla
Sección titulada «Usando el cliente tRPC Vanilla»El hook use<AgentName>AgentClient proporciona acceso al cliente tRPC vanilla para tener más control sobre el ciclo de vida de la suscripción:
import { useState } from 'react';import { useMyAgentAgentClient } from './hooks/useMyAgentAgent';
function ChatComponent() { const client = useMyAgentAgentClient(); const [messages, setMessages] = useState<string[]>([]);
const sendMessage = (message: string) => { const subscription = client.invoke.subscribe( { message }, { onData: (token) => { setMessages((prev) => [...prev, token]); }, onComplete: () => { console.log('Agent finished'); }, onError: (error) => { console.error('Error:', error); }, }, );
// Clean up when done return () => subscription.unsubscribe(); };
return ( <div> <button onClick={() => sendMessage('Hello!')}>Send</button> <div> {messages.map((msg, i) => ( <span key={i}>{msg}</span> ))} </div> </div> );}Desarrollo local
Sección titulada «Desarrollo local»El generador de conexión configura automáticamente la integración con serve-local para tu sitio web de React:
- Ejecutar
nx serve-local <website>también iniciará el servidor local del agente - La configuración del runtime se anula para apuntar a la URL WebSocket local (por ejemplo,
ws://localhost:8081/ws) - Al igual que con las APIs conectadas, la autenticación se omite en modo
serve-localcuandoruntime-config.jsonno está presente
Seguridad de tipos
Sección titulada «Seguridad de tipos»La integración proporciona seguridad de tipos completa de extremo a extremo. Tu IDE proporcionará autocompletado completo y verificación de tipos para todas las llamadas de procedimientos del agente. Los tipos se infieren automáticamente de la definición del enrutador tRPC de tu agente, asegurando que cualquier cambio en la API de tu agente se refleje inmediatamente en tu código frontend.
Más información
Sección titulada «Más información»Para más información, consulta: