TypeScript Strands Agent a A2A Agent
Il generatore connection può connettere il tuo TypeScript Strands 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 in modo che il tuo agente possa scoprire e invocare l’agente A2A remoto, sia quando è distribuito su AWS (tramite Bedrock AgentCore) che 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 Strands Agent generato con
--protocol=A2Ae--auth=IAM(siats#strands-agentchepy#strands-agent) - Entrambi i componenti creati con
computeType: BedrockAgentCoreRuntime
Utilizzo
Sezione intitolata “Utilizzo”Eseguire il Generatore
Sezione intitolata “Eseguire il Generatore”- 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
pnpm nx g @aws/nx-plugin:connectionyarn nx g @aws/nx-plugin:connectionnpx nx g @aws/nx-plugin:connectionbunx nx g @aws/nx-plugin:connectionPuoi anche eseguire una prova per vedere quali file verrebbero modificati
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-runSeleziona il progetto dell’agente host come origine e il progetto dell’agente A2A come destinazione. Se i tuoi progetti contengono più componenti, specifica le opzioni sourceComponent e targetComponent per disambiguare.
Opzioni
Sezione intitolata “Opzioni”| Parametro | Tipo | Predefinito | Descrizione |
|---|---|---|---|
| sourceProject Obbligatorio | string | - | Il progetto sorgente |
| targetProject Obbligatorio | string | - | Il progetto di destinazione a cui connettersi |
| sourceComponent | string | - | Il componente sorgente da cui connettersi (nome del componente, percorso relativo alla radice del progetto sorgente, o id del generatore). Usare '.' per selezionare esplicitamente il progetto come sorgente. |
| targetComponent | string | - | Il componente di destinazione a cui connettersi (nome del componente, percorso relativo alla radice del progetto di destinazione, o id del generatore). Usare '.' per selezionare esplicitamente il progetto come destinazione. |
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.ts Client di alto livello per l’agente A2A connesso
Directorycore
- agentcore-a2a-client.ts Client AgentCore A2A di basso livello con autenticazione SigV4
- index.ts Esporta tutti i client
- project.json
- tsconfig.json
Inoltre:
- Trasforma il file
agent.tsdel tuo agente per registrare l’agente A2A remoto cometooldi Strands - Aggiorna il target
serve-localdell’agente per dipendere dal targetserve-localdell’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 { 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], });};Il parametro sessionId viene passato dal chiamante, garantendo coerenza per Bedrock AgentCore Observability.
Internamente, RemoteAgentClient.create(sessionId) restituisce un A2AAgent di Strands configurato con un clientFactory che firma con SigV4 quando distribuito su AWS, e un endpoint semplice http://localhost:<port>/ quando SERVE_LOCAL=true.
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 configura 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 Runtime Configuration 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"}
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}L’ARN del runtime AgentCore dell’agente remoto viene automaticamente registrato nel namespace agentcore della Runtime Configuration 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 serve-local dell’agente host per:
- Avviare automaticamente gli agenti A2A connessi
- Impostare
SERVE_LOCAL=truein modo che il client generato si connetta direttamente ahttp://localhost:<port>/invece di AgentCore
Esegui l’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>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.