Narzędzia Tworzenie agenta: od zera do Asystenta z użyciem pakietu ADK

1. Wprowadzenie

W tym module nauczysz się tworzyć agenta za pomocą pakietu Agent Development Kit (ADK). Dowiesz się, jak za pomocą ADK i różnych typów narzędzi utworzyć agenta, który będzie pomagać w znajdowaniu błędów w oprogramowaniu. Zaczniesz od podstawowego agenta i będziesz stopniowo dodawać narzędzia, aby zwiększyć jego możliwości, w tym narzędzia funkcji, narzędzia wbudowane, narzędzia innych firmnarzędzia protokołu kontekstu modelu (MCP).

Narzędzia do tworzenia agentów

Czego się nauczysz

  • Jak skonfigurować projekt w Pythonie na potrzeby programowania w ADK.
  • Jak utworzyć podstawowego agenta ADK.
  • Jak wdrażać i używać narzędzi do funkcji.
  • Jak zintegrować wbudowane narzędzia, takie jak wyszukiwarka Google.
  • Jak korzystać z narzędzi innych firm z frameworków takich jak LangChain w ADK.
  • Jak używać narzędzi MCP do interakcji z bazami danych (Cloud SQL) i interfejsami API.

2. Przegląd

Wyobraź sobie, że jesteś menedżerem projektu w QuantumRoast, globalnej firmie produkującej ekspresy do kawy.

Quantum Roast

Pomagasz członkom zespołu poruszać się po morzu planów rozwoju technologii, nagłych zmian strategii (teraz zajmujemy się matchą!) i zgłoszeń od klientów – od wadliwych systemów fakturowania po ekspres do kawy, który przez całą dobę wydaje wysoki dźwięk.

W zwykły dzień masz otwartych około 50 kart przeglądarki: wewnętrzny system zgłoszeń, e-mail, czat, GitHub, wyszukiwarka Google, StackOverflow i inne. Lubisz swoją pracę i współpracowników, ale czasami czujesz się przytłoczony.

Przytłoczony menedżer projektu

A gdybyśmy mogli stworzyć pomocnika, który ułatwi Ci tworzenie i sortowanie zgłoszeń dotyczących oprogramowania oraz rozwiązywanie problemów? Umożliwia to agent AI.

Agent AI

Pakiet Agent Development Kit (ADK)

Pakiet Agent Development Kit (ADK) to elastyczna i modułowa platforma do tworzenia i wdrażania agentów AI. ADK jest zoptymalizowany pod kątem Gemini i ekosystemu Google, ale jest niezależny od modelu i wdrożenia oraz został stworzony z myślą o kompatybilności z innymi platformami. Pakiet ADK został zaprojektowany tak, aby tworzenie agentów przypominało tworzenie oprogramowania. Ułatwia on deweloperom tworzenie, wdrażanie i orkiestrację architektur agentów, które mogą wykonywać zarówno proste zadania, jak i złożone procesy.

ADK to platforma, której użyjemy do stworzenia asystenta do wykrywania błędów w oprogramowaniu QuantumRoast.

Diagram agenta

Narzędzia

Agenty AI używają modeli, a nie tylko zakodowanej logiki, aby rozwiązywać problemy. Agenci AI nie tylko korzystają z rozumowania opartego na LLM, ale też mają unikalną możliwość zbierania danych zewnętrznych, a następnie podejmowania działań w imieniu użytkownika. Zamiast podpowiadać, jak rozwiązać problem, agent AI może Ci w tym pomóc. Jak to zrobić? za pomocą narzędzi.

Narzędzie to funkcja, która pomaga agentowi AI w interakcji ze światem. Narzędziem może być niemal wszystko: funkcja wbudowana, hostowana baza danych, interfejs API innej firmy , a nawet inny agent. Platformy agentów AI, takie jak Agent Development Kit (ADK), mają wbudowaną obsługę narzędzi, w tym różnych typów narzędzi, o których powiemy za chwilę.

Ale skąd agent wie, kiedy i jak wywołać określone narzędzie? Model agenta odgrywa tu kilka kluczowych ról.

