การเริ่มต้นใช้งาน MCP, ADK และ A2A

1. ภาพรวม

AI Agent กำลังได้รับความนิยมเพิ่มขึ้นอย่างรวดเร็ว โดยปฏิวัติการทำงานอัตโนมัติและการตัดสินใจด้วยความสามารถในการทำงานอย่างอิสระ เรียนรู้ และโต้ตอบกับสภาพแวดล้อมเพื่อบรรลุเป้าหมาย

แต่การสร้าง Agent ต้องทำอย่างไรกันแน่ Codelab นี้จะช่วยให้คุณเริ่มต้นใช้งานโดยแสดงวิธีสร้าง Currency Agent ที่สามารถแปลงสกุลเงินของประเทศต่างๆ ได้ จากนั้นคุณจะสร้าง Travel Agency Agent และเชื่อมต่อกับ Currency Agent เป้าหมายคือการแนะนำเทคโนโลยีล่าสุดเพื่อช่วยให้คุณเข้าใจตัวย่อต่างๆ ที่อาจเคยเห็นบนอินเทอร์เน็ต (MCP, ADK, A2A) และดูว่าเทคโนโลยีเหล่านี้ทำงานร่วมกันอย่างไร

สถาปัตยกรรม

Model Context Protocol (MCP)

Model Context Protocol (MCP) เป็นโปรโตคอลแบบเปิดที่กำหนดมาตรฐานวิธีที่แอปพลิเคชันให้บริบทแก่ LLM MCP มีวิธีที่ได้มาตรฐานในการเชื่อมต่อโมเดล AI กับทรัพยากร พรอมต์ และเครื่องมือ

Agent Development Kit (ADK)

Agent Development Kit (ADK) เป็นเฟรมเวิร์กการจัดการที่ยืดหยุ่นสำหรับการพัฒนาและติดตั้งใช้งาน AI Agent ADK ไม่ขึ้นอยู่กับโมเดล ไม่ขึ้นอยู่กับการติดตั้งใช้งาน และสร้างขึ้นเพื่อให้ใช้งานร่วมกับเฟรมเวิร์กอื่นๆ ได้ ADK ได้รับการออกแบบมาเพื่อให้การพัฒนา Agent มีลักษณะคล้ายกับการพัฒนาซอฟต์แวร์มากขึ้น เพื่อให้นักพัฒนาแอปสร้าง ติดตั้งใช้งาน และจัดการสถาปัตยกรรม Agentic AI ได้ง่ายขึ้น ซึ่งครอบคลุมตั้งแต่การทำงานอย่างง่ายไปจนถึงเวิร์กโฟลว์ที่ซับซ้อน

โปรโตคอล Agent2Agent (A2A)

โปรโตคอล Agent2Agent (A2A) เป็นมาตรฐานแบบเปิดที่ออกแบบมาเพื่อให้ AI Agent สื่อสารและทำงานร่วมกันได้อย่างราบรื่น เช่นเดียวกับที่ MCP มีวิธีที่ได้มาตรฐานในการให้สิทธิ์ LLM เข้าถึงข้อมูลและเครื่องมือ A2A ก็มีวิธีที่ได้มาตรฐานสำหรับ Agent ในการพูดคุยกับ Agent อื่นๆ ในโลกที่ Agent สร้างขึ้นโดยใช้เฟรมเวิร์กที่หลากหลายและโดยผู้ให้บริการที่แตกต่างกัน A2A มีภาษาที่ใช้ร่วมกัน ซึ่งจะช่วยลดการทำงานแบบแยกส่วนและส่งเสริมการทำงานร่วมกัน

สิ่งที่คุณจะได้เรียนรู้

  • วิธีสร้างเซิร์ฟเวอร์ MCP ในเครื่อง
  • การติดตั้งใช้งานเซิร์ฟเวอร์ MCP ใน Cloud Run
  • วิธีสร้าง Agent ด้วย Agent Development Kit ที่ใช้เครื่องมือ MCP
  • วิธีเปิดใช้งาน ADK Agent เป็นเซิร์ฟเวอร์ A2A
  • การทดสอบเซิร์ฟเวอร์ A2A โดยใช้ไคลเอ็นต์ A2A
  • วิธีสร้าง Agent เพื่อพูดคุยกับ Agent อื่นผ่านโปรโตคอล A2A

