Công cụ Tạo một tác nhân: Từ con số 0 đến trợ lý với ADK

1. Giới thiệu

Trong lớp học này, bạn sẽ tạo một tác nhân bằng Agent Development Kit (ADK)! Bạn sẽ học cách tạo một tác nhân trợ lý về lỗi phần mềm bằng ADK và nhiều loại công cụ. Bạn sẽ bắt đầu với một tác nhân cơ bản và dần dần thêm các công cụ để nâng cao khả năng của tác nhân đó, bao gồm công cụ hàm, công cụ tích hợp, công cụ bên thứ bacông cụ Giao thức ngữ cảnh mô hình (MCP).

Công cụ Tạo một nhân viên hỗ trợ

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

  • Cách thiết lập dự án Python để phát triển ADK.
  • Cách tạo một tác nhân ADK cơ bản.
  • Cách triển khai và sử dụng Công cụ hàm.
  • Cách tích hợp các công cụ tích hợp như Google Tìm kiếm.
  • Cách tận dụng Công cụ của bên thứ ba từ các khung như LangChain trong ADK.
  • Cách sử dụng MCP Tools để tương tác với cơ sở dữ liệu (Cloud SQL) và API.

2. Tổng quan

Giả sử bạn là một nhà quản lý dự án tại QuantumRoast, một công ty sản xuất máy pha cà phê toàn cầu.

Quantum Roast

Bạn giúp các đồng nghiệp của mình vượt qua vô vàn kế hoạch phát triển kỹ thuật, những thay đổi đột ngột về chiến lược (chúng ta sẽ làm matcha ngay bây giờ!), và các phiếu yêu cầu từ khách hàng – mọi thứ từ hệ thống hoá đơn có lỗi cho đến máy pha cà phê phát ra tiếng kêu chói tai 24/7.

Vào một ngày bình thường, bạn có khoảng 50 thẻ trình duyệt đang mở: hệ thống yêu cầu hỗ trợ nội bộ, email, tin nhắn tức thời, GitHub, Google Tìm kiếm, StackOverflow và nhiều thẻ khác. Bạn thích công việc và đồng nghiệp của mình, nhưng đôi khi bạn cảm thấy quá tải.

Nhà quản lý dự án bị quá tải

Nếu có một trợ lý mà chúng ta có thể tạo ra để giúp bạn tạo và phân loại phiếu yêu cầu hỗ trợ phần mềm, cũng như gỡ lỗi thì sao? Một trợ lý AI có thể giúp bạn làm được điều này.

Nhân viên hỗ trợ AI

Bộ công cụ phát triển tác nhân (ADK)

Agent Development Kit (ADK) là một khung linh hoạt và mô-đun để phát triển và triển khai các tác nhân AI. Mặc dù được tối ưu hoá cho Gemini và hệ sinh thái của Google, nhưng 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 dựa trên tác nhân, từ các tác vụ đơn giản đến quy trình công việc phức tạp.

ADK là khung mà chúng ta sẽ dùng để tạo trợ lý phần mềm QuantumRoast về lỗi.

Sơ đồ tác nhân

Công cụ 101

Các tác nhân AI sử dụng mô hình chứ không chỉ logic được mã hoá cứng để suy luận cách giải quyết vấn đề. Nhưng không chỉ dựa vào khả năng suy luận của LLM, các tác nhân AI còn có khả năng thu thập dữ liệu bên ngoài và sau đó hành động thay cho người dùng. Thay vì hướng dẫn bạn cách giải quyết vấn đề, một trợ lý AI có thể giúp bạn thực sự giải quyết vấn đề đó. Làm cách nào để thực hiện việc này? Với các công cụ!

Công cụ là một chức năng giúp tác nhân AI tương tác với thế giới. Công cụ có thể là hầu hết mọi thứ: một hàm nội tuyến, một cơ sở dữ liệu được lưu trữ, một API của bên thứ ba hoặc thậm chí là một tác nhân khác. Các khung tác nhân AI như Agent Development Kit (ADK) có hỗ trợ sẵn cho các công cụ, hỗ trợ nhiều loại công cụ mà chúng ta sẽ đề cập ngay sau đây.

Nhưng làm cách nào để một tác nhân biết không chỉ thời điểm gọi một công cụ nhất định mà còn biết cách gọi công cụ đó? Mô hình của tác nhân đóng một số vai trò chính ở đây.

Cách hoạt động của các công cụ

Đầu tiên là lựa chọn công cụ. Chúng tôi cung cấp cho nhân viên hỗ trợ danh sách các công cụ và một số hướng dẫn về cách sử dụng các công cụ đó. Khi người dùng nhắc nhân viên hỗ trợ, mô hình của nhân viên hỗ trợ sẽ giúp quyết định nên gọi công cụ nào và lý do gọi để giúp người dùng.

Bước quan trọng thứ hai là gọi hàm. Gọi hàm là một tên gọi không chính xác vì mô hình này không thực sự gọi công cụ, mà là chuẩn bị gọi công cụ bằng cách định dạng nội dung yêu cầu mà khung sau đó dùng để gọi công cụ.

Cuối cùng, mô hình này giúp diễn giải phản hồi từ công cụ đó (ví dụ: danh sách các lỗi chưa được khắc phục trong cơ sở dữ liệu) và quyết định có nên thực hiện thêm hành động hay phản hồi cho người dùng bằng thông tin đó.

Để xem tất cả những điều này trong thực tế, đã đến lúc bạn cần tạo tác nhân trợ lý báo lỗi QuantumRoast bằng ADK Python.

Trợ lý báo lỗi QuantumRoast

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

Thiết lập dự án trên Google Cloud

  1. Nếu chưa có Tài khoản Google, bạn phải tạo một Tài khoản Google.
    • Sử dụng tài khoản cá nhân thay vì tài khoản do nơi làm việc hoặc trường học cấp. Tài khoản do nơi làm việc và trường học cấp có thể có các hạn chế khiến bạn không thể bật những API cần thiết cho lớp học này.
  2. Đăng nhập vào Google Cloud Console.
  3. Bật tính năng thanh toán trong Cloud Console.
    • Việc hoàn thành bài thực hành này sẽ tốn ít hơn 1 USD cho các tài nguyên trên đám mây.
    • Bạn có thể làm theo các bước ở cuối bài thực hành này để xoá tài nguyên nhằm tránh bị tính thêm phí.
    • Người dùng mới sẽ đủ điều kiện dùng thử miễn phí 300 USD.
  4. Tạo một dự án mới hoặc chọn sử dụng lại một dự án hiện có.