Jak działają narzędzia

Pierwszy to wybór narzędzia. Udostępniamy agentowi listę narzędzi i instrukcje dotyczące ich używania. Gdy użytkownik wyda agentowi polecenie, model agenta pomoże zdecydować, które narzędzia wywołać i dlaczego, aby pomóc użytkownikowi.

Drugim kluczowym krokiem jest wywoływanie funkcji. Wywoływanie funkcji to nieco myląca nazwa, ponieważ model nie wywołuje narzędzia, ale przygotowuje się do tego, formatując treść żądania, której framework następnie używa do wywołania narzędzia.

Model pomaga też interpretować odpowiedź z tego narzędzia, np. listę otwartych błędów z bazy danych, i decyduje, czy podjąć dalsze działania, czy odpowiedzieć użytkownikowi, przekazując mu te informacje.

Aby zobaczyć to wszystko w praktyce, czas zbudować agenta QuantumRoast do wykrywania błędów za pomocą pakietu ADK Python.

Asystent do zgłaszania błędów QuantumRoast

3. Zanim zaczniesz

Konfiguracja projektu Google Cloud

  1. Jeśli nie masz jeszcze konta Google, musisz utworzyć konto Google.
    • Używaj konta osobistego zamiast konta służbowego lub szkolnego. Konta służbowe i szkolne mogą mieć ograniczenia, które uniemożliwiają włączenie interfejsów API potrzebnych w tym module.
  2. Zaloguj się w konsoli Google Cloud.
  3. Włącz rozliczenia w Cloud Console.
  4. Utwórz nowy projekt lub użyj już istniejącego.

Otwórz edytor Cloud Shell

  1. Otwórz edytor Cloud Shell.
  2. Jeśli terminal nie pojawi się u dołu ekranu, otwórz go:
    • Kliknij menu Ikona menu z 3 kreskami.
    • Kliknij Terminal.
    • Kliknij Nowy terminalOtwieranie nowego terminala w edytorze Cloud Shell.
  3. W terminalu ustaw projekt za pomocą tego polecenia (zastępując YOUR_PROJECT_ID):
    • Format:
      gcloud config set project YOUR_PROJECT_ID
      
    • Przykład:
      gcloud config set project lab-project-id-example
      
    • Jeśli nie pamiętasz identyfikatora projektu:
      • Aby wyświetlić wszystkie identyfikatory projektów, użyj tego polecenia:
        gcloud projects list | awk '/PROJECT_ID/{print $2}'
        
      Ustawianie identyfikatora projektu w terminalu edytora Cloud Shell
  4. Jeśli pojawi się pytanie o autoryzację, kliknij Autoryzuj, aby przejść dalej. Kliknij, aby autoryzować Cloud Shell
  5. Powinien wyświetlić się ten komunikat:
    Updated property [core/project].
    
    Jeśli widzisz symbol WARNING i pojawia się pytanie Do you want to continue (Y/N)?, prawdopodobnie identyfikator projektu został wpisany nieprawidłowo. Naciśnij N, a potem Enter i spróbuj ponownie uruchomić polecenie gcloud config set project.
  6. W terminalu ustaw zmienną środowiskową PROJECT_ID, która będzie używana w dalszych krokach.
    export PROJECT_ID=$(gcloud config get project)
    

Włącz interfejsy API

W terminalu uruchom to polecenie, aby włączyć niezbędne interfejsy API 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

Utwórz instancję Cloud SQL for PostgreSQL

QuantumRoast ma bazę danych zgłoszeń błędów, która zawiera wszystkie zgłoszenia wewnętrzne. Skonfigurujmy ją, tworząc instancję Cloud SQL for 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

Poczekaj, aż instancja zostanie utworzona (może to potrwać kilka minut).

Po utworzeniu instancji możesz ją wyświetlić w konsoli Google Cloud tutaj.

Tworzenie bazy danych Cloud SQL

Utwórz bazę danych SQL (tickets-db) i przyznaj dostęp do Vertex AI kontu usługi Cloud SQL (abyśmy mogli tworzyć wektory dystrybucyjne do przeprowadzania wyszukiwania podobieństw).

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"

