1. 📖 Giới thiệu
Giao thức Agent2Agent (A2A) được thiết kế để chuẩn hoá hoạt động giao tiếp giữa các tác nhân AI, đặc biệt là những tác nhân được triển khai trong các hệ thống bên ngoài. Trước đây, các giao thức như vậy được thiết lập cho Công cụ có tên là Giao thức ngữ cảnh mô hình (MCP). Đây là một tiêu chuẩn mới nổi để kết nối các mô hình ngôn ngữ lớn (LLM) với dữ liệu và tài nguyên. A2A cố gắng bổ sung cho MCP, trong đó A2A tập trung vào một vấn đề khác, còn MCP tập trung vào việc giảm độ phức tạp để kết nối các tác nhân với công cụ và dữ liệu, A2A tập trung vào cách cho phép các tác nhân cộng tác theo phương thức tự nhiên của họ. Việc này cho phép các trợ lý giao tiếp với tư cách là trợ lý (hoặc với tư cách là người dùng) thay vì với tư cách là công cụ; ví dụ: cho phép giao tiếp qua lại khi bạn muốn đặt hàng.
A2A được thiết kế để bổ sung cho MCP. Trong tài liệu chính thức, các ứng dụng nên sử dụng MCP cho các công cụ và A2A cho các tác nhân – được biểu thị bằng AgentCard ( Chúng ta sẽ thảo luận về vấn đề này sau). Sau đó, các khung có thể sử dụng A2A để giao tiếp với người dùng, các tác nhân từ xa và các tác nhân khác.
Trong bản minh hoạ này, chúng ta sẽ bắt đầu bằng việc triển khai A2A bằng SDK Python. Chúng ta sẽ khám phá một trường hợp sử dụng khi có một trợ lý mua hàng cá nhân có thể giúp chúng ta giao tiếp với các đại lý bán bánh mì kẹp thịt và pizza để xử lý đơn đặt hàng.
A2A sử dụng nguyên tắc máy khách-máy chủ. Sau đây là quy trình A2A điển hình mà bạn sẽ thấy trong hướng dẫn này
- Trước tiên, A2A Client sẽ khám phá tất cả thẻ tác nhân A2A Server có thể truy cập và sử dụng thông tin của thẻ đó để tạo một ứng dụng kết nối
- Khi cần, A2A Client sẽ gửi một thông báo đến A2A Server. Máy chủ sẽ đánh giá thông báo này là một Việc cần làm. Nếu URL của trình nhận thông báo đẩy được định cấu hình trên ứng dụng A2A và được Máy chủ A2A hỗ trợ, thì máy chủ cũng có thể xuất bản trạng thái tiến trình của tác vụ đến điểm cuối nhận trên ứng dụng
- Sau khi hoàn thành tác vụ, máy chủ A2A sẽ gửi phản hồi đến A2A Client
Trong lớp học lập trình này, bạn sẽ sử dụng phương pháp từng bước như sau:
- Chuẩn bị dự án trên Google Cloud
- Thiết lập thư mục công việc cho môi trường lập trình
- Triển khai tác nhân bánh mì kẹp thịt lên Cloud Run
- Triển khai tác nhân pizza lên Cloud Run
- Triển khai trợ lý mua hàng cho Agent Engine
- Tương tác với nhân viên hỗ trợ mua hàng thông qua giao diện địa phương
Tổng quan về cấu trúc
Bạn sẽ triển khai cấu trúc dịch vụ sau
Bạn sẽ triển khai 2 dịch vụ đóng vai trò là máy chủ A2A, tác nhân Burger ( được hỗ trợ bởi khung tác nhân CrewAI) và tác nhân Pizza ( được hỗ trợ bởi khung tác nhân Langgraph). Người dùng sẽ chỉ tương tác trực tiếp với nhân viên hỗ trợ mua hàng chạy bằng khung Agent Development Kit (ADK) và đóng vai trò là ứng dụng A2A.
Mỗi tác nhân này sẽ có môi trường và hoạt động triển khai riêng.
Điều kiện tiên quyết
- Thoải mái làm việc với Python
- Hiểu biết về cấu trúc cơ bản của ngăn xếp đầy đủ bằng cách sử dụng dịch vụ HTTP
Kiến thức bạn sẽ học được
- Cấu trúc cốt lõi của Máy chủ A2A
- Cấu trúc cốt lõi của Ứng dụng A2A
- Triển khai dịch vụ tác nhân lên Cloud Run
- Triển khai dịch vụ tác nhân cho Agent Engine
- Cách A2A Client kết nối với A2A Server
- Cấu trúc yêu cầu và phản hồi trên kết nối không phát trực tuyến
Bạn cần có
- Trình duyệt web Chrome
- Tài khoản Gmail
- Một Dự án trên đám mây đã bật tài khoản thanh toán
Lớp học lập trình này được thiết kế cho nhà phát triển ở mọi cấp độ (kể cả người mới bắt đầu), sử dụng Python trong ứng dụng mẫu. Tuy nhiên, bạn không cần có kiến thức về Python để hiểu các khái niệm được trình bày.
2. 🚀 Chuẩn bị thiết lập môi trường phát triển cho hội thảo
Bước 1: Chọn Dự án đang hoạt động trong Cloud Console
Trong Google Cloud Console, trên trang chọn dự án, hãy chọn hoặc tạo một dự án trên Google Cloud (xem phần trên cùng bên trái của bảng điều khiển)
Nhấp vào biểu tượng đó, bạn sẽ thấy danh sách tất cả dự án của mình như ví dụ này:
Giá trị được biểu thị bằng hộp màu đỏ là MÃ DỰ ÁN và giá trị này sẽ được dùng trong suốt hướng dẫn.
Đảm bảo rằng bạn đã bật tính năng thanh toán cho dự án trên Cloud. Để kiểm tra, hãy nhấp vào biểu tượng trình đơn ☰ ở thanh trên cùng bên trái để xem Trình đơn điều hướng và tìm trình đơn Thanh toán
Nếu bạn thấy thông báo "Tài khoản thanh toán dùng thử Google Cloud Platform" đã được liên kết, thì dự án của bạn đã sẵn sàng để sử dụng cho hướng dẫn này. Nếu không, hãy quay lại đầu hướng dẫn này và đổi tài khoản thanh toán
Bước 2: Làm quen với Cloud Shell
Bạn sẽ sử dụng Cloud Shell cho hầu hết các phần của hướng dẫn, hãy nhấp vào Kích hoạt Cloud Shell ở đầu Google Cloud Console. Nếu hệ thống nhắc bạn uỷ quyền, hãy nhấp vào Uỷ quyền
Sau khi kết nối với Cloud Shell, chúng ta cần kiểm tra xem shell ( hoặc cửa sổ dòng lệnh) đã được xác thực bằng tài khoản của chúng ta hay chưa
gcloud auth list
Nếu bạn thấy gmail cá nhân của mình như ví dụ về đầu ra bên dưới, thì mọi thứ đều ổn
Credentialed Accounts ACTIVE: * ACCOUNT: alvinprayuda@gmail.com To set the active account, run: $ gcloud config set account `ACCOUNT`
Nếu không, hãy thử làm mới trình duyệt và đảm bảo bạn nhấp vào Uỷ quyền khi được nhắc ( quá trình này có thể bị gián đoạn do sự cố kết nối)
Tiếp theo, bạn cũng cần kiểm tra xem shell đã được định cấu hình thành PROJECT ID chính xác mà bạn có hay chưa. Nếu thấy có giá trị bên trong dấu ngoặc đơn ( ) trước biểu tượng $ trong thiết bị đầu cuối ( trong ảnh chụp màn hình bên dưới, giá trị là "a2a-agent-engine"), thì giá trị này cho biết dự án đã được định cấu hình cho phiên shell đang hoạt động của bạn.
Nếu giá trị xuất hiện đã chính xác, bạn có thể bỏ qua lệnh tiếp theo. Tuy nhiên, nếu không chính xác hoặc bị thiếu, hãy chạy lệnh sau
gcloud config set project <YOUR_PROJECT_ID>
Sau đó, hãy sao chép thư mục làm việc của mẫu cho lớp học lập trình này từ GitHub bằng cách chạy lệnh sau. Thao tác này sẽ tạo thư mục đang hoạt động trong thư mục purchasing-concierge-a2a
git clone https://github.com/alphinside/purchasing-concierge-intro-a2a-codelab-starter.git purchasing-concierge-a2a
Bước 3: Làm quen với Cloud Shell Editor và thiết lập thư mục làm việc của ứng dụng
Bây giờ, chúng ta có thể thiết lập trình chỉnh sửa mã để thực hiện một số việc liên quan đến mã hoá. Chúng ta sẽ sử dụng Trình chỉnh sửa Cloud Shell cho việc này
Nhấp vào nút Open Editor (Mở trình chỉnh sửa). Thao tác này sẽ mở Cloud Shell Editor
Sau đó, hãy chuyển đến phần trên cùng của Cloud Shell Editor rồi nhấp vào File->Open Folder (Tệp->Mở thư mục), tìm thư mục username (tên người dùng) của bạn, sau đó tìm thư mục purchasing-concierge-a2a (trợ lý mua hàng a2a) rồi nhấp vào nút OK. Thao tác này sẽ đặt thư mục đã chọn làm thư mục làm việc chính. Trong ví dụ này, tên người dùng là alvinprayuda, do đó, đường dẫn thư mục được hiển thị bên dưới
Giờ đây, Cloud Shell Editor sẽ có dạng như sau
Bây giờ, hãy mở cửa sổ dòng lệnh cho trình chỉnh sửa. Bạn có thể thực hiện việc này bằng cách nhấp vào Terminal -> New Terminal (Cửa sổ dòng lệnh -> Cửa sổ dòng lệnh mới) trên thanh trình đơn hoặc sử dụng tổ hợp phím Ctrl + Shift + C. Thao tác này sẽ mở một cửa sổ dòng lệnh ở phần dưới cùng của trình duyệt
Thiết bị đầu cuối đang hoạt động hiện tại của bạn phải nằm trong thư mục làm việc purchasing-concierge-a2a. Chúng ta sẽ sử dụng Python 3.12 trong lớp học lập trình này và sẽ dùng trình quản lý dự án uv python để đơn giản hoá nhu cầu tạo và quản lý phiên bản python cũng như môi trường ảo. Gói uv này đã được cài đặt sẵn trên Cloud Shell.
Chạy lệnh này để cài đặt các phần phụ thuộc cần thiết cho môi trường ảo trong thư mục .venv
uv sync --frozen
Kiểm tra pyproject.toml để xem các phần phụ thuộc đã khai báo cho hướng dẫn này là a2a-sdk, google-adk, and gradio
.
Bây giờ, chúng ta sẽ cần bật các API bắt buộc thông qua lệnh bên dưới. Quá trình này có thể mất một chút thời gian.
gcloud services enable aiplatform.googleapis.com \
run.googleapis.com \
cloudbuild.googleapis.com \
cloudresourcemanager.googleapis.com
Khi thực thi lệnh thành công, bạn sẽ thấy một thông báo tương tự như thông báo dưới đây:
Operation "operations/..." finished successfully.
3. 🚀 Triển khai các nhân viên bán hàng từ xa A2A lên Cloud Run
Trong bước này, chúng ta sẽ triển khai 2 tác nhân bán hàng từ xa này, được đánh dấu bằng hộp màu đỏ. Tác nhân bánh mì kẹp thịt sẽ được hỗ trợ bởi khung tác nhân CrewAI và tác nhân bánh pizza sẽ được hỗ trợ bởi tác nhân Langgraph
4. 🚀 Triển khai Burger Seller Agent – Máy chủ A2A
Mã nguồn của tác nhân burger nằm trong thư mục remote_seller_agents/burger_agent.
Tất cả các tệp có trong thư mục remote_seller_agents/burger_agent đều đã đủ để triển khai tác nhân của chúng ta vào Cloud Run để có thể truy cập dưới dạng một dịch vụ. Chạy lệnh sau để triển khai
gcloud run deploy burger-agent \
--source remote_seller_agents/burger_agent \
--port=8080 \
--allow-unauthenticated \
--min 1 \
--region us-central1 \
--update-env-vars GOOGLE_CLOUD_LOCATION=us-central1 \
--update-env-vars GOOGLE_CLOUD_PROJECT={your-project-id}
Nếu bạn nhận được lời nhắc rằng một kho lưu trữ vùng chứa sẽ được tạo để triển khai từ nguồn, hãy trả lời Y. Sau khi triển khai thành công, nhật ký sẽ có dạng như sau.
Service [burger-agent] revision [burger-agent-xxxxx-xxx] has been deployed and is serving 100 percent of traffic. Service URL: https://burger-agent-xxxxxxxxx.us-central1.run.app
Phần xxxx
ở đây sẽ là một giá trị nhận dạng duy nhất khi chúng tôi triển khai dịch vụ này.
Mở một thẻ trình duyệt mới rồi chuyển đến tuyến đường https://burger-agent-xxxxxxxxx.us-central1.run.app/.well-known/agent.json
của các dịch vụ đại lý bán bánh mì kẹp thịt được triển khai thông qua trình duyệt. Đây là URL để truy cập vào thẻ tác nhân máy chủ A2A đã triển khai.
Nếu triển khai thành công, bạn sẽ thấy phản hồi như bên dưới trong trình duyệt khi truy cập vào thẻ đại lý
Đây là thông tin thẻ nhân viên hỗ trợ dạng nút hamburger mà người dùng có thể truy cập để khám phá.
Lưu ý rằng giá trị url
vẫn được đặt ở http://0.0.0.0:8080/
tại đây. Giá trị url
này phải là thông tin chính để A2A Client gửi thông báo từ thế giới bên ngoài và chưa được định cấu hình đúng cách.
Chúng ta cần cập nhật giá trị này thành URL của dịch vụ tác nhân burger bằng cách thêm một biến môi trường khác HOST_OVERRIDE
.
Cập nhật giá trị URL của Burger Agent trên thẻ Agent thông qua biến môi trường
Để thêm HOST_OVERRIDE
vào dịch vụ tác nhân burger, hãy làm theo các bước sau
- Tìm Cloud Run trên thanh tìm kiếm ở đầu Cloud Console
- Nhấp vào dịch vụ burger-agent Cloud Run đã triển khai trước đó
- Sao chép URL của dịch vụ burger, sau đó nhấp vào Chỉnh sửa và triển khai bản sửa đổi mới
- Sau đó, nhấp vào mục Biến và khoá bí mật
- Sau đó, nhấp vào Thêm biến và đặt
HOST_OVERRIDE
giá trị thành URL của dịch vụ ( URL có mẫuhttps://burger-agent-xxxxxxxxx.us-central1.run.app
)
- Cuối cùng, hãy nhấp vào nút deploy (triển khai) để triển khai lại dịch vụ của bạn
Khi bạn truy cập lại thẻ tác nhân burger-agent trong trình duyệt https://burger-agent-xxxxxxxxx.us-central1.run.app/.well-known/agent.json
, giá trị url
sẽ được định cấu hình đúng cách
5. 🚀 Triển khai Pizza Seller Agent – Máy chủ A2A
Tương tự, mã nguồn của tác nhân pizza nằm trong thư mục remote_seller_agents/pizza_agent.
Tương tự như bước triển khai burger-agent trước đó, tất cả các tệp có trong thư mục remote_seller_agents/pizza_agent đều đã đủ để triển khai tác nhân của chúng ta vào Cloud Run để có thể truy cập dưới dạng một dịch vụ. Chạy lệnh sau để triển khai
gcloud run deploy pizza-agent \
--source remote_seller_agents/pizza_agent \
--port=8080 \
--allow-unauthenticated \
--min 1 \
--region us-central1 \
--update-env-vars GOOGLE_CLOUD_LOCATION=us-central1 \
--update-env-vars GOOGLE_CLOUD_PROJECT={your-project-id}
Sau khi triển khai thành công, nhật ký sẽ có dạng như sau.
Service [pizza-agent] revision [pizza-agent-xxxxx-xxx] has been deployed and is serving 100 percent of traffic. Service URL: https://pizza-agent-xxxxxxxxx.us-central1.run.app
Phần xxxx
ở đây sẽ là một giá trị nhận dạng duy nhất khi chúng tôi triển khai dịch vụ này.
Tương tự với tác nhân bánh mì kẹp thịt, khi bạn cố gắng truy cập vào tuyến đường https://pizza-agent-xxxxxxxxx.us-central1.run.app/.well-known/agent.json
của các dịch vụ tác nhân bánh pizza đã triển khai thông qua trình duyệt để truy cập vào thẻ tác nhân máy chủ A2A, giá trị url
của tác nhân bánh pizza trên thẻ tác nhân chưa được định cấu hình đúng cách. Chúng ta cũng cần thêm HOST_OVERRIDE
vào biến môi trường của nó
Cập nhật giá trị URL của Pizza Agent trên thẻ Agent thông qua biến môi trường
Để thêm HOST_OVERRIDE
vào dịch vụ đại lý bán bánh pizza, hãy làm theo các bước sau
- Tìm Cloud Run trên thanh tìm kiếm ở đầu Cloud Console
- Nhấp vào dịch vụ pizza-agent Cloud Run đã triển khai trước đó
- Nhấp vào Chỉnh sửa và triển khai bản sửa đổi mới
- Sao chép URL của dịch vụ giao bánh pizza, sau đó nhấp vào mục Variable & Secrets (Biến và khoá bí mật)
- Sau đó, nhấp vào Thêm biến và đặt
HOST_OVERRIDE
giá trị thành URL của dịch vụ ( URL có mẫuhttps://pizza-agent-xxxxxxxxx.us-central1.run.app
)
- Cuối cùng, hãy nhấp vào nút deploy (triển khai) để triển khai lại dịch vụ của bạn
Giờ đây, khi bạn truy cập lại thẻ đại lý pizza-agent trong trình duyệt https://pizza-agent-xxxxxxxxx.us-central1.run.app/.well-known/agent.json
, giá trị url
sẽ được định cấu hình đúng cách
Đến đây, chúng ta đã triển khai thành công cả dịch vụ bánh kẹp và bánh pizza lên Cloud Run.
6. 🚀 Triển khai Trợ lý mua hàng – Ứng dụng A2A cho Công cụ tác nhân
Trong bước này, chúng ta sẽ triển khai trợ lý mua hàng. Đây là nhân viên hỗ trợ mà chúng ta sẽ tương tác.
Mã nguồn của trợ lý mua hàng nằm trong thư mục purchasing_concierge. Bạn có thể kiểm tra quá trình khởi tạo tác nhân trên tập lệnh purchasing_concierge/purchasing_agent.py.
Hãy làm theo các bước sau để triển khai :
- Trước tiên, chúng ta cần tạo bộ nhớ dàn dựng trong Cloud Storage
gcloud storage buckets create gs://purchasing-concierge-{your-project-id} --location=us-central1
- Bây giờ, trước tiên chúng ta cần chuẩn bị biến .env, hãy sao chép .env.example vào tệp .env
cp .env.example .env
- Bây giờ, hãy mở tệp .env, bạn sẽ thấy nội dung sau
GOOGLE_GENAI_USE_VERTEXAI=TRUE GOOGLE_CLOUD_PROJECT={your-project-id} GOOGLE_CLOUD_LOCATION=us-central1 STAGING_BUCKET=gs://purchasing-concierge-{your-project-id} PIZZA_SELLER_AGENT_URL={your-pizza-agent-url} BURGER_SELLER_AGENT_URL={your-burger-agent-url} AGENT_ENGINE_RESOURCE_NAME={your-agent-engine-resource-name}
Tác nhân này sẽ giao tiếp với tác nhân bánh mì kẹp thịt và pizza, do đó, chúng ta cần cung cấp thông tin đăng nhập phù hợp cho cả hai. Chúng ta sẽ cần cập nhật PIZZA_SELLER_AGENT_URL và BURGER_SELLER_AGENT_URL bằng URL Cloud Run từ các bước trước.
Nếu bạn quên, hãy truy cập vào bảng điều khiển Cloud Run. Nhập "Cloud Run" vào thanh tìm kiếm ở đầu bảng điều khiển, rồi nhấp chuột phải vào biểu tượng Cloud Run để mở trong một thẻ mới
Bạn sẽ thấy các dịch vụ trước đây của chúng tôi về tác nhân bán hàng từ xa được triển khai như minh hoạ bên dưới
Để xem URL công khai của các dịch vụ đó, hãy nhấp vào một trong các dịch vụ và bạn sẽ được chuyển hướng đến trang Chi tiết dịch vụ. Bạn có thể thấy URL ở khu vực trên cùng, ngay bên cạnh thông tin về Khu vực
Biến môi trường cuối cùng sẽ có dạng như sau
GOOGLE_GENAI_USE_VERTEXAI=TRUE GOOGLE_CLOUD_PROJECT={your-project-id} GOOGLE_CLOUD_LOCATION=us-central1 STAGING_BUCKET=gs://purchasing-concierge-{your-project-id} PIZZA_SELLER_AGENT_URL=https://pizza-agent-xxxxx.us-central1.run.app BURGER_SELLER_AGENT_URL=https://burger-agent-xxxxx.us-central1.run.app AGENT_ENGINE_RESOURCE_NAME={your-agent-engine-resource-name}
- Giờ đây, chúng ta đã sẵn sàng triển khai trợ lý mua hàng. Chúng ta sẽ triển khai nó vào công cụ tác nhân và mã triển khai nằm trong tập lệnh
deploy_to_agent_engine.py
.
Chúng ta có thể triển khai bằng cách chạy tập lệnh:
uv run deploy_to_agent_engine.py
Sau khi triển khai thành công, nhật ký sẽ có dạng như sau. Thao tác này sẽ cho bạn biết tên tài nguyên Agent Engine là "projects/xxxx/locations/us-central1/reasoningEngines/yyyy"
AgentEngine created. Resource name: projects/xxxx/locations/us-central1/reasoningEngines/yyyy To use this AgentEngine in another session: agent_engine = vertexai.agent_engines.get('projects/xxxx/locations/us-central1/reasoningEngines/yyyy) Deployed remote app resource: projects/xxxx/locations/us-central1/reasoningEngines/xxxx
Và khi chúng ta kiểm tra nó trong trang tổng quan về công cụ đại lý (tìm kiếm "công cụ đại lý" trên thanh tìm kiếm), nó sẽ cho thấy việc triển khai trước đó của chúng ta
Bạn cũng có thể kiểm tra để đảm bảo tên tài nguyên Agent Engine xuất hiện ở đó.Sau đó, chúng ta có thể sử dụng tên tài nguyên này để kiểm thử
Sau đó, hãy cập nhật AGENT_ENGINE_RESOURCE_NAME
trong tệp .env
bằng giá trị này. Đảm bảo rằng bạn cung cấp đúng tên tài nguyên công cụ đại lý. Tệp .env
của bạn sẽ có dạng như sau:
GOOGLE_GENAI_USE_VERTEXAI=TRUE
GOOGLE_CLOUD_PROJECT={your-project-id}
GOOGLE_CLOUD_LOCATION=us-central1
STAGING_BUCKET=gs://purchasing-concierge-{your-project-id}
PIZZA_SELLER_AGENT_URL=https://pizza-agent-xxxxx.us-central1.run.app
BURGER_SELLER_AGENT_URL=https://burger-agent-xxxxx.us-central1.run.app
AGENT_ENGINE_RESOURCE_NAME=projects/xxxx/locations/us-central1/reasoningEngines/yyyy
Kiểm thử Agent đã triển khai trên Agent Engine
Bạn có thể tương tác với công cụ tác nhân thông qua lệnh curl
và SDK. Ví dụ: hãy chạy lệnh sau để thử tương tác với tác nhân đã triển khai.
Bạn có thể thử gửi truy vấn này để kiểm tra xem nhân viên hỗ trợ đã được triển khai thành công hay chưa. Chạy tập lệnh test_agent_engine.sh
sau
bash test_agent_engine.sh
Bạn có thể kiểm tra tập lệnh và thấy rằng chúng tôi cố gắng yêu cầu "Liệt kê thực đơn bánh mì kẹp thịt hiện có" cho trợ lý
Nếu thành công, bạn sẽ thấy một số sự kiện phản hồi được truyền trực tuyến trên bảng điều khiển của mình như sau
{ "content": { "parts": [ { "text": "Here is our burger menu:\n- Classic Cheeseburger: IDR 85K\n- Double Cheeseburger: IDR 110K\n- Spicy Chicken Burger: IDR 80K\n- Spicy Cajun Burger: IDR 85K" } ], "role": "model" }, "usage_metadata": { "candidates_token_count": 51, "candidates_tokens_details": [ { "modality": "TEXT", "token_count": 51 } ], "prompt_token_count": 907, "prompt_tokens_details": [ { "modality": "TEXT", "token_count": 907 } ], "total_token_count": 958, "traffic_type": "ON_DEMAND" }, "invocation_id": "e-14679918-af68-45f1-b942-cf014368a733", "author": "purchasing_agent", "actions": { "state_delta": {}, "artifact_delta": {}, "requested_auth_configs": {} }, "id": "dbe7fc43-b82a-4f3e-82aa-dd97afa8f15b", "timestamp": 1754287348.941454 }
Chúng ta sẽ thử sử dụng giao diện người dùng ở bước tiếp theo, tuy nhiên, trước tiên, hãy thảo luận về các thành phần cốt lõi và quy trình điển hình của ứng dụng A2A
7. 🚀 Kiểm thử tích hợp và kiểm tra tải trọng
Bây giờ, hãy kiểm tra trợ lý mua hàng của chúng ta bằng cách tương tác với nhân viên từ xa thông qua giao diện người dùng trên web. Chạy lệnh sau để triển khai một ứng dụng Gradio. Để chạy ứng dụng này, bạn phải điền chính xác vào tệp .env
uv run purchasing_concierge_ui.py
Nếu thành công, bạn sẽ thấy kết quả sau
* Running on local URL: http://0.0.0.0:8080 * To create a public link, set `share=True` in `launch()`.
Sau đó, hãy nhấn Ctrl + nhấp vào URL http://0.0.0.0:8080 trên thiết bị đầu cuối hoặc nhấp vào nút xem trước trên web để mở giao diện người dùng web
Hãy thử trò chuyện như sau :
- Cho tôi xem thực đơn bánh mì kẹp thịt và pizza
- Tôi muốn đặt 1 chiếc pizza gà nướng và 1 chiếc bánh mì kẹp thịt Cajun cay
Sau đó, tiếp tục trò chuyện cho đến khi bạn hoàn tất đơn đặt hàng. Kiểm tra xem hoạt động tương tác diễn ra như thế nào, cũng như lệnh gọi và phản hồi của công cụ là gì? Hình ảnh sau đây là một ví dụ về kết quả tương tác.
Chúng ta có thể thấy rằng việc giao tiếp với 2 tác nhân khác nhau sẽ mang lại 2 hành vi khác nhau và A2A có thể xử lý tốt việc này. Nhân viên bán bánh pizza chấp nhận trực tiếp yêu cầu của nhân viên mua hàng, trong khi nhân viên bán bánh hamburger cần chúng tôi xác nhận trước khi tiến hành yêu cầu và sau khi chúng tôi xác nhận, nhân viên bán bánh hamburger có thể dựa vào thông tin xác nhận đó.
Giờ đây, chúng ta đã hoàn thành các khái niệm cơ bản về A2A và xem cách khái niệm này được triển khai dưới dạng cấu trúc máy khách và máy chủ
8. 💡 [Giải thích mã] Khái niệm và cách triển khai máy chủ A2A
Bạn có thể kiểm tra quá trình khởi tạo tác nhân người bán từ xa trên tập lệnh remote_seller_agents/*/agent.py. Sau đây là đoạn mã của các nhân viên bán hàng.
Burger Agent
from crewai import Agent, Crew, LLM, Task, Process
from crewai.tools import tool
...
model = LLM(
model="vertex_ai/gemini-2.5-flash-lite", # Use base model name without provider prefix
)
burger_agent = Agent(
role="Burger Seller Agent",
goal=(
"Help user to understand what is available on burger menu and price also handle order creation."
),
backstory=("You are an expert and helpful burger seller agent."),
verbose=False,
allow_delegation=False,
tools=[create_burger_order],
llm=model,
)
agent_task = Task(
description=self.TaskInstruction,
agent=burger_agent,
expected_output="Response to the user in friendly and helpful manner",
)
crew = Crew(
tasks=[agent_task],
agents=[burger_agent],
verbose=False,
process=Process.sequential,
)
inputs = {"user_prompt": query, "session_id": sessionId}
response = crew.kickoff(inputs)
return response
...
Pizza Agent
from langchain_google_vertexai import ChatVertexAI
from langgraph.prebuilt import create_react_agent
...
self.model = ChatVertexAI(
model="gemini-2.5-flash-lite",
location=os.getenv("GOOGLE_CLOUD_LOCATION"),
project=os.getenv("GOOGLE_CLOUD_PROJECT"),
)
self.tools = [create_pizza_order]
self.graph = create_react_agent(
self.model,
tools=self.tools,
checkpointer=memory,
prompt=self.SYSTEM_INSTRUCTION,
)
...
Như bạn có thể thấy, 2 tác nhân này được xây dựng bằng các khung hoàn toàn khác nhau ( CrewAI và Langgraph) so với tác nhân máy khách ( ADK). Với A2A, đây không phải là vấn đề, chúng ta không cần các tác nhân này chia sẻ mã nội bộ để giao tiếp với nhau, không quan trọng việc chúng đang sử dụng khung nào, ngôn ngữ nào được sử dụng hoặc nơi chúng được triển khai.
Các thành phần cốt lõi của máy chủ A2A
Bây giờ, hãy thảo luận về khái niệm và các thành phần cốt lõi của máy chủ A2A
Thẻ của nhân viên hỗ trợ
Mỗi A2A Server phải có một thẻ đại lý có thể truy cập trên tài nguyên /.well-known/agent.json
. Việc này nhằm hỗ trợ giai đoạn khám phá trên A2A Client, cung cấp thông tin và bối cảnh đầy đủ về cách truy cập vào trợ lý ảo và biết tất cả các chức năng của trợ lý ảo. Điều này tương tự như tài liệu API được ghi lại đầy đủ bằng Swagger hoặc Postman.
Đây là nội dung của thẻ nhân viên hỗ trợ về bánh mì kẹp mà chúng tôi đã triển khai
{
"capabilities": {
"streaming": true
},
"defaultInputModes": [
"text",
"text/plain"
],
"defaultOutputModes": [
"text",
"text/plain"
],
"description": "Helps with creating burger orders",
"name": "burger_seller_agent",
"protocolVersion": "0.2.6",
"skills": [
{
"description": "Helps with creating burger orders",
"examples": [
"I want to order 2 classic cheeseburgers"
],
"id": "create_burger_order",
"name": "Burger Order Creation Tool",
"tags": [
"burger order creation"
]
}
],
"url": "https://burger-agent-109790610330.us-central1.run.app",
"version": "1.0.0"
}
Những thẻ tác nhân này làm nổi bật nhiều thành phần quan trọng, chẳng hạn như kỹ năng của tác nhân, khả năng truyền phát trực tiếp, các phương thức được hỗ trợ, phiên bản giao thức và những thành phần khác.
Bạn có thể sử dụng tất cả thông tin này để phát triển một cơ chế giao tiếp phù hợp, nhờ đó ứng dụng A2A có thể giao tiếp đúng cách. Phương thức và cơ chế xác thực được hỗ trợ đảm bảo có thể thiết lập thông tin liên lạc một cách thích hợp và thông tin skills
của nhân viên hỗ trợ có thể được nhúng vào lời nhắc hệ thống của ứng dụng A2A để cung cấp cho nhân viên hỗ trợ của khách hàng bối cảnh về các chức năng và kỹ năng của nhân viên hỗ trợ từ xa sẽ được gọi. Bạn có thể xem các trường chi tiết hơn cho thẻ đại lý này trong tài liệu này.
Trong mã của chúng tôi, việc triển khai thẻ đại lý được thiết lập bằng A2A python sdk, hãy kiểm tra đoạn mã remote_seller_agents/burger_agent/main.py bên dưới để biết cách triển khai
...
capabilities = AgentCapabilities(streaming=True)
skill = AgentSkill(
id="create_burger_order",
name="Burger Order Creation Tool",
description="Helps with creating burger orders",
tags=["burger order creation"],
examples=["I want to order 2 classic cheeseburgers"],
)
agent_host_url = (
os.getenv("HOST_OVERRIDE")
if os.getenv("HOST_OVERRIDE")
else f"http://{host}:{port}/"
)
agent_card = AgentCard(
name="burger_seller_agent",
description="Helps with creating burger orders",
url=agent_host_url,
version="1.0.0",
defaultInputModes=BurgerSellerAgent.SUPPORTED_CONTENT_TYPES,
defaultOutputModes=BurgerSellerAgent.SUPPORTED_CONTENT_TYPES,
capabilities=capabilities,
skills=[skill],
)
...
Chúng ta có thể thấy một số trường như:
AgentCapabilities
: Khai báo các hàm bổ sung không bắt buộc mà dịch vụ tác nhân hỗ trợ,chẳng hạn như khả năng hỗ trợ truyền phát trực tuyến và/hoặc thông báo đẩyAgentSkill
: Công cụ hoặc chức năng mà trợ lý hỗ trợInput/OutputModes
: Phương thức nhập/xuất được hỗ trợUrl
: Địa chỉ để giao tiếp với tác nhân
Trong cấu hình này, chúng tôi cung cấp một quy trình tạo URL máy chủ lưu trữ tác nhân động để bạn dễ dàng chuyển đổi giữa kiểm thử cục bộ và triển khai trên đám mây. Đó là lý do chúng ta cần thêm biến HOST_OVERRIDE
ở bước trước.
Hàng đợi tác vụ và Trình thực thi tác nhân
Máy chủ A2A có thể xử lý các yêu cầu từ nhiều tác nhân hoặc người dùng và có thể tách biệt hoàn toàn từng tác vụ. Để hình dung rõ hơn về bối cảnh của những hình ảnh này, bạn có thể xem xét hình ảnh bên dưới
Do đó, mỗi máy chủ A2A phải có khả năng theo dõi các tác vụ đến và lưu trữ thông tin thích hợp về tác vụ đó. SDK A2A cung cấp các mô-đun để giải quyết thách thức này trong máy chủ A2A. Trước tiên, chúng ta có thể tạo thực thể cho logic về cách xử lý yêu cầu đến. Bằng cách kế thừa lớp trừu tượng AgentExecutor, chúng ta có thể kiểm soát cách mình muốn quản lý việc thực thi và huỷ tác vụ. Bạn có thể kiểm tra ví dụ về quy trình triển khai này tại mô-đun remote_seller_agents/burger_agent/agent_executor.py
( đường dẫn tương tự cho trường hợp người bán bánh pizza)
...
class BurgerSellerAgentExecutor(AgentExecutor):
"""Burger Seller AgentExecutor."""
def __init__(self):
self.agent = BurgerSellerAgent()
async def execute(
self,
context: RequestContext,
event_queue: EventQueue,
) -> None:
query = context.get_user_input()
try:
result = self.agent.invoke(query, context.context_id)
print(f"Final Result ===> {result}")
parts = [Part(root=TextPart(text=str(result)))]
await event_queue.enqueue_event(
completed_task(
context.task_id,
context.context_id,
[new_artifact(parts, f"burger_{context.task_id}")],
[context.message],
)
)
except Exception as e:
print("Error invoking agent: %s", e)
raise ServerError(error=ValueError(f"Error invoking agent: {e}")) from e
async def cancel(
self, request: RequestContext, event_queue: EventQueue
) -> Task | None:
raise ServerError(error=UnsupportedOperationError())
...
Trong đoạn mã trên, chúng ta triển khai một sơ đồ xử lý cơ bản, trong đó tác nhân sẽ được gọi trực tiếp khi yêu cầu đến và gửi các sự kiện tác vụ đã hoàn thành sau khi hoàn tất lệnh gọi. Tuy nhiên, chúng ta không triển khai phương thức huỷ ở đây vì phương thức này được coi là một thao tác chạy trong thời gian ngắn.
Sau khi tạo trình thực thi, chúng ta có thể trực tiếp sử dụng DefaultRequestHandler, InMemoryTaskStore và A2AStarletteApplication tích hợp sẵn để khởi động Máy chủ HTTP. Bạn có thể kiểm tra quy trình triển khai này trong remote_seller_agents/burger_agent/__main__.py
...
request_handler = DefaultRequestHandler(
agent_executor=BurgerSellerAgentExecutor(),
task_store=InMemoryTaskStore(),
)
server = A2AStarletteApplication(
agent_card=agent_card, http_handler=request_handler
)
uvicorn.run(server.build(), host=host, port=port)
...
Mô-đun này sẽ cung cấp cho bạn phương thức triển khai tuyến /.well-known/agent.json
để truy cập vào thẻ đại lý, đồng thời cung cấp điểm cuối POST để hỗ trợ giao thức A2A
Tóm tắt
Tóm lại, cho đến nay, A2A Server mà chúng tôi triển khai bằng Python SDK có thể hỗ trợ 2 chức năng bên dưới:
- Xuất bản thẻ tác nhân trên tuyến đường
/.well-known/agent.json
- Xử lý yêu cầu JSON-RPC bằng cách xếp hàng tác vụ trong bộ nhớ
Bạn có thể kiểm tra điểm truy cập khi bắt đầu các chức năng này trên tập lệnh __main__.py
( trên remote_seller_agents/burger_agent
hoặc remote_seller_agents/pizza_agent
) .
9. 💡 [Giải thích mã] Triển khai Agent Engine
Sau đây là đoạn mã của trợ lý mua hàng trong purchasing_concierge/purchasing_agent.py:
from google.adk import Agent
...
def create_agent(self) -> Agent:
return Agent(
model="gemini-2.5-flash-lite",
name="purchasing_agent",
instruction=self.root_instruction,
before_model_callback=self.before_model_callback,
before_agent_callback=self.before_agent_callback,
description=(
"This purchasing agent orchestrates the decomposition of the user purchase request into"
" tasks that can be performed by the seller agents."
),
tools=[
self.send_task,
],
)
...
Nhân viên hỗ trợ này được xây dựng bằng ADK và triển khai trên Agent Engine.
Vertex AI Agent Engine là một bộ dịch vụ cho phép nhà phát triển triển khai, quản lý và mở rộng quy mô các tác nhân AI trong quá trình sản xuất. Nền tảng này xử lý cơ sở hạ tầng để mở rộng quy mô các tác nhân trong quá trình sản xuất, nhờ đó chúng ta có thể tập trung vào việc tạo ứng dụng. Bạn có thể đọc thêm về vấn đề này trong tài liệu này . Nếu trước đây chúng ta cần chuẩn bị các tệp cần thiết để triển khai dịch vụ tác nhân (chẳng hạn như tập lệnh máy chủ chính và Dockerfile), thì trong trường hợp này, chúng ta có thể triển khai tác nhân trực tiếp từ tập lệnh Python mà không cần phát triển dịch vụ phụ trợ của riêng mình bằng cách sử dụng kết hợp ADK và Agent Engine.
Trong hướng dẫn này, chúng ta sẽ triển khai bằng tập lệnh deploy_to_agent_engine.py
. Nội dung của tập lệnh này được trình bày bên dưới
import vertexai
from vertexai.preview import reasoning_engines
from vertexai import agent_engines
from dotenv import load_dotenv
import os
from purchasing_concierge.agent import root_agent
load_dotenv()
PROJECT_ID = os.getenv("GOOGLE_CLOUD_PROJECT")
LOCATION = os.getenv("GOOGLE_CLOUD_LOCATION")
STAGING_BUCKET = os.getenv("STAGING_BUCKET")
vertexai.init(
project=PROJECT_ID,
location=LOCATION,
staging_bucket=STAGING_BUCKET,
)
adk_app = reasoning_engines.AdkApp(
agent=root_agent,
)
remote_app = agent_engines.create(
agent_engine=adk_app,
display_name="purchasing-concierge",
requirements=[
"google-cloud-aiplatform[adk,agent_engines]",
"a2a-sdk==0.2.16",
],
extra_packages=[
"./purchasing_concierge",
],
env_vars={
"GOOGLE_GENAI_USE_VERTEXAI": os.environ["GOOGLE_GENAI_USE_VERTEXAI"],
"PIZZA_SELLER_AGENT_URL": os.environ["PIZZA_SELLER_AGENT_URL"],
"BURGER_SELLER_AGENT_URL": os.environ["BURGER_SELLER_AGENT_URL"],
},
)
print(f"Deployed remote app resource: {remote_app.resource_name}")
Đây là các bước cần thiết để triển khai tác nhân ADK của chúng tôi vào công cụ tác nhân. Trước tiên, chúng ta cần tạo một đối tượng AdkApp
từ root_agent
ADK. Sau đó, chúng ta có thể chạy phương thức agent_engines.create
bằng cách cung cấp đối tượng adk_app
, chỉ định các yêu cầu trong trường requirements
, chỉ định đường dẫn thư mục tác nhân trong extra_packages
( bạn cũng có thể cung cấp các thư mục và tệp khác nếu cần tại đây) và cung cấp các biến môi trường cần thiết.
10. 💡 [Giải thích mã] Khái niệm và cách triển khai ứng dụng A2A
Hình ảnh minh hoạ ở trên là quy trình tương tác A2A điển hình:
- Ứng dụng khách sẽ cố gắng tìm mọi thẻ đại lý đã xuất bản trong URL đại lý từ xa được cung cấp trong tuyến đường
/.well-known/agent.json
- Sau đó, khi cần, nó sẽ gửi một Thông báo đến tác nhân đó kèm theo thông báo và các tham số siêu dữ liệu cần thiết ( ví dụ: mã phiên, bối cảnh trước đây, v.v.). Máy chủ sẽ coi Thông báo này là một Nhiệm vụ cần hoàn thành
- Quy trình máy chủ A2A xử lý yêu cầu. Nếu máy chủ hỗ trợ thông báo đẩy, thì máy chủ cũng có thể xuất bản một số thông báo trong quá trình xử lý tác vụ ( Chức năng này nằm ngoài phạm vi của lớp học lập trình này)
- Sau khi hoàn tất, máy chủ A2A sẽ gửi lại phản hồi cho ứng dụng
Một số đối tượng cốt lõi cho các hoạt động tương tác nêu trên là những mục này (bạn có thể đọc thêm thông tin chi tiết tại đây) :
- Tin nhắn: Một lượt giao tiếp giữa khách hàng và nhân viên hỗ trợ từ xa
- Tác vụ: Đơn vị công việc cơ bản do A2A quản lý, được xác định bằng một mã nhận dạng duy nhất
- Cấu phần phần mềm: Đầu ra (ví dụ: tài liệu, hình ảnh, dữ liệu có cấu trúc) do tác nhân tạo ra trong quá trình thực hiện một tác vụ, bao gồm các Phần
- Part: Đơn vị nội dung nhỏ nhất trong một Message hoặc Artifact. Phần này có thể là văn bản, hình ảnh, video, tệp, v.v.
Khám phá thẻ
Khi dịch vụ A2A Client đang được khởi động, quy trình thông thường là cố gắng lấy thông tin thẻ đại lý và lưu trữ thông tin đó để dễ dàng truy cập khi cần. Trong lớp học lập trình này, chúng ta sẽ triển khai nó trên before_agent_callback
, bạn có thể xem quá trình triển khai trong purchasing_concierge/purchasing_agent.py
, hãy xem đoạn mã bên dưới
...
async def before_agent_callback(self, callback_context: CallbackContext):
if not self.a2a_client_init_status:
httpx_client = httpx.AsyncClient(timeout=httpx.Timeout(timeout=30))
for address in self.remote_agent_addresses:
card_resolver = A2ACardResolver(
base_url=address, httpx_client=httpx_client
)
try:
card = await card_resolver.get_agent_card()
remote_connection = RemoteAgentConnections(
agent_card=card, agent_url=card.url
)
self.remote_agent_connections[card.name] = remote_connection
self.cards[card.name] = card
except httpx.ConnectError:
print(f"ERROR: Failed to get agent card from : {address}")
agent_info = []
for ra in self.list_remote_agents():
agent_info.append(json.dumps(ra))
self.agents = "\n".join(agent_info)
...
Ở đây, chúng ta sẽ cố gắng truy cập vào tất cả các thẻ nhân viên hỗ trợ có sẵn bằng cách sử dụng mô-đun A2ACardResolver
của ứng dụng A2A tích hợp sẵn, sau đó thu thập thông tin kết nối cần thiết để gửi tin nhắn cho nhân viên hỗ trợ. Sau đó, chúng ta cũng cần liệt kê tất cả nhân viên hỗ trợ có sẵn và thông số kỹ thuật của họ vào lời nhắc để nhân viên hỗ trợ của chúng ta biết rằng họ có thể giao tiếp với những nhân viên hỗ trợ này
Công cụ Nhắc và gửi việc cần làm
Đây là câu lệnh và công cụ mà chúng tôi cung cấp cho nhân viên hỗ trợ ADK tại đây
...
def root_instruction(self, context: ReadonlyContext) -> str:
current_agent = self.check_active_agent(context)
return f"""You are an expert purchasing delegator that can delegate the user product inquiry and purchase request to the
appropriate seller remote agents.
Execution:
- For actionable tasks, you can use `send_task` to assign tasks to remote agents to perform.
- When the remote agent is repeatedly asking for user confirmation, assume that the remote agent doesn't have access to user's conversation context.
So improve the task description to include all the necessary information related to that agent
- Never ask user permission when you want to connect with remote agents. If you need to make connection with multiple remote agents, directly
connect with them without asking user permission or asking user preference
- Always show the detailed response information from the seller agent and propagate it properly to the user.
- If the remote seller is asking for confirmation, rely the confirmation question to the user if the user haven't do so.
- If the user already confirmed the related order in the past conversation history, you can confirm on behalf of the user
- Do not give irrelevant context to remote seller agent. For example, ordered pizza item is not relevant for the burger seller agent
- Never ask order confirmation to the remote seller agent
Please rely on tools to address the request, and don't make up the response. If you are not sure, please ask the user for more details.
Focus on the most recent parts of the conversation primarily.
If there is an active agent, send the request to that agent with the update task tool.
Agents:
{self.agents}
Current active seller agent: {current_agent["active_agent"]}
"""
...
async def send_task(self, agent_name: str, task: str, tool_context: ToolContext):
"""Sends a task to remote seller agent
This will send a message to the remote agent named agent_name.
Args:
agent_name: The name of the agent to send the task to.
task: The comprehensive conversation context summary
and goal to be achieved regarding user inquiry and purchase request.
tool_context: The tool context this method runs in.
Yields:
A dictionary of JSON data.
"""
if agent_name not in self.remote_agent_connections:
raise ValueError(f"Agent {agent_name} not found")
state = tool_context.state
state["active_agent"] = agent_name
client = self.remote_agent_connections[agent_name]
if not client:
raise ValueError(f"Client not available for {agent_name}")
session_id = state["session_id"]
task: Task
message_id = ""
metadata = {}
if "input_message_metadata" in state:
metadata.update(**state["input_message_metadata"])
if "message_id" in state["input_message_metadata"]:
message_id = state["input_message_metadata"]["message_id"]
if not message_id:
message_id = str(uuid.uuid4())
payload = {
"message": {
"role": "user",
"parts": [
{"type": "text", "text": task}
], # Use the 'task' argument here
"messageId": message_id,
"contextId": session_id,
},
}
message_request = SendMessageRequest(
id=message_id, params=MessageSendParams.model_validate(payload)
)
send_response: SendMessageResponse = await client.send_message(
message_request=message_request
)
print(
"send_response",
send_response.model_dump_json(exclude_none=True, indent=2),
)
if not isinstance(send_response.root, SendMessageSuccessResponse):
print("received non-success response. Aborting get task ")
return None
if not isinstance(send_response.root.result, Task):
print("received non-task response. Aborting get task ")
return None
return send_response.root.result
...
Trong lời nhắc, chúng tôi cung cấp cho trợ lý mua hàng tất cả tên và nội dung mô tả của các trợ lý từ xa hiện có. Trong công cụ self.send_task
, chúng tôi cung cấp một cơ chế để truy xuất khách hàng phù hợp nhằm kết nối với trợ lý và gửi siêu dữ liệu bắt buộc bằng đối tượng SendMessageRequest
.
Giao thức truyền thông
Định nghĩa Task là một miền thuộc quyền sở hữu của máy chủ A2A. Tuy nhiên, theo quan điểm của ứng dụng A2A, ứng dụng này xem đó là một Thông báo được gửi đến máy chủ. Máy chủ sẽ quyết định cách xác định thông báo đến từ ứng dụng là nhiệm vụ nào và liệu việc hoàn thành nhiệm vụ có cần sự tương tác của ứng dụng hay không. Bạn có thể đọc thêm thông tin chi tiết về vòng đời của nhiệm vụ trong tài liệu này. Bạn có thể hình dung khái niệm ở cấp độ cao hơn của việc này như sau:
Việc trao đổi thông báo -> tác vụ này được triển khai bằng cách sử dụng định dạng tải trọng trên tiêu chuẩn JSON-RPC như minh hoạ trong ví dụ bên dưới về giao thức message/send
:
{ # identifier for this request "id": "abc123", # version of JSON-RPC protocol "jsonrpc": "2.0", # method name "method": "message/send", # parameters/arguments of the method "params": { "message": "hi, what can you help me with?" } }
Có nhiều phương thức có sẵn, chẳng hạn như để hỗ trợ nhiều loại hình thức giao tiếp (ví dụ: đồng bộ, phát trực tuyến, không đồng bộ) hoặc để định cấu hình thông báo cho trạng thái của tác vụ. Bạn có thể linh hoạt định cấu hình máy chủ A2A để xử lý các tiêu chuẩn định nghĩa tác vụ này. Bạn có thể đọc thông tin chi tiết về các phương thức này trong tài liệu này.
11. 🎯 Thách thức
Giờ đây, bạn có thể tự chuẩn bị tệp cần thiết và triển khai ứng dụng Gradio vào Cloud Run không? Đã đến lúc tham gia thử thách!
12. 🧹 Dọn dẹp
Để tránh phát sinh phí cho tài khoản Google Cloud của bạn đối với các tài nguyên được dùng trong lớp học lập trình này, hãy làm theo các bước sau:
- Trong Google Cloud Console, hãy chuyển đến trang Quản lý tài nguyên.
- Trong danh sách dự án, hãy chọn dự án mà bạn muốn xoá, rồi nhấp vào Xoá.
- Trong hộp thoại, hãy nhập mã dự án rồi nhấp vào Tắt để xoá dự án.
- Ngoài ra, bạn có thể chuyển đến Cloud Run và Agent Engine trên bảng điều khiển, chọn dịch vụ bạn vừa triển khai rồi xoá.