Membuat Agen AI dengan ADK: Mengorkestrasi Alur Kerja Agen

1. Ringkasan

Memenuhi permintaan perjalanan dengan banyak batasan (seperti merancang itinerari Kyoto sehari penuh dengan anggaran di bawah $100 yang berfokus pada kuil bersejarah dan masakan lokal tanpa galeri seni modern) memerlukan ekstraksi batasan, riset tempat wisata dan tempat makan secara bersamaan, penyusunan jadwal terperinci, dan audit rencana akhir. Mengandalkan satu agen monolitik dengan banyak alat dapat melewatkan langkah-langkah verifikasi atau melanggar pengecualian, sehingga orkestrasi mengoordinasikan sub-agen khusus melalui pengontrol alur kerja deterministik.

Di bagian ketiga dari seri Membangun Agen AI dengan ADK ini, Anda akan membangun perencana perjalanan multi-agen mandiri di Agent Platform menggunakan pengontrol alur kerja Agent Development Kit (ADK) 2 (SequentialAgent, ParallelAgent, dan LoopAgent). Melalui tiga tahap progresif (tanpa memerlukan penyiapan ruang kerja Bagian 1 atau Bagian 2), Anda akan mengoordinasikan enam agen spesialis yang didukung oleh gemini-3.8-flash dengan status sesi bersama (output_key), eksekusi google_search serentak, dan loop penyempurnaan pembuat-pemeriksa yang berulang.

Prasyarat

Yang Anda pelajari

  • Cara membuat scaffold project ADK 2 multi-agen dari awal
  • Cara mendesain tim agen khusus yang berbagi status sesi menggunakan output_key
  • Cara menggunakan SequentialAgent untuk menjalankan sub-agen dalam pipeline langkah demi langkah yang deterministik
  • Cara menggunakan ParallelAgent untuk menjalankan agen riset independen secara serentak untuk latensi yang lebih rendah
  • Cara menggunakan eskalasi LoopAgent dan ToolContext untuk menerapkan loop penyempurnaan pembuat-pemeriksa yang berulang
  • Cara menggabungkan pola berurutan, paralel, dan loop ke dalam alur kerja multi-agen hierarkis

Yang Anda perlukan

  • Akun Google (gunakan akun @gmail.com pribadi jika mengklaim poin workshop)
  • Link kredit workshop dari instruktur Anda (ditambah kamera ponsel untuk memindai kode QR) atau akun Penagihan Cloud yang aktif
  • Google Chrome (jendela Samaran direkomendasikan untuk menghindari pencampuran akun pribadi dan kantor)

2. Klaim kredit Google Cloud (Opsional)

Jika Anda menghadiri workshop dengan link kredit acara, klaim kredit Google Developer Program Anda untuk menyediakan akun penagihan tanpa kartu kredit.

Klaim kredit acara Anda

  1. Buka link kredit workshop di jendela Samaran dan login dengan akun @gmail.com Anda.
  2. Di Claim Your Benefit, klik Claim Credit:

Kartu Klaim Manfaat Anda di Google Builders Hub yang menampilkan tombol Klaim Kredit

  1. Jika diminta untuk membuat profil Google Developer Program, lengkapi formulir.
  2. Saat Scan to Verify You're Human muncul, pindai kode QR dengan ponsel Anda dan selesaikan verifikasi (muat ulang dan klik Claim Credit lagi jika kode QR tidak muncul):

Dialog kode QR Pindai untuk Memverifikasi bahwa Anda Adalah Orang Sungguhan di Google Developer Program

  1. Pastikan pesan Successfully claimed your event credit! muncul, lalu klik Open Billing Account:

Google Builders Hub menampilkan pesan Berhasil mengklaim kredit acara Anda dan tombol Buka Akun Penagihan

🔍 Periksa hasil kerja Anda

Penyiapan akun penagihan memerlukan waktu hingga 3 menit:

  1. Buka Penagihan Google Cloud (atau salin URL ke jendela Samaran Anda) dan pilih Akun penagihan Anda:
https://console.cloud.google.com/billing
  1. Muat ulang hingga akun GDP Credit Anda menampilkan status Active:

Pengelolaan akun Penagihan Google Cloud yang menampilkan akun penagihan Kredit GDP yang aktif

3. Membuat project Google Cloud (Opsional)

Buat project Google Cloud khusus agar semua resource dari codelab ini tetap terisolasi dan mudah dibersihkan.

  1. Buka Create a Project (atau salin URL ke jendela Samaran):
https://console.cloud.google.com/projectcreate
  1. Masukkan detail project Anda:
    • Nama project: Misalnya, google-cloud-workshop
    • Billing account (jika ditampilkan): Pilih GDP Credit (atau akun penagihan aktif Anda)
    • Resource induk: Tidak ada organisasi (atau organisasi Anda jika diperlukan)
  2. Catat Project ID yang dihasilkan di bawah nama project, lalu klik Create:

Layar Create a Google Cloud Project yang menampilkan Project name, Project ID, Parent resource, dan tombol Create

🔍 Periksa hasil kerja Anda

Klik Notifications di toolbar kanan atas, lalu klik Select Project setelah pembuatan project selesai:

Menu Notifications di Konsol Google Cloud yang menampilkan link Create Project dan Select Project

4. Menyiapkan lingkungan Anda

Konfigurasikan Google Cloud Shell, aktifkan Agent Platform API, dan buat lingkungan virtual Python 3.12 yang terisolasi dengan uv.

Mengonfigurasi Cloud Shell

  1. Klik Activate Cloud Shell (>_) di toolbar Konsol Google Cloud, atau buka Google Cloud Shell secara langsung (atau salin URL ke jendela Samaran Anda):
https://shell.cloud.google.com/?show=ide,terminal

Tombol Activate Cloud Shell di toolbar Konsol Google Cloud

  1. Klik Authorize jika diminta:

Dialog Authorize Cloud Shell

  1. Pilih Project ID Google Cloud yang aktif dari menu bernomor di terminal Anda:
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

Anda akan melihat output yang mirip dengan (project yang tidak diberi tag juga mencetak baris informasi [environment: untagged]):

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

Pastikan Project ID yang Anda pilih muncul ditandai dengan warna kuning di prompt Cloud Shell:

Terminal Cloud Shell yang menampilkan Project ID yang dipilih dan ditandai dengan warna kuning

Aktifkan API yang diperlukan

Aktifkan Agent Platform API agar agen ADK Anda dapat memanggil model Gemini:

gcloud services enable aiplatform.googleapis.com

Anda akan melihat output yang mirip dengan:

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

Membuat lingkungan virtual Python dan menginstal ADK

Buat ruang kerja ~/adk-agents dan aktifkan lingkungan virtual Python 3.12:

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

Pastikan awalan (.venv) muncul di awal prompt terminal Anda:

Terminal Cloud Shell yang menampilkan awalan .venv di lingkungan virtual Python yang aktif

Instal ADK 2 di dalam lingkungan virtual yang aktif:

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

🔍 Periksa hasil kerja Anda

Verifikasi versi adk CLI yang diinstal:

adk --version

Anda akan melihat output yang mirip dengan:

adk, version 2.14.0

5. Membuat scaffold agen perencana perjalanan

Setelah lingkungan Anda siap, gunakan perintah adk create bawaan ADK untuk membuat file awal untuk paket agen travel_planner Anda.

Membuat paket awal

Jalankan adk create dari direktori ~/adk-agents Anda:

cd ~/adk-agents
adk create travel_planner

Saat diminta di terminal, pilih opsi konfigurasi berikut (jika diminta dengan Enable telemetry? [Y/n]: pada operasi pertama, tekan Enter atau ketik n dan tekan Enter):

  1. Choose a model for the root agent: Ketik 2 untuk memilih gemini-3.8-flash (opsi 1 memilih gemini-3.5-flash), lalu tekan Enter.
  2. Pilih backend: Ketik 2 untuk memilih backend Agent Platform Google Cloud (opsi 2 di menu CLI di bawah) dan tekan Enter.
  3. Enter Google Cloud project ID: Konfirmasi Project ID Anda yang ditampilkan dalam tanda kurung dengan menekan Enter.
  4. Enter Google Cloud region: Ketik global, lalu tekan Enter.