Konfigurowanie tabeli tickets

W Cloud Console (Cloud SQL) otwórz Cloud SQL Studio dla instancji software-assistant.

Zaloguj się w bazie danychtickets-db jako użytkownik postgres, a jako hasło wpisz admin.

Cloud SQL Studio

Otwórz nową kartę Editor.

Edytujący Cloud SQL Studio

Następnie wklej poniższy kod SQL, aby skonfigurować tabelę i utworzyć wektory dystrybucyjne. Kliknij przycisk Run, aby wykonać polecenie.

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.
);

Tabela tickets została utworzona. Kliknij Clear, aby wyczyścić stare zapytanie.

Teraz wstaw przykładowe dane i ponownie kliknij przycisk 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');

W QuantumRoast możemy chcieć wiedzieć, kiedy ostatnio zaktualizowano błąd lub zgłoszenie.

W tym celu możemy utworzyć aktywator, który będzie aktualizować pole updated_time za każdym razem, gdy rekord zostanie zaktualizowany.

Kliknij Clear, a następnie wklej ten kod SQL, aby wdrożyć wyzwalacz.

Naciśnij przycisk Run, aby wykonać działanie.

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();

Utwórz wektory dystrybucyjne z pola description. Dzięki temu nasz agent będzie mógł przeprowadzać w naszej bazie danych wyszukiwanie podobieństw. Na przykład „Czy są jakieś otwarte problemy związane ze stroną główną witryny?”.

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

Możesz teraz wysłać zapytanie do bazy danych, aby sprawdzić, czy jest gotowa.

SELECT * FROM tickets;

Powinno zostać zwróconych 10 wierszy podobnych do tych:

Weryfikowanie bazy danych Cloud SQL

Teraz możesz przejść do najciekawszej części, czyli kodu.

4. Konfigurowanie projektu w Pythonie

Zanim zaczniemy tworzyć agenta, musimy się upewnić, że mamy prawidłowo skonfigurowany projekt w Pythonie. Wszystko zrobimy w Cloud Shell.

Najpierw utwórz folder quantum-roast i przejdź do niego za pomocą polecenia cd:

mkdir quantum-roast && cd quantum-roast

Gdy mamy już folder projektu, czas go zainicjować i utworzyć odpowiednie pliki, których będziemy potrzebować.

Do zarządzania projektem i zależnościami będziemy używać uv (bardzo szybkiego menedżera pakietów i projektów Pythona), który jest wstępnie zainstalowany w Cloud Shell. Uv pomoże nam skonfigurować niektóre pliki, a także zarządzać środowiskami wirtualnymi, zależnościami itp. Dzięki temu nie musimy tego robić.

Zainicjuj nowy projekt za pomocą uv init:

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

Po uruchomieniu polecenia w projekcie powinien pojawić się plik pyproject.toml. Aby to sprawdzić, uruchom w terminalu Cloud Shell polecenie cat pyproject.toml:

cat pyproject.toml

Dane wyjściowe powinny wyglądać tak:

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

Czas dodać google-adk (ADK) jako zależność do projektu za pomocą uv add.

uv add google-adk==1.11.0

Spowoduje to dodanie google-adk do listy dependencies w naszych pyproject.toml.

Aby uzyskać najlepsze wyniki, ADK oczekuje określonej struktury projektu.

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

Utwórz folder software_bug_assistant i pliki w nim:

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

Sprawdź, czy pliki zostały utworzone, za pomocą polecenia ls:

ls -a software_bug_assistant/

Strona powinna wyglądać tak:

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

Czas wypełnić plik .env zmiennymi środowiskowymi wymaganymi przez ADK do prawidłowego wywoływania modeli Gemini. Dostęp do Gemini uzyskamy za pomocą interfejsu 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

Aby sprawdzić, czy zmienna .env została poprawnie wypełniona, uruchom to polecenie:

cat software_bug_assistant/.env