สิ่งที่คุณต้องมี

  • เบราว์เซอร์ เช่น Chrome หรือ Firefox
  • โปรเจ็กต์ Google Cloud ที่เปิดใช้การเรียกเก็บเงินแล้ว

2. ก่อนเริ่มต้น

สร้างโปรเจ็กต์

หากยังไม่มีโปรเจ็กต์ Google Cloud ให้สร้างโปรเจ็กต์

ใน คอนโซล Google Cloud ในหน้าตัวเลือกโปรเจ็กต์ ให้เลือกหรือสร้าง โปรเจ็กต์ Google Cloud

นอกจากนี้ ให้ตรวจสอบว่าได้เปิดใช้การเรียกเก็บเงินสำหรับโปรเจ็กต์ที่อยู่ในระบบคลาวด์แล้ว ดูวิธีตรวจสอบว่าได้เปิดใช้การเรียกเก็บเงินในโปรเจ็กต์แล้ว

เปิดใช้งาน Cloud Shell

Google Cloud Shell เป็นสภาพแวดล้อมในการพัฒนาซอฟต์แวร์แบบอินเทอร์แอกทีฟในเบราว์เซอร์ที่ให้บริการโดยตรงภายในคอนโซล Google Cloud ซึ่งเป็นวิธีที่ง่ายที่สุดในการเริ่มต้นใช้งาน Google Cloud โดยไม่ต้องติดตั้งเครื่องมือในเครื่อง

เปิดใช้งาน Cloud Shell โดยคลิกลิงก์นี้ คุณสลับระหว่างเทอร์มินัล Cloud Shell (สำหรับเรียกใช้คำสั่ง Cloud) กับเครื่องมือแก้ไข (สำหรับสร้างโปรเจ็กต์) ได้โดยคลิกปุ่มที่เกี่ยวข้องจาก Cloud Shell

เมื่อเชื่อมต่อกับ Cloud Shell แล้ว ให้ตรวจสอบว่าคุณได้ตรวจสอบสิทธิ์แล้วและโปรเจ็กต์ตั้งค่าเป็นรหัสโปรเจ็กต์โดยใช้คำสั่งต่อไปนี้

gcloud auth list

เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคำสั่ง gcloud รู้จักโปรเจ็กต์ของคุณ

gcloud config list project

ใช้คำสั่งต่อไปนี้เพื่อตั้งค่าโปรเจ็กต์

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

เปิดใช้ Cloud API

เปิดใช้ API ที่จำเป็นโดยใช้คำสั่งต่อไปนี้ การดำเนินการนี้อาจใช้เวลาสักครู่

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

โปรดดูเอกสารประกอบสำหรับคำสั่ง gcloud และการใช้งาน

รับโค้ด

โคลนที่เก็บ

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

uv ใช้เพื่อจัดการการขึ้นต่อกันและติดตั้งไว้แล้วใน Cloud Shell แต่หากคุณเรียกใช้ Codelab ในเครื่อง คุณสามารถติดตั้งได้ดังนี้

# 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"

กำหนดค่าตัวแปรสภาพแวดล้อมด้วยไฟล์ .env โดยเรียกใช้คำสั่งต่อไปนี้

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

3. สร้างเซิร์ฟเวอร์ MCP ในเครื่อง

ก่อนที่จะจัดการ Currency Agent คุณจะต้องสร้างเซิร์ฟเวอร์ MCP เพื่อเปิดใช้งานเครื่องมือที่ Agent จะต้องใช้ก่อน

เซิร์ฟเวอร์ MCP ช่วยให้คุณเขียนโปรแกรมขนาดเล็กเพื่อเปิดใช้งานความสามารถเฉพาะ (เช่น การดึงข้อมูลอัตราแลกเปลี่ยนสกุลเงิน) เป็นเครื่องมือได้ จากนั้น Agent หรือแม้แต่ Agent หลายรายจะเข้าถึงเครื่องมือเหล่านี้ได้โดยใช้ Model Context Protocol (MCP) ที่ได้มาตรฐาน

