Bắt đầu sử dụng MCP, ADK và A2A

1. Tổng quan

Tác nhân AI đang ngày càng phổ biến, mang đến cuộc cách mạng trong việc tự động hoá tác vụ và ra quyết định nhờ khả năng hoạt động độc lập, học hỏi và tương tác với môi trường để đạt được mục tiêu.

Nhưng chính xác thì làm cách nào để xây dựng một tác nhân? Lớp học lập trình này sẽ giúp bạn bắt đầu bằng cách hướng dẫn cách tạo một tác nhân tiền tệ có thể chuyển đổi giữa các loại tiền tệ của nhiều quốc gia. Sau đó, bạn sẽ tạo một tác nhân đại lý du lịch và kết nối tác nhân đó với tác nhân tiền tệ. Mục tiêu của chúng tôi là giới thiệu cho bạn những công nghệ mới nhất để giúp bạn hiểu rõ những từ viết tắt mà bạn có thể đã thấy trên Internet (MCP, ADK, A2A) và xem cách chúng kết hợp với nhau.

Kiến trúc

Giao thức ngữ cảnh mô hình (MCP)

Giao thức ngữ cảnh mô hình (MCP) là một giao thức mở giúp chuẩn hoá cách các ứng dụng cung cấp bối cảnh cho LLM. MCP cung cấp một cách thức chuẩn hoá để kết nối các mô hình AI với tài nguyên, câu lệnh và công cụ.

Agent Development Kit (ADK)

Bộ công cụ phát triển tác nhân (ADK) là một khung điều phối linh hoạt để phát triển và triển khai các tác nhân AI. ADK không phụ thuộc vào mô hình, không phụ thuộc vào việc triển khai và được xây dựng để tương thích với các khung khác. ADK được thiết kế để giúp quá trình phát triển tác nhân giống với quá trình phát triển phần mềm hơn, giúp nhà phát triển dễ dàng tạo, triển khai và điều phối các cấu trúc tác nhân từ các tác vụ đơn giản đến các quy trình công việc phức tạp.

Giao thức Agent2Agent (A2A)

Giao thức Agent2Agent (A2A) là một tiêu chuẩn mở được thiết kế để cho phép giao tiếp và cộng tác liền mạch giữa các tác nhân AI. Tương tự như cách MCP cung cấp một phương thức chuẩn hoá để cho phép LLM truy cập vào dữ liệu và công cụ, A2A cung cấp một phương thức chuẩn hoá để các tác nhân giao tiếp với nhau! Trong một thế giới mà các tác nhân được xây dựng bằng nhiều khung và bởi nhiều nhà cung cấp, A2A cung cấp một ngôn ngữ chung, phá vỡ các rào cản và thúc đẩy khả năng tương tác.

Kiến thức bạn sẽ học được

  • Cách tạo máy chủ MCP cục bộ
  • Triển khai máy chủ MCP lên Cloud Run
  • Cách tạo một Tác nhân bằng Bộ công cụ phát triển tác nhân sử dụng các công cụ MCP
  • Cách hiển thị một tác nhân ADK dưới dạng Máy chủ A2A
  • Kiểm thử Máy chủ A2A bằng Ứng dụng A2A
  • Cách tạo một Tác nhân để trò chuyện với một Tác nhân khác qua giao thức A2A

Bạn cần có

  • Một trình duyệt, chẳng hạn như Chrome hoặc Firefox
  • Một dự án trên Google Cloud đã bật tính năng thanh toán.

2. Trước khi bắt đầu

Tạo dự án

Nếu bạn chưa có dự án trên Google Cloud, hãy tạo một dự án.

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.

Ngoài ra, hãy đảm bảo rằng bạn đã bật tính năng thanh toán cho dự án trên đám mây. Tìm hiểu cách kiểm tra xem tính năng thanh toán có được bật trong một dự án hay không.

Kích hoạt Cloud Shell

Google Cloud Shell là một môi trường phát triển tương tác dựa trên trình duyệt, được cung cấp ngay trong Google Cloud Console. Đây là cách dễ nhất để bắt đầu sử dụng Google Cloud mà không cần cài đặt các công cụ cục bộ.

Kích hoạt Cloud Shell bằng cách nhấp vào đường liên kết này. Bạn có thể chuyển đổi giữa Cloud Shell Terminal (để chạy các lệnh trên đám mây) và Trình chỉnh sửa (để tạo dự án) bằng cách nhấp vào nút tương ứng trong Cloud Shell.