Mở Trình chỉnh sửa Cloud Shell

  1. Chuyển đến Trình chỉnh sửa Cloud Shell
  2. Nếu thiết bị đầu cuối không xuất hiện ở cuối màn hình, hãy mở thiết bị đầu cuối:
    • Nhấp vào trình đơn có biểu tượng ba dấu gạch ngang Biểu tượng trình đơn ba đường kẻ
    • Nhấp vào Terminal (Thiết bị đầu cuối)
    • Nhấp vào Thiết bị đầu cuối mớiMở cửa sổ dòng lệnh mới trong Trình chỉnh sửa Cloud Shell
  3. Trong thiết bị đầu cuối, hãy thiết lập dự án bằng lệnh này (thay thế YOUR_PROJECT_ID):
    • Định dạng:
      gcloud config set project YOUR_PROJECT_ID
      
    • Ví dụ:
      gcloud config set project lab-project-id-example
      
    • Nếu bạn không nhớ mã dự án của mình:
      • Bạn có thể liệt kê tất cả mã dự án bằng cách dùng:
        gcloud projects list | awk '/PROJECT_ID/{print $2}'
        
      Đặt mã dự án trong thiết bị đầu cuối Cloud Shell Editor
  4. Nếu được nhắc uỷ quyền, hãy nhấp vào Uỷ quyền để tiếp tục. Nhấp để uỷ quyền cho Cloud Shell
  5. Bạn sẽ thấy thông báo sau:
    Updated property [core/project].
    
    Nếu thấy biểu tượng WARNING và được yêu cầu Do you want to continue (Y/N)?, thì có thể bạn đã nhập sai mã dự án. Nhấn N, nhấn Enter rồi thử chạy lại lệnh gcloud config set project.
  6. Trong thiết bị đầu cuối, hãy đặt biến môi trường PROJECT_ID để dùng trong các bước sau.
    export PROJECT_ID=$(gcloud config get project)
    

Bật API

Trong dòng lệnh, hãy chạy lệnh sau để bật các API cần thiết của Google Cloud:

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

Tạo một phiên bản Cloud SQL cho PostgreSQL

QuantumRoast có một cơ sở dữ liệu phiếu yêu cầu hỗ trợ lỗi chứa tất cả các phiếu yêu cầu hỗ trợ nội bộ. Hãy tiến hành thiết lập bằng cách tạo một phiên bản Cloud SQL cho PostgreSQL.

gcloud sql instances create software-assistant \
   --database-version=POSTGRES_16 \
   --tier=db-custom-1-3840 \
   --region=us-central1 \
   --edition=ENTERPRISE \
   --enable-google-ml-integration \
   --database-flags cloudsql.enable_google_ml_integration=on \
   --root-password=admin

Đợi phiên bản được tạo (có thể mất vài phút).

Sau khi tạo, bạn có thể xem phiên bản của mình trong Cloud Console tại đây.

Tạo cơ sở dữ liệu Cloud SQL

Tạo cơ sở dữ liệu SQL (tickets-db) và cấp cho tài khoản dịch vụ Cloud SQL quyền truy cập vào Vertex AI (để chúng ta có thể tạo các mục nhúng nhằm thực hiện tìm kiếm tương tự).

gcloud sql databases create tickets-db --instance=software-assistant

SERVICE_ACCOUNT_EMAIL=$(gcloud sql instances describe software-assistant --format="value(serviceAccountEmailAddress)")
echo $SERVICE_ACCOUNT_EMAIL

gcloud projects add-iam-policy-binding $PROJECT_ID --member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" --role="roles/aiplatform.user"

Thiết lập bảng tickets

Trên Cloud Console (Cloud SQL), hãy mở Cloud SQL Studio cho phiên bản software-assistant.

Đăng nhập vào cơ sở dữ liệu tickets-db bằng người dùng postgresadmin làm mật khẩu.

Cloud SQL Studio

Mở một thẻ Editor mới.

Trình chỉnh sửa Cloud SQL Studio

Sau đó, hãy dán mã SQL sau đây để thiết lập bảng và tạo các mục nhúng vectơ. Nhấn nút Run để thực thi lệnh.

CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector CASCADE;
GRANT EXECUTE ON FUNCTION embedding TO postgres;

CREATE TABLE tickets (
    ticket_id SERIAL PRIMARY KEY,             -- PostgreSQL's auto-incrementing integer type (SERIAL is equivalent to INT AUTO_INCREMENT)
    title VARCHAR(255) NOT NULL,              -- A concise summary or title of the bug/issue.
    description TEXT,                         -- A detailed description of the bug.
    assignee VARCHAR(100),                    -- The name or email of the person/team assigned to the ticket.
    priority VARCHAR(50),                     -- The priority level (e.g., 'P0 - Critical', 'P1 - High').
    status VARCHAR(50) DEFAULT 'Open',        -- The current status of the ticket (e.g., 'Open', 'In Progress', 'Resolved'). Default is 'Open'.
    creation_time TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, -- Timestamp when the ticket was first created. 'WITH TIME ZONE' is recommended for clarity and compatibility.
    updated_time TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP  -- Timestamp when the ticket was last updated. Will be managed by a trigger.
);

Bảng tickets đã được tạo, hãy nhấp vào Clear để xoá truy vấn cũ.

Bây giờ, hãy chèn dữ liệu mẫu rồi nhấn lại nút Run.

INSERT INTO tickets (title, description, assignee, priority, status) VALUES
('Login Page Freezes After Multiple Failed Attempts', 'Users are reporting that after 3 failed login attempts, the login page becomes unresponsive and requires a refresh. No specific error message is displayed.', 'samuel.green@example.com', 'P0 - Critical', 'Open');

INSERT INTO tickets (title, description, assignee, priority, status) VALUES
('Dashboard Sales Widget Intermittent Data Loading Failure', 'The "Sales Overview" widget on the main dashboard intermittently shows a loading spinner but no data. Primarily affects Chrome browser users.', 'maria.rodriguez@example.com', 'P1 - High', 'In Progress');

INSERT INTO tickets (title, description, assignee, priority, status) VALUES
('Broken Link in Footer - Privacy Policy', 'The "Privacy Policy" hyperlink located in the website footer leads to a 404 "Page Not Found" error.', 'maria.rodriguez@example.com', 'P3 - Low', 'Resolved');

INSERT INTO tickets (title, description, assignee, priority, status) VALUES
('UI Misalignment on Mobile Landscape View (iOS)', 'On specific iOS devices (e.g., iPhone 14 models), the top navigation bar shifts downwards when the device is viewed in landscape orientation, obscuring content.', 'maria.rodriguez@example.com', 'P2 - Medium', 'In Progress');

INSERT INTO tickets (title, description, assignee, priority, status) VALUES
('Critical XZ Utils Backdoor Detected in Core Dependency (CVE-2024-3094)', 'Urgent: A sophisticated supply chain compromise (CVE-2024-3094) has been identified in XZ Utils versions 5.6.0 and 5.6.1. This malicious code potentially allows unauthorized remote SSH access by modifying liblzma. Immediate investigation and action required for affected Linux/Unix systems and services relying on XZ Utils.', 'frank.white@example.com', 'P0 - Critical', 'Open');