Powinny pojawić się te informacje, gdzie your-project-id to identyfikator Twojego projektu:

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

Możemy teraz zacząć tworzyć agenta pakietu ADK.

5. Agent podstawowego pakietu ADK

Zacznijmy od skonfigurowania podstawowego agenta ADK, do którego będziemy dodawać narzędzia podczas tego warsztatu, aby stworzyć zaawansowanego asystenta do wykrywania błędów.

Otwórz plik agent.py w edytorze Cloud Shell:

cloudshell edit software_bug_assistant/agent.py

Wklej ten kod do pliku agent.py i zapisz go jako 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=[],
)

Uruchom nowo utworzonego agenta, włączając interfejs programistyczny ADK (adk web). Jeśli zrobisz to za pomocą uv run, automatycznie utworzysz środowisko wirtualne z zainstalowanym ADK.

uv run adk web --port 8080 --reload_agents

W konsoli powinno pojawić się potwierdzenie pomyślnego uruchomienia serwera WWW ADK.

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)

Otwórz podgląd w przeglądarce Cloud Shell, aby zobaczyć interfejs.

Podgląd w przeglądarce Cloud Shell

Powinien pojawić się interfejs internetowy ADK.

Internetowy interfejs ADK

Spróbuj porozmawiać z agentem ADK.

Zapytaj agenta What day is it today?.

Przykład ADK Web

Z odpowiedzi widać, że agent nie potrafi odpowiedzieć na to proste pytanie. Przypomnienie, że modele LLM to odizolowane systemy trenowane na danych z przeszłości. Nie mają kontekstu w czasie rzeczywistym dotyczącego ostatnich wydarzeń ani nawet bieżącej daty… chyba że udostępnisz im narzędzia.

Czas na wdrożenie pierwszego typu narzędzia ADK, czyli narzędzia funkcji.

6. Narzędzie funkcji

Pierwszym i najprostszym typem narzędzia ADK jest narzędzie funkcyjne. Jest to dosłownie to, na co wskazuje nazwa – funkcja Pythona wywoływana przez agenta.

Narzędzie funkcji

Narzędzia funkcji są bardzo przydatne, ponieważ umożliwiają pisanie niestandardowego kodu, który agent może wywoływać jako narzędzie, np. do wykonywania obliczeń, wywoływania interfejsu API czy wysyłania zapytań do bazy danych. Mogą to być proste lub złożone funkcje – to zależy od Ciebie.

W QuantumRoast chcemy zdefiniować podstawową funkcję, która będzie zwracać datę bieżącego dnia. Dzięki temu będziemy mogli później w tym laboratorium obsługiwać zapytania takie jak „pokaż mi błędy z ostatniego tygodnia” lub „jaki jest dziś dzień?”. (zdarza się to nam wszystkim).

W pliku tools.py w folderze /software_bug_assistant będziemy organizować wszystkie narzędzia, które utworzymy w tym module.

Otwórz NOWY terminal, klikając ikonę +.

Nowy terminal

W nowym terminalu ustaw PROJECT_ID i otwórz tools.py:

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

Teraz zdefiniuj funkcję get_current_date, która będzie używana jako narzędzie Funkcja.

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

Funkcja jest już zdefiniowana. Czas przekazać go pracownikowi obsługi klienta jako narzędzie.

Otwórz plik agent.py w edytorze Cloud Shell:

cloudshell edit software_bug_assistant/agent.py

Chcemy zaimportować funkcję get_current_datetools.py i przekazać ją do argumentu tools agenta.

Zaktualizowany element agent.py wygląda tak:

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

Jeśli teraz wrócisz do karty Podgląd w przeglądarce z uruchomionym interfejsem ADK Web i ponownie zapytasz What day is it today?...

Narzędzie funkcji internetowych ADK

Agent może podać datę, wywołując narzędzie get_current_date Function Tool. 🎉

Czas poznać kolejny typ narzędzia ADK.

7. Wbudowane narzędzie