Sau khi kết nối với Cloud Shell, bạn có thể kiểm tra để đảm bảo rằng bạn đã được xác thực và dự án được đặt thành mã dự án của bạn bằng lệnh sau:

gcloud auth list

Chạy lệnh sau trong Cloud Shell để xác nhận rằng lệnh gcloud biết về dự án của bạn.

gcloud config list project

Sử dụng lệnh sau để thiết lập dự án của bạn:

export PROJECT_ID=<YOUR_PROJECT_ID>
gcloud config set project $PROJECT_ID

Bật Cloud API

Bật các API bắt buộc bằng lệnh sau. Quá trình này có thể mất vài phút.

gcloud services enable cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       run.googleapis.com \
                       cloudbuild.googleapis.com \
                       artifactregistry.googleapis.com \
                       aiplatform.googleapis.com \
                       compute.googleapis.com

Tham khảo tài liệu để biết các lệnh và cách sử dụng gcloud.

Lấy mã

Sao chép kho lưu trữ:

git clone https://github.com/jackwotherspoon/currency-agent.git
cd currency-agent

uv được dùng để quản lý các phần phụ thuộc và đã được cài đặt trong Cloud Shell. Tuy nhiên, nếu đang chạy lớp học lập trình cục bộ, bạn có thể cài đặt uv như sau:

# macOS and Linux
curl -LsSf https://astral.sh/uv/install.sh | sh

# Windows (uncomment below line)
# powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

Định cấu hình các biến môi trường bằng tệp .env bằng cách chạy lệnh sau:

echo "GOOGLE_GENAI_USE_ENTERPRISE=TRUE" >> .env \
&& echo "GOOGLE_CLOUD_PROJECT=$PROJECT_ID" >> .env \
&& echo "GOOGLE_CLOUD_LOCATION=global" >> .env

3. Tạo một máy chủ MCP cục bộ

Trước khi điều phối tác nhân tiền tệ, trước tiên, bạn sẽ tạo một máy chủ MCP để hiển thị(các) công cụ mà tác nhân của bạn sẽ cần.

Máy chủ MCP cho phép bạn viết các chương trình đơn giản để cung cấp các chức năng cụ thể (chẳng hạn như tìm nạp tỷ giá hối đoái) dưới dạng công cụ. Sau đó, một hoặc thậm chí nhiều tác nhân có thể truy cập vào các công cụ này bằng cách sử dụng Giao thức ngữ cảnh mô hình (MCP) được chuẩn hoá.

Bạn có thể tận dụng gói Python FastMCP để tạo một máy chủ MCP hiển thị một công cụ duy nhất có tên là get_exchange_rate. Công cụ get_exchange_rate thực hiện một lệnh gọi qua Internet đến Frankfurter API để lấy tỷ giá hối đoái hiện tại giữa hai loại tiền tệ.

Bạn có thể tìm thấy mã cho máy chủ MCP trong tệp mcp-server/server.py:

import logging
import os

import httpx
from fastmcp import FastMCP

# Set up logging
logger = logging.getLogger(__name__)
logging.basicConfig(format="[%(levelname)s]: %(message)s", level=logging.INFO)

mcp = FastMCP("Currency MCP Server 💵")

@mcp.tool()
def get_exchange_rate(
    currency_from: str = 'USD',
    currency_to: str = 'EUR',
    currency_date: str = 'latest',
):
    """Use this to get current exchange rate.

    Args:
        currency_from: The currency to convert from (e.g., "USD").
        currency_to: The currency to convert to (e.g., "EUR").
        currency_date: The date for the exchange rate or "latest". Defaults to "latest".

    Returns:
        A dictionary containing the exchange rate data, or an error message if the request fails.
    """
    logger.info(f"--- 🛠️ Tool: get_exchange_rate called for converting {currency_from} to {currency_to} ---")
    try:
        response = httpx.get(
            f'https://api.frankfurter.app/{currency_date}',
            params={'from': currency_from, 'to': currency_to},
        )
        response.raise_for_status()

        data = response.json()
        if 'rates' not in data:
            return {'error': 'Invalid API response format.'}
        logger.info(f'✅ API response: {data}')
        return data
    except httpx.HTTPError as e:
        return {'error': f'API request failed: {e}'}
    except ValueError:
        return {'error': 'Invalid JSON response from API.'}