INSERT INTO tickets (title, description, assignee, priority, status) VALUES
('Database Connection Timeouts During Peak Usage', 'The application is experiencing frequent database connection timeouts, particularly during peak hours (10 AM - 12 PM EDT), affecting all users and causing service interruptions.', 'frank.white@example.com', 'P1 - High', 'Open');

INSERT INTO tickets (title, description, assignee, priority, status) VALUES
('Export to PDF Truncates Long Text Fields in Reports', 'When generating PDF exports of reports containing extensive text fields, the text is abruptly cut off at the end of the page instead of wrapping or continuing to the next page.', 'samuel.green@example.com', 'P1 - High', 'Open');

INSERT INTO tickets (title, description, assignee, priority, status) VALUES
('Search Filter "Date Range" Not Applying Correctly', 'The "Date Range" filter on the search results page does not filter records accurately; results outside the specified date range are still displayed.', 'samuel.green@example.com', 'P2 - Medium', 'Resolved');

INSERT INTO tickets (title, description, assignee, priority, status) VALUES
('Typo in Error Message: "Unathorized Access"', 'The error message displayed when a user attempts an unauthorized action reads "Unathorized Access" instead of "Unauthorized Access."', 'maria.rodriguez@example.com', 'P3 - Low', 'Resolved');

INSERT INTO tickets (title, description, assignee, priority, status) VALUES
('Intermittent File Upload Failures for Large Files', 'Users are intermittently reporting that file uploads fail without a clear error message or explanation, especially for files exceeding 10MB in size.', 'frank.white@example.com', 'P1 - High', 'Open');

Tại QuantumRoast, chúng tôi có thể muốn biết lần gần nhất một lỗi/phiếu yêu cầu được cập nhật là khi nào.

Để làm như vậy, chúng ta có thể tạo một điều kiện kích hoạt để cập nhật trường updated_time mỗi khi một bản ghi được cập nhật.

Nhấp vào Clear rồi dán SQL sau đây để triển khai một điều kiện kích hoạt.

Nhấn nút Run để thực thi.

CREATE OR REPLACE FUNCTION update_updated_time_tickets()
RETURNS TRIGGER AS $$
BEGIN
    NEW.updated_time = NOW();  -- Set the updated_time to the current timestamp
    RETURN NEW;                -- Return the new row
END;
$$ language 'plpgsql';        

CREATE TRIGGER update_tickets_updated_time
BEFORE UPDATE ON tickets
FOR EACH ROW                  -- This means the trigger fires for each row affected by the UPDATE statement
EXECUTE PROCEDURE update_updated_time_tickets();

Tạo vectơ nhúng từ trường description. Thao tác này sẽ cho phép tác nhân thực hiện tìm kiếm tương tự trên cơ sở dữ liệu của chúng tôi. Ví dụ: "Có vấn đề nào chưa được giải quyết liên quan đến trang chủ của trang web không?".

ALTER TABLE tickets ADD COLUMN embedding vector(768) GENERATED ALWAYS AS (embedding('text-embedding-005',description)) STORED;

Giờ đây, bạn có thể truy vấn cơ sở dữ liệu để xác minh rằng cơ sở dữ liệu đã sẵn sàng.

SELECT * FROM tickets;

Bạn sẽ thấy 10 hàng được trả về có dạng như sau:

Xác minh cơ sở dữ liệu Cloud SQL

Giờ bạn đã sẵn sàng chuyển sang phần thú vị nhất, đó là mã!

4. Thiết lập dự án Python

Trước khi bắt đầu xây dựng tác nhân, chúng ta phải đảm bảo rằng mình đã thiết lập đúng dự án Python. Chúng ta sẽ thực hiện tất cả trong Cloud Shell!

Trước tiên, hãy tạo một thư mục quantum-roastcd vào thư mục đó:

mkdir quantum-roast && cd quantum-roast

Giờ đây, khi đã có một thư mục cho dự án, chúng ta cần khởi tạo dự án và tạo các tệp tương ứng mà chúng ta sẽ cần.

Chúng ta sẽ sử dụng uv (trình quản lý dự án và gói cực nhanh của Python) được cài đặt sẵn trong Cloud Shell để quản lý dự án và các phần phụ thuộc. Uv sẽ giúp chúng ta thiết lập một số tệp cũng như quản lý môi trường ảo, các phần phụ thuộc, v.v. để chúng ta không phải làm việc này!

Khởi chạy một dự án mới bằng uv init:

uv init --description "QuantumRoast Software Bug Assistant with ADK" --bare --python 3.10

Sau khi chạy lệnh này, chúng ta sẽ có một tệp pyproject.toml cho dự án của mình. Để xác minh, hãy chạy cat pyproject.toml trong cửa sổ dòng lệnh Cloud Shell:

cat pyproject.toml

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

[project]
name = "quantum-roast"
version = "0.1.0"
description = "QuantumRoast Software Bug Assistant with ADK"
requires-python = ">=3.10"
dependencies = []

Đã đến lúc thêm google-adk (ADK) làm phần phụ thuộc cho dự án bằng uv add.

uv add google-adk==1.11.0

Thao tác này sẽ thêm google-adk vào danh sách dependencies trong pyproject.toml của chúng tôi.

ADK yêu cầu một cấu trúc dự án nhất định để đạt được kết quả tốt nhất.

quantum-roast/
    software_bug_assistant/
        __init__.py
        agent.py
        .env

Tạo thư mục software_bug_assistant và các tệp trong thư mục đó:

mkdir software_bug_assistant && touch software_bug_assistant/__init__.py \
software_bug_assistant/agent.py \
software_bug_assistant/tools.py \
software_bug_assistant/.env

Xác minh việc tạo tệp bằng cách sử dụng ls:

ls -a software_bug_assistant/

Bạn sẽ thấy những thông tin sau:

__init__.py	 .  ..	 .env	 agent.py    tools.py

Đã đến lúc điền vào tệp .env các biến môi trường cần thiết để ADK gọi đúng các mô hình Gemini. Chúng ta sẽ truy cập vào Gemini thông qua Vertex API.

echo "GOOGLE_GENAI_USE_VERTEXAI=TRUE" >> software_bug_assistant/.env \
&& echo "GOOGLE_CLOUD_PROJECT=$PROJECT_ID" >> software_bug_assistant/.env \
&& echo "GOOGLE_CLOUD_LOCATION=us-central1" >> software_bug_assistant/.env

Để xác minh rằng .env đã được điền chính xác, hãy chạy lệnh sau:

cat software_bug_assistant/.env

Bạn sẽ thấy nội dung sau đây, trong đó your-project-id là mã dự án của bạn:

GOOGLE_GENAI_USE_VERTEXAI=TRUE
GOOGLE_CLOUD_PROJECT=your-project-id
GOOGLE_CLOUD_LOCATION=us-central1

