TypeScript Agent to A2A Agent
Il generatore connection può connettere il tuo TypeScript Agent a un agente A2A remoto — sia TypeScript che Python — in modo che il tuo agente possa delegare a un altro agente come strumento.
Il generatore configura tutto il cablaggio necessario affinché il tuo agente possa scoprire e invocare l’agente A2A remoto, sia quando viene distribuito su AWS (tramite Bedrock AgentCore) sia quando viene eseguito localmente.
Prerequisiti
Sezione intitolata “Prerequisiti”Prima di utilizzare questo generatore, assicurati di avere:
- Un progetto TypeScript con un componente Strands Agent (qualsiasi protocollo)
- Un progetto con un componente Agent generato con
--protocol=a2ae--auth=iam(siats#agentchepy#agent) - Entrambi i componenti creati con
infra: agentcore
Utilizzo
Sezione intitolata “Utilizzo”Esegui il Generatore
Sezione intitolata “Esegui il Generatore”Esegui questo generatore@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- Installa il Nx Console VSCode Plugin se non l'hai già fatto
- Apri la console Nx in VSCode
- Clicca su
Generate (UI)nella sezione "Common Nx Commands" - Cerca
@aws/nx-plugin - connection - Compila i parametri richiesti
- Clicca su
Generate
Componi il tuo comando5
Obbligatorio
Obbligatorio
Seleziona il progetto del tuo agente host come sorgente e il progetto del tuo agente A2A come destinazione. Se i tuoi progetti contengono più componenti, specifica le opzioni sourceComponent e targetComponent per disambiguare.
Opzioni
Sezione intitolata “Opzioni”sourceProjectObbligatoriostringIl progetto sorgente
targetProjectObbligatoriostringIl progetto di destinazione a cui connettersi
sourceComponentstringIl componente sorgente da cui connettersi (nome del componente, percorso relativo alla radice del progetto sorgente, o id del generatore). Usa '.' per selezionare esplicitamente il progetto come sorgente.
targetComponentstringIl componente destinazione a cui connettersi (nome del componente, percorso relativo alla radice del progetto destinazione, o id del generatore). Usa '.' per selezionare esplicitamente il progetto come destinazione.
preferInstallDependenciesbooleanPredefinito:trueSe preferire l'installazione delle dipendenze dopo l'esecuzione del generatore. Impostare su false per rimandare l'installazione quando si eseguono più generatori in batch (l'installazione viene comunque eseguita se necessaria affinché i generatori successivi possano calcolare il grafo dei progetti Nx); installare una volta alla fine.
Output del Generatore
Sezione intitolata “Output del Generatore”Il generatore crea un pacchetto condiviso agent-connection e modifica il codice del tuo agente:
Directorypackages/common/agent-connection
Directorysrc
Directoryapp
- <target-agent-name>-client-strands.ts High-level Strands client for the connected A2A agent
Directorycore
- agentcore-endpoints.ts Framework-agnostic ARN/URL resolution
- agentcore-fetch.ts Framework-agnostic SigV4 / JWT / session-forwarding fetch
- agentcore-a2a-client-config.ts Framework-agnostic A2A client config (signed
clientFactory) - agentcore-a2a-client-strands.ts Strands A2A client wrapping the config
- index.ts Exports all clients
- project.json
- tsconfig.json
Inoltre:
- Trasforma il file
agent.tsdel tuo agente per registrare l’agente A2A remoto cometooldi Strands - Aggiorna il target
devdell’agente per dipendere dal targetdevdell’agente di destinazione - Installa le dipendenze richieste
Utilizzo dell’Agente A2A Connesso
Sezione intitolata “Utilizzo dell’Agente A2A Connesso”Il generatore trasforma il file agent.ts del tuo agente per avvolgere l’agente A2A remoto come strumento:
import { Agent, tool } from '@strands-agents/sdk';import { RemoteAgentClientStrands } from '@my-scope/agent-connection';import { z } from 'zod';
export const getAgent = async () => { const remoteAgent = await RemoteAgentClientStrands.create(); 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], });};L’ID di sessione AgentCore viene propagato automaticamente all’agente remoto tramite l’header X-Amzn-Bedrock-AgentCore-Runtime-Session-Id, quindi create() non richiede argomenti: il server dell’agente associa la sessione della richiesta in entrata in un contesto AsyncLocalStorage (enterSessionContext nel router.ts generato, o runWithSessionId nel middleware di sessione A2A/AG-UI), e il fetch del client di connessione in agentcore-fetch.ts lo applica su ogni chiamata in uscita — garantendo coerenza per Bedrock AgentCore Observability.
Internamente, RemoteAgentClientStrands.create() restituisce un A2AAgent di Strands configurato con un clientFactory che firma con SigV4 quando distribuito su AWS, e un semplice endpoint http://localhost:<port>/ quando LOCAL_DEV=true. La firma e la risoluzione degli endpoint risiedono nel file framework-agnostic agentcore-a2a-client-config.ts; solo il sottile agentcore-a2a-client-strands.ts dipende da Strands.
Infrastruttura
Sezione intitolata “Infrastruttura”Dopo aver eseguito il generatore di connessioni, è necessario concedere all’agente host il permesso di invocare l’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 su un agente A2A collega sia bedrock-agentcore:InvokeAgentRuntime che bedrock-agentcore:GetAgentCard — il client A2A ha bisogno di entrambi per recuperare la scheda dell’agente e inviare messaggi.
L’ARN del runtime AgentCore dell’agente remoto viene automaticamente registrato nel namespace agentcore della Configurazione Runtime dal costrutto CDK generato, in modo che l’agente host possa scoprirlo a runtime.
module "remote_agent" { source = "../../common/terraform/src/app/agents/remote-agent"
appconfig_application_id = module.runtime_config_appconfig.application_id appconfig_application_arn = module.runtime_config_appconfig.application_arn}
module "my_agent" { source = "../../common/terraform/src/app/agents/my-agent"
appconfig_application_id = module.runtime_config_appconfig.application_id appconfig_application_arn = module.runtime_config_appconfig.application_arn}
# 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}L’ARN del runtime AgentCore dell’agente remoto viene automaticamente registrato nel namespace agentcore della Configurazione Runtime dal modulo Terraform generato, in modo che l’agente host possa scoprirlo a runtime.
Sviluppo Locale
Sezione intitolata “Sviluppo Locale”Il generatore configura il target dev dell’agente host per:
- Avviare automaticamente gli agenti A2A connessi
- Impostare
LOCAL_DEV=truein modo che il client generato si connetta direttamente ahttp://localhost:<port>/invece che ad AgentCore
Esegui l’agente localmente con:
pnpm nx <agent-name>-dev <project-name>yarn nx <agent-name>-dev <project-name>npx nx <agent-name>-dev <project-name>bunx nx <agent-name>-dev <project-name>Questo avvierà sia l’agente host che tutti gli agenti A2A connessi, con l’agente host che chiama gli agenti remoti tramite HTTP semplice sulle loro porte locali assegnate.