if __name__ == "__main__":
    logger.info(f"🚀 MCP server started on port {os.getenv('PORT', 8080)}")
    # Could also use 'sse' transport, host="0.0.0.0" required for Cloud Run.
    asyncio.run(
        mcp.run_async(
            transport="http",
            host="0.0.0.0",
            port=os.getenv("PORT", 8080),
        )
    )

Để khởi động máy chủ MCP cục bộ, hãy mở một cửa sổ dòng lệnh rồi chạy lệnh sau (máy chủ sẽ khởi động trên http://localhost:8080):

uv run mcp-server/server.py

Kiểm thử để đảm bảo máy chủ MCP hoạt động đúng cách và công cụ get_exchange_rate có thể truy cập được bằng Giao thức ngữ cảnh mô hình.

Trong cửa sổ dòng lệnh mới (để bạn không dừng máy chủ MCP cục bộ), hãy chạy lệnh sau:

uv run mcp-server/test_server.py

Bạn sẽ thấy tỷ giá hối đoái hiện tại của 1 USD (đô la Mỹ) sang EUR (Euro) được xuất ra:

--- 🛠️ Tool found: get_exchange_rate ---
--- 🪛 Calling get_exchange_rate tool for USD to EUR ---
---  Success: {
  "amount": 1.0,
  "base": "USD",
  "date": "2025-05-26",
  "rates": {
    "EUR": 0.87866
  }
} ---

Tuyệt vời! Bạn đã có một máy chủ MCP hoạt động với một công cụ mà tác nhân của bạn có thể truy cập.

Trước khi chuyển sang trạm tiếp theo, hãy dừng máy chủ MCP đang chạy cục bộ bằng cách chạy Ctrl+C (hoặc Command+C trên máy Mac) trong thiết bị đầu cuối mà bạn đã khởi động.

4. Triển khai MCP Server lên Cloud Run

Giờ đây, bạn đã sẵn sàng triển khai máy chủ MCP dưới dạng máy chủ MCP từ xa lên Cloud Run 🚀☁️

Lợi ích của việc chạy máy chủ MCP từ xa

Việc chạy một máy chủ MCP từ xa trên Cloud Run có thể mang lại một số lợi ích:

  • 📈Khả năng mở rộng: Cloud Run được thiết kế để mở rộng quy mô nhanh chóng nhằm xử lý tất cả các yêu cầu đến. Cloud Run sẽ tự động mở rộng quy mô máy chủ MCP của bạn dựa trên nhu cầu.
  • 👥Máy chủ tập trung: Bạn có thể chia sẻ quyền truy cập vào một máy chủ MCP tập trung với các thành viên trong nhóm thông qua đặc quyền IAM, cho phép họ kết nối với máy chủ đó từ máy cục bộ thay vì tất cả đều chạy máy chủ riêng của họ trên máy cục bộ. Nếu có thay đổi đối với máy chủ MCP, tất cả thành viên trong nhóm đều sẽ được hưởng lợi.
  • 🔐Bảo mật: Cloud Run cung cấp một cách dễ dàng để buộc các yêu cầu được xác thực. Điều này chỉ cho phép các kết nối bảo mật đến máy chủ MCP của bạn, ngăn chặn truy cập trái phép.

Thay đổi thành thư mục mcp-server:

cd mcp-server

Triển khai máy chủ MCP lên Cloud Run:

gcloud run deploy mcp-server --no-allow-unauthenticated --region=us-central1 --source .

Nếu dịch vụ của bạn đã triển khai thành công, bạn sẽ thấy một thông báo như sau:

Service [mcp-server] revision [mcp-server-12345-abc] has been deployed and is serving 100 percent of traffic.

Xác thực ứng dụng MCP

Vì bạn đã chỉ định --no-allow-unauthenticated để yêu cầu xác thực, nên mọi ứng dụng MCP kết nối với máy chủ MCP từ xa đều cần xác thực.

Tài liệu chính thức về Lưu trữ máy chủ MCP trên Cloud Run cung cấp thêm thông tin về chủ đề này, tuỳ thuộc vào nơi bạn đang chạy ứng dụng MCP.

Bạn sẽ cần chạy proxy Cloud Run để tạo một đường hầm đã xác thực đến máy chủ MCP từ xa trên máy cục bộ.

Theo mặc định, URL của các dịch vụ Cloud Run yêu cầu tất cả các yêu cầu phải được uỷ quyền bằng vai trò IAM Cloud Run Invoker (roles/run.invoker). IAM policy binding này đảm bảo rằng một cơ chế bảo mật mạnh mẽ được dùng để xác thực ứng dụng MCP cục bộ của bạn.

Bạn phải đảm bảo rằng bạn hoặc bất kỳ thành viên nào trong nhóm đang cố gắng truy cập vào máy chủ MCP từ xa đều có vai trò roles/run.invoker IAM được liên kết với nguyên tắc IAM (tài khoản Google Cloud) của họ.

gcloud run services proxy mcp-server --region=us-central1

Bạn sẽ thấy kết quả sau đây:

Proxying to Cloud Run service [mcp-server] in project [<YOUR_PROJECT_ID>] region [us-central1]
http://127.0.0.1:8080 proxies to https://mcp-server-abcdefgh-uc.a.run.app

Giờ đây, tất cả lưu lượng truy cập đến http://127.0.0.1:8080 sẽ được xác thực và chuyển tiếp đến máy chủ MCP từ xa.

Kiểm thử máy chủ MCP từ xa

Trong thiết bị đầu cuối mới, hãy quay lại thư mục gốc và chạy lại tệp mcp-server/test_server.py để đảm bảo máy chủ MCP từ xa đang hoạt động.

cd ..
uv run mcp-server/test_server.py

Bạn sẽ thấy kết quả tương tự như khi chạy máy chủ cục bộ:

--- 🛠️ Tool found: get_exchange_rate ---
--- 🪛 Calling get_exchange_rate tool for USD to EUR ---
---  Success: {
  "amount": 1.0,
  "base": "USD",
  "date": "2025-05-26",
  "rates": {
    "EUR": 0.87866
  }
} ---

Bạn có thể truy vấn nhật ký của máy chủ MCP Cloud Run đã triển khai nếu muốn xác minh rằng máy chủ từ xa thực sự đã được gọi:

gcloud run services logs read mcp-server --region us-central1 --limit 5

Bạn sẽ thấy kết quả sau đây trong nhật ký:

2025-06-04 14:28:29,871 [INFO]: --- 🛠️ Tool: get_exchange_rate called for converting USD to EUR ---
2025-06-04 14:28:30,610 [INFO]: HTTP Request: GET https://api.frankfurter.app/latest?from=USD&to=EUR "HTTP/1.1 200 OK"
2025-06-04 14:28:30,611 [INFO]:  API response: {'amount': 1.0, 'base': 'USD', 'date': '2025-06-03', 'rates': {'EUR': 0.87827}}

Giờ đây, khi đã có một máy chủ MCP từ xa, bạn có thể chuyển sang bước tạo tác nhân! 🤖

5. Tạo tác nhân bằng ADK

Bạn đã triển khai máy chủ MCP, giờ là lúc tạo tác nhân tiền tệ bằng Bộ công cụ phát triển tác nhân (ADK).

ADK giúp tạo các tác nhân cực kỳ đơn giản và cho phép các tác nhân kết nối với máy chủ MCP nhờ hỗ trợ sẵn cho Công cụ MCP. Tác nhân tiền tệ sẽ truy cập vào công cụ get_exchange_rate bằng cách sử dụng lớp MCPToolset của ADK.

Mã của tác nhân tiền tệ nằm trong currency_agent/agent.py:

import logging
import os

from dotenv import load_dotenv
from google.adk.agents import LlmAgent
from google.adk.a2a.utils.agent_to_a2a import to_a2a
from google.adk.tools.mcp_tool import MCPToolset, StreamableHTTPConnectionParams

logger = logging.getLogger(__name__)
logging.basicConfig(format="[%(levelname)s]: %(message)s", level=logging.INFO)

load_dotenv()

SYSTEM_INSTRUCTION = (
    "You are a specialized assistant for currency conversions. "
    "Your sole purpose is to use the 'get_exchange_rate' tool to answer questions about currency exchange rates. "
    "If the user asks about anything other than currency conversion or exchange rates, "
    "politely state that you cannot help with that topic and can only assist with currency-related queries. "
    "Do not attempt to answer unrelated questions or use tools for other purposes."
)

logger.info("--- 🔧 Loading MCP tools from MCP Server... ---")
logger.info("--- 🤖 Creating ADK Currency Agent... ---")

root_agent = LlmAgent(
    model="gemini-3.7-flash",
    name="currency_agent",
    description="An agent that can help with currency conversions",
    instruction=SYSTEM_INSTRUCTION,
    tools=[
        MCPToolset(
            connection_params=StreamableHTTPConnectionParams(
                url=os.getenv("MCP_SERVER_URL", "http://localhost:8080/mcp")
            )
        )
    ],
)

Để nhanh chóng kiểm thử tác nhân tiền tệ, bạn có thể tận dụng giao diện người dùng dành cho nhà phát triển của ADK bằng cách chạy adk web:

uv run adk web --allow_origins "regex:https://.*\.cloudshell\.dev"

Trong trình duyệt, hãy truy cập vào http://localhost:8000 để xem và thử nghiệm tác nhân!

Đảm bảo rằng currency_agent được chọn làm tác nhân ở góc trên bên trái của giao diện người dùng web.

Giao diện người dùng web ADK

Hỏi nhân viên hỗ trợ trong khu vực trò chuyện, chẳng hạn như "250 CAD bằng bao nhiêu USD?". Bạn sẽ thấy nhân viên gọi công cụ get_exchange_rate MCP của chúng tôi trước khi đưa ra câu trả lời.

Tác nhân đơn vị tiền tệ trên web ADK

Tác nhân hoạt động! Công cụ này có thể xử lý các câu hỏi xoay quanh việc chuyển đổi tiền tệ 💸.

6. Giao thức Agent2Agent (A2A)

Giao thức Agent2Agent (A2A) là một tiêu chuẩn mở được thiết kế để cho phép giao tiếp và cộng tác liền mạch giữa các tác nhân AI. Điều này cho phép các tác nhân được xây dựng bằng nhiều khung và bởi nhiều nhà cung cấp khác nhau giao tiếp với nhau bằng một ngôn ngữ chung, phá vỡ các rào cản và thúc đẩy khả năng tương tác.

Giao thức A2A

A2A cho phép các tác nhân:

  • Khám phá: Tìm các tác nhân khác và tìm hiểu kỹ năng (AgentSkill) và khả năng (AgentCapabilities) của họ bằng cách sử dụng Thẻ tác nhân tiêu chuẩn.
  • Liên lạc: Trao đổi tin nhắn và dữ liệu một cách an toàn.
  • Cộng tác: Uỷ quyền nhiệm vụ và phối hợp hành động để đạt được các mục tiêu phức tạp.

Giao thức A2A hỗ trợ hoạt động giao tiếp này thông qua các cơ chế như "Thẻ đại lý". Đây là thẻ doanh nghiệp kỹ thuật số mà các đại lý có thể dùng để quảng cáo khả năng và thông tin kết nối của họ.

Thẻ tác nhân A2A

Bây giờ là lúc bạn cần hiển thị tác nhân tiền tệ bằng A2A để các tác nhân và ứng dụng khác có thể gọi tác nhân này.

A2A Python SDK

A2A Python SDK cung cấp các mô hình Pydantic cho từng tài nguyên nêu trên; AgentSkill, AgentCapabilitiesAgentCard. Điều này cung cấp một giao diện để đẩy nhanh quá trình phát triển và tích hợp với giao thức A2A.

AgentSkill là cách bạn quảng cáo cho các tác nhân khác rằng tác nhân tiền tệ có một công cụ để get_exchange_rate:

# A2A Agent Skill definition
skill = AgentSkill(
    id='get_exchange_rate',
    name='Currency Exchange Rates Tool',
    description='Helps with exchange values between various currencies',
    tags=['currency conversion', 'currency exchange'],
    examples=['What is exchange rate between USD and GBP?'],
)

Sau đó, trong phần AgentCard, hệ thống sẽ liệt kê các kỹ năng và khả năng của trợ lý ảo cùng với các thông tin chi tiết khác như chế độ đầu vào và đầu ra mà trợ lý ảo có thể xử lý:

# A2A Agent Card definition
agent_card = AgentCard(
    name='Currency Agent',
    description='Helps with exchange rates for currencies',
    url=f'http://{host}:{port}/',
    version='1.0.0',
    defaultInputModes=["text"],
    defaultOutputModes=["text"],
    capabilities=AgentCapabilities(streaming=True),
    skills=[skill],
)

Đã đến lúc kết hợp tất cả với tác nhân tiền tệ và thể hiện sức mạnh của A2A!

7. Hiển thị Currency Agent dưới dạng A2A Server

ADK giúp bạn đơn giản hoá quy trình tạo và kết nối các tác nhân bằng giao thức A2A. Việc cung cấp quyền truy cập (hiển thị) cho một tác nhân ADK hiện có dưới dạng một máy chủ A2A được thực hiện bằng hàm to_a2a(root_agent) của ADK (Xem tài liệu ADK để biết thông tin chi tiết).

Hàm to_a2a chuyển đổi một tác nhân hiện có để hoạt động với A2A và có thể hiển thị tác nhân đó dưới dạng một máy chủ thông qua uvicorn. Điều này có nghĩa là bạn có thể kiểm soát chặt chẽ hơn những gì bạn muốn hiển thị nếu dự định đưa tác nhân vào sản xuất. Hàm to_a2a() tự động tạo thẻ đại lý dựa trên mã đại lý của bạn bằng cách sử dụng A2A Python SDK.

Khi xem bên trong tệp currency_agent/agent.py, bạn có thể thấy cách sử dụng to_a2a và cách tác nhân tiền tệ được hiển thị dưới dạng một máy chủ A2A chỉ bằng hai dòng mã!

from google.adk.a2a.utils.agent_to_a2a import to_a2a
# ... see file for full code

# Make the agent A2A-compatible
a2a_app = to_a2a(root_agent, port=10000)

Để chạy máy chủ A2A, trong cửa sổ dòng lệnh mới, hãy chạy lệnh sau:

uv run uvicorn currency_agent.agent:a2a_app --host localhost --port 10000

Nếu máy chủ khởi động thành công, đầu ra sẽ có dạng như sau, cho biết máy chủ đang chạy trên cổng 10000:

[INFO]: --- 🔧 Loading MCP tools from MCP Server... ---
[INFO]: --- 🤖 Creating ADK Currency Agent... ---
INFO:     Started server process [45824]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://localhost:10000 (Press CTRL+C to quit)

Giờ đây, tác nhân tiền tệ đã chạy thành công dưới dạng một máy chủ A2A, có khả năng được các tác nhân hoặc ứng dụng khác gọi bằng giao thức A2A!

Xác minh rằng Remote Agent đang chạy

Bạn có thể kiểm tra kỹ để đảm bảo rằng nhân viên hỗ trợ đang hoạt động bằng cách truy cập vào URL thẻ nhân viên hỗ trợ cho nhân viên hỗ trợ tiền tệ do hàm to_a2a() tự động tạo.

Trong trình duyệt, hãy truy cập vào http://localhost:10000/.well-known/agent-card.json

Bạn sẽ thấy thẻ đại lý sau:

{
  "capabilities": {

  },
  "defaultInputModes": [
    "text/plain"
  ],
  "defaultOutputModes": [
    "text/plain"
  ],
  "description": "An agent that can help with currency conversions",
  "name": "currency_agent",
  "preferredTransport": "JSONRPC",
  "protocolVersion": "0.3.0",
  "skills": [
    {
      "description": "An agent that can help with currency conversions I am a specialized assistant for currency conversions. my sole purpose is to use the 'get_exchange_rate' tool to answer questions about currency exchange rates. If the user asks about anything other than currency conversion or exchange rates, politely state that I cannot help with that topic and can only assist with currency-related queries. Do not attempt to answer unrelated questions or use tools for other purposes.",
      "id": "currency_agent",
      "name": "model",
      "tags": [
        "llm"
      ]
    },
    {
      "description": "Use this to get current exchange rate.\n\nArgs:\n    currency_from: The currency to convert from (e.g., \"USD\").\n    currency_to: The currency to convert to (e.g., \"EUR\").\n    currency_date: The date for the exchange rate or \"latest\". Defaults to \"latest\".\n\nReturns:\n    A dictionary containing the exchange rate data, or an error message if the request fails.",
      "id": "currency_agent-get_exchange_rate",
      "name": "get_exchange_rate",
      "tags": [
        "llm",
        "tools"
      ]
    }
  ],
  "supportsAuthenticatedExtendedCard": false,
  "url": "http://localhost:10000",
  "version": "0.0.1"
}

Kiểm thử Máy chủ A2A

Giờ đây, bạn có thể kiểm thử máy chủ bằng cách gửi một số yêu cầu đến máy chủ đó thông qua A2A!

A2A Python SDK cung cấp một lớp a2a.client.Client giúp bạn đơn giản hoá quy trình này.

Tệp currency_agent/test_a2aclient.py chứa mã cho biết cách tìm nạp thẻ đại lý và gửi thông báo đến máy chủ A2A.

# ... see file for full code

async def get_agent_card():
    """Get the agent card."""
    print(f"🔄 Fetching the agent card at {AGENT_URL}")

    async with httpx.AsyncClient() as httpx_client:
        resolver = A2ACardResolver(
            httpx_client=httpx_client,
            base_url=AGENT_URL,
        )
        public_agent_card = await resolver.get_agent_card()
        print("✅ Successfully fetched the agent card")
    return public_agent_card


async def send_message(text_query: str) -> None:
    """
    Send a text query to the agent and print the response.
    """
    public_agent_card = await get_agent_card()

    print("🔄 Initializing a non-streaming client")
    config = ClientConfig(streaming=False)
    client = await create_client(agent=public_agent_card, client_config=config)

    message = new_text_message(text_query, role=Role.ROLE_USER)
    print("Sending request:")
    request = SendMessageRequest(message=message)
    print(request)

    print("Response:")
    async for chunk in client.send_message(request):
        print(chunk)
    await client.close()

Chạy các kiểm thử bằng lệnh sau:

uv run currency_agent/test_a2aclient.py

Một lần chạy thử nghiệm thành công sẽ dẫn đến những kết quả sau:

🔄 Fetching the agent card at http://localhost:10000
 Successfully fetched the agent card
====================================================
                     AgentCard                      
====================================================
--- General ---
Name        : currency_agent
Description : An agent that can help with currency conversions
Version     : 0.0.1

--- Interfaces ---
  [0] http://localhost:10000  (JSONRPC 1.0)

--- Capabilities ---
Streaming           : False
Push notifications  : False
Extended agent card : False

--- I/O Modes ---
Input  : text/plain
Output : text/plain

--- Skills ---
----------------------------------------------------
  ID          : currency_agent
  Name        : model
  Description : An agent that can help with currency conversions
  Tags        : llm
----------------------------------------------------
  ID          : currency_agent-get_exchange_rate
  Name        : get_exchange_rate
  Description : Use this to get current exchange rate.
  Tags        : llm, tools
====================================================
🔄 Fetching the agent card at http://localhost:10000
 Successfully fetched the agent card
🔄 Initializing a non-streaming client
Sending request:
message {
  message_id: "5d190c88-336e-4a22-925d-e2af49cf4bad"
  role: ROLE_USER
  parts {
    text: "how much is 100 USD in GBP?"
  }
}

Response:
task {
  id: "e6f311bb-654a-477f-82a9-81c7a48f7b81"
  context_id: "672e351b-0ff3-4aed-a059-868b383c41a0"
  status {
    state: TASK_STATE_COMPLETED
    timestamp {
      seconds: 1787836031
      nanos: 994786000
    }
  }
  artifacts {
    artifact_id: "e0a05ac8-25c7-471c-a33c-1073fe48cbb8"
    parts {
      text: "100 USD is currently equal to approximately **73.37 GBP** (at an exchange rate of 1 USD = 0.73368 GBP)."
    }
  }
  ...

Ứng dụng hoạt động rồi! Bạn đã thử nghiệm thành công việc có thể giao tiếp với tác nhân tiền tệ qua giao thức A2A bằng một ứng dụng A2A! 🎉

Hãy xem kho lưu trữ a2a-samples trên GitHub để biết thêm các mẫu A2A.

8. Sử dụng Currency Agent từ xa thông qua A2A

Ở bước trước, bạn đã sử dụng một A2A Client để giao tiếp với Currency Agent qua A2A.

Trong bước này, hãy xem cách bạn có thể sử dụng Currency Agent làm tác nhân từ xa từ một Travel Agent khác.

Mã của Đại lý du lịch nằm trong travel_agent/agent.py:

import logging
import os

from dotenv import load_dotenv
from google.adk.agents import LlmAgent
from google.adk.tools.agent_tool import AgentTool
from google.adk.agents.remote_a2a_agent import RemoteA2aAgent, AGENT_CARD_WELL_KNOWN_PATH

logger = logging.getLogger(__name__)
logging.basicConfig(format="[%(levelname)s]: %(message)s", level=logging.INFO)

load_dotenv()

SYSTEM_INSTRUCTION = (
    "You are a helpful travel assistant. You help users plan trips, recommend places, "
    "and answer travel-related questions. "
    "Whenever a user asks about currency exchange rates or money conversions, "
    "delegate the request to the 'currency_agent' sub-agent."
)

CURRENCY_AGENT_URL = os.getenv("CURRENCY_AGENT_URL", "http://localhost:10000")

logger.info(
    "--- 🔗 Connecting to Remote A2A Currency Agent at %s... ---",
    CURRENCY_AGENT_URL,
)

currency_remote_agent = RemoteA2aAgent(
    name="currency_agent",
    agent_card=f"{CURRENCY_AGENT_URL}{AGENT_CARD_WELL_KNOWN_PATH}",
    description="An agent that can help with currency conversions and exchange rates.",
)

logger.info("--- 🤖 Creating ADK Travel Agent... ---")

root_agent = LlmAgent(
    model="gemini-3.7-flash",
    name="travel_agent",
    description="A travel assistant that can help plan trips and convert currencies via the remote currency agent.",
    instruction=SYSTEM_INSTRUCTION,
    tools=[AgentTool(agent=currency_remote_agent)],
)

Lưu ý cách truy cập vào Currency Agent bằng cách sử dụng RemoteA2aAgent.

Chạy adk web để kiểm thử Đại lý du lịch:

uv run adk web --allow_origins "regex:https://.*\.cloudshell\.dev"

Trong trình duyệt, hãy truy cập vào http://localhost:8000 để xem và kiểm thử tác nhân.

Đảm bảo rằng travel_agent được chọn làm tác nhân ở góc trên bên trái của giao diện người dùng web.

Hỏi nhân viên hỗ trợ trong khu vực trò chuyện, chẳng hạn như "250 CAD bằng bao nhiêu USD?".

Bạn nên xem cuộc gọi của Đại lý du lịch currency_agent từ xa trước khi đưa ra phản hồi.

Tác nhân tiền tệ từ xa trên web của ADK

Tác nhân hoạt động! Trợ lý này có thể xử lý các truy vấn liên quan đến việc chuyển đổi tiền tệ 💸 bằng cách gọi một tác nhân từ xa thông qua A2A!

9. Xin chúc mừng

Xin chúc mừng! Bạn đã tạo và triển khai thành công một máy chủ MCP từ xa, tạo một tác nhân tiền tệ bằng Bộ công cụ phát triển tác nhân (ADK) kết nối với các công cụ bằng MCP và hiển thị tác nhân của bạn bằng giao thức Agent2Agent (A2A). Sau đó, bạn đã tạo một công ty du lịch để trò chuyện từ xa với đại lý tiền tệ bằng cách sử dụng A2A!

Tại đây là đường liên kết đến tài liệu đầy đủ về mã.

Bạn muốn triển khai tác nhân của mình? Thời gian chạy tác nhân của Nền tảng Tác nhân Gemini Enterprise mang đến trải nghiệm được quản lý để triển khai các tác nhân AI vào hoạt động sản xuất!

Nội dung đã đề cập

  • Cách tạo máy chủ MCP cục bộ
  • Triển khai máy chủ MCP lên Cloud Run
  • Cách tạo một Tác nhân bằng Bộ công cụ phát triển tác nhân sử dụng các công cụ MCP
  • Cách hiển thị một tác nhân ADK dưới dạng Máy chủ A2A
  • Kiểm thử Máy chủ A2A bằng Ứng dụng A2A
  • Cách tạo một Tác nhân để trò chuyện với một Tác nhân khác qua giao thức A2A

Dọn dẹp

Để tránh bị tính phí vào tài khoản Google Cloud cho các tài nguyên được dùng trong bài tập thực hành này, hãy làm theo các bước sau:

  1. Trong Google Cloud Console, hãy chuyển đến trang Quản lý tài nguyên.
  2. Trong danh sách dự án, hãy chọn dự án bạn muốn xoá, rồi nhấp vào Xoá.
  3. Trong hộp thoại, hãy nhập mã dự án rồi nhấp vào Tắt để xoá dự án.