Agent TypeScript
Générez un Strands Agent TypeScript pour créer des agents IA avec des outils, et déployez-le optionnellement sur Amazon Bedrock AgentCore Runtime. Par défaut, le générateur utilise tRPC sur WebSocket pour tirer parti du support de streaming bidirectionnel d’AgentCore pour une communication en temps réel et type-safe. Alternativement, vous pouvez choisir le protocole Agent-to-Agent (A2A) pour l’interopérabilité avec d’autres agents compatibles A2A, ou le protocole AG-UI pour une intégration frontend directe via CopilotKit.
Qu’est-ce que Strands ?
Section intitulée « Qu’est-ce que Strands ? »Strands est un framework léger pour créer des agents IA. Les fonctionnalités clés incluent :
- Léger et personnalisable : Boucle d’agent simple qui ne vous gêne pas
- Prêt pour la production : Observabilité complète, traçage et options de déploiement à grande échelle
- Agnostique du modèle et du fournisseur : Prend en charge de nombreux modèles de différents fournisseurs
- Outils communautaires : Ensemble puissant d’outils contribués par la communauté
- Support multi-agents : Techniques avancées comme les équipes d’agents et les agents autonomes
- Modes d’interaction flexibles : Support conversationnel, streaming et non-streaming
Utilisation
Section intitulée « Utilisation »Générer un Agent
Section intitulée « Générer un Agent »Vous pouvez générer un Agent TypeScript de deux manières :
Exécuter ce générateur@aws/nx-plugin:ts#agent
pnpm nx g @aws/nx-plugin:ts#agent yarn nx g @aws/nx-plugin:ts#agent npx nx g @aws/nx-plugin:ts#agent bunx nx g @aws/nx-plugin:ts#agent- Installez le Nx Console VSCode Plugin si ce n'est pas déjà fait
- Ouvrez la console Nx dans VSCode
- Cliquez sur
Generate (UI)dans la section "Common Nx Commands" - Recherchez
@aws/nx-plugin - ts#agent - Remplissez les paramètres requis
- Cliquez sur
Generate
Composez votre commande9
Requis
infra = agentcore | agentcore-ecr
projectRequisstringLe projet auquel ajouter l'Agent
frameworkenumPar défaut:strandsLe SDK d'agent à utiliser.
strandsauthenuminfra = agentcore | agentcore-ecrPar défaut:iamLa méthode utilisée pour s'authentifier auprès de votre Agent. Applicable uniquement lorsque infra est défini (ignoré lorsque infra est none).
iamcognitoprotocolenumPar défaut:httpLe protocole serveur pour votre Agent. HTTP expose un serveur tRPC/WebSocket. A2A expose un serveur de protocole Agent-to-Agent. AG-UI expose un serveur de protocole AG-UI pour l'intégration frontend directe avec CopilotKit.
httpa2aag-uiiacenumPar défaut:inheritLe fournisseur IaC préféré. Par défaut, cela est hérité de votre sélection initiale.
inheritcdkterraforminfraenumPar défaut:agentcoreLe type d'infrastructure pour héberger votre Agent. agentcore déploie votre code sous forme de zip vers un runtime géré par AgentCore pour le cycle de build et déploiement le plus rapide. agentcore-ecr construit et héberge une image conteneur à la place, pour un contrôle au niveau du système d'exploitation ou un pipeline de conteneurs établi.
agentcoreagentcore-ecrnonesessionenumPar défaut:s3Le stockage utilisé pour persister la session de votre Agent.
s3in-memorynamestringLe nom de votre Agent (par défaut : agent)
preferInstallDependenciesbooleanPar défaut:trueIndique s'il faut privilégier l'installation des dépendances après l'exécution du générateur. Définir sur false pour différer l'installation lors de l'exécution de plusieurs générateurs en lot (une installation s'exécute quand même si nécessaire pour que les générateurs suivants puissent calculer le graphe de projet Nx) ; installer une seule fois à la fin.
Sortie du générateur
Section intitulée « Sortie du générateur »Le générateur ajoutera les fichiers suivants à votre projet TypeScript existant. Les fichiers générés dépendent du protocol choisi :
Protocole HTTP (par défaut)
Section intitulée « Protocole HTTP (par défaut) »Répertoireyour-project/
Répertoiresrc/
Répertoireagent/ (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
Répertoireschema/
- z-async-iterable.ts Zod schema for the router’s streamed responses
- client.ts Vended client for invoking your agent
- agent-core-trpc-client.ts Client factory for connecting to agents on AgentCore Runtime
- Dockerfile Container image definition (only when
infraisagentcore-ecr)
- package.json Updated with Strands dependencies
- project.json Updated with agent serve targets
Protocole A2A
Section intitulée « Protocole A2A »Le point d’entrée utilise le Strands A2A Express Server au lieu de tRPC :
Répertoireyour-project/
Répertoiresrc/
Répertoireagent/ (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
Répertoiremiddleware/
- session-id-middleware.ts Binds the inbound AgentCore session ID for the request
- Dockerfile Container image definition (only when
infraisagentcore-ecr)
- package.json Updated with Strands and Express dependencies
- project.json Updated with agent serve targets
Protocole AG-UI
Section intitulée « Protocole AG-UI »Le point d’entrée utilise @ag-ui/aws-strands pour exposer l’agent via le protocole AG-UI (SSE sur POST), compatible avec CopilotKit :
Répertoireyour-project/
Répertoiresrc/
Répertoireagent/ (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
Répertoiremiddleware/
- session-id-middleware.ts Binds the inbound AgentCore session ID for the request
- Dockerfile Container image definition (only when
infraisagentcore-ecr)
- package.json Updated with Strands and AG-UI dependencies
- project.json Updated with agent serve targets
Infrastructure
Section intitulée « Infrastructure »L’option infra sélectionne la manière dont votre code est empaqueté et hébergé sur Amazon Bedrock AgentCore Runtime :
agentcore(par défaut) utilise le déploiement direct de code : votre code compilé est empaqueté sous forme de.zip, téléchargé vers S3, et exécuté sur un runtime de langage géré par AgentCore. Il n’y a pas d’image de conteneur à construire, pas de dépôt ECR à gérer, et pas d’image à pousser, ce qui permet un cycle de construction et de déploiement nettement plus rapide.agentcore-ecrconstruit une image de conteneurarm64à partir d’unDockerfilefourni et l’héberge depuis le registre partagécore/asset-ecr, aux côtés de tous les autres conteneurs de l’espace de travail. Choisissez cette option lorsque vous avez besoin de contrôler l’image du système d’exploitation — par exemple pour installer des bibliothèques système natives — ou lorsque vous disposez d’un pipeline de conteneurs établi. Cette option fournit également une cible d’analyse d’image Trivy (voir Analyse d’image ci-dessous).nonene génère aucune infrastructure, de sorte que le projet ne peut être exécuté que localement.
Étant donné que ce générateur fournit de l’infrastructure en tant que code basée sur votre iac choisi, il créera un projet dans packages/common qui inclut les constructs CDK ou modules Terraform pertinents.
Le projet d’infrastructure en tant que code commun est structuré comme suit :
Répertoirepackages/common/constructs
Répertoiresrc
Répertoireapp/ Constructs pour l’infrastructure spécifique à un projet/générateur
- …
Répertoirecore/ Constructs génériques qui sont réutilisés par les constructs dans
app- …
- index.ts Entry point exporting constructs from
app
- project.json Project build targets and configuration
Répertoirepackages/common/terraform
Répertoiresrc
Répertoireapp/ Terraform modules for infrastructure specific to a project/generator
- …
Répertoirecore/ Generic modules which are reused by modules in
app- …
- project.json Project build targets and configuration
Pour déployer votre Agent, les fichiers suivants sont générés :
Répertoirepackages/common/constructs/src
Répertoireapp
Répertoireagents
Répertoire<agent-name>
- <agent-name>.ts CDK construct for deploying your agent
Répertoirepackages/common/terraform/src
Répertoireapp
Répertoireagents
Répertoire<agent-name>
- <agent-name>.tf Module for deploying your agent
Répertoirecore
Répertoireagent-core
- runtime.tf Generic module for deploying to Bedrock AgentCore Runtime
Répertoireagent-core-code (when
infraisagentcore)- runtime.tf Packages your agent’s code and delegates to
agent-core
- runtime.tf Packages your agent’s code and delegates to
Répertoireagent-core-container (when
infraisagentcore-ecr)- runtime.tf Builds and publishes your agent’s image and delegates to
agent-core
- runtime.tf Builds and publishes your agent’s image and delegates to
Si vous avez sélectionné none pour infra, aucune construction CDK ou module Terraform n’est généré — l’Agent ne peut être exécuté que localement. L’option auth est ignorée dans ce mode car il n’y a pas de point de terminaison hébergé à authentifier.
Architecture
Section intitulée « Architecture »Lorsqu’il est déployé sur Bedrock AgentCore Runtime, le code de votre agent est empaqueté sous forme de zip et exécuté dans le runtime géré AgentCore. Les clients invoquent le point de terminaison du plan de données AgentCore Runtime, qui transmet les requêtes à votre agent. L’agent appelle Amazon Bedrock pour l’inférence du modèle et peut invoquer des outils, des serveurs MCP ou des API en aval.
Avec infra: agentcore-ecr, l’agent est construit dans une image de conteneur, poussé vers Amazon ECR et exécuté dans AgentCore Runtime. Cela vous donne un contrôle au niveau du système d’exploitation sur l’environnement d’exécution, au prix d’un cycle de construction et de déploiement plus long que l’empaquetage zip ci-dessus.
Avec infra: none, aucune infrastructure AWS n’est générée. L’agent s’exécute en tant que processus local et appelle Amazon Bedrock pour l’inférence du modèle.
Travailler avec votre Agent
Section intitulée « Travailler avec votre Agent »Protocole
Section intitulée « Protocole »Le protocole serveur de votre agent détermine comment il communique. Vous pouvez choisir entre :
- HTTP (par défaut) : Utilise tRPC sur WebSocket pour une communication en temps réel et type-safe. Idéal pour les intégrations client personnalisées et un contrôle précis de l’API de l’agent.
- A2A : Utilise le protocole Agent-to-Agent (A2A) pour une communication inter-agents standardisée. Idéal lorsque votre agent doit être découvrable et invocable par d’autres agents compatibles A2A.
- AG-UI : Utilise le protocole AG-UI (SSE sur POST) via
@ag-ui/aws-strandspour une intégration frontend directe avec CopilotKit. Idéal lorsque vous souhaitez une interface de chat riche avec streaming, visualisation des appels d’outils et gestion d’état.
Le protocole est défini dans l’infrastructure CDK/Terraform, et le code de l’application est généré en conséquence.
tRPC sur WebSocket (protocole HTTP)
Section intitulée « tRPC sur WebSocket (protocole HTTP) »L’Agent TypeScript utilise tRPC sur WebSocket, tirant parti du support de streaming bidirectionnel d’AgentCore pour permettre une communication en temps réel et type-safe entre les clients et votre agent.
Puisque tRPC prend en charge les procédures Query, Mutation et Subscription sur WebSocket, vous pouvez définir n’importe quel nombre de procédures. Par défaut, une seule procédure de souscription nommée invoke est définie pour vous dans router.ts.
Ajouter des outils
Section intitulée « Ajouter des outils »Les outils sont des fonctions que l’agent IA peut appeler pour effectuer des actions. Vous pouvez ajouter de nouveaux outils dans le fichier 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], });};Le framework Strands gère automatiquement :
- La validation des entrées à l’aide de schémas Zod
- La génération de schémas JSON pour l’appel d’outils
- La gestion des erreurs et le formatage des réponses
Configuration du modèle
Section intitulée « Configuration du modèle »Par défaut, les agents Strands utilisent Claude Sonnet 4.6 sur Amazon Bedrock, mais vous pouvez facilement basculer entre les fournisseurs de modèles :
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?');Consultez la documentation Strands sur les fournisseurs de modèles pour plus d’options de configuration.
Consommer des serveurs MCP
Section intitulée « Consommer des serveurs MCP »Vous pouvez ajouter des outils à partir de serveurs MCP à votre agent Strands.
Pour consommer des serveurs MCP que vous avez créés à l’aide des générateurs py#mcp-server ou ts#mcp-server, vous pouvez utiliser le générateur connection.
Exécuter ce générateur@aws/nx-plugin:connection
pnpm nx g @aws/nx-plugin:connection yarn nx g @aws/nx-plugin:connection npx nx g @aws/nx-plugin:connection bunx nx g @aws/nx-plugin:connection- Installez le Nx Console VSCode Plugin si ce n'est pas déjà fait
- Ouvrez la console Nx dans VSCode
- Cliquez sur
Generate (UI)dans la section "Common Nx Commands" - Recherchez
@aws/nx-plugin - connection - Remplissez les paramètres requis
- Cliquez sur
Generate
Composez votre commande5
Requis
Requis
Consultez le guide du générateur connection pour plus de détails sur la configuration de la connexion.
Pour d’autres serveurs MCP, veuillez vous référer à la documentation Strands.
Pour un guide plus approfondi sur l’écriture d’agents Strands, consultez la documentation Strands.
Serveur A2A (protocole A2A)
Section intitulée « Serveur A2A (protocole A2A) »Le fichier index.ts généré monte le Strands A2A Express Server sur une application Express afin que l’agent généré expose les points de terminaison du protocole A2A ainsi qu’un contrôle de santé /ping. L’URL annoncée dans la carte de l’agent provient de la variable d’environnement AGENTCORE_RUNTIME_URL, avec un repli sur http://localhost:<port>/ pour le développement local.
La plupart des utilisateurs n’auront pas besoin de modifier ce fichier — modifiez agent.ts pour changer les outils ou le prompt système. Les agents A2A écoutent sur le port 9000 (contre 8080 pour HTTP), ce pour quoi l’infrastructure générée est déjà configurée.
Serveur AG-UI (protocole AG-UI)
Section intitulée « Serveur AG-UI (protocole AG-UI) »Le fichier index.ts généré enveloppe votre Agent Strands dans un @ag-ui/aws-strands StrandsAgent et crée une application Express. L’application résultante expose un seul point de terminaison POST qui diffuse des événements AG-UI via Server-Sent Events (SSE), ainsi que /ping pour le contrôle de santé du runtime AgentCore.
Les agents AG-UI sont conçus pour être consommés directement par un frontend. Utilisez le générateur connection pour connecter votre site web React à l’agent avec un fournisseur CopilotKit et un client AG-UI HttpAgent.
La plupart des utilisateurs n’auront pas besoin de modifier index.ts — modifiez agent.ts pour changer les outils ou le prompt système. Les agents AG-UI écoutent sur le port 8080 (comme HTTP), ce pour quoi l’infrastructure générée est déjà configurée.
Exécuter votre Agent
Section intitulée « Exécuter votre Agent »Développement local
Section intitulée « Développement local »Pour exécuter votre Agent (et tout ce qui y est connecté) localement, utilisez la cible dev du projet :
pnpm nx dev your-projectyarn nx dev your-projectnpx nx dev your-projectbunx nx dev your-projectSi vous avez ajouté plusieurs composants à votre projet (agents, serveurs MCP, etc.), cela les démarre tous. Pour exécuter uniquement cet agent, ciblez sa cible <your-agent-name>-dev :
pnpm nx agent-dev your-projectyarn nx agent-dev your-projectnpx nx agent-dev your-projectbunx nx agent-dev your-projectCela utilise tsx --watch pour redémarrer automatiquement le serveur lorsque les fichiers changent. L’agent sera disponible à http://localhost:8081 (ou le port attribué si vous avez plusieurs agents — lisez-le depuis metadata.ports dans le project.json du projet).
Une cible <your-agent-name>-serve est également générée, qui exécute l’agent contre votre infrastructure déployée et nécessite donc que RUNTIME_CONFIG_APP_ID soit défini. Consultez le guide Développement local pour la différence entre dev et serve.
Discuter avec votre Agent
Section intitulée « Discuter avec votre Agent »Le générateur configure une cible Nx <your-agent-name>-chat qui vous place dans un chat terminal interactif avec votre agent.
La cible chat s’exécute de manière autonome. Par défaut, elle se connecte à votre agent en cours d’exécution localement, donc démarrez d’abord la cible <your-agent-name>-dev de l’agent (dans un terminal séparé) :
pnpm nx agent-dev your-projectyarn nx agent-dev your-projectnpx nx agent-dev your-projectbunx nx agent-dev your-projectEnsuite, dans un autre terminal, démarrez le 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-chatLe générateur émet un scripts/<your-agent-name>/chat.ts pour chaque protocole. Vous pouvez le personnaliser au fur et à mesure que vous faites évoluer la forme d’entrée de l’agent. Il se connecte à l’agent local par défaut, ou à votre agent déployé lorsque RUNTIME_CONFIG_APP_ID est défini (voir Discuter avec votre agent déployé ci-dessous).
Discuter avec votre agent déployé
Section intitulée « Discuter avec votre agent déployé »Pour discuter avec votre agent déployé sur Bedrock AgentCore, définissez la variable d’environnement RUNTIME_CONFIG_APP_ID sur l’identifiant d’application AppConfig du déploiement (sortie en tant que RuntimeConfigApplicationId par la pile déployée). Le script de chat résout l’ARN du runtime de votre agent à partir de la configuration du runtime et se connecte au point de terminaison déployé :
Pour les agents authentifiés par IAM, les requêtes sont signées avec SigV4 en utilisant vos informations d’identification AWS par défaut. Assurez-vous que l’environnement dispose d’informations d’identification AWS avec l’autorisation d’invoquer le 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-chatPour les agents authentifiés par Cognito, fournissez un jeton d’accès Cognito via la variable d’environnement AGENT_ACCESS_TOKEN, qui est envoyé en tant que jeton bearer :
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-chatVous pouvez obtenir un jeton d’accès en utilisant la commande cognito-idp admin-initiate-auth de l’AWS CLI, par exemple :
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 textDéployer votre Agent sur Bedrock AgentCore Runtime
Section intitulée « Déployer votre Agent sur Bedrock AgentCore Runtime »Infrastructure as Code
Section intitulée « Infrastructure as Code »Si vous avez sélectionné agentcore ou agentcore-ecr pour infra, l’infrastructure CDK ou Terraform pertinente est générée et vous pouvez l’utiliser pour déployer votre Agent sur Amazon Bedrock AgentCore Runtime.
Un construct CDK est généré pour votre agent, nommé en fonction du name que vous avez choisi lors de l’exécution du générateur, ou <ProjectName>Agent par défaut.
Vous pouvez utiliser ce construct CDK dans une application CDK :
import { MyProjectAgent } from '@my-scope/common-constructs';
export class ExampleStack extends Stack { constructor(scope: Construct, id: string) { new MyProjectAgent(this, 'MyProjectAgent'); }}Un module Terraform est généré pour vous, nommé en fonction du name que vous avez choisi lors de l’exécution du générateur, ou <ProjectName>-agent par défaut.
Passez les sorties du module partagé runtime_config_appconfig dans le module agent, ainsi que le magasin d’artefacts partagé utilisé par son empaquetage. Sous l’empaquetage agentcore par défaut, le code de l’agent est mis en scène dans le bucket d’actifs partagé, donc instanciez le module core/asset-bucket une fois par déploiement, comme le font déjà les modules Lambda et API :
module "asset_bucket" { source = "../../common/terraform/src/core/asset-bucket"}
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
asset_bucket_name = module.asset_bucket.bucket_name asset_bucket_arn = module.asset_bucket.bucket_arn}Sous agentcore-ecr, l’image de l’agent est publiée dans le registre d’actifs partagé à la place, donc passez les sorties de core/asset-ecr plutôt que celles du bucket. Un seul registre sert tous les conteneurs de l’espace de travail, donc aucun agent n’a besoin de son propre dépôt :
module "asset_ecr" { source = "../../common/terraform/src/core/asset-ecr"}
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
asset_ecr_repository_url = module.asset_ecr.repository_url asset_ecr_repository_arn = module.asset_ecr.repository_arn}Authentification
Section intitulée « Authentification »Le générateur fournit une option auth pour configurer l’authentification de votre Agent. Vous pouvez choisir entre l’authentification IAM (par défaut) ou Cognito lors de la génération de votre agent.
Par défaut, votre Agent sera sécurisé en utilisant l’authentification IAM, déployez-le simplement sans aucun argument :
import { MyProjectAgent } from '@my-scope/common-constructs';
export class ExampleStack extends Stack { constructor(scope: Construct, id: string) { new MyProjectAgent(this, 'MyProjectAgent'); }}Vous pouvez accorder l’accès pour invoquer votre agent sur Bedrock AgentCore Runtime en utilisant la méthode grantInvokeAccess, par exemple :
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); }}module "asset_bucket" { source = "../../common/terraform/src/core/asset-bucket"}
# 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
# Under `agentcore-ecr`, pass `core/asset-ecr`'s outputs instead. asset_bucket_name = module.asset_bucket.bucket_name asset_bucket_arn = module.asset_bucket.bucket_arn}Pour accorder l’accès pour invoquer votre agent, vous devrez ajouter une politique telle que la suivante, en référençant la sortie 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}/*" ]}Authentification Cognito
Section intitulée « Authentification Cognito »Lorsque vous sélectionnez l’authentification Cognito, le générateur configure l’agent pour utiliser Cognito pour l’authentification.
Le construct généré accepte une prop identity qui configure l’authentification 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, }); }}Le construct UserIdentity peut être généré en utilisant le générateur ts#website#auth, ou vous pouvez créer votre propre UserPool et UserPoolClient CDK.
Le module généré accepte les variables user_pool_id et user_pool_client_ids pour l’authentification 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]}Cible de bundle
Section intitulée « Cible de bundle »Le générateur configure automatiquement une cible bundle qui utilise Rolldown pour créer un package de déploiement :
pnpm nx bundle <project-name>yarn nx bundle <project-name>npx nx bundle <project-name>bunx nx bundle <project-name>La configuration de Rolldown se trouve dans rolldown.config.ts, avec une entrée par bundle à générer. Rolldown gère la création de plusieurs bundles en parallèle s’ils sont définis.
La cible de bundle utilise index.ts comme point d’entrée pour le serveur WebSocket à héberger sur Bedrock AgentCore Runtime.
Cible de package
Section intitulée « Cible de package »Le générateur configure une cible <your-agent-name>-package qui assemble le package de code déployable : le index.js regroupé plus une installation vendorisée de l’AWS Distro for OpenTelemetry, qu’AgentCore nécessite d’être présent dans le package. L’infrastructure générée télécharge ce répertoire en tant que .zip — via AgentRuntimeArtifact.fromCodeAsset sous CDK, ou archivé dans le bucket d’actifs partagé sous Terraform.
Cible Docker
Section intitulée « Cible Docker »Le générateur configure une cible <your-agent-name>-docker qui copie le Dockerfile de votre répertoire source d’agent dans le répertoire de sortie du bundle. Cela co-localise le Dockerfile avec les artefacts regroupés, permettant à CDK de construire l’image Docker directement en utilisant AgentRuntimeArtifact.fromAsset.
Une cible docker est également générée qui prépare le contexte docker pour tous les agents si vous en avez plusieurs définis.
Analyse d’image
Section intitulée « Analyse d’image »L’image Docker construite pour ce projet peut être analysée pour détecter les vulnérabilités à l’aide de Trivy, exécuté depuis l’image Trivy hébergée sur ECR.
Une cible trivy est ajoutée à votre projet qui analyse l’image construite et se termine avec un code non nul si une vulnérabilité de gravité HIGH ou CRITICAL est trouvée. Le Dockerfile généré utilise une image de base sans vulnérabilité corrigeable connue de ces gravités au moment de la génération, et met à niveau les outils fournis (tels que npm) pour maintenir cet état.
L’analyse utilise le même moteur de conteneur que votre construction d’image (docker ou finch), donc aucun outillage supplémentaire n’est requis. L’analyse n’est pas mise en cache, car l’image qu’elle lit se trouve dans le moteur de conteneur plutôt que sur le disque — elle analyse donc toujours l’image réelle et échoue bruyamment plutôt que de signaler un succès mis en cache pour une image qui n’est plus là. Chaque exécution prend donc des dizaines de secondes par image et actualise la base de données de vulnérabilités de Trivy, elle nécessite donc un accès réseau. Le script racine trivy fourni analyse chaque image dans l’espace de travail :
pnpm trivyyarn trivynpm run trivybun trivySuppression des résultats Trivy
Section intitulée « Suppression des résultats Trivy »Il peut y avoir des cas où vous souhaitez supprimer une vulnérabilité spécifique, par exemple lorsqu’aucun correctif n’est encore disponible et que vous avez évalué le risque comme acceptable.
Ajoutez l’ID de vulnérabilité (un par ligne) au fichier .trivyignore à la racine de votre projet (c’est-à-dire à côté de votre project.json) :
# node-tar arbitrary file write - not exploitable in our usageCVE-2024-XXXXXPour plus de détails sur le filtrage des résultats, consultez la documentation de filtrage Trivy.
Observabilité
Section intitulée « Observabilité »Votre agent est automatiquement configuré avec l’observabilité en utilisant l’AWS Distro for Open Telemetry (ADOT).
Vous pouvez trouver les traces dans la console AWS CloudWatch, en sélectionnant “GenAI Observability” dans le menu. Notez que pour que les traces soient remplies, vous devrez activer Transaction Search.
Pour plus de détails, consultez la documentation AgentCore sur l’observabilité.
Gestion de session
Section intitulée « Gestion de session »L’option session contrôle comment votre agent persiste l’état de conversation (historique des messages, état des outils, etc.) entre les invocations, en utilisant le SessionManager du SDK Strands :
s3(par défaut) : L’infrastructure CDK/Terraform provisionne un bucket S3 dédié pour les données de session, chiffré avec une clé KMS dédiée et avec tout accès public bloqué ; les journaux d’accès au serveur sont délivrés à un groupe de journaux CloudWatch Logs via la même clé. Le rôle IAM de l’agent reçoit un accès en lecture/écriture/liste/suppression au bucket et un accès de déchiffrement/génération-de-clé-de-données à la clé, et le nom du bucket est enregistré aux côtés de l’ARN de l’agent dans la configuration du runtime AppConfig.in-memory: Aucun bucket n’est provisionné. L’état de conversation est conservé en mémoire uniquement pendant la durée de vie du processus en cours d’exécution et ne survit pas aux redémarrages ou à la réduction d’échelle.
Ceci est implémenté dans le fichier session.ts généré, qui exporte une fonction getSessionManager() résolvant un SessionManager pour la session actuelle.
L’ID de session lui-même provient de la session AgentCore Runtime (propagée via l’en-tête x-amzn-bedrock-agentcore-runtime-session-id pour A2A/AG-UI, ou le contexte de connexion WebSocket pour HTTP/tRPC) et est lié à un contexte basé sur AsyncLocalStorage afin que getCurrentSessionId() puisse le résoudre n’importe où dans la requête — y compris dans tous les clients MCP ou A2A en aval connectés via le générateur connection, de sorte que toute la chaîne d’appels partage une session cohérente.
Restreindre les sessions à leur propriétaire
Section intitulée « Restreindre les sessions à leur propriétaire »L’ID de session provient de l’appelant, donc en soi il identifie une conversation mais pas à qui appartient la conversation. AgentCore Runtime autorise une invocation contre l’ARN de ressource du runtime de l’agent plutôt que contre une session individuelle, ce qui laisse l’agent libre de décider ce qu’une session signifie pour votre application.
Pour restreindre chaque utilisateur à ses propres conversations :
- Ajoutez une API pour créer une session, en utilisant tRPC, FastAPI ou Smithy. Générez un ID de session opaque (au moins 33 caractères) et stockez-le aux côtés de l’ID de l’utilisateur appelant — par exemple dans une table créée avec le générateur
ts#dynamodb. Chaque guide d’API montre comment récupérer l’ID de l’utilisateur appelant. - Dans votre agent, recherchez l’ID utilisateur stocké pour l’ID de session qui lui a été donné, et rejetez la requête lorsqu’il ne correspond pas à l’appelant. Avec
auth=cognito, le JWT de l’appelant atteint votre code d’agent, donc sa revendicationsubles identifie.
Générez l’ID de session plutôt que de le dériver de valeurs fournies par l’utilisateur telles qu’un nom de conversation — tout ce qu’un appelant peut prédire, un appelant peut l’envoyer.
Invoquer votre Agent
Section intitulée « Invoquer votre Agent »La communication de l’agent est transmise via tRPC sur WebSocket. En tant que tel, il est recommandé d’utiliser la factory de client type-safe générée dans client.ts.
Invoquer le serveur local
Section intitulée « Invoquer le serveur local »Démarrez votre agent avec la cible <your-agent-name>-dev :
pnpm nx agent-dev your-projectyarn nx agent-dev your-projectnpx nx agent-dev your-projectbunx nx agent-dev your-projectEnsuite, invoquez-le en utilisant la méthode factory .local de la factory de client.
Vous pouvez, par exemple, créer un fichier nommé scripts/test.ts dans votre espace de travail qui importe le client :
La classe client est nommée d’après votre agent, donc un agent nommé my-agent exporte MyAgentClient.
import { MyAgentClient } from '../packages/<project>/src/agent/client.js';
const client = MyAgentClient.local({ url: 'http://localhost:8081/ws' });
client.invoke.subscribe({ prompt: 'what is 1 plus 1?' }, { onData: console.log });Substituez le port attribué à votre agent — lisez-le depuis metadata.ports dans le project.json du projet.
Invoquer l’agent déployé
Section intitulée « Invoquer l’agent déployé »Pour invoquer votre Agent déployé sur Bedrock AgentCore Runtime, vous pouvez envoyer une requête POST au point de terminaison du plan de données Bedrock AgentCore Runtime avec votre ARN encodé en URL.
Vous pouvez obtenir l’ARN du runtime depuis votre infrastructure comme suit :
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}L’ARN aura le format suivant : arn:aws:bedrock-agentcore:<region>:<account>:runtime/<agent-runtime-id>.
Vous pouvez ensuite encoder l’ARN en URL en remplaçant : par %3A et / par %2F.
L’URL du plan de données Bedrock AgentCore Runtime pour invoquer l’agent est la suivante :
https://bedrock-agentcore.<region>.amazonaws.com/runtimes/<url-encoded-arn>/invocationsLa manière exacte d’invoquer cette URL dépend de la méthode d’authentification utilisée.
Le fichier client.ts généré inclut une factory de client type-safe qui peut être utilisée pour invoquer votre agent déployé.
Authentification IAM
Section intitulée « Authentification IAM »Vous pouvez invoquer votre agent déployé en passant son ARN à la méthode factory withIamAuth :
import { MyAgentClient } from './agent/client.js';
const client = MyAgentClient.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'),});Authentification JWT / Cognito
Section intitulée « Authentification JWT / Cognito »Utilisez la méthode factory withJwtAuth pour vous authentifier avec le jeton d’accès JWT / Cognito.
const client = MyAgentClient.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,});Le accessTokenProvider doit retourner le jeton utilisé pour authentifier la requête. Vous pouvez, par exemple, obtenir un jeton dans cette méthode pour vous assurer que des informations d’identification fraîches sont réutilisées lorsque tRPC redémarre une connexion WebSocket. Ce qui suit démontre l’utilisation du SDK AWS pour obtenir le jeton de Cognito :
import { CognitoIdentityProvider } from "@aws-sdk/client-cognito-identity-provider";
const cognito = new CognitoIdentityProvider();
const jwtClient = MyAgentClient.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!; },});Navigateur / Site web React
Section intitulée « Navigateur / Site web React »Pour invoquer votre Agent depuis un site web React, vous pouvez utiliser le générateur connection, qui configure automatiquement un client WebSocket tRPC avec l’authentification correcte (IAM ou Cognito).
Exécuter ce générateur@aws/nx-plugin:connection
pnpm nx g @aws/nx-plugin:connection yarn nx g @aws/nx-plugin:connection npx nx g @aws/nx-plugin:connection bunx nx g @aws/nx-plugin:connection- Installez le Nx Console VSCode Plugin si ce n'est pas déjà fait
- Ouvrez la console Nx dans VSCode
- Cliquez sur
Generate (UI)dans la section "Common Nx Commands" - Recherchez
@aws/nx-plugin - connection - Remplissez les paramètres requis
- Cliquez sur
Generate
Composez votre commande5
Requis
Requis
Consultez le guide du générateur connection pour plus de détails sur la configuration de la connexion.
Invoquer un agent A2A en tant qu’outil
Section intitulée « Invoquer un agent A2A en tant qu’outil »Pour déléguer du travail de cet agent à un agent A2A distant (soit TypeScript soit Python), utilisez le générateur connection. Il fournit un client authentifié SigV4 pour l’agent cible et transforme l’AST du fichier agent.ts de cet agent pour enregistrer l’agent A2A distant en tant qu’tool Strands.
Exécuter ce générateur@aws/nx-plugin:connection
pnpm nx g @aws/nx-plugin:connection yarn nx g @aws/nx-plugin:connection npx nx g @aws/nx-plugin:connection bunx nx g @aws/nx-plugin:connection- Installez le Nx Console VSCode Plugin si ce n'est pas déjà fait
- Ouvrez la console Nx dans VSCode
- Cliquez sur
Generate (UI)dans la section "Common Nx Commands" - Recherchez
@aws/nx-plugin - connection - Remplissez les paramètres requis
- Cliquez sur
Generate
Composez votre commande5
Requis
Requis
Consultez le guide du générateur connection pour plus de détails sur la configuration de la connexion.
Invoquer un agent AG-UI
Section intitulée « Invoquer un agent AG-UI »Pour invoquer votre agent AG-UI depuis un site web React, utilisez le générateur connection, qui configure un client CopilotKit configuré pour votre agent déployé avec l’authentification correcte (IAM ou Cognito).
Exécuter ce générateur@aws/nx-plugin:connection
pnpm nx g @aws/nx-plugin:connection yarn nx g @aws/nx-plugin:connection npx nx g @aws/nx-plugin:connection bunx nx g @aws/nx-plugin:connection- Installez le Nx Console VSCode Plugin si ce n'est pas déjà fait
- Ouvrez la console Nx dans VSCode
- Cliquez sur
Generate (UI)dans la section "Common Nx Commands" - Recherchez
@aws/nx-plugin - connection - Remplissez les paramètres requis
- Cliquez sur
Generate
Composez votre commande5
Requis
Requis
Consultez le guide du générateur connection pour plus de détails sur la configuration de la connexion.
Sécuriser votre Agent
Section intitulée « Sécuriser votre Agent »Les agents agissent sur des entrées non fiables et peuvent déclencher des actions réelles via leurs outils, il est donc important de considérer la sécurité dès le départ. Les pratiques suivantes s’appliquent à l’agent généré.
Traiter les entrées et sorties du modèle comme non fiables
Section intitulée « Traiter les entrées et sorties du modèle comme non fiables »Les prompts peuvent contenir des instructions adverses (injection de prompt), et la sortie du modèle est non déterministe — ni l’un ni l’autre ne doivent être considérés comme fiables dans une logique sensible à la sécurité :
- Définissez des schémas d’entrée stricts pour vos outils, comme dans l’exemple d’outil généré. Contraignez les valeurs à ce dont l’outil a réellement besoin (énumérations, limites de longueur, plages numériques) plutôt que d’accepter des chaînes de caractères libres.
- Ne passez jamais la sortie du modèle directement dans des commandes shell, des requêtes SQL, une évaluation de code ou du HTML rendu sans validation ou encodage.
- Appliquez des vérifications d’autorisation dans vos outils et services en aval — ne comptez pas sur le prompt système pour empêcher le modèle d’utiliser à mauvais escient un outil auquel il a accès.
Les guides Prompt Engineering et Responsible AI de Strands couvrent la rédaction de prompts système robustes et soucieux de la sécurité.
Limiter étroitement les permissions des outils
Section intitulée « Limiter étroitement les permissions des outils »Accordez au rôle IAM de l’agent uniquement les permissions dont ses outils ont besoin. Les constructs CDK et modules Terraform fournis exposent des méthodes grant* et des politiques limitées à cet effet — par exemple, accorder à un agent l’accès pour invoquer une API spécifique plutôt que d’attacher de larges politiques gérées. Lorsqu’un outil agit au nom d’un utilisateur, préférez autoriser l’action en utilisant l’identité de l’utilisateur appelant (transmise via le contexte de la requête) plutôt que les permissions ambiantes de l’agent lui-même.
Fournir un interrupteur d’urgence
Section intitulée « Fournir un interrupteur d’urgence »Étant donné que le comportement du modèle peut changer de manière inattendue, prévoyez de désactiver ou de remplacer rapidement le modèle sans modification de code :
- Lisez l’ID du modèle depuis la configuration (par exemple une variable d’environnement
MODEL_ID) afin que les opérateurs puissent changer ou revenir à un modèle différent en mettant à jour la configuration. - Placez l’agent derrière un feature flag afin que sa fonctionnalité IA puisse être désactivée entièrement. Lorsqu’elle est désactivée, renvoyez un message générique plutôt qu’une erreur, et assurez-vous que le reste de votre application se dégrade gracieusement.
Documentez comment activer ces contrôles dans votre manuel opérationnel.
Protéger les données sensibles
Section intitulée « Protéger les données sensibles »- Évitez de journaliser les prompts et les complétions, qui peuvent contenir des données utilisateur. Le hook de journalisation des erreurs du modèle de l’agent généré journalise uniquement les métadonnées d’erreur, pas le contenu de la conversation — conservez cette propriété lors de l’ajout de votre propre journalisation.
- Renvoyez des messages d’erreur génériques aux utilisateurs ; journalisez les erreurs détaillées côté serveur.
- Isolez l’état de conversation entre les utilisateurs et les sessions, et autorisez l’accès à toutes les données de session persistées.
- Masquez les informations personnellement identifiables (PII) des prompts et des sorties — soit avec un filtre d’informations sensibles Amazon Bedrock Guardrail (ci-dessous), soit, pour les agents Strands, les approches du guide PII Redaction.
Amazon Bedrock Guardrails
Section intitulée « Amazon Bedrock Guardrails »Amazon Bedrock Guardrails fournit des filtres de contenu configurables, des sujets interdits et des filtres d’informations sensibles (PII) qui sont évalués sur l’entrée et la sortie du modèle. Vous pouvez attacher un guardrail au modèle utilisé par l’agent généré :
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, /* ... */ });Consultez le guide Strands sur les Guardrails pour plus de détails.
Connexions
Section intitulée « Connexions »Utilisez le générateur connection pour intégrer ce projet avec d’autres dans votre espace de travail. Les connexions suivantes impliquent ce projet :
