ADK ile Yapay Zeka Ajanları Oluşturma: Temsilci İş Akışlarını Yönetme

1. Genel Bakış

Birden fazla kısıtlamaya sahip bir seyahat isteğini yerine getirmek (örneğin, tarihi tapınaklara ve yerel mutfağa odaklanan, modern sanat galerileri içermeyen, 100 ABD dolarının altında bir bütçeyle tam günlük Kyoto seyahat planı tasarlamak) için kısıtlamaları belirlemek, turistik yerleri ve restoranları aynı anda araştırmak, ayrıntılı bir program hazırlamak ve nihai planı denetlemek gerekir. Birçok araca sahip tek bir monolitik ajana güvenmek, doğrulama adımlarının atlanmasına veya hariç tutma kurallarının ihlal edilmesine neden olabilir. Bu nedenle orkestrasyon, deterministik iş akışı denetleyicileri aracılığıyla özel alt ajanları koordine eder.

ADK ile Yapay Zeka Ajanları Oluşturma serisinin bu üçüncü bölümünde, Agent Development Kit (ADK) 2 iş akışı denetleyicilerini (SequentialAgent, ParallelAgent ve LoopAgent) kullanarak Agent Platform'da bağımsız bir çoklu yapay zeka ajanı seyahat planlayıcısı oluşturacaksınız. Üç aşamalı bir süreçte (1. veya 2. bölüm çalışma alanı kurulumu gerekmez), gemini-3.8-flash tarafından desteklenen altı uzman yapay zeka ajanını paylaşılan oturum durumu (output_key), eşzamanlı google_search yürütme ve yinelemeli bir yapıcı-kontrolör iyileştirme döngüsüyle koordine edeceksiniz.

Ön koşullar

Öğrenecekleriniz

  • Sıfırdan çoklu temsilci ADK 2 projesi oluşturma
  • output_key kullanarak oturum durumunu paylaşan uzmanlaşmış temsilcilerden oluşan bir ekip tasarlama
  • Belirgin ve adım adım ilerleyen bir ardışık düzende alt ajanları yürütmek için SequentialAgent öğesini kullanma
  • Daha düşük gecikme süresi için bağımsız araştırma temsilcilerini eşzamanlı olarak çalıştırmak üzere ParallelAgent aracını kullanma
  • Yinelemeli bir yapıcı-kontrolör hassaslaştırma döngüsü uygulamak için LoopAgent ve ToolContext üst birime iletme özelliğini kullanma
  • Sıralı, paralel ve döngü kalıplarını hiyerarşik bir çoklu temsilci iş akışında birleştirme

İhtiyacınız olanlar

  • Google Hesabı (Atölye kredisi talep ediyorsanız kişisel @gmail.com hesabı kullanın)
  • Eğitmeninizden aldığınız atölye kredisi bağlantısı (ve QR kodunu taramak için telefon kamerası) veya etkin bir Cloud Faturalandırma Hesabı
  • Google Chrome (Kişisel hesaplar ile iş hesaplarının karışmaması için gizli pencere kullanılması önerilir.)

2. Google Cloud kredilerini kullanma (isteğe bağlı)

Etkinlik kredisi bağlantısı içeren bir atölyeye katılıyorsanız kredi kartı olmadan faturalandırma hesabı oluşturmak için Google Developer Program kredinizi kullanın.

Etkinlik kredinizi alma

  1. Atölye kredisi bağlantısını gizli pencerede açın ve @gmail.com hesabınızla oturum açın.
  2. Avantajınızı Kullanın sayfasında Krediyi Kullan'ı tıklayın:

Google Builders Hub'da "Kredinizi alın" düğmesini gösteren "Avantajınızı alın" kartı

  1. Google Developer Program profili oluşturmanız istenirse formu doldurun.
  2. Gerçek Kişi Olduğunuzu Doğrulamak İçin Tarayın ifadesi göründüğünde QR kodunu telefonunuzla tarayın ve doğrulamayı tamamlayın (QR kodu görünmüyorsa sayfayı yenileyip Krediyi Al'ı tekrar tıklayın):

Google Developer Program'da gerçek bir kişi olduğunuzu doğrulamak için QR kodunu tarayın iletişim kutusu

  1. Etkinlik kredinizi başarıyla kullandınız ifadesinin göründüğünü onaylayın, ardından Faturalandırma Hesabını Aç'ı tıklayın:

Google Builders Hub'da "Etkinlik kredinizi başarıyla kullandınız" mesajı ve "Faturalandırma Hesabını Aç" düğmesi gösteriliyor.

🔍 Çalışmanızı kontrol edin

Faturalandırma hesabı kurulumu 3 dakika kadar sürer:

  1. Google Cloud Billing'i açın (veya URL'yi gizli pencerenize kopyalayın) ve Faturalandırma hesaplarınız'ı seçin:
https://console.cloud.google.com/billing
  1. GDP Credit hesabınızın durumu Etkin olarak gösterilene kadar sayfayı yenileyin:

Etkin bir GDP Kredisi faturalandırma hesabını gösteren Google Cloud Faturalandırma Hesabı yönetimi

3. Google Cloud projesi oluşturma (isteğe bağlı)

Bu codelab'deki tüm kaynakların izole kalması ve kolayca temizlenebilmesi için özel bir Google Cloud projesi oluşturun.

  1. Proje Oluşturma sayfasını açın (veya URL'yi gizli pencerenize kopyalayın):
https://console.cloud.google.com/projectcreate
  1. Proje ayrıntılarınızı girin:
    • Proje adı: Örneğin, google-cloud-workshop
    • Faturalandırma hesabı (gösteriliyorsa): GDP Credit (veya etkin faturalandırma hesabınızı) seçin.
    • Üst kaynak: Kuruluş yok (veya gerekirse kuruluşunuz)
  2. Proje adının altında oluşturulan Proje Kimliği'ni not edin ve Oluştur'u tıklayın:

Proje adı, proje kimliği, üst kaynak ve Oluştur düğmesinin gösterildiği Google Cloud projesi oluşturma ekranı

🔍 Çalışmanızı kontrol edin

Sağ üstteki araç çubuğunda Bildirimler'i tıklayın ve proje oluşturma işlemi tamamlandığında Proje Seç'i tıklayın:

Proje Oluştur ve Proje Seç bağlantısını gösteren Google Cloud Console Bildirimler menüsü

4. Ortamınızı ayarlama

Google Cloud Shell'i yapılandırın, Agent Platform API'yi etkinleştirin ve uv ile izole bir Python 3.12 sanal ortamı oluşturun.

Cloud Shell'i yapılandırma

  1. Google Cloud konsolu araç çubuğunda Cloud Shell'i etkinleştir'i (>_) tıklayın veya doğrudan Google Cloud Shell'i açın (ya da URL'yi gizli pencerenize kopyalayın):
https://shell.cloud.google.com/?show=ide,terminal

Google Cloud Console araç çubuğundaki Cloud Shell'i etkinleştir düğmesi

  1. İstenirse Authorize'ı (Yetkilendir) tıklayın:

Cloud Shell'i yetkilendirme iletişim kutusu

  1. Terminalinizdeki numaralı menüden etkin Google Cloud proje kimliğinizi seçin:
unset CLOUDSDK_CORE_PROJECT
PS3="Select your project (e.g. 1): "
select PROJECT_ID in $(gcloud projects list --format="value(projectId)"); do
  [ -n "$PROJECT_ID" ] && gcloud config set project "$PROJECT_ID" && break
done

Aşağıdakine benzer bir çıkış görürsünüz (etiketlenmemiş projeler de bilgilendirici bir [environment: untagged] satırı yazdırır):

1) google-cloud-workshop-4210
2) my-cloud-project-8812
Select your project (e.g. 1): 1
Updated property [core/project].

Seçtiğiniz proje kimliğinin Cloud Shell isteminde sarı renkle vurgulandığını doğrulayın:

Seçilen proje kimliğinin sarı renkle vurgulandığı Cloud Shell terminali

Gerekli API'leri etkinleştirme

ADK temsilcilerinizin Gemini modellerini çağırabilmesi için Agent Platform API'yi etkinleştirin:

gcloud services enable aiplatform.googleapis.com

Şuna benzer bir çıkış alırsınız:

Operation "operations/acat.p2-..." finished successfully.

Python sanal ortamı oluşturma ve ADK'yi yükleme

~/adk-agents çalışma alanını oluşturun ve Python 3.12 sanal ortamını etkinleştirin:

cd ~
mkdir -p adk-agents && cd ~/adk-agents

which uv >/dev/null 2>&1 || curl -LsSf https://astral.sh/uv/install.sh | sh
export PATH="$HOME/.local/bin:$PATH"

uv venv .venv --python 3.12
source .venv/bin/activate

