跳转到内容

Python Strands Agent 到 A2A Agent

connection 生成器可以将您的 Python Strands Agent 连接到远程 A2A 代理 — 可以是 TypeScriptPython — 这样您的代理就可以将任务委托给另一个代理作为工具。

该生成器会设置所有必要的配置,使您的代理能够发现并调用远程 A2A 代理,无论是部署到 AWS(通过 Bedrock AgentCore)还是在本地运行时。

在使用此生成器之前,请确保您具备:

  1. 一个包含 Strands Agent 组件的 Python 项目(任何协议)
  2. 一个使用 --protocol=A2A--auth=IAM 生成的 Strands Agent 组件项目(可以是 ts#strands-agentpy#strands-agent)
  3. 两个组件都使用 computeType: BedrockAgentCoreRuntime 创建
  1. 安装 Nx Console VSCode Plugin 如果您尚未安装
  2. 在VSCode中打开Nx控制台
  3. 点击 Generate (UI) 在"Common Nx Commands"部分
  4. 搜索 @aws/nx-plugin - connection
  5. 填写必需参数
    • 点击 Generate

    选择您的宿主代理项目作为源,选择您的 A2A 代理项目作为目标。如果您的项目包含多个组件,请指定 sourceComponenttargetComponent 选项以消除歧义。

    参数 类型 默认值 描述
    sourceProject 必需 string - 源项目
    targetProject 必需 string - 要连接到的目标项目
    sourceComponent string - 要从其连接的源组件(组件名称、相对于源项目根目录的路径或生成器 ID)。使用 '.' 显式选择项目作为源。
    targetComponent string - 要连接到的目标组件(组件名称、相对于目标项目根目录的路径或生成器 ID)。使用 '.' 显式选择项目作为目标。

    生成器会在 packages/common/agent_connection/ 创建一个共享的 agent_connection Python 项目(如果不存在)。每个连接的客户端模块都会生成到这个共享项目中:

    • 文件夹packages/common/agent_connection
      • 文件夹<scope>_agent_connection
        • __init__.py 重新导出每个连接的客户端
        • 文件夹core
          • agentcore_a2a_client.py 带有 SigV4 身份验证的核心 AgentCore A2A 客户端
        • 文件夹app
          • <target_agent_name>_client.py 每个 A2A 代理的连接客户端

    此外,生成器还会:

    • 转换您的代理的 agent.py,使用 @tool 将远程 A2A 代理注册为工具
    • agent_connection 项目添加为您的代理项目的工作区依赖项
    • 更新代理的 serve-local 目标,使其依赖于目标代理的 serve-local 目标

    生成器会转换您的代理的 agent.py,将远程 A2A 代理包装为工具:

    packages/my-project/my_module/agent/agent.py
    from contextlib import contextmanager
    from strands import Agent, tool
    from my_scope_agent_connection import RemoteAgentClient
    @contextmanager
    def 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],
    )

    session_id 参数从调用方传递,确保 Bedrock AgentCore Observability 的一致性。

    在底层,RemoteAgentClient.create(session_id=...) 返回一个配置了 httpx.AsyncClient 的 Strands A2AAgent,该客户端在部署到 AWS 时使用 SigV4 签名请求,在 SERVE_LOCAL=true 时使用普通的 http://localhost:<port>/ 端点。

    运行连接生成器后,您需要授予宿主代理调用远程 A2A 代理的权限。

    packages/infra/src/stacks/application-stack.ts
    const remoteAgent = new RemoteAgent(this, 'RemoteAgent');
    const myAgent = new MyAgent(this, 'MyAgent');
    // Grant the host agent permission to invoke the remote A2A agent
    remoteAgent.grantInvokeAccess(myAgent);

    A2A 代理上的 grantInvokeAccess 会同时配置 bedrock-agentcore:InvokeAgentRuntimebedrock-agentcore:GetAgentCard — A2A 客户端需要这两者来获取代理卡片并发送消息。

    远程代理的 AgentCore 运行时 ARN 会由生成的 CDK 构造自动注册到运行时配置agentcore 命名空间中,以便宿主代理可以在运行时发现它。

    生成器配置宿主代理的 serve-local 目标以:

    1. 自动启动连接的 A2A 代理
    2. 设置 SERVE_LOCAL=true,使生成的客户端直接连接到 http://localhost:<port>/ 而不是 AgentCore

    使用以下命令在本地运行代理:

    Terminal window
    pnpm nx <agent-name>-serve-local <project-name>

    这将启动宿主代理和所有连接的 A2A 代理,宿主代理通过分配的本地端口使用普通 HTTP 调用远程代理。