Ir al contenido

TypeScript Agent

Filter this guidePick generator option values to hide sections that don't apply.

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.

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

Puedes generar un TypeScript Agent de dos maneras:

Terminal window
pnpm nx g @aws/nx-plugin:ts#agent
También puede realizar una ejecución en seco para ver qué archivos se cambiarían
Terminal window
pnpm nx g @aws/nx-plugin:ts#agent --dry-run
ParámetroTipoPredeterminadoDescripción
project Requeridostring-El proyecto al que agregar el Agent
framework strandsstrandsEl SDK del agente a utilizar.
name string-El nombre de tu Agent (predeterminado: agent)
auth iam | cognitoiamEl método utilizado para autenticar con tu Agent. Solo aplicable cuando infra está configurado (se ignora cuando infra es none).
protocol http | a2a | ag-uihttpEl 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 | terraforminheritEl proveedor de IaC preferido. Por defecto, se hereda de tu selección inicial.
infra agentcore | noneagentcoreEl tipo de infraestructura para alojar tu Agent.
session s3 | in-memorys3El almacenamiento utilizado para persistir la sesión de tu Agent.
preferInstallDependencies booleantrueSi 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.

El generador agregará los siguientes archivos a tu proyecto TypeScript existente. Los archivos generados dependen del protocol elegido:

protocol = http
  • 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 infra is set to None)
    • package.json Updated with Strands dependencies
    • project.json Updated with agent serve targets
protocol = 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 infra is set to None)
    • package.json Updated with Strands and Express dependencies
    • project.json Updated with agent serve targets
protocol = 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 infra is set to None)
    • package.json Updated with Strands and AG-UI dependencies
    • project.json Updated with agent serve targets
infra = agentcore

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

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
infra = none

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.

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.

ClientECRStrands Agent(AgentCore Runtime)Bedrock(Model Inference)CloudWatch(Logs, Metrics) Containerimage InvokeModel

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-strands para 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.

protocol = 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.

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 agent
export 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

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 Bedrock
const 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 provider
const 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.

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.

Terminal window
pnpm nx g @aws/nx-plugin:connection
También puede realizar una ejecución en seco para ver qué archivos se cambiarían
Terminal window
pnpm nx g @aws/nx-plugin:connection --dry-run

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.

protocol = 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.

protocol = 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.

Para ejecutar tu Agent (y todo lo conectado a él) localmente, usa el target dev del proyecto:

Terminal window
pnpm nx dev your-project

Si 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:

Terminal window
pnpm nx agent-dev your-project

Esto 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).

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):

Terminal window
pnpm nx agent-dev your-project

Luego, en otra terminal, inicia el chat:

Terminal window
pnpm nx run your-project:agent-chat

El 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).

infra = agentcore

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:

Terminal window
RUNTIME_CONFIG_APP_ID=<app-id> pnpm nx run your-project:agent-chat
infra = agentcore

Desplegar tu Agent en Bedrock AgentCore Runtime

Sección titulada «Desplegar tu Agent en Bedrock AgentCore Runtime»

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');
}
}

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);
}
}

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 generador configura automáticamente un target bundle que utiliza Rolldown para crear un paquete de despliegue:

Terminal window
pnpm 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.

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.

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:

Terminal window
pnpm 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):

.trivyignore
# node-tar arbitrary file write - not exploitable in our usage
CVE-2024-XXXXX

Para más detalles sobre el filtrado de hallazgos, consulta la documentación de filtrado de Trivy.

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.

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.

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.

protocol = http

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:

scripts/test.ts
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 });

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,
});
}
}

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>/invocations

La 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.

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'),
});

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).

Terminal window
pnpm nx g @aws/nx-plugin:connection
También puede realizar una ejecución en seco para ver qué archivos se cambiarían
Terminal window
pnpm nx g @aws/nx-plugin:connection --dry-run

Consulta la guía del generador connection para detalles sobre cómo se configura la conexión.

protocol = a2a

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.

Terminal window
pnpm nx g @aws/nx-plugin:connection
También puede realizar una ejecución en seco para ver qué archivos se cambiarían
Terminal window
pnpm nx g @aws/nx-plugin:connection --dry-run

Consulta la guía del generador connection para detalles sobre cómo se configura la conexión.

protocol = 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).

Terminal window
pnpm nx g @aws/nx-plugin:connection
También puede realizar una ejecución en seco para ver qué archivos se cambiarían
Terminal window
pnpm nx g @aws/nx-plugin:connection --dry-run

Consulta la guía del generador connection para detalles sobre cómo se configura la conexión.

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.

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.

  • 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 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:

agent.ts
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.

Usa el generador connection para integrar este proyecto con otros en tu workspace. Las siguientes conexiones involucran este proyecto:

Strands AgentsTypeScript
React to TypeScript AgentCall a TypeScript Agent from a React website
CopilotKit
React to AG-UI AgentCall an Agent exposing the AG-UI protocol from a React website via CopilotKit
Strands AgentsTypeScriptModel Context Protocol
TypeScript Agent to MCPConnect a TypeScript Agent to an MCP server
Strands AgentsTypeScriptAgent2Agent
TypeScript Agent to A2A AgentConnect a TypeScript Agent to a remote A2A agent
Strands AgentsPythonAgent2Agent
Python Agent to A2A AgentConnect a Python Agent to a remote A2A agent
Strands AgentsTypeScriptAmazon Aurora
TypeScript Agent to Relational DatabaseConnect a TypeScript Agent to an Aurora relational database
Strands AgentsTypeScriptAmazon DynamoDB
TypeScript Agent to TypeScript DynamoDBConnect a TypeScript Agent to a DynamoDB table
Strands AgentsTypeScriptAmazon Bedrock AgentCore Gateway
TypeScript Agent to AgentCore GatewayConnect a TypeScript Agent to an AgentCore Gateway
Amazon Bedrock AgentCore GatewayStrands Agents
AgentCore Gateway to AgentFront an agent with an AgentCore Gateway as a runtime target