adk create menulis GOOGLE_GENAI_USE_ENTERPRISE=1, project ID Anda, dan GOOGLE_CLOUD_LOCATION=global ke dalam travel_planner/.env, sehingga kredensial Anda tetap dikonfigurasi saat Anda mengupdate agent.py nanti.

🔍 Periksa hasil kerja Anda

Anda akan melihat output yang mirip dengan:

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

Buka folder saat ini di editor kode Cloud Shell agar Anda dapat memeriksa dan mengedit file secara berdampingan dengan terminal:

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

Menguji agen tunggal default

Sebelum membangun alur kerja multi-agen, luncurkan UI Pengembangan ADK untuk mengamati cara agen tunggal default merespons kueri perencanaan perjalanan yang luas:

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

Buka UI Pengembangan di browser Anda menggunakan Pratinjau Web Cloud Shell:

  1. Klik ikon Web Preview di toolbar kanan atas Cloud Shell.
  2. Pilih Change Port, masukkan 8000, lalu klik Change and Preview.

Dialog konfigurasi port Pratinjau Web Cloud Shell ditetapkan ke 8000

Setelah UI Web ADK dimuat, kirim salam seperti "hello, what can you do?" atau "Help me plan a trip to Japan":

UI Web Pengembangan ADK yang menampilkan percakapan agen tunggal dasar

Perhatikan bahwa root_agent tunggal menjawab langsung dalam satu kali proses tanpa ekstraksi preferensi terstruktur, riset web langsung, atau verifikasi anggaran.

Setelah selesai menguji, tekan Ctrl + C di terminal Cloud Shell untuk menghentikan server adk web dan kembali ke command prompt.

6. Membangun alur kerja SequentialAgent

Sekarang, Anda akan membangun pola orkestrasi pertama: alur kerja linear yang didukung oleh SequentialAgent. Dalam pipeline berurutan, sub-agen dijalankan dalam urutan yang ketat. Pakar pertama mengekstrak parameter terstruktur dan menyimpannya ke status sesi bersama menggunakan output_key="user_preferences", dan pakar kedua membaca {user_preferences} dari status bersama untuk menyusun draf itinerari.

Diagram arsitektur yang menunjukkan root_agent mendelegasikan ke master_travel_agent (SequentialAgent), yang menjalankan user_profiler_agent diikuti oleh itinerary_synthesizer_agent melalui status sesi bersama

Membuat spesialis awal (specialists.py)

Buka file baru bernama specialists.py di dalam travel_planner/:

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

Tempelkan kode berikut ke dalam travel_planner/specialists.py untuk menentukan user_profiler_agent dan itinerary_synthesizer_agent (mengimpor ToolContext dan google_search di awal untuk langkah berikutnya):

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

Menghubungkan pipeline berurutan (workflows.py)

Buat file baru bernama workflows.py di dalam travel_planner/ untuk mengorkestrasi spesialis:

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

Tambahkan definisi SequentialAgent berikut ke travel_planner/workflows.py:

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

Menghubungkan alur kerja ke root_agent (agent.py)

Sekarang daftarkan master_travel_agent sebagai sub-agen root_agent. Buka travel_planner/agent.py:

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

Ganti konten travel_planner/agent.py dengan kode berikut:

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

🔍 Periksa hasil kerja Anda

Mulai UI Web ADK dari terminal Anda:

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

Buka Web Preview di port 8000 dan masukkan perintah:

Help me plan a trip to Kyoto

Anda akan melihat output yang mirip dengan alur eksekusi berikut di tampilan Events:

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

UI Web ADK 2.14.0 yang menampilkan grafik eksekusi dari root_agent melalui master_travel_agent ke user_profiler_agent dan itinerary_synthesizer_agent bersama dengan itinerari Kyoto yang dihasilkan

Klik badge peristiwa apa pun (atau chip State: final_itinerary) dan beralihlah ke tab State di panel inspector kiri untuk mengonfirmasi bahwa user_preferences dan final_itinerary diisi dalam status sesi.