Terminal isteminizin başında (.venv) ön ekinin göründüğünü doğrulayın:

Etkin bir Python sanal ortamında .venv ön ekini gösteren Cloud Shell terminali

Etkin sanal ortamda ADK 2'yi yükleyin:

uv pip install --no-cache "google-adk==2.14.0"

🔍 Çalışmanızı kontrol edin

Yüklü adk CLI sürümünü doğrulayın:

adk --version

Şuna benzer bir çıkış alırsınız:

adk, version 2.14.0

5. Seyahat planlayıcı temsilcisinin iskeletini oluşturma

Ortamınız hazır olduğunda ADK'nin yerleşik adk create komutunu kullanarak travel_planner temsilci paketiniz için başlangıç dosyalarını oluşturun.

Başlangıç paketini oluşturma

~/adk-agents dizininizden adk create komutunu çalıştırın:

cd ~/adk-agents
adk create travel_planner

Terminalde istendiğinde aşağıdaki yapılandırma seçeneklerini belirleyin (ilk çalıştırmada Enable telemetry? [Y/n]: istemi gösterilirse Enter tuşuna basın veya n yazıp Enter tuşuna basın):

  1. Kök temsilci için bir model seçin: gemini-3.8-flash modelini seçmek için 2 yazın (1 seçeneği gemini-3.5-flash modelini seçer) ve Enter tuşuna basın.
  2. Arka uç seçin: Google Cloud Agent Platform arka ucunu seçmek için 2 yazın (aşağıdaki CLI menüsünde 2 seçeneği) ve Enter tuşuna basın.
  3. Enter Google Cloud project ID (Google Cloud proje kimliğini girin): Parantez içinde gösterilen proje kimliğinizi Enter tuşuna basarak onaylayın.
  4. Enter Google Cloud region (Google Cloud bölgesini girin): global yazın ve Enter tuşuna basın.

adk create, GOOGLE_GENAI_USE_ENTERPRISE=1, proje kimliğiniz ve GOOGLE_CLOUD_LOCATION=global değerlerini travel_planner/.env dosyasına yazar. Böylece daha sonra agent.py aracını güncellediğinizde kimlik bilgileriniz yapılandırılmış olarak kalır.

🔍 Çalışmanızı kontrol edin

Şuna benzer bir çıkış alırsınız:

Choose a model for the root agent:
1. gemini-3.5-flash
2. gemini-3.8-flash
3. Other models (fill later)
Choose model (1, 2, 3): 2
1. Google AI
2. Vertex AI
3. Login with Google
Choose a backend (1, 2, 3): 2

You need an existing Google Cloud account and project, check out this link for details:
https://google.github.io/adk-docs/get-started/quickstart/#gemini---google-cloud-vertex-ai

Enter Google Cloud project ID [google-cloud-workshop-4210]:
Enter Google Cloud region [us-central1]: global

Agent created in /home/your_username/adk-agents/travel_planner:
- .env
- .gitignore
- __init__.py
- agent.py

⚠️  WARNING: Secrets (like GOOGLE_API_KEY) are stored in .env.

