1. Giriş
Bu codelab'de, Agent Development Kit'i (ADK) kullanarak gelişmiş bir Maraton Planlayıcı Ajanı oluşturacaksınız. İyi yapılandırılmış bir sistem isteminden dinamik beceri yüklemeye ve MCP araçlarını eşlemeye kadar, aracının özelliklerini aşamalı olarak inceleyeceksiniz. Son olarak, aracıyı yerel olarak test edecek ve Agent Runtime'a (Agent Engine) dağıtacaksınız.
Yapacaklarınız
- Yeni bir ADK aracısı projesi başlatma
- Yapılandırılmış bir oluşturucu kullanarak güçlü bir sistem istemi oluşturma
- Gerçek dünya konum bağlamı için Google Haritalar MCP araçlarını ekleyin.
- Ajanın araç setine becerileri dinamik olarak yükleme
- Temsilci yürütmesini yerel olarak test etme
- Aracıyı Agent Engine'e (Cloud Run) dağıtın.
İhtiyacınız olanlar
- Chrome gibi bir web tarayıcısı
- Faturalandırmanın etkin olduğu bir Google Cloud projesi
- Python'a dair temel bilgiler
Bu codelab, uzmanlaşmış üretken yapay zeka aracıları oluşturmak isteyen orta düzey geliştiriciler içindir.
Tahmini süre: 45 dakika
Bu codelab'de oluşturulan kaynakların maliyeti 2 ABD dolarından az olmalıdır.
2. Başlamadan önce
Google Cloud projesi oluşturma
- Google Cloud Console'daki proje seçici sayfasında bir Google Cloud projesi seçin veya oluşturun.
- Cloud projeniz için faturalandırmanın etkinleştirildiğinden emin olun. Bir projede faturalandırmanın etkin olup olmadığını kontrol etmeyi öğrenin.
Cloud Shell'i Başlatma
Cloud Shell, Google Cloud'da çalışan ve gerekli araçların önceden yüklendiği bir komut satırı ortamıdır.
- Google Cloud Console'un üst kısmından Cloud Shell'i etkinleştir'i tıklayın.
- Cloud Shell'e bağlandıktan sonra kimlik doğrulamanızı onaylayın:
gcloud auth list - Projenizin yapılandırıldığını onaylayın:
gcloud config get project - Projeniz beklendiği gibi ayarlanmamışsa şu şekilde ayarlayın:
export PROJECT_ID=<YOUR_PROJECT_ID> gcloud config set project $PROJECT_ID
Kimlik doğrulamayı doğrulayın:
gcloud auth list
Projenizi onaylayın:
gcloud config get project
Gerekirse ayarlayın:
export PROJECT_ID=<YOUR_PROJECT_ID> gcloud config set project $PROJECT_ID
API'leri etkinleştir
Gerekli tüm API'leri etkinleştirmek için bu komutu çalıştırın:
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 Haritalar API anahtarı oluşturma
Google Haritalar MCP araçlarını kullanmak için Haritalar API anahtarı oluşturmanız gerekir.
- Google Cloud Console'da arama çubuğunu kullanarak Google Haritalar Platformu > Kimlik Bilgileri'ne gidin.
- İstenirse Google Cloud projenizi onaylayın.
- Kimlik bilgisi oluştur'u tıklayın ve API anahtarı'nı seçin.
- Oluşturulan API anahtarını kopyalayın. Bu bilgiye bir sonraki adımda ihtiyacınız olacak.
3. Ortamınızı ayarlama
Bu codelab'deki kod GitHub'da barındırılır. Dizin yapısını ve gerekli alt bileşenleri (ör. skills/ dizini) içeren depoyu klonlarsınız.
- Depoyu klonlayın ve proje klasörüne gidin:
git clone https://github.com/GoogleCloudPlatform/next-26-keynotes cd next-26-keynotes/devkey/demo-1
- Python sanal ortamı oluşturun ve ADK'yı yükleyin:
uv venv source .venv/bin/activate uv sync
- Haritalar API anahtarınızı ayarlayın. Uygulama, bunu bir ortam değişkeninden okur:
export GOOGLE_MAPS_API_KEY="<YOUR_MAPS_API_KEY>"
Ortam değişkenlerini yapılandırma
Simülasyon Aracı, yapılandırma için .env dosyasını kullanır. Örnek dosyayı kopyalayın ve proje kimliğinizle güncelleyin.
- Örnek ortam dosyasını kopyalayın:
cp planner_agent/sample.env planner_agent/.env
planner_agent/.envdosyasını açın,GOOGLE_CLOUD_PROJECTalanını gerçek Google Cloud proje kimliğinizle veGOOGLE_MAPS_API_KEYalanını oluşturduğunuz Google Haritalar API anahtarınızla güncelleyin.
Dosya aşağıdaki gibi görünmelidir:
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. Yeni bir ADK aracısı oluşturma
Aracı tanımlayan temel dosyayı inceleyin: planner_agent/agent.py.
build-agents-with-skills deposunda, aracı ADK'nın Agent sınıfı kullanılarak başlatılır. Temel modeli ve kimlik adını belirtir, diğer modüllerde tanımlanan talimatları ve araçları kullanır.
İlk kullanıma hazırlama kodunu incelemek için planner_agent/agent.py dosyasını açın:
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
)
Agent sınıfı, mesaj geçmişini, araç düzenlemesini ve LLM iletişimini soyutlayarak aracının davranışına odaklanmanızı sağlar.
Şu anda temsilci çok genel bir yanıt veriyor. Bu modelle diğer büyük dil modelleriyle etkileşim kurduğunuz gibi etkileşim kurabilirsiniz.
uv run adk run planner_agent
Bu komut, temsilciyle sohbet başlatır. Model olarak gemini-3-flash-preview'ı kullanır ve temel soruları yanıtlayabilir.
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**.
Temsilci, maratonlarla ilgili bazı bilgileri zaten biliyor. Ancak bu, kurallar ve rota planlamasıyla uygun bir maraton planlamak için yeterli değildir.
5. Sistem istemi oluşturma
Sistem istemleri (talimatlar), temsilcinin davranışını belirler. Bu proje, tek bir devasa dize yerine talimatları dinamik olarak oluşturmak için PromptBuilder (planner_agent/utils.py) kullanır.
İstemlerin nasıl mantıksal bölümler halinde yapılandırıldığını görmek için planner_agent/prompts.py simgesini açın:
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()
planner_agent/agent.py'da bu zaten içe aktarılmış.
TODO: Replace Instruction and Description içeren bölümü bulun ve instruction ile description değişken yeniden atamasını yorumdan çıkarın.
Kodun bu bölümü şu şekilde görünmelidir:
instruction=PLANNER_INSTRUCTION_NO_TOOLS
description="Expert GIS analyst for marathon route and event planning."
Aracı için herhangi bir araca referans vermeyen bir istem sürümünü içe aktarıyorsunuz. Araçları daha sonraki bir adımda ekleyeceksiniz.
Temsilcinin bu sürümünü test edebilirsiniz:
uv run adk run planner_agent
Sohbet penceresinde aşağıdaki istemi gönderin:
Plan a marathon for 10000 participants in Las Vegas on April 24, 2027 in the
evening timeframe
Birkaç dakika sonra şuna benzer bir yanıt alırsınız:
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).
...
...
İyi tanımlanmış bir istemle, çıktı zaten beklenen sonuca çok daha yakın. Sonraki adımda, temsilciyi bir sonraki seviyeye taşıyacak araçlar ekleyeceksiniz.
6. Beceri ve araç ekleme
planner_agent/agent.py'da becerileri ve araçları etkinleştirmek için TODO: Replaces Tools içeren bölümü bulun ve sonraki iki satırın yorumunu kaldırın. Kodunuz aşağıdaki gibi görünmelidir:
instruction=PLANNER_INSTRUCTION
tools=get_tools()
Bu adımda yapılması gereken tek kod değişikliği budur. Bu bölümün geri kalanında beceri ve araçların arkasındaki kavramlar açıklanmaktadır.
Beceri
Bir temsilci becerisi, ADK temsilcisinin belirli bir görevi yerine getirmek için kullanabileceği bağımsız bir işlev birimidir. Bir temsilci becerisi, Temsilci Becerisi spesifikasyonuna göre bir görev için gerekli talimatları, kaynakları ve araçları kapsar. Beceri yapısı, aracının işletim bağlamı penceresi üzerindeki etkiyi en aza indirmek için becerinin artımlı olarak yüklenmesine olanak tanır.
Maraton planlama aracısı için tanımlanmış 3 beceri vardır:
- gis-spatial-engineering: Maraton rotasını oluşturmak için GeoJSON verilerini işlemekten sorumludur.
- Harita: Yerleri ve hava durumu bilgilerini aramak için Google Haritalar araçlarını kullanın.
- race-director: Maraton rotasının planlama kurallarına uygun olduğunu doğrulayın.
Becerilerde komut dosyaları, ek öğeler ve referanslar olabilir.
Uygulama, tüm becerileri yükler ve planner_agent/tools.py'da araç olarak sunar. Bunun get_tools() işlevinde nasıl yapıldığına dikkat edin:
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
En ilgi çekici kısım, ADK'daki load_skill_from_dir yöntemidir. ADK'da beceri oluşturmanın bir başka yolu da satır içi oluşturmadır. Bu codelab'de kullanılmasa da şu şekilde görünür:
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.",
},
),
)
Eşleme araçları ekleme
Maraton planlayıcının rota oluşturmak için mekansal bağlama ihtiyacı vardır. Google Haritalar MCP (Model Context Protocol) sunucusunu entegre ederek bunu sağlayabilirsiniz.
planner_agent/tools.py bölümünde, MCP sunucusunun ApiRegistry aracıyla nasıl kaydedildiğine dikkat edin:
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)]
MCP araç setini ekleyen aracı, rota, yükseklik ve konum ayrıntıları için Google Haritalar'ı otomatik olarak sorgulama olanağı kazanır.
7. Aracıyı yerel olarak çalıştırma
Artık aracı, istemi ve araçları birbirine bağladığınıza göre aracı yerel olarak çalıştırın. Bu kez, adk web kullanacaksınız. Böylece Skill Load ve Tool Call etkinliklerini görebilirsiniz.
uv run adk web
Aşağıdakine benzer bir şey görmeniz gerekir.
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)
- Tarayıcınızı açın ve terminalde gösterilen URL'ye (genellikle
http://localhost:8000) gidin. - Sol üstteki açılır listede
planner_agentsimgesini seçin. - Sohbet penceresinde aşağıdaki istemi gönderin:
Plan a marathon for 10000 participants in Las Vegas on April 24, 2027 in the
evening timeframe
Becerilerin yüklendiğini ve araçların çağrıldığını görmelisiniz. Birkaç dakika sonra ajan, maraton planı oluşturur.
Kullanıcı arayüzünüz aşağıdaki gibi görünmelidir:

8. Aracıyı dağıtma
Aracının yerel olarak performansından memnun kaldığınızda, aracı Cloud Run'da güvenli bir şekilde barındıran Agent Engine'e dağıtabilirsiniz.
Aracı dağıtmak için ADK CLI dağıtım komutunu kullanın:
uv run adk deploy agent_engine \ --env_file planner_agent/.env \ planner_agent
Dağıtım tamamlandığında CLI, aracınız için güvenli bir şekilde barındırılan uç nokta çıkarır. Artık bu uç noktayı ön uç uygulamalarına, chatbot'lara veya diğer arka uç sistemlerine entegre edebilirsiniz. Ayrıca, aracı test etmek için Agent Runtime Playground'u da kullanabilirsiniz.
Çıkış şu şekilde görünür:
Files and dependencies resolved Deploying to agent engine... ✅ Created agent engine: projects/<PROJECT_ID>/locations/us-west1/reasoningEngines/<AGENT_ID>
Aracıyla iletişim kurmak için sağlanan Python komut dosyasını kullanabilirsiniz.
- Örnek ortam dosyasını kopyalayın:
cp sample.env .env
.envdosyasını açın veGOOGLE_CLOUD_PROJECTalanını gerçek Google Cloud projesi kimliğinizle güncelleyin.
Dosya aşağıdaki gibi görünmelidir:
GOOGLE_CLOUD_PROJECT=<YOUR_PROJECT_ID>
GOOGLE_CLOUD_LOCATION=us-west1
- Projenizdeki temsilcileri listeleyebilirsiniz.
python main.py list
Aşağıdakine benzer bir şey görmeniz gerekir.
Listing deployed agents... ID: <AGENT_ID> | Display Name: planner_agent
Dağıtılan aracı kimliğine sahip olduğunuzda istem gönderebilirsiniz:
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"
Aşağıdakine benzer bir çıkış alırsınız:
Streaming response from agent <AGENT_ID>:
{'model_version': 'gemini-3-flash-preview', 'content': {'parts': [{'text': 'Here is a comprehensive
...
...
...
9. Temizleme
Google Cloud hesabınızın sürekli olarak ücretlendirilmesini önlemek için bu codelab sırasında oluşturulan kaynakları silin.
Dağıtım tarafından oluşturulan Cloud Run hizmetini silin:
python main.py delete --agent-id ${AGENT_ID}
Maps API anahtarını Secret Manager'da sakladıysanız gizli anahtarı silin:
gcloud secrets delete maps-api-key --project=$PROJECT_ID
Bu codelab için yeni bir Google Cloud projesi oluşturduysanız projeyle ilişkili tüm kaynakları ve API'leri kaldırmak için projenin tamamını silebilirsiniz:
gcloud projects delete $PROJECT_ID
10. Tebrikler
Tebrikler! ADK'yı kullanarak gelişmiş bir Maraton Planlayıcı Temsilcisi oluşturdunuz.
Öğrendikleriniz
- Agent Development Kit (ADK) projesini başlatma
- Modüler sistem istemleri için
PromptBuilder'ı kullanma - MCP araçlarını ve
ApiRegistrykullanarak harita oluşturma özelliklerini entegre etme SkillToolsetkullanarak becerileri koşullu olarak yükleme- Yerel olarak test etme ve Agent Engine'e dağıtma