คุณสามารถใช้แพ็กเกจ FastMCP Python เพื่อสร้างเซิร์ฟเวอร์ MCP ที่เปิดใช้งานเครื่องมือเดียวที่ชื่อว่า get_exchange_rate เครื่องมือ get_exchange_rate จะเรียกใช้ Frankfurter API ผ่านอินเทอร์เน็ตเพื่อรับอัตราแลกเปลี่ยนปัจจุบันระหว่าง 2 สกุลเงิน

คุณดูโค้ดสำหรับเซิร์ฟเวอร์ MCP ได้ในไฟล์ 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),
        )
    )

หากต้องการเริ่มเซิร์ฟเวอร์ MCP ในเครื่อง ให้เปิดเทอร์มินัลและเรียกใช้คำสั่งต่อไปนี้ (เซิร์ฟเวอร์จะเริ่มทำงานที่ http://localhost:8080)

uv run mcp-server/server.py

ทดสอบว่าเซิร์ฟเวอร์ MCP ทำงานอย่างถูกต้องและเครื่องมือ get_exchange_rate เข้าถึงได้โดยใช้ Model Context Protocol

ในหน้าต่างเทอร์มินัลใหม่ (เพื่อไม่ให้หยุดเซิร์ฟเวอร์ MCP ในเครื่อง) ให้เรียกใช้คำสั่งต่อไปนี้

uv run mcp-server/test_server.py

คุณควรเห็นอัตราแลกเปลี่ยนปัจจุบันของ 1 USD (ดอลลาร์สหรัฐ) เป็น EUR (ยูโร) แสดงขึ้น

--- 🛠️ 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
  }
} ---

ยอดเยี่ยม! คุณมีเซิร์ฟเวอร์ MCP ที่ทำงานได้สำเร็จพร้อมเครื่องมือที่ Agent จะเข้าถึงได้

ก่อนที่จะไปยังขั้นตอนถัดไป ให้หยุดเซิร์ฟเวอร์ MCP ที่ทำงานในเครื่องโดยเรียกใช้ Ctrl+C (หรือ Command+C ใน Mac) ในเทอร์มินัลที่คุณเริ่มเซิร์ฟเวอร์

4. ติดตั้งใช้งานเซิร์ฟเวอร์ MCP ใน Cloud Run

ตอนนี้คุณพร้อมที่จะติดตั้งใช้งานเซิร์ฟเวอร์ MCP เป็นเซิร์ฟเวอร์ MCP ระยะไกลใน Cloud Run แล้ว 🚀☁️

ข้อดีของการเรียกใช้เซิร์ฟเวอร์ MCP จากระยะไกล

การเรียกใช้เซิร์ฟเวอร์ MCP จากระยะไกลใน Cloud Run มีข้อดีหลายประการ ดังนี้

  • 📈ความสามารถในการปรับขนาด: Cloud Run สร้างขึ้นเพื่อเพิ่มโหนดออกอย่างรวดเร็วเพื่อจัดการคำขอขาเข้าทั้งหมด Cloud Run จะปรับขนาดเซิร์ฟเวอร์ MCP โดยอัตโนมัติตามความต้องการ
  • 👥เซิร์ฟเวอร์ส่วนกลาง: คุณสามารถแชร์สิทธิ์เข้าถึงเซิร์ฟเวอร์ MCP ส่วนกลางกับสมาชิกในทีมผ่านสิทธิ์ IAM ซึ่งจะช่วยให้สมาชิกเชื่อมต่อกับเซิร์ฟเวอร์จากเครื่องในเครื่องของตนเองได้แทนที่จะเรียกใช้เซิร์ฟเวอร์ของตนเองในเครื่อง หากมีการเปลี่ยนแปลงเซิร์ฟเวอร์ MCP สมาชิกในทีมทุกคนจะได้รับประโยชน์จากการเปลี่ยนแปลงดังกล่าว
  • 🔐ความปลอดภัย: Cloud Run มีวิธีง่ายๆ ในการบังคับใช้คำขอที่ตรวจสอบสิทธิ์แล้ว ซึ่งจะอนุญาตเฉพาะการเชื่อมต่อที่ปลอดภัยกับเซิร์ฟเวอร์ MCP เท่านั้น เพื่อป้องกันการเข้าถึงที่ไม่ได้รับอนุญาต