Giờ đây, chúng ta đã sẵn sàng bắt đầu tạo tác nhân ADK.

5. Nhân viên hỗ trợ ADK cơ bản

Hãy thiết lập một tác nhân ADK cơ bản mà chúng ta có thể thêm từng công cụ vào trong hội thảo này để tạo ra một trợ lý mạnh mẽ về lỗi!

Mở agent.py trong Trình chỉnh sửa Cloud Shell:

cloudshell edit software_bug_assistant/agent.py

Dán mã sau vào agent.py rồi lưu tệp Ctrl + s:

from google.adk.agents import Agent

# --- Agent Definition (model, instructions, tools) ---
root_agent = Agent(
    model="gemini-2.5-flash",
    name="software_assistant",
    instruction="""
    You are a skilled expert in triaging and debugging software issues for a
    coffee machine company, QuantumRoast.
    """,
    tools=[],
)

Chạy tác nhân bạn vừa tạo bằng cách khởi động giao diện người dùng dành cho nhà phát triển của ADK (adk web). Khi bạn làm như vậy với uv run, hệ thống sẽ tự động tạo một môi trường ảo có ADK đã cài đặt.

uv run adk web --port 8080 --reload_agents

Trong bảng điều khiển, bạn sẽ thấy ADK Web Server khởi động thành công.

INFO:     Started server process [1557]
INFO:     Waiting for application startup.

+-----------------------------------------------------------------------------+
| ADK Web Server started                                                      |
|                                                                             |
| For local testing, access at http://localhost:8080.                         |
+-----------------------------------------------------------------------------+

INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:8080 (Press CTRL+C to quit)

Mở tính năng Xem trước trên web của Cloud Shell để xem giao diện người dùng.

Bản xem trước web của Cloud Shell

Bạn sẽ thấy giao diện người dùng web ADK.

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

Hãy thử trò chuyện với nhân viên hỗ trợ ADK.

Hỏi tác nhân What day is it today?.

Ví dụ về ADK Web

Bạn sẽ nhận thấy rằng nhân viên hỗ trợ không thể trả lời câu hỏi cơ bản này! Xin lưu ý rằng LLM là các hệ thống riêng biệt, được huấn luyện dựa trên dữ liệu trong quá khứ. Chúng không có bối cảnh theo thời gian thực về các sự kiện gần đây hoặc thậm chí là ngày hiện tại... trừ phi bạn cung cấp cho chúng công cụ!

Đã đến lúc triển khai loại công cụ đầu tiên của ADK, đó là Công cụ chức năng.

6. Công cụ hàm

Loại công cụ ADK đầu tiên và đơn giản nhất là công cụ hàm. Đúng như tên gọi, đây là một hàm Python được tác nhân gọi!

Công cụ chức năng

Các công cụ hàm khá mạnh mẽ vì cho phép bạn viết mã tuỳ chỉnh để tác nhân gọi dưới dạng một công cụ, chẳng hạn như thực hiện phép tính, gọi API, truy vấn cơ sở dữ liệu. Bạn có thể chọn hàm đơn giản hoặc phức tạp tuỳ ý.

Tại QuantumRoast , chúng ta muốn xác định một hàm cơ bản để lấy ngày hiện tại, nhằm xử lý các truy vấn như "cho tôi xem lỗi của tuần trước" hoặc "hôm nay là thứ mấy?" sau này trong phòng thí nghiệm này. (chuyện này xảy ra với tất cả chúng ta).

Tệp tools.py trong thư mục /software_bug_assistant là nơi chúng ta sẽ sắp xếp tất cả các công cụ mà chúng ta tạo trong suốt lớp học này.

Mở một cửa sổ dòng lệnh MỚI bằng cách nhấp vào biểu tượng +.

Nhà ga mới

Bây giờ, trong cửa sổ dòng lệnh mới, hãy đặt PROJECT_ID rồi mở tools.py:

cd quantum-roast
export PROJECT_ID=$(gcloud config get project)
cloudshell edit software_bug_assistant/tools.py

Bây giờ, hãy xác định hàm get_current_date sẽ được dùng làm công cụ Hàm.

from datetime import datetime

# ----- Example of a Function tool -----
def get_current_date() -> dict:
    """
    Get the current date in the format YYYY-MM-DD
    """
    return {"current_date": datetime.now().strftime("%Y-%m-%d")}

Hàm hiện đã được xác định! Đã đến lúc chuyển thông tin này cho nhân viên hỗ trợ.

Mở agent.py trong Trình chỉnh sửa Cloud Shell:

cloudshell edit software_bug_assistant/agent.py

Chúng ta muốn nhập hàm get_current_date từ tools.py và truyền hàm này vào đối số tools của tác nhân.

agent.py sau khi cập nhật sẽ có dạng như sau:

from google.adk.agents import Agent

from .tools import get_current_date

# --- Agent Definition (model, instructions, tools) ---
root_agent = Agent(
    model="gemini-2.5-flash",
    name="software_assistant",
    instruction="""
    You are a skilled expert in triaging and debugging software issues for a
    coffee machine company, QuantumRoast.
    """,
    tools=[get_current_date],
)

Giờ đây, nếu bạn quay lại thẻ Web Preview (Xem trước trên web) đang chạy Giao diện người dùng web ADK và hỏi lại What day is it today?...

Công cụ chức năng web ADK

Trợ lý có thể cho biết ngày bằng cách gọi Công cụ hàm get_current_date! 🎉

Đã đến lúc khám phá loại công cụ ADK tiếp theo.

7. Công cụ tích hợp

Một loại công cụ ADK khác là công cụ tích hợp. Đây là những công cụ hoạt động với các tính năng của mô hình hàng đầu của Google, chẳng hạn như thực thi mã ngay trong mô hình. Chúng ta có thể đính kèm công cụ tích hợp Google Tìm kiếm vào tác nhân trợ lý báo lỗi để cung cấp cho tác nhân ngữ cảnh phù hợp bằng cách cấp cho tác nhân quyền truy cập vào việc tìm kiếm trên web. Nhờ đó, nhân viên hỗ trợ có thể thu thập thêm thông tin mới nhất về một lỗi hoặc lỗ hổng bảo mật đã biết.

Công cụ tích hợp

Mở tệp tools.py để thêm chế độ hỗ trợ cho công cụ tích hợp của Google Tìm kiếm.

cloudshell edit software_bug_assistant/tools.py

Thêm nội dung sau vào cuối tools.py:

# ----- Built-in Tool Imports -----
from google.adk.agents import Agent
from google.adk.tools import google_search
from google.adk.tools.agent_tool import AgentTool

# ----- Example of a Built-in Tool -----
search_agent = Agent(
    model="gemini-2.5-flash",
    name="search_agent",
    description="A specialist in Google Search.",
    instruction="""
    You're a specialist in Google Search.
    """,
    tools=[google_search],
)

search_tool = AgentTool(search_agent)