Innym typem narzędzia ADK jest narzędzie wbudowane. Są to narzędzia, które współpracują z najważniejszymi funkcjami modelu Google, takimi jak wykonywanie kodu w samym modelu. Możemy dołączyć do naszego asystenta do zgłaszania błędów wbudowane narzędzie wyszukiwarki Google, aby zapewnić mu odpowiedni kontekst, umożliwiając mu przeszukiwanie internetu. Dzięki temu agent może zebrać więcej aktualnych informacji o błędzie lub dobrze znanej podatności.

Wbudowane narzędzie

Otwórz plik tools.py, aby dodać obsługę wbudowanego narzędzia wyszukiwarki Google.

cloudshell edit software_bug_assistant/tools.py

Dodaj na końcu pliku tools.py te informacje:

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

W tym przypadku narzędzie wyszukiwarki Google jest opakowane w osobnego agenta z własnymi instrukcjami systemowymi, co oznacza, że agent jest używany jako narzędzie.

Teraz możemy zaimportować i przekazać search_tool do agenta głównego w agent.py:

cloudshell edit software_bug_assistant/agent.py

Możesz zastąpić agent.py tym kodem, aby uwzględnić 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],
)

Zapisz plik i wróć do otwartej karty z interfejsem ADK.

W QuantumRoast chcemy mieć pewność, że nasza witryna i oprogramowanie są chronione przed typami luk w zabezpieczeniach (CVE), czyli publicznymi lukami w zabezpieczeniach cybernetycznych. Możemy użyć nowego narzędzia wyszukiwarki Google naszego agenta, aby wyszukać w internecie najnowsze odkryte luki CVE.

Uruchom to zapytanie: Do a web search for 5 of the most recent CVEs?.

Nasz agent powinien zadzwonić na numer search_agent, aby wyszukać informacje w internecie.

Przykład wbudowanego narzędzia ADK Web

Nasz agent odblokował już możliwość wyszukiwania informacji w internecie za pomocą wbudowanego narzędzia ADK do wyszukiwarki Google. 🎉

Przejdźmy do kolejnego typu narzędzia ADK.

8. Narzędzie zewnętrzne

ADK zostało zaprojektowane tak, aby można je było łatwo rozbudowywać i bezproblemowo integrować z narzędziami z innych platform agentów AI, takich jak CrewAILangChain. Ta interoperacyjność jest kluczowa, ponieważ umożliwia szybsze tworzenie aplikacji i ponowne wykorzystywanie istniejących narzędzi.

Narzędzie zewnętrzne

Aby podłączyć naszego agenta do zgłaszania błędów do potężnych danych z pytaniami i odpowiedziami z StackOverflow, możemy skorzystać z obszernej biblioteki narzędzi LangChain, a konkretnie z narzędzia StackExchange API Wrapper. Pakiet ADK obsługuje narzędzia innych firm, takie jak LangChain, więc dodanie tego narzędzia do naszego agenta ADK wymaga tylko kilku wierszy kodu.

Najpierw musimy dodać do naszego projektu nowe zależności dla LangChain i StackOverflow (langchain-community i stackapi):

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

Otwórz plik tools.py, aby dodać obsługę narzędzia LangChain StackExchange.

cloudshell edit software_bug_assistant/tools.py

Dodaj na końcu pliku tools.py te informacje:

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

Teraz możemy zaimportować i przekazać langchain_tool do agenta głównego w agent.py:

cloudshell edit software_bug_assistant/agent.py

Możesz zastąpić agent.py tym kodem, aby uwzględnić 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],
)

Zapisz plik i wróć do otwartej karty z interfejsem ADK Web UI.

Spróbuj zapytać agenta o poprzednie luki CVE "Are there similar issues on stack exchange?" lub o coś nowego, np. "Our database queries with SQLAlchemy seem to be timing out, is there anything on StackExchange relevant to this?".

Przykład narzędzia zewnętrznego ADK Web

Nasz agent z powodzeniem wykorzystał narzędzie LangChain w ADK do wysłania zapytania do StackOverflow. 🥳

Czas na kolejny typ narzędzia ADK... Narzędzia MCP!

9. Narzędzie MCP (baza danych)

