Membangun Agen AI dengan ADK: Mengorkestrasi Alur Kerja Grafik

1. Ringkasan

Untuk memenuhi permintaan perjalanan dengan banyak batasan (seperti merencanakan perjalanan sehari seharga $100 di Kyoto dengan kuil bersejarah, ramen lokal, dan tanpa museum seni modern), model perlu mengekstrak preferensi terstruktur, meneliti tempat secara bersamaan, menyintesis draf terperinci, dan mengaudit total biaya sebelum merespons. Di ADK 1.x, mengorkestrasi tahap-tahap tersebut memerlukan penyusunan bertingkat wrapper SequentialAgent, ParallelAgent, dan LoopAgent, menyimpan setiap output perantara ke dalam status sesi, dan memanggil panggilan alat LLM tambahan hanya untuk keluar dari loop penyempurnaan.

Dalam codelab ini, Anda akan membangun perencana perjalanan multi-agen di Platform Agen menggunakan alur kerja grafik (Workflow) Agent Development Kit (ADK) 2. Melalui tiga tahap progresif, Anda akan menghubungkan node Agent spesialis (didukung oleh gemini-3.8-flash) dalam rantai edge berurutan (node_input), menyebarkan peneliti google_search serentak yang disinkronkan dengan JoinNode, dan menerapkan aturan anggaran dan pengecualian dengan router Python deterministik (Event(route=...)) yang melewati penyempurnaan setiap kali draf awal lulus audit.

Prasyarat

