Python Strands Agent tới A2A Agent
Trình tạo connection có thể kết nối Python Strands Agent của bạn với một agent A2A từ xa — có thể là TypeScript hoặc Python — để agent của bạn có thể ủy quyền cho một agent khác như một công cụ.
Trình tạo thiết lập tất cả các kết nối cần thiết để agent của bạn có thể khám phá và gọi agent A2A từ xa, cả khi triển khai lên AWS (thông qua Bedrock AgentCore) và khi chạy cục bộ.
Điều kiện tiên quyết
Phần tiêu đề “Điều kiện tiên quyết”Trước khi sử dụng trình tạo này, hãy đảm bảo bạn có:
- Một dự án Python với component Strands Agent (bất kỳ giao thức nào)
- Một dự án với component Strands Agent được tạo với
--protocol=A2Avà--auth=IAM(có thể làts#strands-agenthoặcpy#strands-agent) - Cả hai component được tạo với
computeType: BedrockAgentCoreRuntime
Cách sử dụng
Phần tiêu đề “Cách sử dụng”Chạy Trình tạo
Phần tiêu đề “Chạy Trình tạo”- Cài đặt Nx Console VSCode Plugin nếu bạn chưa cài đặt
- Mở Nx Console trong VSCode
- Nhấp
Generate (UI)trong phần "Common Nx Commands" - Tìm kiếm
@aws/nx-plugin - connection - Điền các tham số bắt buộc
- Nhấp
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:connectionBạn cũng có thể thực hiện chạy thử để xem những tệp nào sẽ bị thay đổi
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-runChọn dự án agent chủ của bạn làm nguồn và dự án agent A2A của bạn làm đích. Nếu các dự án của bạn chứa nhiều component, hãy chỉ định các tùy chọn sourceComponent và targetComponent để phân biệt.
Tùy chọn
Phần tiêu đề “Tùy chọn”| Tham số | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
| sourceProject Bắt buộc | string | - | Dự án nguồn |
| targetProject Bắt buộc | string | - | Dự án đích để kết nối tới |
| sourceComponent | string | - | Component nguồn để kết nối từ đó (tên component, đường dẫn tương đối so với thư mục gốc của dự án nguồn, hoặc generator id). Sử dụng '.' để chọn rõ ràng dự án làm nguồn. |
| targetComponent | string | - | Component đích để kết nối tới (tên component, đường dẫn tương đối so với thư mục gốc của dự án đích, hoặc generator id). Sử dụng '.' để chọn rõ ràng dự án làm đích. |
Kết quả đầu ra của Trình tạo
Phần tiêu đề “Kết quả đầu ra của Trình tạo”Trình tạo tạo một dự án Python agent_connection được chia sẻ tại packages/common/agent_connection/ (nếu nó chưa tồn tại). Các module client theo từng kết nối được tạo vào dự án chia sẻ này:
Thư mụcpackages/common/agent_connection
Thư mục<scope>_agent_connection
- __init__.py Xuất lại các client theo từng kết nối
Thư mụccore
- agentcore_a2a_client.py Client A2A AgentCore cốt lõi với xác thực SigV4
Thư mụcapp
- <target_agent_name>_client.py Client theo từng kết nối cho mỗi agent A2A
Ngoài ra, trình tạo:
- Chuyển đổi
agent.pycủa agent của bạn để đăng ký agent A2A từ xa như một công cụ sử dụng@tool - Thêm dự án
agent_connectionnhư một dependency workspace của dự án agent của bạn - Cập nhật target
serve-localcủa agent để phụ thuộc vào targetserve-localcủa agent đích
Sử dụng Agent A2A đã kết nối
Phần tiêu đề “Sử dụng Agent A2A đã kết nối”Trình tạo chuyển đổi agent.py của agent của bạn để bọc agent A2A từ xa như một công cụ:
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], )Tham số session_id được truyền qua từ người gọi, đảm bảo tính nhất quán cho Bedrock AgentCore Observability.
Bên trong, RemoteAgentClient.create(session_id=...) trả về một Strands A2AAgent được cấu hình với một httpx.AsyncClient ký các yêu cầu bằng SigV4 khi triển khai lên AWS, và một endpoint http://localhost:<port>/ đơn giản khi SERVE_LOCAL=true.
Hạ tầng
Phần tiêu đề “Hạ tầng”Sau khi chạy trình tạo kết nối, bạn cần cấp quyền cho agent chủ để gọi agent A2A từ xa.
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 trên agent A2A thiết lập cả bedrock-agentcore:InvokeAgentRuntime và bedrock-agentcore:GetAgentCard — client A2A cần cả hai để lấy agent card và gửi tin nhắn.
ARN runtime AgentCore của agent từ xa được tự động đăng ký trong namespace agentcore của Runtime Configuration bởi CDK construct được tạo, do đó agent chủ có thể khám phá nó tại 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}ARN runtime AgentCore của agent từ xa được tự động đăng ký trong namespace agentcore của Runtime Configuration bởi module Terraform được tạo, do đó agent chủ có thể khám phá nó tại runtime.
Phát triển cục bộ
Phần tiêu đề “Phát triển cục bộ”Trình tạo cấu hình target serve-local của agent chủ để:
- Tự động khởi động (các) agent A2A đã kết nối
- Đặt
SERVE_LOCAL=trueđể client được tạo kết nối trực tiếp đếnhttp://localhost:<port>/thay vì AgentCore
Chạy agent cục bộ với:
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>Điều này sẽ khởi động cả agent chủ và tất cả các agent A2A đã kết nối, với agent chủ gọi các agent từ xa qua HTTP đơn giản trên các cổng cục bộ được chỉ định của chúng.