Setelah Anda selesai memeriksa trace, tekan Ctrl + C di terminal untuk menghentikan adk web.

7. Menjalankan riset dengan ParallelAgent

Meskipun alur kerja berurutan memisahkan ekstraksi preferensi dari penyusunan draf itinerari dengan jelas, rekomendasinya masih sepenuhnya mengandalkan pengetahuan pelatihan statis model. Anda dapat mendasarkan itinerari pada data web langsung dengan menambahkan dua peneliti khusus yang didukung oleh alat google_search bawaan:

  • activity_finder_agent: Menemukan 3 tempat wisata spesifik yang sesuai dengan tujuan dan minat pengguna, beserta perkiraan harga tiket.
  • restaurant_finder_agent: Menemukan 3 restoran lokal dengan rating tinggi dan perkiraan biaya per orang.

Karena riset tempat wisata dan riset restoran tidak saling bergantung, menjalankannya satu per satu akan membuang-buang waktu. Sebagai gantinya, Anda akan menggabungkan kedua peneliti di dalam ParallelAgent (parallel_research_agent) sehingga ADK menjalankan kedua alur kerja Google Penelusuran secara serentak dan mengisi {activity_recommendations?} serta {restaurant_recommendations?} sebelum menyerahkan ke itinerary_synthesizer_agent.

Diagram arsitektur yang menunjukkan master_travel_agent menjalankan user_profiler_agent di Tahap 1, parallel_research_agent (ParallelAgent dengan activity_finder_agent dan restaurant_finder_agent) di Tahap 2, dan itinerary_synthesizer_agent di Tahap 3

Tambahkan spesialis riset paralel ke specialists.py

Buka travel_planner/specialists.py:

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

Tambahkan dua pakar Google Penelusuran berikut ke bagian bawah travel_planner/specialists.py (tepat di bawah itinerary_synthesizer_agent):

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

Memasukkan ParallelAgent ke dalam workflows.py

Buka travel_planner/workflows.py:

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

Perbarui travel_planner/workflows.py untuk menentukan parallel_research_agent menggunakan ParallelAgent dan tempatkan di antara user_profiler_agent dan itinerary_synthesizer_agent:

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

🔍 Periksa hasil kerja Anda

Luncurkan adk web lagi untuk menguji pipeline riset paralel:

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

Di UI Web Preview, kirim perintah:

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

Anda akan melihat output yang mirip dengan urutan berikut dalam tampilan Events:

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. Tampilan trace: Klik Traces di bagian atas panel percakapan (di samping Events) dan periksa giliran Anda. Anda akan melihat rentang linimasa yang tumpang-tindih untuk activity_finder_agent dan restaurant_finder_agent di bagian parallel_research_agent, yang mengurangi total latensi riset web hampir setengahnya dibandingkan dengan menjalankannya secara berurutan.
  2. Tab State: Klik tab State di panel inspector kiri untuk memeriksa kamus sesi live (user_preferences, activity_recommendations, restaurant_recommendations, dan final_itinerary).

Setelah selesai menguji, tekan Ctrl + C di terminal Anda untuk menghentikan adk web.

8. Menyempurnakan draf dengan LoopAgent

Meskipun dengan hasil penelusuran langsung, draf awal yang dihasilkan oleh itinerary_synthesizer_agent mungkin melebihi total anggaran pengguna atau secara tidak sengaja menyertakan kategori yang dikecualikan (seperti galeri seni modern padahal pengguna tidak memintanya).

Untuk menjamin kepatuhan terhadap batasan, Anda akan menambahkan loop penyempurnaan maker-checker di akhir pipeline menggunakan LoopAgent:

  1. itinerary_critic_agent (Pemeriksa): Mengaudit {final_itinerary} terhadap {user_preferences}. Agen ini menjumlahkan estimasi biaya, memeriksa setiap batasan negatif, dan menulis petunjuk revisi spesifik ke critique_feedback atau merespons dengan frasa persis "APPROVED".
  2. itinerary_refiner_agent (Pembuat/Pengguna yang Keluar): Membaca {critique_feedback}. Jika kritik sama dengan "APPROVED", model akan memanggil alat exit_loop (tool_context.actions.escalate = True) untuk segera keluar dari LoopAgent. Jika tidak, Gemini akan merevisi {final_itinerary} untuk memperbaiki masalah yang ditandai dan menimpa final_itinerary untuk tahap berikutnya.