Ở đây, chúng ta đang bao bọc công cụ Google Tìm kiếm đó trong chính tác nhân của nó bằng các chỉ dẫn hệ thống riêng, nhờ đó sử dụng hiệu quả tác nhân làm công cụ.

Bây giờ, chúng ta có thể nhập và truyền search_tool đến tác nhân gốc trong agent.py:

cloudshell edit software_bug_assistant/agent.py

Bạn có thể thay thế agent.py bằng mã sau để thêm search_tool:

from google.adk.agents import Agent

from .tools import get_current_date, search_tool

# --- Agent Definition (model, instructions, tools) ---
root_agent = Agent(
    model="gemini-2.5-flash",
    name="software_assistant",
    instruction="""
    You are a skilled expert in triaging and debugging software issues for a
    coffee machine company, QuantumRoast.
    """,
    tools=[get_current_date, search_tool],
)

Lưu tệp và quay lại cửa sổ đang mở có giao diện người dùng web ADK đang chạy.

Tại QuantumRoast, chúng tôi muốn đảm bảo trang web và phần mềm của mình được bảo vệ khỏi Các lỗ hổng và vấn đề rò rỉ phổ biến (CVE) là những lỗ hổng bảo mật mạng công khai. Chúng ta có thể sử dụng công cụ Tìm kiếm của Google mới của trợ lý để tìm kiếm các CVE mới phát hiện gần đây nhất trên web.

Chạy truy vấn sau: Do a web search for 5 of the most recent CVEs?.

Trợ lý của chúng tôi nên gọi search_agent để tìm kiếm trên web.

Ví dụ về công cụ tích hợp sẵn trên web ADK

Giờ đây, tác nhân của chúng tôi đã mở khoá thành công khả năng tìm kiếm trên web thông qua công cụ tích hợp của ADK cho Google Tìm kiếm! 🎉

Chuyển sang loại công cụ ADK tiếp theo.

8. Công cụ của bên thứ ba

ADK được thiết kế để có khả năng mở rộng cao, cho phép bạn tích hợp liền mạch các công cụ từ các khung AI Agent khác của bên thứ ba như CrewAILangChain. Khả năng tương tác này là yếu tố then chốt vì nó giúp giảm thời gian phát triển và cho phép bạn sử dụng lại các công cụ hiện có.

Công cụ của bên thứ ba

Để kết nối tác nhân lỗi của chúng tôi với dữ liệu hỏi và đáp mạnh mẽ của StackOverflow, chúng tôi có thể lấy dữ liệu từ thư viện công cụ mở rộng của LangChain, cụ thể là công cụ Trình bao bọc API StackExchange. ADK hỗ trợ các công cụ của bên thứ ba như LangChain, vì vậy, bạn chỉ cần thêm một vài dòng mã để thêm công cụ này vào tác nhân ADK của chúng tôi!

Trước tiên, chúng ta phải thêm các phần phụ thuộc mới cho LangChain và StackOverflow (langchain-communitystackapi) vào dự án:

uv add langchain-community==0.3.27 stackapi==0.3.1

Mở tệp tools.py để thêm chế độ hỗ trợ cho công cụ LangChain StackExchange.

cloudshell edit software_bug_assistant/tools.py

Thêm nội dung sau vào cuối tools.py:

# ----- Example of a Third-Party Tool -----
from google.adk.tools.langchain_tool import LangchainTool
from langchain_community.tools import StackExchangeTool
from langchain_community.utilities import StackExchangeAPIWrapper

stack_exchange_tool = StackExchangeTool(api_wrapper=StackExchangeAPIWrapper())
langchain_tool = LangchainTool(stack_exchange_tool)

Bây giờ, chúng ta có thể nhập và truyền langchain_tool đến tác nhân gốc trong agent.py:

cloudshell edit software_bug_assistant/agent.py

Bạn có thể thay thế agent.py bằng mã sau để thêm langchain_tool:

from google.adk.agents import Agent

from .tools import get_current_date, langchain_tool, search_tool

# --- Agent Definition (model, instructions, tools) ---
root_agent = Agent(
    model="gemini-2.5-flash",
    name="software_assistant",
    instruction="""
    You are a skilled expert in triaging and debugging software issues for a
    coffee machine company, QuantumRoast.
    """,
    tools=[get_current_date, search_tool, langchain_tool],
)

Lưu tệp và quay lại thẻ đang mở có Giao diện người dùng web ADK.

Hãy thử hỏi trợ lý ảo về các CVE trước đây, "Are there similar issues on stack exchange?" hoặc một CVE mới như "Our database queries with SQLAlchemy seem to be timing out, is there anything on StackExchange relevant to this?".

Ví dụ về công cụ của bên thứ ba trên web ADK

Giờ đây, tác nhân của chúng tôi đã tận dụng thành công một công cụ LangChain trong ADK để truy vấn StackOverflow. 🥳

Đã đến lúc tìm hiểu về loại công cụ ADK tiếp theo... Công cụ MCP!

9. Công cụ MCP (Cơ sở dữ liệu)

MCP là viết tắt của Giao thức ngữ cảnh mô hình. Đây là một giao thức mở do Anthropic giới thiệu vào năm 2024. MCP cung cấp một lớp trừu tượng giữa tác nhân AI và "hậu phương" (API, cơ sở dữ liệu) của công cụ.

Cách hoạt động của MCP

MCP có một số quy cách riêng. Không giống như HTTP tiêu chuẩn, MCP cung cấp một kết nối hai chiều có trạng thái giữa ứng dụng và máy chủ. Công cụ này có cách riêng để xác định công cụthông báo lỗi dành riêng cho công cụ. Sau đó, nhà cung cấp công cụ có thể tạo Máy chủ MCP dựa trên các API của họ, cung cấp một hoặc nhiều công cụ được tạo sẵn cho nhà phát triển và người dùng. Sau đó, các khung tác nhân có thể khởi động MCP Client bên trong một ứng dụng tác nhân để khám phá và gọi các công cụ đó.

Tại QuantumRoast, chúng tôi có cơ sở dữ liệu Cloud SQL cho PostgreSQL để theo dõi các lỗi phần mềm nội bộ. Chúng tôi muốn tạo các công cụ ADK để nhân viên của chúng tôi có thể thực hiện một số truy vấn nhất định trên cơ sở dữ liệu của chúng tôi.

Cơ sở dữ liệu công cụ MCP

Cách dễ nhất để làm việc này là sử dụng MCP Toolbox for Databases , một máy chủ MCP nguồn mở dành cho cơ sở dữ liệu! Toolbox hỗ trợ hơn 15 cơ sở dữ liệu, trong đó có Cloud SQL!