MCP to skrót od Model Context Protocol. Jest to otwarty protokół wprowadzony przez firmę Anthropic w 2024 roku. MCP zapewnia warstwę abstrakcji między agentem AI a „backendami” narzędzi (interfejsami API, bazami danych).

Jak działa MCP

MCP ma pewne unikalne specyfikacje. W przeciwieństwie do standardowego protokołu HTTP protokół MCP zapewnia stanowe połączenie dwukierunkowe między klientem a serwerem. Ma własny sposób definiowania narzędzikomunikatów o błędach związanych z narzędziami. Dostawca narzędzi może następnie utworzyć serwery MCP na podstawie swoich interfejsów API, udostępniając deweloperom i użytkownikom co najmniej 1 gotowe narzędzie. Następnie platformy agentów mogą inicjować klientów MCP w aplikacji agenta, aby wykrywać i wywoływać te narzędzia.

W QuantumRoast mamy bazę danych Cloud SQL for PostgreSQL, w której przechowujemy informacje o błędach wewnętrznego oprogramowania. Chcemy utworzyć narzędzia ADK, aby nasz agent mógł wykonywać określone zapytania w naszej bazie danych.

Baza danych narzędzia MCP

Najprostszym sposobem na to jest użycie MCP Toolbox for Databases , czyli serwera MCP typu open source dla baz danych. Toolbox obsługuje ponad 15 baz danych, w tym Cloud SQL.

Zestaw narzędzi zapewnia:

  • Uproszczone tworzenie: zintegruj narzędzia z agentem za pomocą mniej niż 10 wierszy kodu, ponownie wykorzystuj narzędzia w wielu agentach lub platformach i łatwiej wdrażaj nowe wersje narzędzi.
  • Lepsza wydajność: sprawdzone metody, takie jak pula połączeń, uwierzytelnianie i inne.
  • Ulepszone zabezpieczenia: zintegrowane uwierzytelnianie zapewniające bezpieczniejszy dostęp do danych
  • Kompleksowa obserwacja: gotowe wskaźniki i śledzenie z wbudowaną obsługą OpenTelemetry.

ADK obsługuje MCP Toolbox for Database tools, co ułatwia szybką integrację.

Zestaw narzędzi MCP do baz danych

Wdrażanie serwera MCP Toolbox for Databases w Cloud Run

Najpierw wdrożymy serwer MCP Toolbox for Databases w Cloud Run i skierujemy go na naszą instancję Cloud SQL.

Zestaw narzędzi wymaga pliku YAML do konfiguracji, w którym określasz źródło bazy danych i narzędzia do skonfigurowania.

Utwórz plik tools.yaml na potrzeby wdrożenia.

cloudshell edit tools.yaml

Wklej do pliku tools.yaml tę zawartość:

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

Plik YAML definiuje 9 narzędzi związanych z bazą danych biletów QuantumRoast.

Czas na skonfigurowanie konta usługi dla usługi Toolbox Cloud Run, przyznanie mu uprawnień dostępu do Cloud SQL i Secret Manager oraz utworzenie obiektu tajnego Secret Manager dla naszego pliku tools.yaml.

W Secret Manager będziemy przechowywać plik tools.yaml, ponieważ zawiera on poufne dane logowania do Cloud SQL.

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

Czas wdrożenia MCP Toolbox for Databases w Cloud Run. Użyjemy najnowszej wersji obrazu kontenera 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

Poczekaj na zakończenie wdrażania...

Sprawdź, czy Toolbox jest uruchomiony, wysyłając zapytanie o logi Cloud Run:

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

Zobaczysz, że:

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

Zapisz adres URL Cloud Run dla usługi Toolbox jako zmienną środowiskową, aby agent ADK wiedział, gdzie go znaleźć.

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

Aktualizowanie agenta QuantumRoast

Po drugie, musimy dodać do projektu zależność od pakietu SDK MCP Toolbox for Databases (toolbox-core):

uv add toolbox-core==0.5.0

Otwórz plik tools.py, aby dodać obsługę narzędzi MCP Toolbox.