Next steps:
- Chat with your agent in the terminal: adk run travel_planner
- Or in the browser: adk web .
- Have your coding agent evaluate and deploy it: uvx google-agents-cli setup
  (other install options: https://adk.dev/get-started/agents-cli/)

Cloud Shell kod düzenleyicide mevcut klasörü açarak dosyaları terminalinizle yan yana inceleyip düzenleyebilirsiniz:

which cloudshell >/dev/null 2>&1 && cloudshell workspace ~/adk-agents || true
cd ~/adk-agents
source .venv/bin/activate

Varsayılan tek temsilciyi test etme

Çoklu temsilci iş akışları oluşturmadan önce ADK Development kullanıcı arayüzünü başlatarak varsayılan tek temsilcinin geniş kapsamlı bir seyahat planlama sorgusuna nasıl yanıt verdiğini inceleyin:

cd ~/adk-agents
adk web --allow_origins "*"

Cloud Shell Web Önizlemesi'ni kullanarak tarayıcınızda geliştirme kullanıcı arayüzünü açın:

  1. Cloud Shell'in sağ üst araç çubuğundaki Web Preview (Web Önizlemesi) simgesini tıklayın.
  2. Change Port'u (Bağlantı Noktasını Değiştir) seçin, 8000 değerini girin ve Change and Preview'u (Değiştir ve Önizle) tıklayın.

Cloud Shell web önizlemesi bağlantı noktası yapılandırma iletişim kutusu 8000 olarak ayarlanmış

ADK Web kullanıcı arayüzü yüklendikten sonra "hello, what can you do?" veya "Help me plan a trip to Japan" gibi bir selamlama mesajı gönderin:

Temel bir tek temsilcili görüşmeyi gösteren ADK Development Web UI

Tek bir root_agent, yapılandırılmış tercih çıkarma, canlı web araştırması veya bütçe doğrulaması olmadan doğrudan tek seferde yanıt verir.

Testi tamamladığınızda Cloud Shell terminalinizde Ctrl + C tuşlarına basarak adk web sunucusunu durdurun ve komut istemine dönün.

6. SequentialAgent iş akışı oluşturma

Şimdi ilk düzenleme kalıbınızı oluşturacaksınız: SequentialAgent tarafından desteklenen doğrusal bir iş akışı. Sıralı ardışık düzende alt ajanlar belirli bir sırayla yürütülür. İlk uzman, yapılandırılmış parametreleri ayıklar ve output_key="user_preferences" kullanarak paylaşılan oturum durumuna kaydeder. İkinci uzman ise seyahat planını hazırlamak için paylaşılan durumdan {user_preferences} değerini okur.

root_agent'ın, paylaşılan oturum durumu aracılığıyla user_profiler_agent'ı ve ardından itinerary_synthesizer_agent'ı çalıştıran master_travel_agent'a (SequentialAgent) yetki verdiğini gösteren mimari diyagramı

İlk uzmanları oluşturma (specialists.py)

travel_planner/ içinde specialists.py adlı yeni bir dosya açın:

cloudshell edit ~/adk-agents/travel_planner/specialists.py

user_profiler_agent ve itinerary_synthesizer_agent değerlerini tanımlamak için aşağıdaki kodu travel_planner/specialists.py dosyasına yapıştırın (sonraki adımlar için ToolContext ve google_search değerlerini önceden içe aktarın):

from google.adk import Agent
from google.adk.tools import ToolContext, google_search

# --- Specialist 1: The User Profiler ---
user_profiler_agent = Agent(
    name="user_profiler_agent",
    description="Extracts travel preferences and constraints from user input.",
    instruction="""
        Extract destination, duration (default 1 day), budget, interests, and exclusions.
        Return a single JSON object with keys: "destination", "duration", "budget", "interests", "exclusions".
    """,
    output_key="user_preferences",  # Saves output to state['user_preferences']
)

# --- Specialist 2: The Synthesizer ---
itinerary_synthesizer_agent = Agent(
    name="itinerary_synthesizer_agent",
    description="Compiles preferences and research into a final Markdown itinerary.",
    instruction="""
        You are an elite Travel Concierge. Write a Markdown itinerary with an itemized USD and local currency cost breakdown using:
        - User Preferences: {user_preferences}
        - Activities (if available): {activity_recommendations?}
        - Restaurants (if available): {restaurant_recommendations?}
    """,
    output_key="final_itinerary",
)

Sıralı ardışık düzeni bağlama (workflows.py)

Uzmanları yönetmek için travel_planner/ içinde workflows.py adlı yeni bir dosya oluşturun:

cloudshell edit ~/adk-agents/travel_planner/workflows.py

travel_planner/workflows.py alanına aşağıdaki SequentialAgent tanımını ekleyin:

from google.adk.agents import SequentialAgent
from .specialists import (
    user_profiler_agent,
    itinerary_synthesizer_agent,
)

# 1. SEQUENTIAL PHASE: A linear two-step workflow
master_travel_agent = SequentialAgent(
    name="master_travel_agent",
    description="Orchestrates the end-to-end travel planning process for trip and itinerary requests.",
    sub_agents=[
        user_profiler_agent,         # Step 1: Extract constraints into user_preferences
        itinerary_synthesizer_agent,  # Step 2: Draft itinerary from user_preferences
    ],
)

root_agent (agent.py) ile iş akışını bağlayın

Şimdi master_travel_agent adlı temsilciyi root_agent adlı temsilcinin alt ajanı olarak kaydedin. travel_planner/agent.py uygulamasını açın:

cloudshell edit ~/adk-agents/travel_planner/agent.py

travel_planner/agent.py dosyasının içeriğini aşağıdaki kodla değiştirin:

from google.adk import Agent
from .workflows import master_travel_agent

MODEL = "gemini-3.8-flash"

root_agent = Agent(
    model=MODEL,
    name="root_agent",
    description="A helpful assistant for user questions.",
    instruction=(
        "Greet the user and delegate any travel or trip planning requests "
        "to master_travel_agent."
    ),
    sub_agents=[master_travel_agent],
)

🔍 Çalışmanızı kontrol edin

Terminalinizden ADK web kullanıcı arayüzünü başlatın:

cd ~/adk-agents
adk web --allow_origins "*"

8000 bağlantı noktasında Web Önizlemesi'ni açın ve istemi girin:

Help me plan a trip to Kyoto

Events (Etkinlikler) görünümünde aşağıdaki yürütme akışına benzer bir çıkış görürsünüz:

1. root_agent -> calls transfer_to_agent(agent_name="master_travel_agent")
2. user_profiler_agent -> outputs JSON {"destination": "Kyoto", "duration": "1 day", ...} to state['user_preferences']
3. itinerary_synthesizer_agent -> reads {user_preferences} and outputs the formatted Markdown itinerary

root_agent'tan master_travel_agent'a, user_profiler_agent'a ve itinerary_synthesizer_agent'a kadar yürütme grafiğini ve oluşturulan Kyoto seyahat planını gösteren ADK 2.14.0 web kullanıcı arayüzü

Herhangi bir etkinlik rozetini (veya State: final_itinerary çipini) tıklayın ve sol denetleyici panelindeki State (Durum) sekmesine geçerek user_preferences ve final_itinerary değerlerinin oturum durumuna doldurulduğunu onaylayın.

İzlemeyi incelemeyi tamamladığınızda terminalinizde Ctrl + C tuşuna basarak adk web aracını durdurun.

7. ParallelAgent ile araştırma yapma

Sıralı iş akışı, tercihleri ayıklama ve seyahat planı taslağı oluşturma işlemlerini net bir şekilde ayırsa da önerileri yalnızca modelin statik eğitim bilgilerine dayanır. Yerleşik google_search aracından destek alan iki özel araştırmacı ekleyerek seyahat planını canlı web verilerine dayandırabilirsiniz:

  • activity_finder_agent: Kullanıcının varış noktası ve ilgi alanlarıyla eşleşen 3 turistik yer bulur ve tahmini bilet fiyatlarını gösterir.
  • restaurant_finder_agent: Yüksek puanlı 3 yerel restoranı ve kişi başına tahmini maliyetlerini bulur.

Turistik yerleri ve restoranları araştırmak birbirinden bağımsız olduğu için bunları sırayla çalıştırmak zaman kaybına neden olur. Bunun yerine, her iki araştırmacıyı da bir ParallelAgent (parallel_research_agent) içine sarmalayacaksınız. Böylece ADK, her iki Google Arama iş akışını da eşzamanlı olarak yürütür ve itinerary_synthesizer_agent'ya aktarmadan önce {activity_recommendations?} ve {restaurant_recommendations?}'i doldurur.

1. aşamada user_profiler_agent'ı, 2. aşamada parallel_research_agent'ı (activity_finder_agent ve restaurant_finder_agent ile ParallelAgent) ve 3. aşamada itinerary_synthesizer_agent'ı çalıştıran master_travel_agent'ı gösteren mimari şeması

Paralel araştırma uzmanlarını specialists.py adlı dosyaya ekle

travel_planner/specialists.py uygulamasını açın:

cloudshell edit ~/adk-agents/travel_planner/specialists.py

Aşağıdaki iki Google Arama uzmanını travel_planner/specialists.py dosyasının altına (itinerary_synthesizer_agent dosyasının hemen altına) ekleyin:

# --- Specialist 3: The Activity Finder ---
activity_finder_agent = Agent(
    name="activity_finder_agent",
    description="Finds 3 attractions matching the user's destination and interests.",
    instruction="""
        Based on {user_preferences}, use google_search to find 3 specific attractions (including budget-friendly options).
        Return a JSON list with keys: "attraction_name", "estimated_cost_local", "estimated_cost_usd", "notes".
    """,
    tools=[google_search],
    output_key="activity_recommendations",
)

# --- Specialist 4: The Restaurant Finder ---
restaurant_finder_agent = Agent(
    name="restaurant_finder_agent",
    description="Finds 3 restaurants matching the destination and budget.",
    instruction="""
        Based on {user_preferences}, use google_search to find 3 highly-rated restaurants across price points.
        Return a JSON list with keys: "restaurant_name", "cuisine", "estimated_cost_local", "estimated_cost_usd".
    """,
    tools=[google_search],
    output_key="restaurant_recommendations",
)

ParallelAgent öğesini workflows.py içine ekle

travel_planner/workflows.py uygulamasını açın:

cloudshell edit ~/adk-agents/travel_planner/workflows.py

ParallelAgent kullanarak parallel_research_agent öğesini tanımlamak için travel_planner/workflows.py öğesini güncelleyin ve user_profiler_agent ile itinerary_synthesizer_agent arasına yerleştirin:

from google.adk.agents import ParallelAgent, SequentialAgent
from .specialists import (
    activity_finder_agent,
    itinerary_synthesizer_agent,
    restaurant_finder_agent,
    user_profiler_agent,
)

# Parallel branch: Run activity and restaurant research simultaneously
parallel_research_agent = ParallelAgent(
    name="parallel_research_agent",
    description="Runs activity and restaurant research concurrently.",
    sub_agents=[
        activity_finder_agent,
        restaurant_finder_agent,
    ],
)

# Master pipeline: Profile -> Parallel Research -> Synthesize
master_travel_agent = SequentialAgent(
    name="master_travel_agent",
    description="Orchestrates the end-to-end travel planning process for trip and itinerary requests.",
    sub_agents=[
        user_profiler_agent,          # Step 1: Extract constraints
        parallel_research_agent,      # Step 2: Research activities & restaurants in parallel
        itinerary_synthesizer_agent,  # Step 3: Synthesize into an itinerary
    ],
)

🔍 Çalışmanızı kontrol edin

Paralel araştırma ardışık düzenini test etmek için adk web aracını tekrar başlatın:

cd ~/adk-agents
adk web --allow_origins "*"

Web önizleme kullanıcı arayüzünde şu istemi gönderin:

Help me plan a trip to Kyoto focused on historic temples and ramen

Events (Etkinlikler) görünümünde aşağıdakine benzer bir çıkış görürsünüz:

1. user_profiler_agent -> writes state['user_preferences']
2. parallel_research_agent -> fans out concurrently:
   - activity_finder_agent invokes google_search -> writes state['activity_recommendations']
   - restaurant_finder_agent invokes google_search -> writes state['restaurant_recommendations']
3. itinerary_synthesizer_agent -> merges all three state keys into state['final_itinerary']
  1. İzleme görünümü: Görüşme bölmesinin üst kısmındaki (Etkinlikler'in yanındaki) İzlemeler'i tıklayın ve sıranızı inceleyin. parallel_research_agent altında activity_finder_agent ve restaurant_finder_agent için çakışan zaman çizelgesi aralıkları görürsünüz. Bu sayede, toplam web araştırması gecikmesi, sıralı olarak çalıştırmaya kıyasla neredeyse yarı yarıya azalır.
  2. State (Durum) sekmesi: Canlı oturum sözlüğünü (user_preferences, activity_recommendations, restaurant_recommendations ve final_itinerary) incelemek için sol denetleyici panelindeki State (Durum) sekmesini tıklayın.

Testi tamamladığınızda adk web aracını durdurmak için terminalinizde Ctrl + C tuşlarına basın.

8. LoopAgent ile taslakları iyileştirme

Canlı arama sonuçları olsa bile itinerary_synthesizer_agent tarafından üretilen ilk taslak, kullanıcının toplam bütçesini aşabilir veya yanlışlıkla hariç tutulan bir kategoriyi (ör. kullanıcı istemediği halde modern sanat galerisi) içerebilir.

Kısıtlamalara uyulmasını sağlamak için LoopAgent kullanarak ardışık düzenin sonuna bir oluşturucu-denetleyici hassaslaştırma döngüsü ekleyeceksiniz:

  1. itinerary_critic_agent (Denetleyici): {final_itinerary}, {user_preferences} ile karşılaştırılarak denetlenir. Tahmini maliyetleri toplar, her bir negatif kısıtlamayı kontrol eder ve critique_feedback için özel düzeltme talimatları yazar veya tam olarak "APPROVED" ifadesiyle yanıt verir.
  2. itinerary_refiner_agent (The Maker / Exiter): {critique_feedback}. Eleştiri "APPROVED" ise LoopAgent döngüsünden hemen çıkmak için exit_loop aracını (tool_context.actions.escalate = True) çağırır. Aksi takdirde, işaretlenen sorunları düzeltmek için {final_itinerary} dosyasını düzeltir ve bir sonraki geçiş için final_itinerary dosyasının üzerine yazar.

exit_loop çağrılana kadar seyahat planı_critic_agent ve seyahat planı_refiner_agent arasında geçiş yapan 4. aşama refinement_loop_agent (LoopAgent) ile ana_travel_agent'ı gösteren mimari diyagramı

exit_loop, Eleştirmen ve İyileştirici'yi specialists.py öğesine ekleyin

travel_planner/specialists.py uygulamasını açın:

cloudshell edit ~/adk-agents/travel_planner/specialists.py

exit_loop aracını (ToolContext), itinerary_critic_agent ve itinerary_refiner_agent öğelerini travel_planner/specialists.py dosyasının altına ekleyin:

def exit_loop(tool_context: ToolContext) -> dict:
    """Call ONLY when the critique is APPROVED to exit the refinement loop."""
    print(f"[Tool Call] exit_loop triggered by {tool_context.agent_name}")
    tool_context.actions.escalate = True
    return {"status": "approved", "message": "Itinerary approved. Exiting refinement loop."}


# --- Specialist 5: The Budget & Constraint Critic (Inside LoopAgent) ---
itinerary_critic_agent = Agent(
    name="itinerary_critic_agent",
    include_contents="none",
    description="Audits the itinerary draft against budget and negative constraints.",
    instruction="""
        Audit Current Itinerary ({final_itinerary}) against User Preferences ({user_preferences}).
        Verify that the USD total stays within the user's budget and no excluded venue types appear.
        If all checks pass, respond EXACTLY with the single word "APPROVED".
        Otherwise, output 1-2 concise revision instructions explaining what to swap or adjust.
    """,
    output_key="critique_feedback",
)

# --- Specialist 6: The Itinerary Refiner / Exiter (Inside LoopAgent) ---
itinerary_refiner_agent = Agent(
    name="itinerary_refiner_agent",
    include_contents="none",
    description="Refines the itinerary from critique feedback, or calls exit_loop when APPROVED.",
    instruction="""
        Review Auditor Critique ({critique_feedback}) for Current Itinerary ({final_itinerary}).
        If the critique is EXACTLY "APPROVED", call `exit_loop` immediately and return the itinerary unchanged.
        Otherwise, revise the draft using {activity_recommendations} and {restaurant_recommendations}
        so all USD budget and exclusion rules pass, and output ONLY the updated Markdown itinerary.
    """,
    tools=[exit_loop],
    output_key="final_itinerary",
)

LoopAgent kitlesini workflows.py kampanyasına ekleyin

travel_planner/workflows.py uygulamasını açın:

cloudshell edit ~/adk-agents/travel_planner/workflows.py

travel_planner/workflows.py öğesini, itinerary_critic_agent ve itinerary_refiner_agent öğelerini bir LoopAgent (max_iterations=3) içinde sarmalayacak şekilde güncelleyin ve master_travel_agent öğesinin dördüncü aşaması olarak ekleyin:

from google.adk.agents import LoopAgent, ParallelAgent, SequentialAgent
from .specialists import (
    activity_finder_agent,
    itinerary_critic_agent,
    itinerary_refiner_agent,
    itinerary_synthesizer_agent,
    restaurant_finder_agent,
    user_profiler_agent,
)

# Stage 2: Parallel research branch
parallel_research_agent = ParallelAgent(
    name="parallel_research_agent",
    description="Runs activity and restaurant research concurrently.",
    sub_agents=[
        activity_finder_agent,
        restaurant_finder_agent,
    ],
)

# Stage 4: Iterative Maker-Checker refinement loop
refinement_loop_agent = LoopAgent(
    name="refinement_loop_agent",
    description="Iteratively audits and refines the itinerary until constraints and budget are approved.",
    sub_agents=[
        itinerary_critic_agent,
        itinerary_refiner_agent,
    ],
    max_iterations=3,
)

# Master pipeline: Profile -> Parallel Research -> Synthesize -> Refinement Loop
master_travel_agent = SequentialAgent(
    name="master_travel_agent",
    description="Orchestrates the end-to-end travel planning process for trip and itinerary requests.",
    sub_agents=[
        user_profiler_agent,          # Stage 1: Extract constraints
        parallel_research_agent,      # Stage 2: Research activities & restaurants in parallel
        itinerary_synthesizer_agent,  # Stage 3: Draft initial itinerary
        refinement_loop_agent,        # Stage 4: Audit and refine until approved
    ],
)

🔍 Çalışmanızı kontrol edin

Çoklu temsilci iş akışının tamamını test etmek için adk web uygulamasını başlatın:

cd ~/adk-agents
adk web --allow_origins "*"

8000 bağlantı noktasında Web Önizlemesi kullanıcı arayüzünü açın, Yeni Oturum başlatın ve Kyoto ile ilgili birden fazla kısıtlama içeren bu istemle tüm sistemi test edin:

Design a full-day itinerary for Kyoto with a total budget of $100. My main interests are historical landmarks, temples, and authentic local cuisine. Please do not include any modern art museums or galleries.

Events (Etkinlikler) görünümünde ve terminal günlüklerinde aşağıdaki yürütme sırasına benzer bir çıkış görürsünüz:

1. user_profiler_agent -> writes JSON with destination="Kyoto", budget="$100", exclusions=["modern art museums", "galleries"]
2. parallel_research_agent -> runs activity_finder_agent and restaurant_finder_agent in parallel
3. itinerary_synthesizer_agent -> produces initial draft in state['final_itinerary']
4. refinement_loop_agent:
   - itinerary_critic_agent -> audits USD budget and exclusions -> outputs "APPROVED" (or revision notes)
   - itinerary_refiner_agent -> triggers [Tool Call] exit_loop triggered by itinerary_refiner_agent and outputs the approved itinerary
  1. Etkinlikler görünümü: itinerary_critic_agent veya itinerary_refiner_agent bölümündeki herhangi bir etkinlik çipini tıklayarak sol taraftaki Bilgi sekmesinde yükünü inceleyin. itinerary_refiner_agent, exit_loop işlevini çağırdığında etkinliği inceleyerek actions.escalate: true değerini görebilirsiniz. Bu sinyal, LoopAgent işlevine max_iterations=3 değerine ulaşmadan önce yinelemeyi durdurmasını söyler.
  2. State (Durum) sekmesi: state['critique_feedback'] ve state['final_itinerary'] değerlerinin geçişler arasında güncellenmesini izlemek için State (Durum) sekmesini tıklayın. İlk taslak $100 USD değerini aşarsa critique_feedback, final_itinerary daha düşük maliyetli alternatiflerle güncellenmeden önce 1. aşamada denetçinin düzeltme talimatlarını tutar ve critique_feedback, 2. aşamada "APPROVED" olarak değişir.

Testi tamamladığınızda adk web aracını durdurmak için terminalinizde Ctrl + C tuşlarına basın.

9. Temizleme

Yerel proje dosyalarını silme

adk-agents proje dizinini ve sanal ortamı Cloud Shell ana klasörünüzden kaldırmak için şu komutu çalıştırın:

cd ~
rm -rf ~/adk-agents

Agent Platform API'yi devre dışı bırakma

Projenizde etkinleştirilen Agent Platform API'ye artık ihtiyacınız yoksa gcloud ile devre dışı bırakın:

gcloud services disable aiplatform.googleapis.com --quiet

Google Cloud projesinin tamamını silme (isteğe bağlı)

PROJECT_ID=$(gcloud config get-value project)
gcloud projects delete "$PROJECT_ID" --quiet

🔍 Çalışmanızı kontrol edin

~/adk-agents adlı kullanıcının kaldırıldığını onaylayın:

test ! -d ~/adk-agents && echo "Workspace ~/adk-agents removed"

Şuna benzer bir çıkış alırsınız:

Workspace ~/adk-agents removed

10. Tebrikler

Tebrikler! Google Agent Development Kit (ADK) ile hiyerarşik bir çoklu temsilci sistemi oluşturdunuz. Bu sistem, altı uzman temsilciden oluşan bir ekibi sıralı, paralel ve yinelemeli döngü iş akışlarında koordine eder.

Başarılarınız

  • Paylaşılan oturum durumu aracılığıyla temsilciler arasında yapılandırılmış iletişim (output_key ve {state_variable} şablon ekleme)
  • SequentialAgent kullanarak deterministik, adım adım bir ardışık düzen oluşturun.
  • ParallelAgent kullanılarak bağımsız Google Arama araştırma temsilcileri aynı anda çalıştırıldı
  • LoopAgent ve tool_context.actions.escalate = True kullanarak otomatik bir yapıcı-kontrolör doğrulama döngüsü uygulandı.

Sonraki adımlar