React a Agente AG-UI
Nx Plugin for AWS proporciona un generador para conectar un sitio web React a un Strands Agent que expone el protocolo AG-UI. Configura CopilotKit con un HttpAgent de @ag-ui/client en tu sitio web, con soporte para autenticación AWS IAM y Cognito.
Requisitos previos
Sección titulada «Requisitos previos»Antes de usar este generador, asegúrate de tener:
- Un sitio web React (generado usando el generador
ts#react-website) - Un Python Strands Agent con
protocol=AG-UI(generado usando el generadorpy#strands-agent) - Para agentes desplegados, 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 React como proyecto de origen y el proyecto que contiene tu AG-UI Strands Agent como 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 un componente AguiProvider único compartido y un hook por agente conectado:
Directoriosrc
Directoriocomponents
- AguiProvider.tsx Único
CopilotKitProviderpara cada agente AG-UI. Creado en la primera ejecución deconnectiony actualizado en ejecuciones posteriores para registrar cada nuevo agente.
- AguiProvider.tsx Único
Directoriohooks
- useAgui<AgentName>.tsx Registra un agente AG-UI. Un archivo por ejecución de
connection. - useSigV4.tsx Firma SigV4 (solo IAM)
- useAgui<AgentName>.tsx Registra un agente AG-UI. Un archivo por ejecución de
Ejecutar connection por segunda vez para un agente diferente agrega un nuevo hook useAgui<AgentName>.tsx y actualiza AguiProvider.tsx para registrar ambos hooks — cualquier edición personalizada que hayas hecho al proveedor se conserva. main.tsx mantiene su único wrapper <AguiProvider> — nunca terminas con proveedores anidados.
Las siguientes dependencias se agregan al package.json raíz:
@copilotkit/react-core— incluyeCopilotKitProvidery componentes de chat (CopilotChat,CopilotSidebar,CopilotPopup)@ag-ui/client—HttpAgentusado por los hooks generadosaws4fetch,oidc-client-ts,react-oidc-context,@aws-sdk/credential-providers— solo autenticación IAMreact-oidc-context— autenticación Cognito
Cómo funciona
Sección titulada «Cómo funciona»Conexión AG-UI
Sección titulada «Conexión AG-UI»Cada hook useAgui<AgentName> lee el valor de tiempo de ejecución de su agente desde Runtime Configuration e instancia un HttpAgent de @ag-ui/client:
- Desplegado: el valor de tiempo de ejecución es un ARN de Bedrock AgentCore Runtime, que se convierte al endpoint HTTPS de AgentCore:
https://bedrock-agentcore.<region>.amazonaws.com/runtimes/<encoded-arn>/invocations?qualifier=DEFAULT - Desarrollo local:
serve-localsobrescribe el valor a la URL local del agente (por ejemplo,http://localhost:8081)
El AguiProvider compartido llama a cada hook generado y los distribuye en selfManagedAgents en un único CopilotKitProvider, que los expone todos a los componentes de CopilotKit.
Integración con CopilotKit
Sección titulada «Integración con CopilotKit»CopilotKit es el cliente React de referencia de primera parte para el protocolo AG-UI e incluye componentes de chat listos para usar:
<CopilotChat />— interfaz de chat completa<CopilotSidebar />— chat en panel lateral fijo<CopilotPopup />— ventana emergente de chat flotante
Coloca cualquiera de estos en cualquier lugar dentro del wrapper <AguiProvider> (ya configurado en main.tsx para ti).
Autenticación
Sección titulada «Autenticación»El código generado maneja la autenticación según la configuración de tu agente:
- IAM (predeterminado): usa solicitudes HTTP firmadas con AWS SigV4. Las credenciales se obtienen del Cognito Identity Pool configurado con la autenticación de tu sitio web.
- Cognito: incrusta el token de acceso JWT en el encabezado
Authorizationcomo un token Bearer.
Infraestructura
Sección titulada «Infraestructura»Si tu agente utiliza autenticación IAM, el rol autenticado del Cognito Identity Pool debe tener permiso para invocar el agente.
const identity = new UserIdentity(this, 'Identity');const myAgent = new MyAgent(this, 'MyAgent');
// Grant the authenticated Cognito role permission to invoke the agentmyAgent.grantInvokeAccess(identity.identityPool.authenticatedRole);grantInvokeAccess configura todas las acciones de invocación de AgentCore (InvokeAgentRuntime, InvokeAgentRuntimeWithWebSocketStream) en el ARN de tiempo de ejecución del agente.
module "identity" { source = "../../common/terraform/src/core/user-identity"}
module "my_agent" { source = "../../common/terraform/src/app/agents/my-agent"}
# Grant the authenticated Cognito role permission to invoke the agentresource "aws_iam_policy" "invoke_my_agent" { name = "InvokeMyAgentPolicy" policy = jsonencode({ Version = "2012-10-17" Statement = [{ Effect = "Allow" Action = [ "bedrock-agentcore:InvokeAgentRuntime", "bedrock-agentcore:InvokeAgentRuntimeWithWebSocketStream", ] Resource = [ module.my_agent.agent_core_runtime_arn, "${module.my_agent.agent_core_runtime_arn}/*", ] }] })}
resource "aws_iam_role_policy_attachment" "invoke_my_agent" { role = module.identity.authenticated_role_name policy_arn = aws_iam_policy.invoke_my_agent.arn}Si tu agente utiliza autenticación Cognito, no necesitas definir ninguna infraestructura adicional para conectar tu sitio web a tu agente.
Uso del código generado
Sección titulada «Uso del código generado»Agregar una interfaz de chat
Sección titulada «Agregar una interfaz de chat»Instancia componentes de CopilotKit con agentId para seleccionar qué agente usar. El id es el nombre del agente — el mismo que elegiste cuando ejecutaste el generador py#strands-agent — y también puedes encontrarlo en el archivo de hook generado (por ejemplo, la clave devuelta desde packages/web/src/hooks/useAgui<AgentName>.tsx):
import { CopilotChat } from '@copilotkit/react-core/v2';
function ChatPage() { return ( <CopilotChat agentId="agent" labels={{ welcomeMessageText: 'How can I help you today?', chatInputPlaceholder: 'Ask me anything...', }} /> );}Conectar múltiples agentes AG-UI
Sección titulada «Conectar múltiples agentes AG-UI»Ejecuta el generador connection una vez por agente. Todos los agentes registrados a través del AguiProvider compartido son visibles desde cualquier lugar en la aplicación — instancia un componente de CopilotKit con un agentId diferente para enrutar cada chat al agente que desees:
<CopilotChat agentId="story" /> {/* talks to StoryAgent */}<CopilotChat agentId="research" /> {/* talks to ResearchAgent */}Personalizar la apariencia
Sección titulada «Personalizar la apariencia»<CopilotChat /> (y <CopilotSidebar />, <CopilotPopup />) usan un sistema de slots recursivo — puedes sobrescribir cualquier subcomponente con una cadena de clase Tailwind, un objeto de propiedades o un componente React personalizado. Consulta la guía de slots de CopilotKit para el árbol completo de slots.
Estilizado con Tailwind a través de slots
Sección titulada «Estilizado con Tailwind a través de slots»<CopilotChat agentId="agent" // style the input and its children input={{ textArea: 'text-blue-600', sendButton: 'bg-blue-600 hover:bg-blue-700', }} // style nested message slots messageView={{ assistantMessage: 'bg-blue-50 rounded-xl p-2', userMessage: 'bg-blue-100 rounded-xl', }}/>Reemplazar un slot con un componente personalizado
Sección titulada «Reemplazar un slot con un componente personalizado»Cualquier slot puede recibir un componente React en lugar de un className, por lo que puedes reemplazar completamente el predeterminado:
import { CopilotChat } from '@copilotkit/react-core/v2';
const MySendButton: React.FC<{ onClick: () => void }> = ({ onClick }) => ( <button onClick={onClick} className="my-send-btn"> ✨ Send </button>);
<CopilotChat agentId="agent" input={{ sendButton: MySendButton }}/>;Las sobrescrituras más profundas siguen la misma forma — por ejemplo, reemplaza solo el botón de copiar en los mensajes del asistente:
<CopilotChat agentId="agent" messageView={{ assistantMessage: { copyButton: ({ onClick }) => <button onClick={onClick}>Copy</button>, }, }}/>Desarrollo local
Sección titulada «Desarrollo local»El generador de conexión configura automáticamente la integración con serve-local:
- Ejecutar
nx serve-local <website>también iniciará el servidor local del agente - La configuración de tiempo de ejecución se sobrescribe para apuntar a la URL AG-UI local (por ejemplo,
http://localhost:8081) - Tanto el sitio web como el agente se recargan en caliente juntos
pnpm nx serve-local <WebsiteProject>yarn nx serve-local <WebsiteProject>npx nx serve-local <WebsiteProject>bunx nx serve-local <WebsiteProject>