cloudshell edit software_bug_assistant/tools.py

Dodaj na końcu pliku tools.py te informacje:

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

Teraz możemy zaimportować i przekazać toolbox_tools do agenta głównego w agent.py:

cloudshell edit software_bug_assistant/agent.py

Możesz zastąpić agent.py tym kodem, aby uwzględnić 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],
)

Zapisz plik i wróć do otwartej karty z interfejsem ADK Web UI.

Możesz teraz zadawać pytania dotyczące zgłoszeń przechowywanych w naszej wewnętrznej bazie danych zgłoszeń Cloud SQL.

Zadaj pytanie podobne do jednego z tych:

  • 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 (pozwól agentowi przeprowadzić Cię przez proces tworzenia zgłoszenia błędu)

Przykład narzędzia bazy danych MCP

Nasz agent ADK wykonał zapytanie w bazie danych za pomocą narzędzi MCP Toolbox for Databases.🚀

10. Opcjonalnie: narzędzie MCP (API)

Co z połączeniem agenta ADK z narzędziami MCP, które nie mają własnego pakietu SDK, np. z narzędziem MCP Toolbox for Database?

ADK obsługuje ogólne narzędzia MCP za pomocą klasy MCPToolset. Klasa MCPToolset to główny mechanizm ADK do integrowania narzędzi z serwera MCP.

Narzędzie MCP (API)

MCPToolset może służyć do łączenia się z lokalnymi lub zdalnymi serwerami MCP. W QuantumRoast chcemy połączyć naszego agenta ze zdalnym serwerem MCP GitHub, aby łatwo wywoływać interfejsy API GitHub. Dzięki temu nasz agent będzie mógł pobierać informacje o problemach z publicznych repozytoriów oprogramowania, a nawet z naszych własnych baz kodu. Serwer MCP GitHub udostępnia różne części funkcjonalności GitHub, od zgłoszeń i żądań pull po powiadomienia i bezpieczeństwo kodu.

GitHub narzędzia MCP

Osobisty token dostępu (PAT) GitHub

Aby uwierzytelnić się na serwerze GitHub MCP, potrzebujesz osobistego tokena dostępu do GitHuba.

Aby go uzyskać, wykonaj te czynności:

  1. Otwórz ustawienia programisty na GitHubie.
  2. Kliknij „Osobiste tokeny dostępu” –> „Tokeny (klasyczne)”.
  3. Kliknij „Wygeneruj nowy token” –> „Wygeneruj nowy token (klasyczny)”.
  4. Nadaj tokenowi opisową nazwę.
  5. Ustaw datę ważności tokena.
  6. Ważne: ze względów bezpieczeństwa przyznaj tokenowi jak najmniejszy zakres uprawnień. W przypadku dostępu tylko do odczytu do repozytoriów często wystarczą zakresy repo:status, public_reporead:user. Unikaj przyznawania pełnych uprawnień do repozytorium lub uprawnień administratora, chyba że jest to absolutnie konieczne.
  7. Kliknij Generate token.
  8. Skopiuj wygenerowany token.

W terminalu Cloud Shell uruchom to polecenie, aby ustawić PAT GitHub, z którego będzie mógł korzystać agent. Zastąp YOUR_GITHUB_PAT wygenerowanym tokenem PAT.

export GITHUB_PAT=YOUR_GITHUB_PAT

Aktualizowanie agenta QuantumRoast

W przypadku naszego asystenta do wykrywania błędów udostępnimy tylko niektóre narzędzia GitHuba tylko do odczytu, aby pracownicy QuantumRoast mogli znajdować problemy związane z zależnościami open source i sprawdzać, czy mogą one pomóc w określeniu przyczyny błędów, które pojawiają się w wewnętrznym systemie zgłoszeń. Do skonfigurowania tego ustawienia użyjemy zestawu ADK MCPToolset z urządzeniem tool_filter. tool-filter udostępnia tylko potrzebne nam narzędzia GitHub, co nie tylko ukrywa narzędzia, do których nie chcemy, aby użytkownicy mieli dostęp (np. wrażliwe działania w repozytorium), ale także chroni model agenta przed przeciążeniem podczas próby wybrania odpowiedniego narzędzia do wykonania zadania.