Hộp công cụ cung cấp:

  • Đơn giản hoá quá trình phát triển: Tích hợp các công cụ vào tác nhân của bạn chỉ bằng chưa đến 10 dòng mã, sử dụng lại các công cụ giữa nhiều tác nhân hoặc khung và triển khai các phiên bản mới của công cụ dễ dàng hơn.
  • Hiệu suất cao hơn: Các phương pháp hay nhất như nhóm kết nối, xác thực và nhiều phương pháp khác.
  • Tăng cường bảo mật: Cơ chế xác thực tích hợp để truy cập vào dữ liệu của bạn một cách an toàn hơn
  • Khả năng quan sát toàn diện: Các chỉ số và hoạt động theo dõi có sẵn với sự hỗ trợ tích hợp cho OpenTelemetry.

ADK hỗ trợ MCP Toolbox for Database tools (Hộp công cụ MCP cho các công cụ cơ sở dữ liệu), giúp việc tích hợp diễn ra nhanh chóng.

Hộp công cụ MCP cho cơ sở dữ liệu

Triển khai MCP Toolbox for Databases Server lên Cloud Run

Trước tiên, chúng ta sẽ triển khai MCP Toolbox for Databases Server vào Cloud Run và trỏ đến phiên bản Cloud SQL.

Toolbox cần có một tệp YAML để định cấu hình, trong đó bạn vạch ra nguồn cơ sở dữ liệu và các công cụ cần định cấu hình.

Tạo tệp tools.yaml cho quá trình triển khai.

cloudshell edit tools.yaml

Dán nội dung sau vào tools.yaml:

sources:
  postgresql:
    kind: cloud-sql-postgres
    project: ${PROJECT_ID}
    region: us-central1
    instance: software-assistant
    database: tickets-db
    user: postgres
    password: admin

tools:
  search-tickets:
    kind: postgres-sql
    source: postgresql
    description: Search for similar tickets based on their descriptions.
    parameters:
      - name: query
        type: string
        description: The query to perform vector search with.
    statement: |
      SELECT ticket_id, title, description, assignee, priority, status, (embedding <=> embedding('text-embedding-005', $1)::vector) as distance
      FROM tickets
      ORDER BY distance ASC
      LIMIT 3;
  get-ticket-by-id:
    kind: postgres-sql
    source: postgresql
    description: Retrieve a ticket's details using its unique ID.
    parameters:
      - name: ticket_id
        type: string
        description: The unique ID of the ticket.
    statement: SELECT * FROM tickets WHERE ticket_id = $1;
  get-tickets-by-assignee:
    kind: postgres-sql
    source: postgresql
    description: Search for tickets based on assignee (email).
    parameters:
      - name: assignee
        type: string
        description: The email of the assignee.
    statement: SELECT * FROM tickets WHERE assignee ILIKE '%' || $1 || '%';
  update-ticket-priority:
    kind: postgres-sql
    source: postgresql
    description: Update the priority of a ticket based on its ID.
    parameters:
      - name: priority
        type: string
        description: The priority of the ticket. Can be one of 'P0 - Critical', 'P1 - High', 'P2 - Medium', or 'P3 - Low'.
      - name: ticket_id
        type: string
        description: The ID of the ticket.
    statement: UPDATE tickets SET priority = $1 WHERE ticket_id = $2;
  update-ticket-status:
    kind: postgres-sql
    source: postgresql
    description: Update the status of a ticket based on its ID.
    parameters:
      - name: status
        type: string
        description: The new status of the ticket (e.g., 'Open', 'In Progress', 'Closed', 'Resolved').
      - name: ticket_id
        type: string
        description: The ID of the ticket.
    statement: UPDATE tickets SET status = $1 WHERE ticket_id = $2;
  get-tickets-by-status:
    kind: postgres-sql
    source: postgresql
    description: Search for tickets based on their current status.
    parameters:
      - name: status
        type: string
        description: The status of the tickets to retrieve (e.g., 'Open', 'In Progress', 'Closed', 'Resolved').
    statement: SELECT * FROM tickets WHERE status ILIKE '%' || $1 || '%';
  get-tickets-by-priority:
    kind: postgres-sql
    source: postgresql
    description: Search for tickets based on their priority.
    parameters:
      - name: priority
        type: string
        description: The priority of the tickets to retrieve (e.g., 'P0 - Critical', 'P1 - High', 'P2 - Medium', 'P3 - Low').
    statement: SELECT * FROM tickets WHERE priority ILIKE '%' || $1 || '%';
  create-new-ticket:
    kind: postgres-sql
    source: postgresql
    description: Create a new software ticket.
    parameters:
      - name: title
        type: string
        description: The title of the new ticket.
      - name: description
        type: string
        description: A detailed description of the bug or issue.
      - name: assignee
        type: string
        description: (Optional) The email of the person to whom the ticket should be assigned.
      - name: priority
        type: string
        description: (Optional) The priority of the ticket. Can be 'P0 - Critical', 'P1 - High', 'P2 - Medium', or 'P3 - Low'. Default is 'P3 - Low'.
      - name: status
        type: string
        description: (Optional) The initial status of the ticket. Default is 'Open'.
    statement: INSERT INTO tickets (title, description, assignee, priority, status) VALUES ($1, $2, $3, COALESCE($4, 'P3 - Low'), COALESCE($5, 'Open')) RETURNING ticket_id;
  get-tickets-by-date-range:
    kind: postgres-sql
    source: postgresql
    description: Retrieve tickets created or updated within a specific date range.
    parameters:
      - name: start_date
        type: string
        description: The start date (inclusive) for the range (e.g., 'YYYY-MM-DD').
      - name: end_date
        type: string
        description: The end date (inclusive) for the range (e.g., 'YYYY-MM-DD').
      - name: date_field
        type: string
        description: The date field to filter by ('creation_time' or 'updated_time').
    statement: SELECT * FROM tickets WHERE CASE WHEN $3 = 'creation_time' THEN creation_time ELSE updated_time END BETWEEN $1::timestamp AND $2::timestamp;

toolsets:
  tickets_toolset:
    - search-tickets
    - get-ticket-by-id
    - get-tickets-by-assignee
    - get-tickets-by-status
    - get-tickets-by-priority
    - get-tickets-by-date-range
    - update-ticket-priority
    - update-ticket-status
    - create-new-ticket

Tệp YAML xác định 9 công cụ liên quan đến cơ sở dữ liệu vé QuantumRoast.

Đã đến lúc định cấu hình tài khoản dịch vụ cho dịch vụ Toolbox Cloud Run, cấp cho tài khoản này quyền truy cập vào Cloud SQL và Secret Manager, đồng thời tạo một bí mật Secret Manager cho tệp tools.yaml của chúng ta.

Secret Manager là nơi chúng ta sẽ lưu trữ tệp tools.yaml vì tệp này chứa thông tin đăng nhập Cloud SQL nhạy cảm.

gcloud iam service-accounts create toolbox-identity

gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member serviceAccount:toolbox-identity@$PROJECT_ID.iam.gserviceaccount.com \
    --role roles/secretmanager.secretAccessor

gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member serviceAccount:toolbox-identity@$PROJECT_ID.iam.gserviceaccount.com \
    --role roles/cloudsql.client

gcloud secrets create tools --data-file=tools.yaml

Đã đến lúc triển khai MCP Toolbox for Databases lên Cloud Run. Chúng tôi sẽ sử dụng phiên bản phát hành mới nhất của hình ảnh vùng chứa MCP Toolbox.

gcloud run deploy toolbox \
    --image us-central1-docker.pkg.dev/database-toolbox/toolbox/toolbox:latest \
    --service-account toolbox-identity \
    --region us-central1 \
    --set-secrets "/app/tools.yaml=tools:latest" \
    --set-env-vars="PROJECT_ID=$PROJECT_ID" \
    --args="--tools-file=/app/tools.yaml","--address=0.0.0.0","--port=8080" \
    --allow-unauthenticated

Chờ quá trình triển khai hoàn tất...

Xác minh rằng Toolbox đang chạy bằng cách truy vấn nhật ký Cloud Run:

gcloud run services logs read toolbox --region us-central1 --limit 10

Bạn sẽ thấy:

2025-08-20 18:03:55 2025-08-20T18:03:55.465847801Z INFO "Initialized 1 sources."
2025-08-20 18:03:55 2025-08-20T18:03:55.466152914Z INFO "Initialized 0 authServices."
2025-08-20 18:03:55 2025-08-20T18:03:55.466374245Z INFO "Initialized 9 tools."
2025-08-20 18:03:55 2025-08-20T18:03:55.466477938Z INFO "Initialized 2 toolsets."
2025-08-20 18:03:55 2025-08-20T18:03:55.467492303Z INFO "Server ready to serve!"

Lưu URL Cloud Run cho dịch vụ Toolbox dưới dạng một biến môi trường để tác nhân ADK biết nơi tìm thấy URL đó.

export MCP_TOOLBOX_URL=$(gcloud run services describe toolbox --region us-central1 --format "value(status.url)")
echo MCP_TOOLBOX_URL=$MCP_TOOLBOX_URL >> software_bug_assistant/.env

Cập nhật QuantumRoast Agent

Thứ hai, chúng ta phải thêm phần phụ thuộc cho MCP Toolbox for Databases SDK (toolbox-core) vào dự án của mình:

uv add toolbox-core==0.5.0

Mở tệp tools.py để thêm chế độ hỗ trợ cho các công cụ MCP Toolbox.

cloudshell edit software_bug_assistant/tools.py

Thêm nội dung sau vào cuối tools.py:

# ----- Example MCP Toolbox for Databases tools -----
import os
from toolbox_core import ToolboxSyncClient

TOOLBOX_URL = os.getenv("MCP_TOOLBOX_URL", "http://127.0.0.1:5000")

# Initialize Toolbox client
toolbox = ToolboxSyncClient(TOOLBOX_URL)
# Load all the tools from toolset
toolbox_tools = toolbox.load_toolset("tickets_toolset")

Bây giờ, chúng ta có thể nhập và truyền toolbox_tools đến tác nhân gốc trong agent.py:

cloudshell edit software_bug_assistant/agent.py

Bạn có thể thay thế agent.py bằng mã sau để thêm toolbox_tools:

from google.adk.agents import Agent

from .tools import get_current_date, langchain_tool, search_tool, toolbox_tools

# --- Agent Definition (model, instructions, tools) ---
root_agent = Agent(
    model="gemini-2.5-flash",
    name="software_assistant",
    instruction="""
    You are a skilled expert in triaging and debugging software issues for a
    coffee machine company, QuantumRoast.
    """,
    tools=[get_current_date, search_tool, langchain_tool, *toolbox_tools],
)

Lưu tệp và quay lại thẻ đang mở có Giao diện người dùng web ADK.

Giờ đây, bạn có thể đặt câu hỏi về các vé được lưu trữ trong cơ sở dữ liệu vé nội bộ của Cloud SQL!

Đặt câu hỏi như một trong những câu hỏi sau:

  • I am seeing an issue with database timeouts, has anyone else seen a similar issue?
  • How many bugs are assigned to samuel.green@example.com? Show a table.
  • Can you bump the priority of ticket with ID 6 to to P0 - Critical priority
  • Create a new ticket (cho phép nhân viên hỗ trợ hướng dẫn bạn tạo lỗi)

Ví dụ về công cụ cơ sở dữ liệu MCP

Giờ đây, tác nhân ADK của chúng ta đã truy vấn thành công cơ sở dữ liệu thông qua các công cụ MCP Toolbox for Databases!🚀

10. Không bắt buộc: Công cụ MCP (API)

Còn việc kết nối tác nhân ADK của chúng ta với các công cụ MCP không có SDK riêng như MCP Toolbox for Database thì sao?

ADK hỗ trợ các công cụ MCP chung thông qua lớp MCPToolset. Lớp MCPToolset là cơ chế chính của ADK để tích hợp các công cụ từ một máy chủ MCP.

Công cụ MCP (API)

MCPToolset có thể dùng để kết nối với các máy chủ MCP cục bộ hoặc từ xa. Tại QuantumRoast, chúng tôi muốn kết nối tác nhân của mình với máy chủ MCP từ xa của GitHub để dễ dàng gọi các API của GitHub. Việc này sẽ cho phép đặc vụ của chúng tôi lấy thông tin về các vấn đề từ kho lưu trữ phần mềm công khai hoặc thậm chí là cơ sở mã của riêng chúng tôi. Máy chủ MCP của GitHub cung cấp nhiều phần chức năng của GitHub, từ vấn đề và yêu cầu kéo, đến thông báo và bảo mật mã.

MCP Tool GitHub

Mã truy cập cá nhân (PAT) của GitHub

Để xác thực bằng máy chủ GitHub MCP, bạn cần có Mã thông báo truy cập cá nhân của GitHub.

Để có được một khoá, hãy làm theo các bước sau:

  1. Chuyển đến phần Cài đặt nhà phát triển trên GitHub.
  2. Nhấp vào "Personal access tokens" (Mã thông báo truy cập cá nhân) -> "Tokens (classic)" (Mã thông báo (cổ điển)).
  3. Nhấp vào "Tạo mã thông báo mới" -> "Tạo mã thông báo mới (cũ)".
  4. Đặt tên mô tả cho mã thông báo.
  5. Đặt ngày hết hạn cho mã thông báo.
  6. Lưu ý quan trọng: Để đảm bảo an toàn, hãy cấp cho mã thông báo của bạn các phạm vi hạn chế nhất cần thiết. Đối với quyền truy cập chỉ đọc vào kho lưu trữ, các phạm vi repo:status, public_reporead:user thường là đủ. Tránh cấp toàn bộ quyền đối với kho lưu trữ hoặc quyền quản trị viên, trừ trường hợp thực sự cần thiết.
  7. Nhấp vào Generate token.
  8. Sao chép mã thông báo đã tạo.

