Agente Python a Agente A2A
El generador connection puede conectar tu Agente Python 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 Python con un componente Agente Python (Strands o LangChain)
- Un proyecto con un componente Agent generado con
--protocol=a2ay--auth=iam(ya seats#agentopy#agent) - Ambos componentes creados con
infra: agentcore
Ejecutar el Generador
Sección titulada «Ejecutar el Generador»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-run- 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
Selecciona 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. |
| preferInstallDependencies | boolean | true | Si se prefiere instalar las dependencias después de que se ejecute el generador. Establecer en false para diferir la instalación al ejecutar múltiples generadores en lote (la instalación aún se ejecuta si es necesario para que los generadores subsiguientes puedan calcular el grafo de proyectos de Nx); instalar una vez al final. |
Salida del Generador
Sección titulada «Salida del Generador»El generador crea un proyecto Python compartido agent_connection en packages/common/agent_connection/ (si no existe ya). Los módulos de cliente por conexión se generan en este proyecto compartido:
Directoriopackages/common/agent_connection
Directorio<scope>_agent_connection
- __init__.py Re-exporta clientes por conexión
Directoriocore
- agentcore_endpoints.py Resolución de ARN/URL independiente del framework
- agentcore_a2a_client_config.py Configuración de cliente A2A independiente del framework (
ClientConfigfirmado) - agentcore_a2a_client_<framework>.py Cliente A2A que envuelve la configuración para el framework de tu agente
Directorioauth/
httpx.Authde SigV4 / reenvío de sesión independiente del framework- …
Directorioapp
- <target_agent_name>_client_<framework>.py Cliente A2A por conexión para cada agente A2A
El sufijo del cliente coincide con el framework de tu agente (_strands o _langchain). Ambos envuelven el mismo ClientConfig firmado independiente del framework: el cliente Strands envuelve un A2AAgent de Strands, mientras que el cliente LangChain maneja el a2a SDK directamente.
Además, el generador:
- Transforma el
agent.pyde tu agente para registrar el agente A2A remoto como una herramienta usando@tool - Agrega el proyecto
agent_connectioncomo una dependencia de workspace de tu proyecto de agente - Actualiza el target
devdel agente para depender del targetdevdel agente destino
Usar el Agente A2A Conectado
Sección titulada «Usar el Agente A2A Conectado»El generador transforma el agent.py de tu agente para envolver el agente A2A remoto como una herramienta. El agente remoto se registra con un delegado decorado con @tool — la importación del decorador y el constructor del agente difieren según el 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], )Ambos clientes son directamente invocables, devolviendo la respuesta del agente remoto, y envuelven un httpx.AsyncClient que firma solicitudes con SigV4 cuando se despliega en AWS y usa un endpoint simple http://localhost:<port>/ cuando LOCAL_DEV=true. El cliente Strands envuelve un A2AAgent de Strands; el cliente LangChain maneja el a2a SDK directamente.
El ID de sesión de AgentCore se propaga al agente remoto automáticamente a través del encabezado X-Amzn-Bedrock-AgentCore-Runtime-Session-Id, independientemente del framework: el servidor del agente vincula la sesión de la solicitud entrante en un contexto asíncrono, y el httpx.Auth firmado del cliente de conexión lo estampa en cada llamada saliente — asegurando consistencia para Bedrock AgentCore Observability.
Infraestructura
Sección titulada «Infraestructura»Después de ejecutar el generador de conexión, necesitas otorgar al agente host permiso para invocar el 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 namespace agentcore de Runtime Configuration por el constructo CDK generado, para que el agente host pueda descubrirlo en tiempo de ejecución.
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}El ARN del runtime AgentCore del agente remoto se registra automáticamente en el namespace agentcore de Runtime Configuration por el módulo Terraform generado, para que el agente host pueda descubrirlo en tiempo de ejecución.
Desarrollo Local
Sección titulada «Desarrollo Local»El generador configura el target dev del agente anfitrión para:
- Iniciar el/los agente(s) A2A conectado(s) automáticamente
- Establecer
LOCAL_DEV=truepara que el cliente generado se conecte directamente ahttp://localhost:<port>/en lugar de AgentCore
Ejecuta el 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>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.