Otwórz plik tools.py, aby dodać obsługę narzędzi GitHub.

cloudshell edit software_bug_assistant/tools.py

Dodaj na końcu pliku tools.py te informacje:

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

Zwróć uwagę, że musimy też podać osobisty token dostępu (PAT) GitHuba w definicji MCPToolset, tak jak podajesz token uwierzytelniania podczas konfigurowania standardowego klienta interfejsu API w kodzie. Ten PAT ma zakres ograniczony do dostępu tylko do danych publicznego repozytorium i nie obejmuje zakresów związanych z wrażliwymi działaniami użytkownika lub repozytorium.

Teraz możemy zaimportować i przekazać mcp_tools do agenta głównego w agent.py:

cloudshell edit software_bug_assistant/agent.py

Możesz zastąpić agent.py tym kodem, aby uwzględnić 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],
)

Zapisz plik i wróć do otwartej karty z interfejsem ADK Web UI.

Mamy teraz zestaw narzędzi GitHub MCP, do których nasz agent może się odwoływać. Usługi QuantumRoast korzystają z narzędzi XZ, czyli narzędzia do kompresji danych. Nasz wewnętrzny system zgłoszeń błędów śledzi CVE (lukę w zabezpieczeniach) z ubiegłego roku, którą możemy powiązać z repozytorium GitHub XZ Utils za pomocą narzędzi StackOverflow i wyszukiwarki Google. Następnie możemy użyć jednego z narzędzi MCP GitHub, search_issues, aby określić, kiedy i jak została załatana luka CVE:

Zadaj agentowi te pytania:

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

Powinny być widoczne narzędzia GitHub wywoływane przez agenta.

Przykład narzędzi MCP w GitHubie

Agent QuantumRoast ADK może teraz korzystać z narzędzi serwera GitHub MCP. 🤩

11. Gratulacje

Gratulacje! Udało Ci się utworzyć agenta QuantumRoast do wykrywania błędów za pomocą pakietu Agent Development Kit (ADK) i zintegrować różne typy narzędzi, aby zwiększyć jego możliwości. Zaczęliśmy od podstawowego agenta, a następnie stopniowo dodawaliśmy narzędzia funkcji, narzędzia wbudowane, narzędzia innych firm i narzędzia MCP.

Omówione zagadnienia

  • Jak skonfigurować projekt w Pythonie na potrzeby programowania w ADK.
  • Jak utworzyć podstawowego agenta ADK.
  • Jak wdrażać i używać narzędzi do funkcji.
  • Jak zintegrować wbudowane narzędzia, takie jak wyszukiwarka Google.
  • Jak korzystać z narzędzi innych firm z frameworków takich jak LangChain w ADK.
  • Jak używać narzędzi MCP do interakcji z bazami danych (Cloud SQL) i interfejsami API.

QuantumRoast Final

Czyszczenie

Aby uniknąć dodatkowych opłat, możesz usunąć projekt w Cloud.

Cloud Run nie nalicza opłat, gdy usługa nie jest używana, ale może zostać pobrana należność za przechowywanie obrazu kontenera w Artifact Registry. Usunięcie projektu Cloud spowoduje zaprzestanie naliczania opłat za wszelkie zasoby wykorzystywane w ramach tego projektu.

Jeśli chcesz, usuń projekt:

gcloud projects delete $GOOGLE_CLOUD_PROJECT

Możesz też usunąć niepotrzebne zasoby z dysku Cloud Shell. Możesz:

  1. Usuń katalog projektu ćwiczeń z programowania:
    rm -rf ~/quantum-roast
    
  2. Ostrzeżenie! Tej czynności nie można cofnąć. Jeśli chcesz usunąć wszystko z Cloud Shell, aby zwolnić miejsce, możesz usunąć cały katalog domowy. Upewnij się, że wszystko, co chcesz zachować, jest zapisane w innym miejscu.
    sudo rm -rf $HOME