Trong cửa sổ dòng lệnh Cloud Shell, hãy chạy lệnh sau để đặt PAT GitHub để tác nhân có thể sử dụng. Thay thế YOUR_GITHUB_PAT bằng PAT mà bạn đã tạo.

export GITHUB_PAT=YOUR_GITHUB_PAT

Cập nhật QuantumRoast Agent

Đối với trợ lý về lỗi, chúng tôi sẽ chỉ cung cấp một số công cụ chỉ đọc trên GitHub để cho phép nhân viên QuantumRoast tìm thấy các vấn đề liên quan đến các phần phụ thuộc nguồn mở, nhằm xem liệu điều đó có thể giúp họ tìm ra nguyên nhân gốc của các lỗi mà họ đang gặp phải trong hệ thống phiếu yêu cầu nội bộ hay không. Chúng ta sẽ dùng MCPToolset của ADK với tool_filter để thiết lập việc này. tool-filter chỉ hiển thị những công cụ GitHub mà chúng ta cần. Điều này không chỉ ẩn những công cụ mà chúng ta không muốn người dùng truy cập (ví dụ: các thao tác nhạy cảm trên kho lưu trữ), mà còn giúp mô hình của tác nhân không bị quá tải khi cố gắng chọn công cụ phù hợp cho công việc.

Mở tệp tools.py để thêm chế độ hỗ trợ cho các công cụ GitHub.

cloudshell edit software_bug_assistant/tools.py

Thêm nội dung sau vào cuối tools.py:

# ----- Example MCP Tools with MCPToolset (GitHub) -----
from google.adk.tools.mcp_tool import MCPToolset, StreamableHTTPConnectionParams

mcp_tools = MCPToolset(
    connection_params=StreamableHTTPConnectionParams(
        url="https://api.githubcopilot.com/mcp/",
        headers={
            "Authorization": "Bearer " + os.getenv("GITHUB_PAT"),
        },
    ),
    # Read only tools
    tool_filter=[
        "search_repositories",
        "search_issues",
        "list_issues",
        "get_issue",
        "list_pull_requests",
        "get_pull_request",
    ],
)

Lưu ý rằng chúng ta cũng cần cung cấp Mã truy cập cá nhân (PAT) GitHub cho định nghĩa MCPToolset, giống như cách bạn cung cấp mã thông báo uỷ quyền khi thiết lập một ứng dụng API tiêu chuẩn trong mã của mình. PAT này chỉ có phạm vi truy cập vào dữ liệu kho lưu trữ công khai, không có phạm vi nào liên quan đến các hành động nhạy cảm của người dùng hoặc kho lưu trữ.

Bây giờ, chúng ta có thể nhập và truyền mcp_tools đến tác nhân gốc trong agent.py:

cloudshell edit software_bug_assistant/agent.py

Bạn có thể thay thế agent.py bằng mã sau để thêm mcp_tools:

from google.adk.agents import Agent

from .tools import get_current_date, langchain_tool, mcp_tools, search_tool, toolbox_tools

# --- Agent Definition (model, instructions, tools) ---
root_agent = Agent(
    model="gemini-2.5-flash",
    name="software_assistant",
    instruction="""
    You are a skilled expert in triaging and debugging software issues for a
    coffee machine company, QuantumRoast.
    """,
    tools=[get_current_date, search_tool, langchain_tool, *toolbox_tools, mcp_tools],
)

Lưu tệp và quay lại thẻ đang mở có Giao diện người dùng web ADK.

Giờ đây, chúng ta có một bộ công cụ MCP của GitHub mà tác nhân có thể gọi. Các dịch vụ của QuantumRoast dựa vào XZ utils, một công cụ nén dữ liệu. Hệ thống yêu cầu hỗ trợ nội bộ của chúng tôi đang theo dõi một CVE (lỗ hổng bảo mật) từ năm ngoái. Chúng tôi có thể truy nguyên CVE này về kho lưu trữ XZ Utils trên GitHub bằng cách sử dụng các công cụ StackOverflow và Google Tìm kiếm. Sau đó, chúng ta có thể sử dụng một trong các công cụ MCP của GitHub (search_issues) để xác định thời điểm và cách CVE đó được vá:

Hỏi nhân viên hỗ trợ những câu hỏi sau:

  • Find the official XZ Utils GitHub repository
  • Search the repository for issues related to CVE-2024-3094

Bạn sẽ thấy các công cụ GitHub được gọi bởi tác nhân.

Ví dụ về MCP Tools trên GitHub

Giờ đây, tác nhân QuantumRoast ADK có thể tương tác với các công cụ máy chủ MCP của GitHub! 🤩

11. Xin chúc mừng

Xin chúc mừng! Bạn đã tạo thành công tác nhân trợ lý báo lỗi QuantumRoast bằng Agent Development Kit (ADK) và tích hợp nhiều loại công cụ để nâng cao các chức năng của tác nhân này. Bạn bắt đầu bằng một tác nhân cơ bản và dần dần thêm Công cụ hàm, Công cụ tích hợp, Công cụ của bên thứ ba và Công cụ MCP.

Nội dung đã đề cập

  • Cách thiết lập dự án Python để phát triển ADK.
  • Cách tạo một tác nhân ADK cơ bản.
  • Cách triển khai và sử dụng Công cụ hàm.
  • Cách tích hợp các công cụ tích hợp như Google Tìm kiếm.
  • Cách tận dụng Công cụ của bên thứ ba từ các khung như LangChain trong ADK.
  • Cách sử dụng MCP Tools để tương tác với cơ sở dữ liệu (Cloud SQL) và API.

QuantumRoast Final

Dọn dẹp

Bạn có thể xoá dự án trên Cloud để tránh phát sinh thêm chi phí.

Mặc dù Cloud Run không tính phí khi dịch vụ không được sử dụng, nhưng bạn vẫn có thể bị tính phí khi lưu trữ hình ảnh vùng chứa trong Artifact Registry. Khi bạn xoá dự án trên Cloud, hệ thống sẽ ngừng tính phí cho tất cả tài nguyên được dùng trong dự án đó.

Nếu muốn, hãy xoá dự án:

gcloud projects delete $GOOGLE_CLOUD_PROJECT

Bạn cũng có thể muốn xoá các tài nguyên không cần thiết khỏi đĩa cloudshell. Bạn có thể:

  1. Xoá thư mục dự án của lớp học lập trình:
    rm -rf ~/quantum-roast
    
  2. Cảnh báo! Bạn không thể huỷ thao tác tiếp theo này! Nếu muốn xoá mọi thứ trên Cloud Shell để giải phóng dung lượng, bạn có thể xoá toàn bộ thư mục gốc. Hãy cẩn thận để đảm bảo rằng mọi thứ bạn muốn giữ lại đều được lưu ở nơi khác.
    sudo rm -rf $HOME