เปลี่ยนเป็นไดเรกทอรี mcp-server

cd mcp-server

ติดตั้งใช้งานเซิร์ฟเวอร์ MCP ใน Cloud Run

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

หากติดตั้งใช้งานบริการสำเร็จ คุณจะเห็นข้อความต่อไปนี้

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

การตรวจสอบสิทธิ์ไคลเอ็นต์ MCP

เนื่องจากคุณระบุ --no-allow-unauthenticated เพื่อกำหนดให้ต้องมีการตรวจสอบสิทธิ์ ไคลเอ็นต์ MCP ใดก็ตามที่เชื่อมต่อกับเซิร์ฟเวอร์ MCP ระยะไกลจะต้องตรวจสอบสิทธิ์

เอกสารอย่างเป็นทางการสำหรับ โฮสต์เซิร์ฟเวอร์ MCP ใน Cloud Run มีข้อมูลเพิ่มเติมเกี่ยวกับหัวข้อนี้ ทั้งนี้ขึ้นอยู่กับตำแหน่งที่คุณเรียกใช้ไคลเอ็นต์ MCP

คุณจะต้องเรียกใช้พร็อกซี Cloud Run เพื่อสร้างอุโมงค์ที่ตรวจสอบสิทธิ์แล้วไปยังเซิร์ฟเวอร์ MCP ระยะไกลในเครื่อง

โดยค่าเริ่มต้น URL ของบริการ Cloud Run กำหนดให้คำขอทั้งหมดต้องได้รับอนุญาตด้วยบทบาท IAM ของผู้เรียกใช้ Cloud Run (roles/run.invoker) การผูกนโยบาย IAM นี้ช่วยให้มั่นใจได้ว่าจะใช้กลไกความปลอดภัยที่เข้มงวดเพื่อตรวจสอบสิทธิ์ไคลเอ็นต์ MCP ในเครื่อง

คุณควรตรวจสอบว่าคุณหรือสมาชิกในทีมที่พยายามเข้าถึงเซิร์ฟเวอร์ MCP ระยะไกลมีบทบาท IAM roles/run.invoker ผูกกับ Principal IAM (บัญชี Google Cloud)

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

คุณควรเห็นเอาต์พุตต่อไปนี้

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

ตอนนี้ระบบจะตรวจสอบสิทธิ์และส่งต่อการรับส่งข้อมูลทั้งหมดไปยัง http://127.0.0.1:8080 ไปยังเซิร์ฟเวอร์ MCP ระยะไกล

ทดสอบเซิร์ฟเวอร์ MCP ระยะไกล

ในเทอร์มินัลใหม่ ให้กลับไปที่โฟลเดอร์รากและเรียกใช้ไฟล์ mcp-server/test_server.py อีกครั้งเพื่อให้แน่ใจว่าเซิร์ฟเวอร์ MCP ระยะไกลทำงานอยู่

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

คุณควรเห็นเอาต์พุตที่คล้ายกับที่เห็นเมื่อเรียกใช้เซิร์ฟเวอร์ในเครื่อง

--- 🛠️ 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
  }
} ---

คุณสามารถค้นหาบันทึกของเซิร์ฟเวอร์ MCP Cloud Run ที่ติดตั้งใช้งานแล้วได้หากต้องการยืนยันว่ามีการเรียกเซิร์ฟเวอร์ระยะไกลจริง

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

คุณควรเห็นเอาต์พุตต่อไปนี้ในบันทึก

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}}

เมื่อมีเซิร์ฟเวอร์ MCP ระยะไกลแล้ว คุณก็สามารถสร้าง Agent ได้ 🤖

5. สร้าง Agent ด้วย ADK

คุณได้ติดตั้งใช้งานเซิร์ฟเวอร์ MCP แล้ว ตอนนี้ก็ถึงเวลาสร้าง Currency Agent โดยใช้ Agent Development Kit (ADK)