Yang Anda pelajari

  • Cara mendeklarasikan pipeline multi-agen di ADK 2 menggunakan tuple edge Workflow
  • Cara ADK 2 meneruskan output secara langsung di sepanjang edge sebagai node_input dan mengikat kunci status sesi sebagai parameter fungsi
  • Cara menyebarkan cabang riset serentak dan menggabungkan outputnya dengan JoinNode
  • Cara merutekan siklus pembuat-pemeriksa yang dibatasi secara deterministik di Python dengan Event(route=...)
  • Cara memeriksa grafik alur kerja yang dikompilasi, linimasa eksekusi paralel, dan delta status di UI Web ADK

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)
    • Parent resource: No organization (atau pilih 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-graph-agents dan aktifkan lingkungan virtual Python 3.12:

cd ~
mkdir -p adk-graph-agents && cd ~/adk-graph-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 perencana perjalanan

Buat paket travel_planner awal dengan adk create dan uji baseline agen tunggal default di adk web.

Membuat paket awal

Jalankan adk create dari ~/adk-graph-agents:

cd ~/adk-graph-agents
adk create travel_planner

Pilih opsi berikut saat diminta (jika diminta dengan Enable telemetry? [Y/n]: pada pengoperasian 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: Tekan Enter untuk menerima Project ID yang terdeteksi dalam tanda kurung.
  4. Enter Google Cloud region: Ketik global (untuk menggunakan endpoint Gemini global) dan 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 utuh saat Anda mengganti agent.py nanti.

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-graph-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 ~/adk-graph-agents di editor kode Cloud Shell:

which cloudshell >/dev/null 2>&1 && cloudshell workspace ~/adk-graph-agents || true

Aktifkan kembali lingkungan virtual Anda di terminal yang dimuat ulang:

cd ~/adk-graph-agents
source .venv/bin/activate

Menguji agen tunggal awal

Mulai UI Web ADK untuk mengamati cara satu agen awal yang tidak diorkestrasi menjawab perintah perjalanan:

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

Klik ikon Web Preview di toolbar Cloud Shell kanan atas, pilih Change Port, masukkan 8000, lalu klik Change and Preview:

Dialog konfigurasi port Pratinjau Web Cloud Shell ditetapkan ke 8000

🔍 Periksa hasil kerja Anda

Pilih travel_planner di dropdown kiri atas adk web dan kirim "Help me plan a trip to Japan":

UI Web Pengembangan ADK yang menampilkan percakapan agen tunggal dasar

Anda akan melihat balasan percakapan satu kali di panel chat (dengan satu pemanggilan root_agent di Events):

root_agent -> responds in one pass without structured preference extraction, live search, or budget verification

Tekan Ctrl + C di terminal Cloud Shell untuk menghentikan adk web sebelum mengedit file di langkah berikutnya.

6. Membangun alur kerja grafik linear

Bangun Workflow ADK 2 pertama Anda: rantai berurutan yang menghubungkan titik entri "START" yang dicadangkan ke user_profiler_agent dan itinerary_synthesizer_agent (node apa pun tanpa edge keluar bertindak sebagai node terminal). Setiap edge (a, b) secara otomatis menjalankan node Agent (alias untuk LlmAgent) dalam mode single_turn yang terisolasi dan mengirimkan output node a sebagai node_input (pesan pengguna yang masuk) ke node b, sementara {user_preferences} dalam string petunjuk menginterpolasi kunci status sesi yang cocok yang disimpan melalui output_key.

Diagram arsitektur yang menunjukkan travel_workflow (Workflow) yang menghubungkan START ke user_profiler_agent dan itinerary_synthesizer_agent

Membuat spesialis awal

Pastikan adk web dihentikan (Ctrl + C), lalu buka file baru bernama travel_planner/specialists.py:

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

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

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

MODEL = "gemini-3.8-flash"

# --- Specialist 1: The User Profiler ---
user_profiler_agent = Agent(
    model=MODEL,
    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",  # Saved for multi-hop constraints downstream
)

# --- Specialist 2: The Synthesizer ---
itinerary_synthesizer_agent = Agent(
    model=MODEL,
    name="itinerary_synthesizer_agent",
    description="Compiles preferences and research into a final Markdown itinerary.",
    instruction="""
        You are an elite Travel Concierge. Using the incoming input and
        User Preferences ({user_preferences}), write a Markdown itinerary
        with an itemized USD and local currency cost breakdown.
    """,
    output_key="final_itinerary",
)

Menentukan rantai edge berurutan

Buka file baru bernama travel_planner/workflows.py:

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

Tempelkan definisi Workflow berikut (tempat tuple yang berisi 3 node atau lebih dikompilasi menjadi rantai berurutan dari "START"):

from google.adk import Workflow
from .specialists import (
    itinerary_synthesizer_agent,
    user_profiler_agent,
)

# 1. SEQUENTIAL GRAPH: START -> user_profiler_agent -> itinerary_synthesizer_agent
travel_workflow = Workflow(
    name="travel_workflow",
    description="Orchestrates the end-to-end travel planning process as a graph workflow.",
    edges=[
        ("START", user_profiler_agent, itinerary_synthesizer_agent),
    ],
)

Mengekspos alur kerja sebagai root_agent

Buka travel_planner/agent.py:

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

Ganti seluruh konten travel_planner/agent.py dengan dua baris berikut:

from .workflows import travel_workflow

root_agent = travel_workflow

🔍 Periksa hasil kerja Anda

Mulai adk web dari ~/adk-graph-agents:

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

Buka Pratinjau Web di port 8000, klik + New Session, dan kirim:

Help me plan a trip to Kyoto

Di tampilan Events, Anda akan melihat urutan peristiwa yang mirip dengan:

1. user_profiler_agent -> outputs JSON {"destination": "Kyoto", "duration": "1 day", ...} and writes state["user_preferences"]
2. itinerary_synthesizer_agent -> receives preferences via node_input and outputs the Markdown itinerary

UI Web ADK 2.14.0 menampilkan eksekusi grafik START ke user_profiler_agent ke itinerary_synthesizer_agent dan itinerary Kyoto yang dihasilkan

Klik peristiwa apa pun di Events dan klik ikon Graph (account_tree di toolbar detail peristiwa) untuk memeriksa topologi START -> user_profiler_agent -> itinerary_synthesizer_agent yang dikompilasi, lalu periksa tab State untuk memverifikasi bahwa user_preferences dan final_itinerary diisi.

Tekan Ctrl + C di terminal Anda untuk menghentikan adk web sebelum melanjutkan.

7. Fan out dan join dengan JoinNode

Grounding itinerary dalam data web langsung dengan menambahkan dua spesialis google_search serentak (activity_finder_agent dan restaurant_finder_agent) dan menyinkronkannya dengan JoinNode:

  • Fan-out tuple: Menempatkan (activity_finder_agent, restaurant_finder_agent) di dalam edge tuple akan mengirimkan output user_profiler_agent sebagai node_input ke kedua peneliti secara bersamaan.
  • Fan-in barrier (JoinNode): Menempatkan JoinNode(name="research_join") tepat setelah tuple akan menunggu hingga setiap cabang yang masuk selesai dan meneruskan satu dict ({"activity_finder_agent": ..., "restaurant_finder_agent": ...}) yang digabungkan sebagai node_input ke itinerary_synthesizer_agent, bukan memicu sintesis dua kali.

Diagram arsitektur yang menunjukkan travel_workflow yang bercabang dari user_profiler_agent melalui node_input ke activity_finder_agent dan restaurant_finder_agent secara paralel, bergabung di research_join (JoinNode), dan meneruskan node_input (dict) ke itinerary_synthesizer_agent

Tambahkan pakar riset

Pastikan adk web dihentikan (Ctrl + C), lalu buka travel_planner/specialists.py:

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

Tambahkan activity_finder_agent dan restaurant_finder_agent ke bagian bawah travel_planner/specialists.py (keduanya tidak memerlukan output_key karena research_join meneruskan kedua output secara langsung melalui node_input):

# --- Specialist 3: The Activity Finder ---
activity_finder_agent = Agent(
    model=MODEL,
    name="activity_finder_agent",
    description="Finds 3 attractions matching the user's destination and interests.",
    instruction="""
        Using the travel preferences in the input, call 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],
)

# --- Specialist 4: The Restaurant Finder ---
restaurant_finder_agent = Agent(
    model=MODEL,
    name="restaurant_finder_agent",
    description="Finds 3 restaurants matching the destination and budget.",
    instruction="""
        Using the travel preferences in the input, call 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],
)

Menambahkan fan-out dan JoinNode ke workflows.py

Buka travel_planner/workflows.py:

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

Ganti seluruh konten travel_planner/workflows.py dengan fan-out dan grafik JoinNode:

from google.adk import Workflow
from google.adk.workflow import JoinNode
from .specialists import (
    activity_finder_agent,
    itinerary_synthesizer_agent,
    restaurant_finder_agent,
    user_profiler_agent,
)

research_join = JoinNode(name="research_join")

# 2. FAN-OUT / FAN-IN GRAPH: Profile -> (Activities || Restaurants) -> Join -> Synthesize
travel_workflow = Workflow(
    name="travel_workflow",
    description="Orchestrates the end-to-end travel planning process as a graph workflow.",
    edges=[
        (
            "START",
            user_profiler_agent,
            (activity_finder_agent, restaurant_finder_agent),
            research_join,
            itinerary_synthesizer_agent,
        ),
    ],
)

🔍 Periksa hasil kerja Anda

Mulai adk web untuk menguji penelusuran serentak dan sinkronisasi JoinNode:

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

Buka Pratinjau Web di port 8000, klik + New Session, dan kirim:

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

Di tampilan Events, Anda akan melihat urutan peristiwa yang mirip dengan:

1. user_profiler_agent -> emits JSON preferences via node_input
2. activity_finder_agent & restaurant_finder_agent -> invoke google_search concurrently
3. research_join -> merges both researcher outputs into one dict node_input
4. itinerary_synthesizer_agent -> drafts final_itinerary from the merged dict + {user_preferences}

Tekan Ctrl + C di terminal Anda untuk menghentikan adk web sebelum melanjutkan.

8. Siklus revisi rute

Terapkan batasan anggaran dan negatif dengan menambahkan itinerary_critic_agent, itinerary_refiner_agent, dan dua node fungsi Python deterministik (route_critique dan finalize_itinerary) yang menampilkan objek Event ADK:

  • route: Memilih kunci cabang bernama di edge dict ({"revise": ..., "approved": ...}) yang akan dijalankan berikutnya.
  • output: Meneruskan nilai atau string Python yang diketik di sepanjang edge sebagai node_input ke node berikutnya tanpa merender pesan chat.
  • message dan state: message memunculkan teks yang dapat dilihat pengguna dalam transkrip chat, sedangkan state meng-commit update nilai kunci (stateDelta) ke status sesi.

Diagram arsitektur yang menunjukkan travel_workflow dengan itinerary_critic_agent yang memberikan masukan ke route_critique, yang mengarahkan 'revise' ke itinerary_refiner_agent (melakukan loop kembali ke itinerary_critic_agent) atau 'approved' ke finalize_itinerary

Menambahkan spesialis kritik dan penyempurna

Pastikan adk web dihentikan (Ctrl + C), lalu buka travel_planner/specialists.py:

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

Tambahkan itinerary_critic_agent dan itinerary_refiner_agent ke bagian bawah travel_planner/specialists.py (penyaring tidak memerlukan alat google_search atau exit_loop karena menukar item yang sudah dikumpulkan di {final_itinerary} dan hanya berjalan saat route_critique memilih "revise"):

# --- Specialist 5: The Budget & Constraint Critic ---
itinerary_critic_agent = Agent(
    model=MODEL,
    name="itinerary_critic_agent",
    description="Audits the itinerary draft against budget and negative constraints.",
    instruction="""
        Audit the itinerary in the input 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.
    """,
)

# --- Specialist 6: The Itinerary Refiner ---
itinerary_refiner_agent = Agent(
    model=MODEL,
    name="itinerary_refiner_agent",
    description="Revises the itinerary draft using the critic's feedback.",
    instruction="""
        Revise Current Itinerary ({final_itinerary}) using the auditor critique in the input
        so all USD budget and exclusion rules in {user_preferences} pass.
        Output ONLY the updated Markdown itinerary.
    """,
    output_key="final_itinerary",
)

Tambahkan route_critique dan siklus

Buka travel_planner/workflows.py:

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

Ganti seluruh konten travel_planner/workflows.py dengan alur kerja grafik lengkap:

from google.adk import Event, Workflow
from google.adk.workflow import JoinNode
from .specialists import (
    activity_finder_agent, itinerary_critic_agent, itinerary_refiner_agent,
    itinerary_synthesizer_agent, restaurant_finder_agent, user_profiler_agent,
)

MAX_REVISIONS = 2
research_join = JoinNode(name="research_join")


def route_critique(node_input: str, revision_count: int = 0):
    """Routes to 'approved' when constraints pass, or 'revise' up to MAX_REVISIONS."""
    approved = node_input.strip().rstrip(".").upper() == "APPROVED"
    if approved or revision_count >= MAX_REVISIONS:
        return Event(route="approved", output=approved)
    return Event(
        route="revise", output=node_input, state={"revision_count": revision_count + 1}
    )


def finalize_itinerary(node_input: bool, final_itinerary: str, revision_count: int = 0):
    """Emits the verified itinerary and resets revision_count for the next turn."""
    status = (
        f"Itinerary approved after {revision_count} revision(s)."
        if node_input
        else f"Max revisions ({revision_count}) reached; returning best-effort draft."
    )
    return Event(
        message=f"{status}\n\n{final_itinerary}",
        output=final_itinerary,
        state={"revision_count": 0},
    )


travel_workflow = Workflow(
    name="travel_workflow",
    description="Orchestrates the end-to-end travel planning process as a graph workflow.",
    edges=[
        (
            "START",
            user_profiler_agent,
            (activity_finder_agent, restaurant_finder_agent),
            research_join,
            itinerary_synthesizer_agent,
            itinerary_critic_agent,
            route_critique,
        ),
        (route_critique, {"revise": itinerary_refiner_agent, "approved": finalize_itinerary}),
        (itinerary_refiner_agent, itinerary_critic_agent),
    ],
)

🔍 Periksa hasil kerja Anda

Pastikan travel_planner/workflows.py mengompilasi dengan baik dan mencetak tepi grafik terarah:

cd ~/adk-graph-agents && source .venv/bin/activate
python3 -c "from travel_planner.agent import root_agent; print('\n'.join(f'{e.from_node.name} -> {e.to_node.name} (route={e.route})' for e in root_agent.graph.edges))"

Anda akan melihat output yang mirip dengan:

__START__ -> user_profiler_agent (route=None)
user_profiler_agent -> activity_finder_agent (route=None)
user_profiler_agent -> restaurant_finder_agent (route=None)
activity_finder_agent -> research_join (route=None)
restaurant_finder_agent -> research_join (route=None)
research_join -> itinerary_synthesizer_agent (route=None)
itinerary_synthesizer_agent -> itinerary_critic_agent (route=None)
itinerary_critic_agent -> route_critique (route=None)
route_critique -> itinerary_refiner_agent (route=revise)
route_critique -> finalize_itinerary (route=approved)
itinerary_refiner_agent -> itinerary_critic_agent (route=None)

Selanjutnya, mulai adk web untuk menguji persetujuan langsung dan revisi yang dipicu anggaran:

adk web --allow_origins "*"

Buka Web Preview di port 8000, klik + New Session, dan kirim perintah Kyoto dengan beberapa batasan:

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.

Untuk melihat cara kerja loop route="revise", kirim perintah lanjutan dengan anggaran ketat sebesar $15:

Now design a full-day Kyoto itinerary with paid temple admissions, lunch, and dinner on a strict total budget of $15 USD.

Di tampilan Events, Anda akan melihat urutan eksekusi yang mirip dengan:

1. user_profiler_agent -> writes JSON constraints to state["user_preferences"]
2. (activity_finder_agent, restaurant_finder_agent) -> run google_search concurrently -> research_join
3. itinerary_synthesizer_agent -> writes initial draft to state["final_itinerary"]
4. itinerary_critic_agent -> outputs "APPROVED" (or revision instructions when over budget)
5. route_critique -> emits route="approved" (skipping refiner) or route="revise" -> itinerary_refiner_agent -> itinerary_critic_agent
6. finalize_itinerary -> emits "Itinerary approved after N revision(s)." (or max-revisions notice) and resets revision_count=0

Tekan Ctrl + C di terminal Anda untuk menghentikan adk web.

9. Pemecahan masalah

Dropdown agen kosong di adk web

  • Penyebab: adk web dimulai di dalam travel_planner/, bukan di direktori ~/adk-graph-agents induk, atau sesi Cloud Shell dimulai ulang.
  • Perbaikan: Tekan Ctrl + C, kembali ke direktori induk, dan mulai ulang dengan cd ~/adk-graph-agents && source .venv/bin/activate && adk web --allow_origins "*".

Error model 404 NOT_FOUND

  • Penyebab: Anda menekan Enter untuk menerima region us-central1 default selama adk create, bukan mengetik global.
  • Perbaikan: Buka ~/adk-graph-agents/travel_planner/.env dan pastikan GOOGLE_CLOUD_LOCATION=global ditetapkan.

ERROR: [Errno 98] address already in use pada port 8000

  • Penyebab: Server adk web sebelumnya masih berjalan di Cloud Shell.
  • Perbaikan: Tekan Ctrl + C di terminal aktif atau hentikan proses yang ada dengan pkill -f "adk web" sebelum memulai adk web lagi.

10. Pembersihan

Hapus ruang kerja lokal dan nonaktifkan API atau hapus project workshop khusus jika perlu.

Menghapus file project lokal

Hapus direktori ~/adk-graph-agents dan lingkungan virtual:

cd ~
rm -rf ~/adk-graph-agents

Menonaktifkan Agent Platform API (Opsional)

Nonaktifkan Agent Platform API jika Anda tidak lagi memerlukannya dalam project ini:

gcloud services disable aiplatform.googleapis.com --quiet

🔍 Periksa hasil kerja Anda

Konfirmasi bahwa ~/adk-graph-agents telah dihapus:

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

Anda akan melihat output yang mirip dengan:

Workspace ~/adk-graph-agents removed

11. Selamat

Anda telah membangun perencana perjalanan multi-agen menggunakan ADK 2 Workflow, yang menyatukan rantai berurutan, fan-out serentak google_search dengan JoinNode, dan siklus pembuat-pemeriksa bersyarat dalam satu grafik edge deklaratif.

Yang Anda capai

  • Mendeklarasikan pipeline multi-agen menggunakan ADK 2 Workflow(edges=[...])
  • Meneruskan data secara langsung antara node fungsi Agent, JoinNode, dan Python melalui node_input dan parameter yang terikat status, sekaligus menjaga status sesi tetap minimal
  • Menyebarkan cabang google_search serentak dan menyinkronkannya dengan JoinNode
  • Mengganti LoopAgent dan eskalasi loop berbasis alat dengan router Event(route=...) deterministik yang melewati panggilan LLM yang tidak perlu pada draf yang disetujui

Langkah berikutnya