Diagram arsitektur yang menunjukkan master_travel_agent dengan refinement_loop_agent (LoopAgent) Tahap 4 yang berputar antara itinerary_critic_agent dan itinerary_refiner_agent hingga exit_loop dipanggil

Menambahkan exit_loop, Critic, dan Refiner ke specialists.py

Buka travel_planner/specialists.py:

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

Tambahkan alat exit_loop (ToolContext), itinerary_critic_agent, dan itinerary_refiner_agent ke bagian bawah travel_planner/specialists.py:

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

Tambahkan LoopAgent ke workflows.py

Buka travel_planner/workflows.py:

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

Perbarui travel_planner/workflows.py untuk menggabungkan itinerary_critic_agent dan itinerary_refiner_agent dalam LoopAgent (max_iterations=3) dan tambahkan sebagai tahap keempat master_travel_agent:

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

🔍 Periksa hasil kerja Anda

Mulai adk web untuk menguji alur kerja multi-agen yang lengkap:

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

Buka UI Pratinjau Web di port 8000, mulai New Session, dan uji sistem lengkap dengan perintah multi-batasan Kyoto ini:

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.

Anda akan melihat output yang mirip dengan urutan eksekusi berikut di tampilan Events dan log terminal:

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. Tampilan peristiwa: Klik chip peristiwa apa pun dari itinerary_critic_agent atau itinerary_refiner_agent untuk memeriksa payload-nya di tab Info sebelah kiri. Saat itinerary_refiner_agent memanggil exit_loop, periksa peristiwa untuk melihat actions.escalate: true - sinyal yang memberi tahu LoopAgent untuk berhenti melakukan iterasi sebelum mencapai max_iterations=3.
  2. Tab State: Klik tab State untuk melihat state['critique_feedback'] dan state['final_itinerary'] diperbarui di seluruh penerusan. Jika draf awal melebihi $100 USD, critique_feedback akan menyimpan petunjuk revisi auditor pada tahap 1 sebelum final_itinerary diperbarui dengan alternatif yang lebih murah dan critique_feedback berubah menjadi "APPROVED" pada tahap 2.

Setelah selesai menguji, tekan Ctrl + C di terminal Anda untuk menghentikan adk web.

9. Pembersihan

Menghapus file project lokal

Untuk menghapus direktori project dan lingkungan virtual adk-agents dari folder beranda Cloud Shell, jalankan:

cd ~
rm -rf ~/adk-agents

Menonaktifkan Agent Platform API

Jika Anda tidak lagi memerlukan Agent Platform API diaktifkan di project Anda, nonaktifkan dengan gcloud:

gcloud services disable aiplatform.googleapis.com --quiet

Menghapus seluruh project Google Cloud (Opsional)

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

🔍 Periksa hasil kerja Anda

Konfirmasi bahwa ~/adk-agents telah dihapus:

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

Anda akan melihat output yang mirip dengan:

Workspace ~/adk-agents removed

10. Selamat

Selamat! Anda telah membangun sistem multi-agen hierarkis dengan Google Agent Development Kit (ADK) yang mengoordinasikan tim yang terdiri dari enam agen khusus di seluruh alur kerja loop berurutan, paralel, dan iteratif.

Yang Anda capai

  • Komunikasi antar-agen yang terstruktur melalui status sesi bersama (injeksi template output_key dan {state_variable})
  • Membangun pipeline langkah demi langkah yang deterministik menggunakan SequentialAgent
  • Menjalankan agen riset Google Penelusuran independen secara serentak menggunakan ParallelAgent
  • Menerapkan loop verifikasi pembuat-pemeriksa otomatis menggunakan LoopAgent dan tool_context.actions.escalate = True

Langkah berikutnya