ADK ช่วยให้การสร้าง Agent เป็นเรื่องง่ายมากและช่วยให้ Agent เชื่อมต่อกับเซิร์ฟเวอร์ MCP ได้ด้วยการรองรับเครื่องมือ MCP ในตัว Currency Agent จะเข้าถึงเครื่องมือ get_exchange_rate โดยใช้คลาส MCPToolset ของ ADK

โค้ดสำหรับ Currency Agent อยู่ใน 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")
            )
        )
    ],
)

หากต้องการทดสอบ Currency Agent อย่างรวดเร็ว คุณสามารถใช้ประโยชน์จาก UI สำหรับการพัฒนาของ ADK ซึ่งเข้าถึงได้โดยเรียกใช้ adk web

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

ในเบราว์เซอร์ ให้ไปที่ http://localhost:8000 เพื่อดูและทดสอบ Agent

ตรวจสอบว่าได้เลือก currency_agent เป็น Agent ที่มุมซ้ายบนของ UI บนเว็บแล้ว

UI บนเว็บของ ADK

ถาม Agent ในพื้นที่แชท เช่น "250 CAD เป็น USD เท่าไหร่" คุณควรเห็น Agent เรียกใช้เครื่องมือ MCP get_exchange_rate ก่อนที่จะให้คำตอบ

ADK Web Currency Agent

Agent ทำงานได้ โดยสามารถจัดการคำค้นหาที่เกี่ยวข้องกับการแปลงสกุลเงินได้ 💸

6. โปรโตคอล Agent2Agent (A2A)

โปรโตคอล Agent2Agent (A2A) เป็นมาตรฐานแบบเปิดที่ออกแบบมาเพื่อให้ AI Agent สื่อสารและทำงานร่วมกันได้อย่างราบรื่น ซึ่งจะช่วยให้ Agent ที่สร้างขึ้นโดยใช้เฟรมเวิร์กที่หลากหลายและโดยผู้ให้บริการที่แตกต่างกันสามารถสื่อสารกันได้ในภาษาที่ใช้ร่วมกัน ซึ่งจะช่วยลดการทำงานแบบแยกส่วนและส่งเสริมการทำงานร่วมกัน

โปรโตคอล A2A

A2A ช่วยให้ Agent ทำสิ่งต่อไปนี้ได้

  • ค้นพบ: ค้นหา Agent อื่นๆ และเรียนรู้ทักษะ (AgentSkill) และความสามารถ (AgentCapabilities) ของ Agent เหล่านั้นโดยใช้การ์ด Agentที่ได้มาตรฐาน
  • สื่อสาร: แลกเปลี่ยนข้อความและข้อมูลอย่างปลอดภัย
  • ทำงานร่วมกัน: มอบหมายงานและประสานงานการดำเนินการเพื่อให้บรรลุเป้าหมายที่ซับซ้อน

โปรโตคอล A2A ช่วยให้การสื่อสารนี้เป็นไปได้ผ่านกลไกต่างๆ เช่น "การ์ด Agent" ซึ่งทำหน้าที่เป็นการ์ดธุรกิจดิจิทัลที่ Agent ใช้เพื่อโฆษณาความสามารถและข้อมูลการเชื่อมต่อของตนเอง

การ์ด A2A Agent

ตอนนี้ก็ถึงเวลาเปิดใช้งาน Currency Agent โดยใช้ A2A เพื่อให้ Agent และไคลเอ็นต์อื่นๆ เรียกใช้ได้

A2A Python SDK

A2A Python SDK มีโมเดล Pydantic สำหรับทรัพยากรแต่ละรายการที่กล่าวถึงข้างต้น ได้แก่ AgentSkill, AgentCapabilities และ AgentCard ซึ่งมีอินเทอร์เฟซสำหรับการเร่งการพัฒนาและการผสานรวมกับโปรโตคอล A2A

AgentSkill คือวิธีที่คุณจะโฆษณาให้ Agent อื่นๆ ทราบว่า Currency Agent มีเครื่องมือสำหรับ 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?'],
)

