TypeScript Agent
Genera un Strands Agent en TypeScript para construir agentes de IA con herramientas, y opcionalmente despliégalo en Amazon Bedrock AgentCore Runtime. Por defecto, el generador utiliza tRPC sobre WebSocket para aprovechar el soporte de streaming bidireccional de AgentCore para comunicación en tiempo real con seguridad de tipos. Alternativamente, puedes elegir el protocolo Agent-to-Agent (A2A) para interoperabilidad con otros agentes compatibles con A2A, o el protocolo AG-UI para integración directa con el frontend a través de CopilotKit.
¿Qué es Strands?
Sección titulada «¿Qué es Strands?»Strands es un framework ligero para construir agentes de IA. Las características clave incluyen:
- Ligero y personalizable: Bucle de agente simple que no se interpone en tu camino
- Listo para producción: Observabilidad completa, trazabilidad y opciones de despliegue para escalar
- Agnóstico de modelo y proveedor: Soporta muchos modelos diferentes de varios proveedores
- Herramientas impulsadas por la comunidad: Conjunto poderoso de herramientas contribuidas por la comunidad
- Soporte multi-agente: Técnicas avanzadas como equipos de agentes y agentes autónomos
- Modos de interacción flexibles: Soporte conversacional, streaming y no-streaming
Generar un Agent
Sección titulada «Generar un Agent»Puedes generar un TypeScript Agent de dos maneras:
pnpm nx g @aws/nx-plugin:ts#agentyarn nx g @aws/nx-plugin:ts#agentnpx nx g @aws/nx-plugin:ts#agentbunx nx g @aws/nx-plugin:ts#agentTambién puede realizar una ejecución en seco para ver qué archivos se cambiarían
pnpm nx g @aws/nx-plugin:ts#agent --dry-runyarn nx g @aws/nx-plugin:ts#agent --dry-runnpx nx g @aws/nx-plugin:ts#agent --dry-runbunx nx g @aws/nx-plugin:ts#agent --dry-run- 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 - ts#agent - Complete los parámetros requeridos
- Haga clic en
Generate
Opciones
Sección titulada «Opciones»| Parámetro | Tipo | Predeterminado | Descripción |
|---|---|---|---|
| project Requerido | string | - | El proyecto al que agregar el Agent |
| framework | strands | strands | El SDK del agente a utilizar. |
| name | string | - | El nombre de tu Agent (predeterminado: agent) |
| auth | iam | cognito | iam | El método utilizado para autenticar con tu Agent. Solo aplicable cuando infra está configurado (se ignora cuando infra es none). |
| protocol | http | a2a | ag-ui | http | El protocolo del servidor para tu Agent. HTTP expone un servidor tRPC/WebSocket. A2A expone un servidor de protocolo Agent-to-Agent. AG-UI expone un servidor de protocolo AG-UI para integración directa del frontend con CopilotKit. |
| iac | inherit | cdk | terraform | inherit | El proveedor de IaC preferido. Por defecto, se hereda de tu selección inicial. |
| infra | agentcore | none | agentcore | El tipo de infraestructura para alojar tu Agent. |
| session | s3 | in-memory | s3 | El almacenamiento utilizado para persistir la sesión de tu Agent. |
| preferInstallDependencies | boolean | true | Si se prefiere instalar las dependencias después de que se ejecute el generador. Establecer en false para diferir la instalación al ejecutar múltiples generadores en lote (la instalación aún se ejecuta si es necesaria para que los generadores subsecuentes puedan calcular el grafo de proyectos de Nx); instalar una vez al final. |
Salida del generador
Sección titulada «Salida del generador»El generador agregará los siguientes archivos a tu proyecto TypeScript existente. Los archivos generados dependen del protocol elegido:
Protocolo HTTP (predeterminado)
Sección titulada «Protocolo HTTP (predeterminado)»Directorioyour-project/
Directoriosrc/
Directorioagent/ (or custom name if specified)
- index.ts Entry point for Bedrock AgentCore Runtime (tRPC/WebSocket server)
- init.ts tRPC initialization
- router.ts tRPC router with agent procedures
- agent.ts Main agent definition with sample tools
- session.ts Resolves the SessionManager used to persist conversation state
- client.ts Vended client for invoking your agent
- agent-core-trpc-client.ts Client factory for connecting to agents on AgentCore Runtime
- Dockerfile Entry point for hosting your agent (excluded when
infrais set toNone)
- package.json Updated with Strands dependencies
- project.json Updated with agent serve targets
Protocolo A2A
Sección titulada «Protocolo A2A»El punto de entrada utiliza el Strands A2A Express Server en lugar de tRPC:
Directorioyour-project/
Directoriosrc/
Directorioagent/ (or custom name if specified)
- index.ts A2A Express server entry point
- agent.ts Main agent definition with sample tools
- session.ts Resolves the SessionManager used to persist conversation state
- Dockerfile Entry point for hosting your agent (excluded when
infrais set toNone)
- package.json Updated with Strands and Express dependencies
- project.json Updated with agent serve targets
Protocolo AG-UI
Sección titulada «Protocolo AG-UI»El punto de entrada utiliza @ag-ui/aws-strands para exponer el agente a través del protocolo AG-UI (SSE sobre POST), compatible con CopilotKit:
Directorioyour-project/
Directoriosrc/
Directorioagent/ (or custom name if specified)
- index.ts AG-UI server entry point (Express + SSE)
- agent.ts Main agent definition with sample tools
- session.ts Resolves the SessionManager used to persist conversation state
- Dockerfile Entry point for hosting your agent (excluded when
infrais set toNone)
- package.json Updated with Strands and AG-UI dependencies
- project.json Updated with agent serve targets
Infraestructura
Sección titulada «Infraestructura»Dado que este generador proporciona infraestructura como código basada en tu iac elegido, creará un proyecto en packages/common que incluye las construcciones CDK o módulos Terraform relevantes.
El proyecto común de infraestructura como código está estructurado de la siguiente manera:
Directoriopackages/common/constructs
Directoriosrc
Directorioapp/ Constructs for infrastructure specific to a project/generator
- …
Directoriocore/ Generic constructs which are reused by constructs in
app- …
- index.ts Entry point exporting constructs from
app
- project.json Project build targets and configuration
Directoriopackages/common/terraform
Directoriosrc
Directorioapp/ Terraform modules for infrastructure specific to a project/generator
- …
Directoriocore/ Generic modules which are reused by modules in
app- …
- project.json Project build targets and configuration
Para desplegar tu Agent, se generan los siguientes archivos:
Directoriopackages/common/constructs/src
Directorioapp
Directorioagents
Directorio<project-name>
- <project-name>.ts CDK construct for deploying your agent
Directoriopackages/common/terraform/src
Directorioapp
Directorioagents
Directorio<project-name>
- <project-name>.tf Module for deploying your agent
Directoriocore
Directorioagent-core
- runtime.tf Generic module for deploying to Bedrock AgentCore Runtime
Si seleccionaste none para infra, no se generan constructos CDK ni módulos Terraform — el Agent solo puede ejecutarse localmente. La opción auth se ignora en este modo ya que no hay un endpoint alojado para autenticar.
Arquitectura
Sección titulada «Arquitectura»Cuando se despliega en Bedrock AgentCore Runtime, el agente se construye en una imagen de contenedor, se envía a Amazon ECR y se ejecuta en AgentCore Runtime. Los clientes invocan el endpoint del plano de datos de AgentCore Runtime, que reenvía las solicitudes a tu agente. El agente llama a Amazon Bedrock para la inferencia del modelo y puede invocar herramientas, servidores MCP o APIs descendentes.
Con infra: none, no se genera infraestructura de AWS. El agente se ejecuta como un proceso local y llama a Amazon Bedrock para la inferencia del modelo.
Trabajar con tu Agent
Sección titulada «Trabajar con tu Agent»Protocolo
Sección titulada «Protocolo»El protocolo del servidor de tu agente determina cómo se comunica. Puedes elegir entre:
- HTTP (predeterminado): Utiliza tRPC sobre WebSocket para comunicación en tiempo real con seguridad de tipos. Mejor para integraciones de cliente personalizadas y control detallado sobre la API del agente.
- A2A: Utiliza el protocolo Agent-to-Agent (A2A) para comunicación estandarizada entre agentes. Mejor cuando tu agente necesita ser descubrible e invocable por otros agentes compatibles con A2A.
- AG-UI: Utiliza el protocolo AG-UI (SSE sobre POST) a través de
@ag-ui/aws-strandspara integración directa con el frontend con CopilotKit. Mejor cuando deseas una interfaz de chat rica con streaming, visualización de llamadas a herramientas y gestión de estado.
El protocolo se establece en la infraestructura CDK/Terraform, y el código de la aplicación se genera en consecuencia.
tRPC sobre WebSocket (protocolo HTTP)
Sección titulada «tRPC sobre WebSocket (protocolo HTTP)»El TypeScript Agent utiliza tRPC sobre WebSocket, aprovechando el soporte de streaming bidireccional de AgentCore para habilitar comunicación en tiempo real con seguridad de tipos entre clientes y tu agente.
Dado que tRPC soporta procedimientos Query, Mutation y Subscription sobre WebSocket, puedes definir cualquier número de procedimientos. Por defecto, se define un único procedimiento de suscripción llamado invoke en router.ts.
Agregar herramientas
Sección titulada «Agregar herramientas»Las herramientas son funciones que el agente de IA puede llamar para realizar acciones. Puedes agregar nuevas herramientas en el archivo agent.ts:
import { Agent, tool } from '@strands-agents/sdk';import { z } from 'zod';
const letterCounter = tool({ name: 'letter_counter', description: 'Count occurrences of a specific letter in a word', inputSchema: z.object({ word: z.string().describe('The input word to search in'), letter: z.string().length(1).describe('The specific letter to count'), }), callback: (input) => { const { word, letter } = input; const count = word.toLowerCase().split(letter.toLowerCase()).length - 1; return `The letter '${letter}' appears ${count} time(s) in '${word}'`; },});
// Add tools to your agentexport const getAgent = async () => { return new Agent({ systemPrompt: 'You are a helpful assistant with access to various tools.', tools: [letterCounter], });};El framework Strands maneja automáticamente:
- Validación de entrada usando esquemas Zod
- Generación de esquema JSON para llamadas a herramientas
- Manejo de errores y formato de respuesta
Configuración del modelo
Sección titulada «Configuración del modelo»Por defecto, los agentes Strands usan Claude 4 Sonnet, pero puedes cambiar fácilmente entre proveedores de modelos:
import { Agent } from '@strands-agents/sdk';import { BedrockModel } from '@strands-agents/sdk/models/bedrock';import { OpenAIModel } from '@strands-agents/sdk/models/openai';
// Use Bedrockconst bedrockModel = new BedrockModel({ modelId: 'anthropic.claude-sonnet-4-20250514-v1:0',});let agent = new Agent({ model: bedrockModel });let response = await agent.invoke('What can you help me with?');
// Alternatively, use OpenAI by just switching model providerconst openaiModel = new OpenAIModel({ apiKey: process.env.OPENAI_API_KEY, modelId: 'gpt-4o',});agent = new Agent({ model: openaiModel });response = await agent.invoke('What can you help me with?');Consulta la documentación de Strands sobre proveedores de modelos para más opciones de configuración.
Consumir servidores MCP
Sección titulada «Consumir servidores MCP»Puedes agregar herramientas desde servidores MCP a tu agente Strands.
Para consumir servidores MCP que hayas creado usando los generadores py#mcp-server o ts#mcp-server puedes hacer uso del generador connection.
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-run- 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
Consulta la guía del generador connection para detalles sobre cómo se configura la conexión.
Para otros servidores MCP, consulta la documentación de Strands.
Para una guía más detallada sobre cómo escribir agentes Strands, consulta la documentación de Strands.
Servidor A2A (protocolo A2A)
Sección titulada «Servidor A2A (protocolo A2A)»El index.ts generado monta el Strands A2A Express Server en una aplicación Express para que el agente generado exponga los endpoints del protocolo A2A junto con un health check /ping. Cuando se despliega en AgentCore, el punto de entrada resuelve el ARN público del runtime desde AppConfig y lo anuncia en la tarjeta del agente.
La mayoría de los usuarios no necesitarán modificar este archivo — edita agent.ts para cambiar herramientas o el prompt del sistema. Los agentes A2A escuchan en el puerto 9000 (vs 8080 para HTTP), para lo cual el Dockerfile y la infraestructura generados ya están configurados.
Servidor AG-UI (protocolo AG-UI)
Sección titulada «Servidor AG-UI (protocolo AG-UI)»El index.ts generado envuelve tu Agent de Strands en un StrandsAgent de @ag-ui/aws-strands y crea una aplicación Express a través de createStrandsApp(). La aplicación resultante expone un único endpoint POST que transmite eventos AG-UI sobre Server-Sent Events (SSE), así como /ping para el health check del runtime AgentCore.
Los agentes AG-UI están diseñados para ser consumidos directamente por un frontend. Usa el generador connection para conectar tu sitio web React al agente con un proveedor CopilotKit y un cliente AG-UI HttpAgent.
La mayoría de los usuarios no necesitarán modificar index.ts — edita agent.ts para cambiar herramientas o el prompt del sistema. Los agentes AG-UI escuchan en el puerto 8080 (igual que HTTP), para lo cual el Dockerfile y la infraestructura generados ya están configurados.
Ejecutar tu Agent
Sección titulada «Ejecutar tu Agent»Desarrollo local
Sección titulada «Desarrollo local»Para ejecutar tu Agent (y todo lo conectado a él) localmente, usa el target dev del proyecto:
pnpm nx dev your-projectyarn nx dev your-projectnpx nx dev your-projectbunx nx dev your-projectSi has agregado múltiples componentes a tu proyecto (agentes, servidores MCP, etc.), esto los inicia todos. Para ejecutar solo este agente, apunta a su target <your-agent-name>-dev:
pnpm nx agent-dev your-projectyarn nx agent-dev your-projectnpx nx agent-dev your-projectbunx nx agent-dev your-projectEsto usa tsx --watch para reiniciar automáticamente el servidor cuando los archivos cambian. El agente estará disponible en http://localhost:8081 (o el puerto asignado si tienes múltiples agentes).
Chat con tu Agent
Sección titulada «Chat con tu Agent»El generador configura un target Nx <your-agent-name>-chat que te lleva a un chat interactivo en la terminal con tu agente.
El target de chat se ejecuta de forma independiente. Por defecto se conecta a tu agente ejecutándose localmente, así que primero inicia el target <your-agent-name>-dev del agente (en una terminal separada):
pnpm nx agent-dev your-projectyarn nx agent-dev your-projectnpx nx agent-dev your-projectbunx nx agent-dev your-projectLuego, en otra terminal, inicia el chat:
pnpm nx run your-project:agent-chatyarn nx run your-project:agent-chatnpx nx run your-project:agent-chatbunx nx run your-project:agent-chatEl generador emite un scripts/<your-agent-name>/chat.ts para cada protocolo. Puedes personalizarlo a medida que evoluciona la forma de entrada del agente. Se conecta al agente local por defecto, o a tu agente desplegado cuando se establece RUNTIME_CONFIG_APP_ID (consulta Chat con tu agente desplegado a continuación).
Chat con tu agente desplegado
Sección titulada «Chat con tu agente desplegado»Para chatear con tu agente desplegado en Bedrock AgentCore, establece la variable de entorno RUNTIME_CONFIG_APP_ID al id de aplicación AppConfig del despliegue (salida como RuntimeConfigApplicationId por el stack desplegado). El script de chat resuelve el ARN del runtime de tu agente desde la configuración del runtime y se conecta al endpoint desplegado:
Para agentes autenticados con IAM, las solicitudes se firman con SigV4 usando tus credenciales AWS predeterminadas. Asegúrate de que el entorno tenga credenciales AWS con permiso para invocar el runtime:
RUNTIME_CONFIG_APP_ID=<app-id> pnpm nx run your-project:agent-chatRUNTIME_CONFIG_APP_ID=<app-id> yarn nx run your-project:agent-chatRUNTIME_CONFIG_APP_ID=<app-id> npx nx run your-project:agent-chatRUNTIME_CONFIG_APP_ID=<app-id> bunx nx run your-project:agent-chatPara agentes autenticados con Cognito, proporciona un token de acceso Cognito a través de la variable de entorno AGENT_ACCESS_TOKEN, que se envía como un bearer token:
RUNTIME_CONFIG_APP_ID=<app-id> AGENT_ACCESS_TOKEN=<access-token> pnpm nx run your-project:agent-chatRUNTIME_CONFIG_APP_ID=<app-id> AGENT_ACCESS_TOKEN=<access-token> yarn nx run your-project:agent-chatRUNTIME_CONFIG_APP_ID=<app-id> AGENT_ACCESS_TOKEN=<access-token> npx nx run your-project:agent-chatRUNTIME_CONFIG_APP_ID=<app-id> AGENT_ACCESS_TOKEN=<access-token> bunx nx run your-project:agent-chatPuedes obtener un token de acceso usando el comando cognito-idp admin-initiate-auth de AWS CLI, por ejemplo:
aws cognito-idp admin-initiate-auth \ --user-pool-id <user-pool-id> \ --client-id <user-pool-client-id> \ --auth-flow ADMIN_NO_SRP_AUTH \ --auth-parameters USERNAME=<username>,PASSWORD=<password> \ --query 'AuthenticationResult.AccessToken' \ --output textDesplegar tu Agent en Bedrock AgentCore Runtime
Sección titulada «Desplegar tu Agent en Bedrock AgentCore Runtime»Infraestructura como Código
Sección titulada «Infraestructura como Código»Si seleccionaste agentcore para infra, se genera la infraestructura CDK o Terraform relevante que puedes usar para desplegar tu Agent en Amazon Bedrock AgentCore Runtime.
Se genera un constructo CDK para tu agente, nombrado según el name que elegiste al ejecutar el generador, o <ProjectName>Agent por defecto.
Puedes usar este constructo CDK en una aplicación CDK:
import { MyProjectAgent } from '@my-scope/common-constructs';
export class ExampleStack extends Stack { constructor(scope: Construct, id: string) { new MyProjectAgent(this, 'MyProjectAgent'); }}Se genera un módulo Terraform para ti, nombrado según el name que elegiste al ejecutar el generador, o <ProjectName>-agent por defecto.
Pasa las salidas del módulo compartido runtime_config_appconfig al módulo del agente:
module "my_project_agent" { source = "../../common/terraform/src/app/agents/my-project-agent"
appconfig_application_id = module.runtime_config_appconfig.application_id appconfig_application_arn = module.runtime_config_appconfig.application_arn}Autenticación
Sección titulada «Autenticación»El generador proporciona una opción auth para configurar la autenticación de tu Agent. Puedes elegir entre autenticación IAM (predeterminada) o Cognito al generar tu agente.
Por defecto, tu Agent estará protegido usando autenticación IAM, simplemente despliégalo sin ningún argumento:
import { MyProjectAgent } from '@my-scope/common-constructs';
export class ExampleStack extends Stack { constructor(scope: Construct, id: string) { new MyProjectAgent(this, 'MyProjectAgent'); }}Puedes otorgar acceso para invocar tu agente en Bedrock AgentCore Runtime usando el método grantInvokeAccess, por ejemplo:
import { MyProjectAgent } from '@my-scope/common-constructs';
export class ExampleStack extends Stack { constructor(scope: Construct, id: string) { const agent = new MyProjectAgent(this, 'MyProjectAgent'); const lambdaFunction = new Function(this, ...);
agent.grantInvokeAccess(lambdaFunction); }}# Agentmodule "my_project_agent" { # Relative path to the generated module in the common/terraform project source = "../../common/terraform/src/app/agents/my-project-agent"
appconfig_application_id = module.runtime_config_appconfig.application_id appconfig_application_arn = module.runtime_config_appconfig.application_arn}Para otorgar acceso para invocar tu agente, necesitarás agregar una política como la siguiente, haciendo referencia a la salida module.my_project_agent.agent_core_runtime_arn:
{ Effect = "Allow" Action = [ "bedrock-agentcore:InvokeAgentRuntime" ] Resource = [ module.my_project_agent.agent_core_runtime_arn, "${module.my_project_agent.agent_core_runtime_arn}/*" ]}Autenticación Cognito
Sección titulada «Autenticación Cognito»Cuando seleccionas autenticación Cognito, el generador configura el agente para usar Cognito para la autenticación.
El constructo generado acepta una prop identity que configura la autenticación Cognito:
import { MyProjectAgent, UserIdentity } from '@my-scope/common-constructs';
export class ExampleStack extends Stack { constructor(scope: Construct, id: string) { const identity = new UserIdentity(this, 'Identity');
new MyProjectAgent(this, 'MyProjectAgent', { identity, }); }}El constructo UserIdentity se puede generar usando el generador ts#website#auth, o puedes crear tu propio UserPool y UserPoolClient de CDK.
El módulo generado acepta las variables user_pool_id y user_pool_client_ids para la autenticación Cognito:
module "user_identity" { source = "../../common/terraform/src/core/user-identity"}
module "my_project_agent" { source = "../../common/terraform/src/app/agents/my-project-agent"
appconfig_application_id = module.runtime_config_appconfig.application_id appconfig_application_arn = module.runtime_config_appconfig.application_arn
user_pool_id = module.user_identity.user_pool_id user_pool_client_ids = [module.user_identity.user_pool_client_id]}Target Bundle
Sección titulada «Target Bundle»El generador configura automáticamente un target bundle que utiliza Rolldown para crear un paquete de despliegue:
pnpm nx bundle <project-name>yarn nx bundle <project-name>npx nx bundle <project-name>bunx nx bundle <project-name>La configuración de Rolldown se encuentra en rolldown.config.ts, con una entrada por cada bundle a generar. Rolldown gestiona la creación de múltiples bundles en paralelo si están definidos.
El target bundle usa index.ts como punto de entrada para el servidor WebSocket a alojar en Bedrock AgentCore Runtime.
Target Docker
Sección titulada «Target Docker»El generador configura un target <your-agent-name>-docker que copia el Dockerfile desde el directorio fuente de tu agente al directorio de salida del bundle. Esto co-localiza el Dockerfile con los artefactos empaquetados, permitiendo que CDK construya la imagen Docker directamente usando AgentRuntimeArtifact.fromAsset.
También se genera un target docker que prepara el contexto docker para todos los agentes si tienes múltiples definidos.
Escaneo de imágenes
Sección titulada «Escaneo de imágenes»La imagen Docker construida para este proyecto puede ser escaneada en busca de vulnerabilidades usando Trivy, ejecutándose desde la imagen Trivy alojada en ECR.
Se agrega un target trivy a tu proyecto que escanea la imagen construida y termina con código distinto de cero si se encuentra alguna vulnerabilidad de severidad HIGH o CRITICAL. El Dockerfile generado usa una imagen base sin vulnerabilidades corregibles conocidas de estas severidades al momento de la generación, y actualiza las herramientas incluidas (como npm) para mantenerlo así.
El escaneo usa el mismo motor de contenedores que tu construcción de imagen (docker o finch), por lo que no se requieren herramientas adicionales. Dado que el escaneo solo se vuelve a ejecutar cuando la imagen cambia, una imagen sin cambios no se vuelve a escanear. El script raíz trivy proporcionado escanea cada imagen en el workspace:
pnpm trivyyarn trivynpm run trivybun trivySuprimiendo Hallazgos de Trivy
Sección titulada «Suprimiendo Hallazgos de Trivy»Puede haber instancias en las que desees suprimir una vulnerabilidad específica, por ejemplo cuando aún no hay una corrección disponible y has evaluado el riesgo como aceptable.
Agrega el ID de vulnerabilidad (uno por línea) al archivo .trivyignore en la raíz de tu proyecto (es decir, junto a tu project.json):
# node-tar arbitrary file write - not exploitable in our usageCVE-2024-XXXXXPara más detalles sobre el filtrado de hallazgos, consulta la documentación de filtrado de Trivy.
Observabilidad
Sección titulada «Observabilidad»Tu agente se configura automáticamente con observabilidad usando AWS Distro for Open Telemetry (ADOT), configurando auto-instrumentación en tu Dockerfile.
Puedes encontrar trazas en la consola AWS de CloudWatch, seleccionando “GenAI Observability” en el menú. Ten en cuenta que para que las trazas se pueblen necesitarás habilitar Transaction Search.
Para más detalles, consulta la documentación de AgentCore sobre observabilidad.
Gestión de sesiones
Sección titulada «Gestión de sesiones»La opción session controla cómo tu agente persiste el estado de la conversación (historial de mensajes, estado de herramientas, etc.) entre invocaciones, usando el SessionManager del SDK de Strands:
s3(predeterminado): La infraestructura CDK/Terraform aprovisiona un bucket S3 dedicado para datos de sesión, cifrado con una clave KMS dedicada y con todo el acceso público bloqueado; los registros de acceso al servidor se entregan a un grupo de registros de CloudWatch Logs a través de la misma clave. El rol IAM del agente recibe acceso de lectura/escritura/lista/eliminación al bucket y acceso de descifrado/generación-de-clave-de-datos a la clave, y el nombre del bucket se registra junto con el ARN del agente en la configuración del runtime de AppConfig.in-memory: No se aprovisiona ningún bucket. El estado de la conversación se mantiene en memoria solo durante la vida del proceso en ejecución y no sobrevive a reinicios o scale-in.
Esto se implementa en el session.ts generado, que exporta una función getSessionManager() que resuelve un SessionManager para la sesión actual.
El ID de sesión en sí proviene de la sesión del AgentCore Runtime (propagado a través del encabezado x-amzn-bedrock-agentcore-runtime-session-id para A2A/AG-UI, o el contexto de conexión WebSocket para HTTP/tRPC) y está vinculado a un contexto basado en AsyncLocalStorage para que getCurrentSessionId() pueda resolverlo en cualquier lugar de la solicitud — incluyendo en cualquier cliente MCP o A2A descendente conectado a través del generador connection, para que toda la cadena de llamadas comparta una sesión consistente.
Invocar tu Agent
Sección titulada «Invocar tu Agent»La comunicación del agente se transmite a través de tRPC sobre WebSocket. Como tal, se recomienda usar la fábrica de cliente con seguridad de tipos generada en client.ts.
Invocar el servidor local
Sección titulada «Invocar el servidor local»Puedes invocar un agente ejecutándose localmente usando el método de fábrica .local de la fábrica de cliente.
Puedes, por ejemplo, crear un archivo llamado scripts/test.ts en tu workspace que importe el cliente:
import { AgentClient } from '../packages/<project>/src/agent/client.js';
const client = AgentClient.local({ url: 'http://localhost:8081/ws' });
client.invoke.subscribe({ prompt: 'what is 1 plus 1?' }, { onData: console.log });Invocar el Agent desplegado
Sección titulada «Invocar el Agent desplegado»Para invocar tu Agent desplegado en Bedrock AgentCore Runtime, puedes enviar una solicitud POST al endpoint del plano de datos de Bedrock AgentCore Runtime con tu ARN codificado en URL.
Puedes obtener el ARN del runtime desde tu infraestructura de la siguiente manera:
import { CfnOutput } from 'aws-cdk-lib';import { MyProjectAgent } from '@my-scope/common-constructs';
export class ExampleStack extends Stack { constructor(scope: Construct, id: string) { const agent = new MyProjectAgent(this, 'MyProjectAgent');
new CfnOutput(this, 'AgentArn', { value: agent.agentCoreRuntime.agentRuntimeArn, }); }}# Agentmodule "my_project_agent" { # Relative path to the generated module in the common/terraform project source = "../../common/terraform/src/app/agents/my-project-agent"
appconfig_application_id = module.runtime_config_appconfig.application_id appconfig_application_arn = module.runtime_config_appconfig.application_arn}
output "agent_arn" { value = module.my_project_agent.agent_core_runtime_arn}El ARN tendrá el siguiente formato: arn:aws:bedrock-agentcore:<region>:<account>:runtime/<agent-runtime-id>.
Luego puedes codificar el ARN en URL reemplazando : con %3A y / con %2F.
La URL del plano de datos de Bedrock AgentCore Runtime para invocar el agent es la siguiente:
https://bedrock-agentcore.<region>.amazonaws.com/runtimes/<url-encoded-arn>/invocationsLa forma exacta de invocar esta URL depende del método de autenticación utilizado.
El archivo client.ts generado incluye una fábrica de cliente con seguridad de tipos que puede usarse para invocar tu agente desplegado.
Autenticación IAM
Sección titulada «Autenticación IAM»Puedes invocar tu agente desplegado pasando su ARN al método de fábrica withIamAuth:
import { AgentClient } from './agent/client.js';
const client = AgentClient.withIamAuth({ agentRuntimeArn: 'arn:aws:bedrock-agentcore:us-west-2:123456789012:runtime/my-agent',});
client.invoke.subscribe({ prompt: 'what is 1 plus 1?' }, { onData: (message) => console.log(message), onError: (error) => console.error(error), onComplete: () => console.log('Done'),});Autenticación JWT / Cognito
Sección titulada «Autenticación JWT / Cognito»Usa el método de fábrica withJwtAuth para autenticar con el token de acceso JWT / Cognito.
const client = AgentClient.withJwtAuth({ agentRuntimeArn: 'arn:aws:bedrock-agentcore:us-west-2:123456789012:runtime/my-agent', accessTokenProvider: async () => `<access-token>`,});
client.invoke.subscribe({ prompt: 'what is 1 plus 1?' }, { onData: console.log,});El accessTokenProvider debe devolver el token usado para autenticar la solicitud. Puedes, por ejemplo, obtener un token dentro de este método para asegurar que se reutilicen credenciales frescas cuando tRPC reinicie una conexión WebSocket. Lo siguiente demuestra el uso del SDK de AWS para obtener el token de Cognito:
import { CognitoIdentityProvider } from "@aws-sdk/client-cognito-identity-provider";
const cognito = new CognitoIdentityProvider();
const jwtClient = AgentClient.withJwtAuth({ agentRuntimeArn: 'arn:aws:bedrock-agentcore:us-west-2:123456789012:runtime/my-agent', accessTokenProvider: async () => { const response = await cognito.adminInitiateAuth({ UserPoolId: '<user-pool-id>', ClientId: '<user-pool-client-id>', AuthFlow: 'ADMIN_NO_SRP_AUTH', AuthParameters: { USERNAME: '<username>', PASSWORD: '<password>', }, }); return response.AuthenticationResult!.AccessToken!; },});Navegador / Sitio web React
Sección titulada «Navegador / Sitio web React»Para invocar tu Agent desde un sitio web React, puedes hacer uso del generador connection, que configura automáticamente un cliente tRPC WebSocket con la autenticación correcta (IAM o Cognito).
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-run- 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
Consulta la guía del generador connection para detalles sobre cómo se configura la conexión.
Invocar un Agent A2A como herramienta
Sección titulada «Invocar un Agent A2A como herramienta»Para delegar trabajo desde este agente a un agente A2A remoto (ya sea TypeScript o Python), usa el generador connection. Proporciona un cliente autenticado con SigV4 para el agente objetivo y transforma con AST el agent.ts de este agente para registrar el agente A2A remoto como una tool de Strands.
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-run- 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
Consulta la guía del generador connection para detalles sobre cómo se configura la conexión.
Invocar un Agent AG-UI
Sección titulada «Invocar un Agent AG-UI»Para invocar tu agente AG-UI desde un sitio web React, usa el generador connection, que conecta un cliente CopilotKit configurado para tu agente desplegado con la autenticación correcta (IAM o Cognito).
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-run- 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
Consulta la guía del generador connection para detalles sobre cómo se configura la conexión.
Asegurar tu Agent
Sección titulada «Asegurar tu Agent»Los agentes actúan sobre entradas no confiables y pueden ejecutar acciones reales a través de sus herramientas, por lo que vale la pena considerar la seguridad desde el principio. Las siguientes prácticas se aplican al agente generado.
Trata la entrada y salida del modelo como no confiables
Sección titulada «Trata la entrada y salida del modelo como no confiables»Los prompts pueden contener instrucciones adversarias (inyección de prompts), y la salida del modelo es no determinística — ninguna debe ser confiable en lógica sensible a la seguridad:
- Define esquemas de entrada estrictos para tus herramientas, como en la herramienta de ejemplo generada. Restringe los valores a lo que la herramienta realmente necesita (enums, límites de longitud, rangos numéricos) en lugar de aceptar cadenas de forma libre.
- Nunca pases la salida del modelo directamente a comandos de shell, consultas SQL, evaluación de código o HTML renderizado sin validación o codificación.
- Aplica verificaciones de autorización en tus herramientas y servicios descendentes — no confíes en el prompt del sistema para evitar que el modelo haga mal uso de una herramienta a la que tiene acceso.
Las guías de Prompt Engineering y Responsible AI de Strands cubren cómo escribir prompts de sistema robustos y conscientes de la seguridad.
Limita los permisos de las herramientas de forma estricta
Sección titulada «Limita los permisos de las herramientas de forma estricta»Otorga al rol IAM del agente solo los permisos que sus herramientas necesitan. Los constructos CDK y módulos Terraform proporcionados exponen métodos grant* y políticas con alcance limitado para este propósito — por ejemplo, otorgar a un agente acceso para invocar una API específica en lugar de adjuntar políticas administradas amplias. Cuando una herramienta actúa en nombre de un usuario, prefiere autorizar la acción usando la identidad del usuario que llama (pasada a través del contexto de la solicitud) sobre los permisos ambientales propios del agente.
Proporciona un interruptor de emergencia
Sección titulada «Proporciona un interruptor de emergencia»Debido a que el comportamiento del modelo puede cambiar de formas inesperadas, planifica para deshabilitar o intercambiar rápidamente el modelo sin un cambio de código:
- Lee el ID del modelo desde la configuración (por ejemplo, una variable de entorno
MODEL_ID) para que los operadores puedan cambiar o revertir a un modelo diferente actualizando la configuración. - Coloca el agente detrás de un feature flag para que su funcionalidad de IA pueda deshabilitarse por completo. Cuando esté deshabilitado, devuelve un mensaje genérico en lugar de un error, y asegúrate de que el resto de tu aplicación se degrade de manera elegante.
Documenta cómo activar estos controles en tu manual operativo.
Protege los datos sensibles
Sección titulada «Protege los datos sensibles»- Evita registrar prompts y completaciones, que pueden contener datos de usuario. El hook de registro de errores del modelo del agente generado registra solo metadatos de error, no contenido de conversación — mantén esta propiedad al agregar tu propio registro.
- Devuelve mensajes de error genéricos a los usuarios; registra errores detallados del lado del servidor.
- Aísla el estado de conversación entre usuarios y sesiones, y autoriza el acceso a cualquier dato de sesión persistido.
- Redacta información de identificación personal (PII) de los prompts y salidas — ya sea con un filtro de información sensible de Bedrock Guardrail (abajo) o, para agentes Strands, los enfoques en la guía de PII Redaction.
Amazon Bedrock Guardrails
Sección titulada «Amazon Bedrock Guardrails»Amazon Bedrock Guardrails proporciona filtros de contenido configurables, temas denegados y filtros de información sensible (PII) que se evalúan en la entrada y salida del modelo. Puedes adjuntar un guardrail al modelo utilizado por el agente generado:
import { Agent } from '@strands-agents/sdk';import { BedrockModel } from '@strands-agents/sdk/models/bedrock';
const model = new BedrockModel({ modelId: process.env.MODEL_ID, guardrailConfig: { guardrailIdentifier: process.env.GUARDRAIL_ID!, guardrailVersion: process.env.GUARDRAIL_VERSION ?? 'DRAFT', },});
const agent = new Agent({ model, /* ... */ });Consulta la guía de Guardrails de Strands para más detalles.
Conexiones
Sección titulada «Conexiones»Usa el generador connection para integrar este proyecto con otros en tu workspace. Las siguientes conexiones involucran este proyecto:
