Agente TypeScript Strands a Agente A2A
El generador connection puede conectar tu TypeScript Strands Agent a un agente A2A remoto — ya sea TypeScript o Python — para que tu agente pueda delegar a otro agente como una herramienta.
El generador configura todo el cableado necesario para que tu agente pueda descubrir e invocar el agente A2A remoto, tanto cuando se despliega en AWS (a través de Bedrock AgentCore) como cuando se ejecuta localmente.
Requisitos previos
Sección titulada «Requisitos previos»Antes de usar este generador, asegúrate de tener:
- Un proyecto TypeScript con un componente Strands Agent (cualquier protocolo)
- Un proyecto con un componente Strands Agent generado con
--protocol=A2Ay--auth=IAM(ya seats#strands-agentopy#strands-agent) - Ambos componentes creados con
computeType: BedrockAgentCoreRuntime
Ejecutar el generador
Sección titulada «Ejecutar el generador»- Instale el Nx Console VSCode Plugin si aún no lo ha hecho
- Abra la consola Nx en VSCode
- Haga clic en
Generate (UI)en la sección "Common Nx Commands" - Busque
@aws/nx-plugin - connection - Complete los parámetros requeridos
- Haga clic en
Generate
pnpm nx g @aws/nx-plugin:connectionyarn nx g @aws/nx-plugin:connectionnpx nx g @aws/nx-plugin:connectionbunx nx g @aws/nx-plugin:connectionTambién puede realizar una ejecución en seco para ver qué archivos se cambiarían
pnpm nx g @aws/nx-plugin:connection --dry-runyarn nx g @aws/nx-plugin:connection --dry-runnpx nx g @aws/nx-plugin:connection --dry-runbunx nx g @aws/nx-plugin:connection --dry-runSelecciona tu proyecto de agente anfitrión como origen y tu proyecto de agente A2A como destino. Si tus proyectos contienen múltiples componentes, especifica las opciones sourceComponent y targetComponent para desambiguar.
Opciones
Sección titulada «Opciones»| Parámetro | Tipo | Predeterminado | Descripción |
|---|---|---|---|
| sourceProject Requerido | string | - | El proyecto de origen |
| targetProject Requerido | string | - | El proyecto de destino al que conectar |
| sourceComponent | string | - | El componente de origen desde el que conectar (nombre del componente, ruta relativa a la raíz del proyecto de origen, o id del generador). Use '.' para seleccionar explícitamente el proyecto como origen. |
| targetComponent | string | - | El componente de destino al que conectar (nombre del componente, ruta relativa a la raíz del proyecto de destino, o id del generador). Use '.' para seleccionar explícitamente el proyecto como destino. |
Salida del generador
Sección titulada «Salida del generador»El generador crea un paquete compartido agent-connection y modifica el código de tu agente:
Directoriopackages/common/agent-connection
Directoriosrc
Directorioapp
- <target-agent-name>-client.ts Cliente de alto nivel para el agente A2A conectado
Directoriocore
- agentcore-a2a-client.ts Cliente A2A de AgentCore de bajo nivel con autenticación SigV4
- index.ts Exporta todos los clientes
- project.json
- tsconfig.json
Además:
- Transforma el
agent.tsde tu agente para registrar el agente A2A remoto como unatoolde Strands - Actualiza el target
serve-localdel agente para que dependa del targetserve-localdel agente destino - Instala las dependencias requeridas
Usar el agente A2A conectado
Sección titulada «Usar el agente A2A conectado»El generador transforma el agent.ts de tu agente para envolver el agente A2A remoto como una herramienta:
import { Agent, tool } from '@strands-agents/sdk';import { RemoteAgentClient } from ':my-scope/agent-connection';import { z } from 'zod';
export const getAgent = async (sessionId: string) => { const remoteAgent = await RemoteAgentClient.create(sessionId); const remoteAgentTool = tool({ name: 'askRemoteAgent', description: 'Delegate a question to the remote RemoteAgent A2A agent and return its reply.', inputSchema: z.object({ prompt: z.string() }), callback: async ({ prompt }) => (await remoteAgent.invoke(prompt)).toString(), }); return new Agent({ systemPrompt: '...', tools: [remoteAgentTool], });};El parámetro sessionId se transmite desde el llamador, asegurando consistencia para la observabilidad de Bedrock AgentCore.
Internamente, RemoteAgentClient.create(sessionId) devuelve un A2AAgent de Strands configurado con un clientFactory que firma con SigV4 cuando se despliega en AWS, y un endpoint simple http://localhost:<port>/ cuando SERVE_LOCAL=true.
Infraestructura
Sección titulada «Infraestructura»Después de ejecutar el generador de conexiones, necesitas otorgar al agente anfitrión permiso para invocar al agente A2A remoto.
const remoteAgent = new RemoteAgent(this, 'RemoteAgent');const myAgent = new MyAgent(this, 'MyAgent');
// Grant the host agent permission to invoke the remote A2A agentremoteAgent.grantInvokeAccess(myAgent);grantInvokeAccess en un agente A2A configura tanto bedrock-agentcore:InvokeAgentRuntime como bedrock-agentcore:GetAgentCard — el cliente A2A necesita ambos para obtener la tarjeta del agente y enviar mensajes.
El ARN del runtime AgentCore del agente remoto se registra automáticamente en el espacio de nombres agentcore de Runtime Configuration por el constructo CDK generado, para que el agente anfitrión pueda descubrirlo en tiempo de ejecución.
module "remote_agent" { source = "../../common/terraform/src/app/agents/remote-agent"}
module "my_agent" { source = "../../common/terraform/src/app/agents/my-agent"}
# Grant the host agent permission to invoke the remote A2A agentresource "aws_iam_policy" "agent_invoke_a2a" { name = "AgentInvokeA2aPolicy" policy = jsonencode({ Version = "2012-10-17" Statement = [{ Effect = "Allow" Action = [ "bedrock-agentcore:InvokeAgentRuntime", "bedrock-agentcore:GetAgentCard", ] Resource = module.remote_agent.agent_core_runtime_arn }] })}
resource "aws_iam_role_policy_attachment" "agent_invoke_a2a" { role = module.my_agent.agent_core_runtime_role_arn policy_arn = aws_iam_policy.agent_invoke_a2a.arn}El ARN del runtime AgentCore del agente remoto se registra automáticamente en el espacio de nombres agentcore de Runtime Configuration por el módulo Terraform generado, para que el agente anfitrión pueda descubrirlo en tiempo de ejecución.
Desarrollo local
Sección titulada «Desarrollo local»El generador configura el target serve-local del agente anfitrión para:
- Iniciar los agentes A2A conectados automáticamente
- Establecer
SERVE_LOCAL=truepara que el cliente generado se conecte directamente ahttp://localhost:<port>/en lugar de AgentCore
Ejecuta el agente localmente con:
pnpm nx <agent-name>-serve-local <project-name>yarn nx <agent-name>-serve-local <project-name>npx nx <agent-name>-serve-local <project-name>bunx nx <agent-name>-serve-local <project-name>Esto iniciará tanto el agente anfitrión como todos los agentes A2A conectados, con el agente anfitrión llamando a los agentes remotos a través de HTTP simple en sus puertos locales asignados.