จากนั้นในส่วนหนึ่งของ AgentCard ระบบจะแสดงทักษะและความสามารถของ Agent พร้อมกับรายละเอียดเพิ่มเติม เช่น โหมดอินพุตและเอาต์พุตที่ Agent จัดการได้

# 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],
)

ถึงเวลาที่จะรวมทุกอย่างเข้าด้วยกันกับ Currency Agent และแสดงให้เห็นถึงประสิทธิภาพของ A2A แล้ว

7. เปิดใช้งาน Currency Agent เป็นเซิร์ฟเวอร์ A2A

ADK ช่วยลดความซับซ้อนของกระบวนการสร้างและเชื่อมต่อ Agent โดยใช้โปรโตคอล A2A การทำให้ ADK Agent ที่มีอยู่เข้าถึงได้ (เปิดใช้งาน) เป็นเซิร์ฟเวอร์ A2A ทำได้ด้วยฟังก์ชัน to_a2a(root_agent) ของ ADK (ดูรายละเอียดทั้งหมดได้ในเอกสารประกอบ ADK)

ฟังก์ชัน to_a2a จะแปลง Agent ที่มีอยู่ให้ทำงานกับ A2A และเปิดใช้งาน Agent เป็นเซิร์ฟเวอร์ผ่าน uvicorn ซึ่งหมายความว่าคุณจะควบคุมสิ่งที่จะเปิดใช้งานได้มากขึ้นหากวางแผนที่จะนำ Agent ไปใช้จริง ฟังก์ชัน to_a2a() จะสร้างการ์ด Agent โดยอัตโนมัติตามโค้ด Agent โดยใช้ A2A Python SDK เบื้องหลัง

เมื่อดูภายในไฟล์ currency_agent/agent.py คุณจะเห็นการใช้ to_a2a และวิธีที่ Currency Agent เปิดใช้งานเป็นเซิร์ฟเวอร์ A2A ด้วยโค้ดเพียง 2 บรรทัด

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)

หากต้องการเรียกใช้เซิร์ฟเวอร์ A2A ให้เรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัลใหม่

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

หากเซิร์ฟเวอร์เริ่มทำงานสำเร็จ เอาต์พุตจะมีลักษณะดังนี้ ซึ่งบ่งชี้ว่าเซิร์ฟเวอร์ทำงานบนพอร์ต 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)

ตอนนี้ Currency Agent ทำงานเป็นเซิร์ฟเวอร์ A2A ได้สำเร็จแล้ว โดย Agent หรือไคลเอ็นต์อื่นๆ สามารถเรียกใช้ได้โดยใช้โปรโตคอล A2A

ยืนยันว่า Agent ระยะไกลทำงานอยู่

คุณสามารถตรวจสอบอีกครั้งว่า Agent ทำงานอยู่โดยไปที่ URL การ์ด Agent สำหรับ Currency Agent ที่ฟังก์ชัน to_a2a() สร้างขึ้นโดยอัตโนมัติ

ในเบราว์เซอร์ ให้ไปที่ http://localhost:10000/.well-known/agent-card.json

คุณควรเห็นการ์ด Agent ต่อไปนี้

{
  "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"
}

ทดสอบเซิร์ฟเวอร์ A2A

ตอนนี้คุณสามารถทดสอบเซิร์ฟเวอร์ได้โดยส่งคำขอไปยังเซิร์ฟเวอร์โดยใช้ A2A

A2A Python SDK มีคลาส a2a.client.Client ที่ช่วยให้การดำเนินการนี้ง่ายขึ้น

ไฟล์ currency_agent/test_a2aclient.py มีโค้ดที่แสดงวิธีดึงข้อมูลการ์ด Agent และส่งข้อความไปยังเซิร์ฟเวอร์ 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()

เรียกใช้การทดสอบโดยใช้คำสั่งต่อไปนี้

uv run currency_agent/test_a2aclient.py

การเรียกใช้การทดสอบที่สำเร็จจะมีผลลัพธ์ดังนี้

🔄 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)."
    }
  }
  ...

ใช้ได้ผล! คุณทดสอบได้สำเร็จว่าสามารถสื่อสารกับ Currency Agent ผ่านโปรโตคอล A2A ด้วยไคลเอ็นต์ A2A ได้ 🎉

