Python Agent a A2A Agent
Il generatore connection può connettere il tuo Python 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 distribuito su AWS (tramite Bedrock AgentCore) che quando eseguito localmente.
Prerequisiti
Sezione intitolata “Prerequisiti”Prima di utilizzare questo generatore, assicurati di avere:
- Un progetto Python con un componente Python Agent (Strands o LangChain)
- 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”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-run- 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
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”| 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. |
| preferInstallDependencies | boolean | true | Se 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 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 Re-esporta i client per-connessione
Directorycore
- agentcore_endpoints.py Risoluzione ARN/URL indipendente dal framework
- agentcore_a2a_client_config.py Configurazione client A2A indipendente dal framework (
ClientConfigfirmato) - agentcore_a2a_client_<framework>.py Client A2A che avvolge la configurazione per il framework del tuo agente
Directoryauth/
httpx.AuthSigV4 / session-forwarding indipendente dal framework- …
Directoryapp
- <target_agent_name>_client_<framework>.py Client A2A per-connessione per ogni agente A2A
Il suffisso del client corrisponde al framework del tuo agente (_strands o _langchain). Entrambi avvolgono lo stesso ClientConfig firmato indipendente dal framework: il client Strands avvolge un A2AAgent Strands, mentre il client LangChain guida direttamente l’a2a SDK.
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
devdell’agente per dipendere dal targetdevdell’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. L’agente remoto viene registrato con un delegato decorato con @tool — l’import del decoratore e il costruttore dell’agente differiscono per framework:
from contextlib import contextmanagerfrom strands import Agent, tool
from my_scope_agent_connection import RemoteAgentClientStrands
@contextmanagerdef get_agent(): remote_agent = RemoteAgentClientStrands.create()
@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], )from langchain.agents import create_agentfrom langchain_aws import ChatBedrockConversefrom langchain_core.tools import tool
from my_scope_agent_connection import RemoteAgentClientLangChain
def get_agent(): remote_agent = RemoteAgentClientLangChain.create()
@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))
return create_agent( model=ChatBedrockConverse(model=MODEL_ID, region_name=REGION), system_prompt="...", tools=[ask_remote_agent], )Entrambi i client sono direttamente invocabili, restituendo la risposta dell’agente remoto, e avvolgono un httpx.AsyncClient che firma le richieste con SigV4 quando distribuito su AWS e utilizza un semplice endpoint http://localhost:<port>/ quando LOCAL_DEV=true. Il client Strands avvolge un A2AAgent Strands; il client LangChain guida direttamente l’a2a SDK.
L’ID di sessione AgentCore viene propagato automaticamente all’agente remoto tramite l’header X-Amzn-Bedrock-AgentCore-Runtime-Session-Id, indipendentemente dal framework: il server dell’agente associa la sessione della richiesta in entrata in un contesto asincrono, e l’httpx.Auth firmato del client di connessione lo applica su ogni chiamata in uscita — garantendo coerenza per Bedrock AgentCore Observability.
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.