Agente Python Strands ad Agente A2A
Il generatore connection può connettere il tuo Python 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 affinché il tuo agente possa scoprire e invocare l’agente A2A remoto, sia quando viene 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 Python 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 sorgente 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 progetto Python condiviso agent_connection in packages/common/agent_connection/ (se non esiste già). I moduli client per-connessione vengono generati in questo progetto condiviso:
Directorypackages/common/agent_connection
Directory<scope>_agent_connection
- __init__.py Ri-esporta i client per-connessione
Directorycore
- agentcore_a2a_client.py Client A2A AgentCore principale con autenticazione SigV4
Directoryapp
- <target_agent_name>_client.py Client per-connessione per ogni agente A2A
Inoltre, il generatore:
- Trasforma il file
agent.pydel tuo agente per registrare l’agente A2A remoto come strumento utilizzando@tool - Aggiunge il progetto
agent_connectioncome dipendenza workspace del progetto del tuo agente - Aggiorna il target
serve-localdell’agente per dipendere dal targetserve-localdell’agente di destinazione
Utilizzo dell’Agente A2A Connesso
Sezione intitolata “Utilizzo dell’Agente A2A Connesso”Il generatore trasforma il file agent.py del tuo agente per avvolgere l’agente A2A remoto come strumento:
from contextlib import contextmanagerfrom strands import Agent, tool
from my_scope_agent_connection import RemoteAgentClient
@contextmanagerdef get_agent(session_id: str): remote_agent = RemoteAgentClient.create(session_id=session_id)
@tool def ask_remote_agent(prompt: str) -> str: """Delegate a question to the remote RemoteAgent A2A agent and return its reply.""" return str(remote_agent(prompt))
yield Agent( system_prompt="...", tools=[ask_remote_agent], )Il parametro session_id viene propagato dal chiamante, garantendo coerenza per Bedrock AgentCore Observability.
Internamente, RemoteAgentClient.create(session_id=...) restituisce uno Strands A2AAgent configurato con un httpx.AsyncClient che firma le richieste 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 che ad 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.