ดูตัวอย่าง A2A เพิ่มเติมได้ในที่เก็บ a2a-samples ใน GitHub

8. ใช้ Currency Agent ระยะไกลผ่าน A2A

ในขั้นตอนก่อนหน้านี้ คุณใช้ไคลเอ็นต์ A2A เพื่อสื่อสารกับ Currency Agent ผ่าน A2A

ในขั้นตอนนี้ เรามาดูกันว่าคุณจะใช้ Currency Agent เป็น Agent ระยะไกลจาก Travel Agent อื่นได้อย่างไร

โค้ดของ Travel Agent อยู่ใน 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)],
)

โปรดสังเกตวิธีเข้าถึง Currency Agent โดยใช้ RemoteA2aAgent

เรียกใช้ adk web เพื่อทดสอบ Travel Agent

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

ในเบราว์เซอร์ ให้ไปที่ http://localhost:8000 เพื่อดูและทดสอบ Agent

ตรวจสอบว่าได้เลือก travel_agent เป็น Agent ที่มุมซ้ายบนของ UI บนเว็บแล้ว

ถาม Agent ในพื้นที่แชท เช่น "250 CAD เป็น USD เท่าไหร่"

คุณควรเห็น Travel Agent เรียกใช้ currency_agent จากระยะไกลก่อนที่จะให้คำตอบ

ADK Web Remote Currency Agent

Agent ทำงานได้ โดยสามารถจัดการคำค้นหาที่เกี่ยวข้องกับการแปลงสกุลเงินได้ 💸 โดยการเรียกใช้ Agent ระยะไกลโดยใช้ A2A

9. ขอแสดงความยินดี

ยินดีด้วย คุณสร้างและติดตั้งใช้งานเซิร์ฟเวอร์ MCP ระยะไกลได้สำเร็จแล้ว สร้าง Currency Agent โดยใช้ Agent Development Kit (ADK) ที่เชื่อมต่อกับเครื่องมือโดยใช้ MCP และเปิดใช้งาน Agent โดยใช้โปรโตคอล Agent2Agent (A2A) จากนั้นคุณได้สร้างตัวแทนท่องเที่ยวเพื่อพูดคุยกับ Currency Agent จากระยะไกลโดยใช้ A2A

นี่คือลิงก์ไปยังเอกสารประกอบโค้ดฉบับเต็ม

หากต้องการติดตั้งใช้งาน Agent Agent Runtime ของแพลตฟอร์ม Agent ของ Gemini Enterprise มอบประสบการณ์การใช้งานที่มีการจัดการสำหรับการติดตั้งใช้งาน AI Agent ในการใช้งานจริง

สิ่งที่เราได้พูดถึงไปแล้ว

  • วิธีสร้างเซิร์ฟเวอร์ MCP ในเครื่อง
  • การติดตั้งใช้งานเซิร์ฟเวอร์ MCP ใน Cloud Run
  • วิธีสร้าง Agent ด้วย Agent Development Kit ที่ใช้เครื่องมือ MCP
  • วิธีเปิดใช้งาน ADK Agent เป็นเซิร์ฟเวอร์ A2A
  • การทดสอบเซิร์ฟเวอร์ A2A โดยใช้ไคลเอ็นต์ A2A
  • วิธีสร้าง Agent เพื่อพูดคุยกับ Agent อื่นผ่านโปรโตคอล A2A

ล้างข้อมูล

โปรดทำตามขั้นตอนต่อไปนี้เพื่อหลีกเลี่ยงการเรียกเก็บเงินจากบัญชี Google Cloud สำหรับทรัพยากรที่ใช้ในแล็บนี้

  1. ในคอนโซล Google Cloud ให้ไปที่หน้า จัดการทรัพยากร
  2. ในรายการโปรเจ็กต์ ให้เลือกโปรเจ็กต์ที่ต้องการลบ แล้วคลิกลบ
  3. ในกล่องโต้ตอบ ให้พิมพ์รหัสโปรเจ็กต์ แล้วคลิกปิด เพื่อลบโปรเจ็กต์