1. Einführung
In diesem Codelab erstellen Sie mit dem Agent Development Kit (ADK) einen komplexen Marathonplaner-Agenten. Sie untersuchen schrittweise die Funktionen des Agenten, von einem gut strukturierten System-Prompt über das dynamische Laden von Skills bis hin zur Zuordnung von MCP-Tools. Abschließend testen Sie den Agenten lokal und stellen ihn in der Agent Runtime (Agent Engine) bereit.
Aufgaben
- Neues ADK-Agentenprojekt initialisieren
- Mit einem strukturierten Builder einen robusten System-Prompt erstellen
- Google Maps MCP-Tools für den Standortkontext in der realen Welt hinzufügen
- Skills dynamisch in das Toolset des Agenten laden
- Agentenausführung lokal testen
- Agenten in der Agent Engine (Cloud Run) bereitstellen
Voraussetzungen
- Ein Webbrowser wie Chrome
- Ein Google Cloud-Projekt mit aktivierter Abrechnung
- Grundlegende Python-Kenntnisse
Dieses Codelab richtet sich an fortgeschrittene Entwickler, die spezialisierte generative KI-Agenten erstellen möchten.
Geschätzte Dauer: 45 Minuten
Die in diesem Codelab erstellten Ressourcen sollten weniger als 2 $kosten.
2. Hinweis
Google Cloud-Projekt erstellen
- Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.
- Die Abrechnung für das Cloud-Projekt muss aktiviert sein. Informationen zum Prüfen, ob die Abrechnung für ein Projekt aktiviert ist.
Cloud Shell starten
Die Cloud Shell ist eine Befehlszeilenumgebung, die in Google Cloud ausgeführt wird und in der die erforderlichen Tools vorinstalliert sind.
- Klicken Sie oben in der Google Cloud Console auf Cloud Shell aktivieren.
- Sobald die Verbindung mit der Cloud Shell hergestellt ist, prüfen Sie Ihre Authentifizierung:
gcloud auth list - Prüfen Sie, ob Ihr Projekt konfiguriert ist:
gcloud config get project - Wenn Ihr Projekt nicht wie erwartet festgelegt ist, legen Sie es fest:
export PROJECT_ID=<YOUR_PROJECT_ID> gcloud config set project $PROJECT_ID
Authentifizierung prüfen:
gcloud auth list
Prüfen Sie Ihr Projekt:
gcloud config get project
Legen Sie es bei Bedarf fest:
export PROJECT_ID=<YOUR_PROJECT_ID> gcloud config set project $PROJECT_ID
APIs aktivieren
Führen Sie diesen Befehl aus, um alle erforderlichen APIs zu aktivieren:
gcloud services enable \ aiplatform.googleapis.com \ run.googleapis.com \ secretmanager.googleapis.com \ mapstools.googleapis.com \ storage.googleapis.com \ cloudresourcemanager.googleapis.com \ serviceusage.googleapis.com
Google Maps API-Schlüssel erstellen
Wenn Sie die Google Maps MCP-Tools verwenden möchten, müssen Sie einen Maps API-Schlüssel generieren.
- Rufen Sie in der Google Cloud Console über die Suchleiste Google Maps Platform > Anmeldedaten auf.
- Bestätigen Sie bei Aufforderung Ihr Google Cloud-Projekt.
- Klicken Sie auf Anmeldedaten erstellen und wählen Sie API-Schlüssel aus.
- Kopieren Sie den generierten API-Schlüssel. Sie benötigen ihn im nächsten Schritt.
3. Umgebung einrichten
Der Code für dieses Codelab wird auf GitHub gehostet. Sie klonen das Repository, das die Verzeichnisstruktur und die erforderlichen Unterkomponenten (z. B. das Verzeichnis skills/) enthält.
- Klonen Sie das Repository und rufen Sie den Projektordner auf:
git clone https://github.com/GoogleCloudPlatform/next-26-keynotes cd next-26-keynotes/devkey/demo-1
- Richten Sie eine virtuelle Python-Umgebung ein und installieren Sie das ADK:
uv venv source .venv/bin/activate uv sync
- Legen Sie Ihren Maps API-Schlüssel fest. Die Anwendung liest ihn aus einer Umgebungsvariablen:
export GOOGLE_MAPS_API_KEY="<YOUR_MAPS_API_KEY>"
Umgebungsvariablen konfigurieren
Der Simulator-Agent verwendet eine .env-Datei für die Konfiguration. Kopieren Sie die Beispieldatei und aktualisieren Sie sie mit Ihrer Projekt-ID.
- Kopieren Sie die Beispielumgebungsdatei:
cp planner_agent/sample.env planner_agent/.env
- Öffnen Sie
planner_agent/.envund aktualisieren Sie das FeldGOOGLE_CLOUD_PROJECTmit Ihrer tatsächlichen Google Cloud-Projekt-ID. Aktualisieren Sie das FeldGOOGLE_MAPS_API_KEYmit dem von Ihnen erstellten Google Maps API-Schlüssel.
Die Datei sollte in etwa so aussehen:
GOOGLE_GENAI_USE_VERTEXAI=1
GOOGLE_CLOUD_PROJECT=<YOUR_PROJECT_ID>
GOOGLE_CLOUD_LOCATION=us-west1
GOOGLE_MAPS_API_KEY=<YOUR_MAPS_API_KEY>
GOOGLE_CLOUD_AGENT_ENGINE_ENABLE_TELEMETRY=true
OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED=true
OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=true
ADK_CAPTURE_MESSAGE_CONTENT_IN_SPANS=true
4. Neuen ADK-Agenten erstellen
Sehen Sie sich die Hauptdatei an, in der der Agent definiert ist: planner_agent/agent.py.
Im Repository build-agents-with-skills wird der Agent mit der Agent-Klasse des ADK initialisiert. Dabei werden das zugrunde liegende Modell und ein Identitätsname angegeben und die in anderen Modulen definierten Anweisungen und Tools abgerufen.
Öffnen Sie planner_agent/agent.py, um den Initialisierungscode zu prüfen:
instruction="Answer user questions to the best of your knowledge"
description="A helpful assistant for user questions."
tools=[]
# ...
root_agent = Agent(
model='gemini-3-flash-preview',
name='planner_agent',
description=description,
instruction=instruction,
tools=tools
)
Die Agent-Klasse abstrahiert den Nachrichtenverlauf, die Toolorchestrierung und die LLM-Kommunikation, sodass Sie sich auf das Verhalten des Agenten konzentrieren können.
Der Agent ist derzeit sehr allgemein. Sie können mit ihm wie mit jedem anderen LLM interagieren.
uv run adk run planner_agent
Mit diesem Befehl wird ein Chat mit dem Agenten gestartet. Er verwendet gemini-3-flash-preview als Modell und kann grundlegende Fragen beantworten.
Running agent planner_agent, type exit to exit.
[user]: What is the length of a Marathon
[planner_agent]: The official length of a marathon is **26.2 miles**, which is
equivalent to **42.195 kilometers**.
Der Agent kennt bereits einige Fakten zu Marathons. Das reicht jedoch nicht aus, um einen ordnungsgemäßen Marathon mit Regeln und Routenplanung zu planen.
5. System-Prompt erstellen
System-Prompts (Anweisungen) bestimmen das Verhalten des Agenten. Anstelle eines einzelnen langen Strings verwendet dieses Projekt einen PromptBuilder (planner_agent/utils.py), um Anweisungen dynamisch zu erstellen.
Öffnen Sie planner_agent/prompts.py, um zu sehen, wie der Prompt in logische Abschnitte unterteilt ist:
from collections import OrderedDict
from .utils import PromptBuilder
ROLE = """\
...
"""
RULES = """\
...
"""
WORKFLOW = """\
...
"""
###
# Planner instructions with no tools mentioned
PLANNER_INSTRUCTION_NO_TOOLS = PromptBuilder(
OrderedDict(
role=ROLE,
rules=RULES,
tools=TOOLS_PROMPT_ONLY,
workflow=WORKFLOW_PROMPT_ONLY,
)
).build()
# Planner instruction with skills and tools defined
PLANNER_INSTRUCTION = PromptBuilder(
OrderedDict(
role=ROLE,
rules=RULES,
skills=SKILLS,
tools=TOOLS,
workflow=WORKFLOW,
)
).build()
In planner_agent/agent.py ist er bereits importiert.
Suchen Sie den Abschnitt mit TODO: Replace Instruction and Description und entfernen Sie die Kommentarzeichen für die Neuzuweisung der Variablen instruction und description.
Dieser Codeabschnitt sollte so aussehen:
instruction=PLANNER_INSTRUCTION_NO_TOOLS
description="Expert GIS analyst for marathon route and event planning."
Sie importieren eine Version des Prompts für den Agenten, die keine Tools referenziert. Sie fügen Tools in einem späteren Schritt hinzu.
Sie können diese Version des Agenten testen:
uv run adk run planner_agent
Senden Sie im Chatfenster den folgenden Prompt:
Plan a marathon for 10000 participants in Las Vegas on April 24, 2027 in the
evening timeframe
Nach einigen Augenblicken sollten Sie eine Antwort ähnlich dieser erhalten:
Running agent planner_agent, type exit to exit.
[user]: Plan a marathon for 10000 participants in Las Vegas on April 24, 2027 in the evening timeframe
[planner_agent]: Here is the comprehensive marathon plan for Las Vegas.
As requested, I have designed this event for an evening start on April 24, 2027. Because certain parameters (theme and budget) were not specified, I have applied pragmatic defaults: this will be a "Neon Nights" scenic theme to capitalize on the evening Strip, operating on a moderate-to-high budget given the infrastructure needed to secure major Las Vegas corridors.
### 1. Intent Alignment
* **City & Theme:** Las Vegas, Nevada. Theme: "Neon Nights" an evening race maximizing the visual impact of the illuminated city.
* **Date & Time:** Saturday, April 24, 2027. Late April evenings in Las Vegas offer optimal running weather (temperatures dropping from ~70°F at sunset to ~60°F). Race start is 6:30 PM (sunset is approx. 7:20 PM).
...
...
Mit einem gut definierten Prompt kommt die Ausgabe dem erwarteten Ergebnis bereits viel näher. Im nächsten Schritt fügen Sie Tools hinzu, um den Agenten auf die nächste Stufe zu heben.
6. Skills und Tools hinzufügen
Suchen Sie in planner_agent/agent.py den Abschnitt mit TODO: Replaces Tools und heben Sie die Auskommentierung der nächsten beiden Zeilen auf, um Skills und Tools zu aktivieren. Ihr Code sollte so aussehen:
instruction=PLANNER_INSTRUCTION
tools=get_tools()
Das ist die einzige Codeänderung, die in diesem Schritt erforderlich ist. Im Rest dieses Abschnitts werden die Konzepte hinter Skills und Tools erläutert.
Skills
Ein Agent-Skill ist eine in sich geschlossene Funktionseinheit, die ein ADK-Agent verwenden kann, um eine bestimmte Aufgabe auszuführen. Ein Agent-Skill kapselt die erforderlichen Anweisungen, Ressourcen und Tools für eine Aufgabe gemäß der Spezifikation des Agent-Skills. Die Struktur eines Skills ermöglicht es, ihn inkrementell zu laden, um die Auswirkungen auf das Kontextfenster des Agenten zu minimieren.
Für den Marathonplaner-Agenten sind drei Skills definiert:
- gis-spatial-engineering : Verantwortlich für die Verarbeitung von GeoJSON-Daten zur Erstellung der Marathonstrecke.
- mapping : Google Maps-Tools zum Suchen nach Orten und Wetterinformationen verwenden.
- race-director : Prüfen, ob die Marathonstrecke den Planungsrichtlinien entspricht.
Skills können Skripts, zusätzliche Assets und Referenzen enthalten.
Die Anwendung lädt alle Skills und stellt sie als Tools in planner_agent/tools.py bereit. Beachten Sie, wie das in der Funktion get_tools() erfolgt:
def get_tools() -> list:
"""Build the planner's tool list with lazy-loaded skills."""
from google.adk.code_executors.unsafe_local_code_executor import UnsafeLocalCodeExecutor
skills_dir = pathlib.Path(__file__).parent / "skills"
skills = []
if skills_dir.exists():
skills = [
load_skill_from_dir(d)
for d in sorted(skills_dir.iterdir())
if d.is_dir() and not d.name.startswith("_") and (d / "SKILL.md").exists()
]
additional_tools = _load_additional_tools(skills_dir)
skill_toolset = SkillToolset(
skills=skills,
code_executor=UnsafeLocalCodeExecutor(),
additional_tools=additional_tools,
)
tools = [
skill_toolset,
PreloadMemoryTool(),
]
tools.extend(get_maps_tools())
return tools
Der interessanteste Teil ist die Methode load_skill_from_dir aus dem ADK. Es gibt eine weitere Möglichkeit, Skills im ADK zu erstellen, nämlich inline. Sie wird in diesem Codelab nicht verwendet, sieht aber ungefähr so aus:
from google.adk.skills import models
greeting_skill = models.Skill(
frontmatter=models.Frontmatter(
name="greeting-skill",
description=(
"A friendly greeting skill that can say hello to a specific person."
),
),
instructions=(
"Step 1: Read the 'references/hello_world.txt' file to understand how"
" to greet the user. Step 2: Return a greeting based on the reference."
),
resources=models.Resources(
references={
"hello_world.txt": "Hello! So glad to have you here!",
"example.md": "This is an example reference.",
},
),
)
Zuordnungstools hinzufügen
Der Marathonplaner benötigt einen räumlichen Kontext, um Routen zu generieren. Sie stellen diesen bereit, indem Sie den Google Maps MCP-Server (Model Context Protocol) einbinden.
Beachten Sie in planner_agent/tools.py, wie der MCP-Server mit dem Tool ApiRegistry registriert wird:
from google.adk.integrations.api_registry import ApiRegistry
class MapsApiRegistry(ApiRegistry):
"""ApiRegistry subclass that strips ADC headers to force API key auth."""
def get_toolset(self, *args, **kwargs): # noqa: ANN002, ANN003
toolset = super().get_toolset(*args, **kwargs)
conn = getattr(toolset, "_connection_params", None)
headers = getattr(conn, "headers", None) if conn else None
if headers:
headers.pop("Authorization", None) # type: ignore[union-attr]
headers.pop("x-goog-user-project", None) # type: ignore[union-attr]
return toolset
def get_maps_tools() -> list:
"""Return Maps MCP toolset if configured."""
project_id = os.getenv("GOOGLE_CLOUD_PROJECT", "").strip()
maps_key = _resolve_maps_key()
if not project_id or not maps_key:
return []
# Map the MCP server location on Google Cloud
mcp_server_name = f"projects/{project_id}/locations/global/mcpServers/google-mapstools.googleapis.com-mcp"
# Initialize the custom API registry that supports header injection
api_registry = MapsApiRegistry(
api_registry_project_id=project_id,
header_provider=header_provider,
)
return [api_registry.get_toolset(mcp_server_name=mcp_server_name)]
Durch Hinzufügen des MCP-Toolsets kann der Agent automatisch Google Maps nach Routen, Höhenangaben und Standortdetails abfragen.
7. Agenten lokal ausführen
Nachdem der Agent, der Prompt und die Tools miteinander verbunden sind, führen Sie den Agenten lokal aus. Dieses Mal verwenden Sie adk web, damit Sie die Ereignisse zum Laden von Skills und zum Aufrufen von Tools sehen können.
uv run adk web
Die Ausgabe sollte in etwa so aussehen:
INFO: Started server process [99665]
INFO: Waiting for application startup.
+-----------------------------------------------------------------------------+
| ADK Web Server started |
| |
| For local testing, access at http://127.0.0.1:8000. |
+-----------------------------------------------------------------------------+
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
- Öffnen Sie Ihren Browser und rufen Sie die im Terminal angezeigte URL auf (in der Regel
http://localhost:8000). - Wählen Sie oben links im Drop-down-Menü
planner_agentaus. - Senden Sie im Chatfenster den folgenden Prompt:
Plan a marathon for 10000 participants in Las Vegas on April 24, 2027 in the
evening timeframe
Sie sollten sehen, dass Skills geladen und Tools aufgerufen werden. Nach einigen Augenblicken generiert der Agent einen Marathonplan.
Die Benutzeroberfläche sollte in etwa so aussehen:

8. Agent bereitstellen
Wenn Sie mit der lokalen Leistung des Agenten zufrieden sind, können Sie ihn in der Agent Engine bereitstellen, die den Agenten sicher in Cloud Run hostet.
Verwenden Sie den ADK-CLI-Bereitstellungsbefehl, um den Agenten bereitzustellen:
uv run adk deploy agent_engine \ --env_file planner_agent/.env \ planner_agent
Wenn die Bereitstellung abgeschlossen ist, gibt die CLI einen sicher gehosteten Endpunkt für Ihren Agenten aus. Sie können diesen Endpunkt jetzt in Front-End-Anwendungen, Chatbots oder andere Back-End-Systeme einbinden. Sie können den Agenten auch mit dem Agent Runtime Playground testen.
Die Ausgabe sieht so aus:
Files and dependencies resolved Deploying to agent engine... ✅ Created agent engine: projects/<PROJECT_ID>/locations/us-west1/reasoningEngines/<AGENT_ID>
Mit dem bereitgestellten Python-Skript können Sie mit dem Agenten kommunizieren.
- Kopieren Sie die Beispielumgebungsdatei:
cp sample.env .env
- Öffnen Sie
.envund aktualisieren Sie das FeldGOOGLE_CLOUD_PROJECTmit Ihrer tatsächlichen Google Cloud-Projekt-ID.
Die Datei sollte in etwa so aussehen:
GOOGLE_CLOUD_PROJECT=<YOUR_PROJECT_ID>
GOOGLE_CLOUD_LOCATION=us-west1
- Sie können Agenten in Ihrem Projekt auflisten.
python main.py list
Die Ausgabe sollte in etwa so aussehen:
Listing deployed agents... ID: <AGENT_ID> | Display Name: planner_agent
Sobald Sie die ID des bereitgestellten Agenten haben, können Sie einen Prompt senden:
export AGENT_ID=<AGENT_ID>
python main.py prompt --agent-id ${AGENT_ID} --message "Plan a marathon for
10000 participants in Las Vegas on April 24, 2027 in the evening timeframe"
Die Ausgabe sollte in etwa so aussehen:
Streaming response from agent <AGENT_ID>:
{'model_version': 'gemini-3-flash-preview', 'content': {'parts': [{'text': 'Here is a comprehensive
...
...
...
9. Bereinigen
Löschen Sie die in diesem Codelab erstellten Ressourcen, um laufende Kosten für Ihr Google Cloud-Konto zu vermeiden.
Löschen Sie den Cloud Run-Dienst, der durch die Bereitstellung erstellt wurde:
python main.py delete --agent-id ${AGENT_ID}
Wenn Sie den Maps API-Schlüssel in Secret Manager gespeichert haben, löschen Sie das Secret:
gcloud secrets delete maps-api-key --project=$PROJECT_ID
Wenn Sie für dieses Codelab ein neues Google Cloud-Projekt erstellt haben, können Sie das gesamte Projekt löschen, um alle zugehörigen Ressourcen und APIs zu entfernen:
gcloud projects delete $PROJECT_ID
10. Glückwunsch
Glückwunsch! Sie haben mit dem ADK einen komplexen Marathonplaner-Agenten erstellt.
Lerninhalte
- Agent Development Kit (ADK)-Projekt initialisieren
PromptBuilderfür modulare System-Prompts verwenden- Zuordnungsfunktionen mit MCP-Tools und
ApiRegistryeinbinden - Skills mit
SkillToolsetbedingt laden - Lokal testen und in der Agent Engine bereitstellen