Membangun Sistem Multiagen

1. Pengantar

Ringkasan

Di lab ini, Anda akan melampaui chatbot sederhana dan membangun sistem multi-agen terdistribusi.

Meskipun satu LLM dapat menjawab pertanyaan, kompleksitas dunia nyata sering kali memerlukan peran khusus. Anda tidak meminta engineer backend untuk mendesain UI, dan Anda tidak meminta desainer untuk mengoptimalkan kueri database. Demikian pula, kita dapat membuat agen AI khusus yang berfokus pada satu tugas dan berkoordinasi satu sama lain untuk memecahkan masalah yang kompleks.

Anda akan membangun Sistem Pembuatan Kursus yang terdiri dari:

  1. Agen Peneliti: Menggunakan google_search untuk menemukan informasi terbaru.
  2. Agen Penilaian: Mengkritik kualitas dan kelengkapan riset.
  3. Agen Pembuat Konten: Mengubah riset menjadi kursus terstruktur.
  4. Agen Pengelola: Mengelola alur kerja dan komunikasi antara spesialis ini.

Prasyarat

  • Pengetahuan Python dasar.
  • Pemahaman tentang Konsol Google Cloud.

Yang akan Anda lakukan

  • Tentukan agen yang menggunakan alat (researcher) yang dapat menelusuri web.
  • Terapkan output terstruktur dengan Pydantic untuk judge.
  • Hubungkan ke agen jarak jauh menggunakan protokol Agent-to-Agent (A2A).
  • Buat LoopAgent untuk membuat feedback loop antara peneliti dan juri.
  • Jalankan sistem terdistribusi secara lokal menggunakan ADK.
  • Deploy sistem multi-agen ke Google Cloud Run.

Prinsip Arsitektur & Orkestrasi

Sebelum menulis kode, mari kita pahami cara kerja agen ini bersama-sama. Kami sedang membangun Pipeline Pembuatan Kursus.

Desain Sistem

Diagram Arsitektur

Mengorkestrasi dengan Agen

Agen standar (seperti Peneliti) berfungsi. Agen Pengelola (seperti LoopAgent atau SequentialAgent) mengelola agen lain. Mereka tidak memiliki alatnya sendiri; "alat" mereka adalah pendelegasian.

  1. LoopAgent: Ini bertindak seperti loop while dalam kode. Agen ini menjalankan urutan agen berulang kali hingga suatu kondisi terpenuhi (atau iterasi maksimum tercapai). Kami menggunakannya untuk Loop Riset:
    • Peneliti menemukan info.
    • Juri mengkritiknya.
    • Jika Judge menampilkan "Fail", EscalationChecker akan memungkinkan loop berlanjut.
    • Jika Judge mengatakan "Pass", EscalationChecker akan menghentikan loop.
  2. SequentialAgent: Tindakan ini seperti eksekusi skrip standar. Agen ini menjalankan agen satu demi satu. Kita menggunakannya untuk Pipeline Tingkat Tinggi:
    • Pertama, jalankan Research Loop (hingga selesai dengan data yang baik).
    • Kemudian, jalankan Content Builder (untuk menulis kursus).

Dengan menggabungkan keduanya, kita membuat sistem yang andal yang dapat mengoreksi diri sendiri sebelum menghasilkan output akhir.

2. Penyiapan

Penyiapan Lingkungan

Buka Cloud Shell: Buka tab baru dan ketik shell.cloud.google.com

Mendapatkan Kode Awal

  1. Buat clone repositori awal ke direktori utama Anda:
    cd ~
    git clone https://github.com/amitkmaraj/prai-roadshow-lab-1-starter.git
    cd prai-roadshow-lab-1-starter
    
  2. Jalankan skrip init untuk mengaitkan kredit aktivasi dengan penagihan.
    chmod +x ./init.sh
    ./init.sh
    
  3. Buka folder ini di editor Anda.

Mengaktifkan API

Setelah memiliki project baru, jalankan perintah berikut untuk mengaktifkan layanan Google Cloud yang diperlukan:

gcloud services enable \
    run.googleapis.com \
    artifactregistry.googleapis.com \
    cloudbuild.googleapis.com \
    aiplatform.googleapis.com \
    compute.googleapis.com

Proses ini mungkin perlu waktu beberapa detik.

Instal Dependensi

Kita menggunakan uv untuk pengelolaan dependensi yang cepat.

  1. Instal dependensi project:
    # Ensure you have uv installed: pip install uv
    uv sync
    
  2. Tetapkan ID Project Google Cloud Anda.
    • Tips: Anda dapat menemukan Project ID di dasbor Konsol Cloud, atau dengan menjalankan gcloud config get-value project.
    export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project)
    
  3. Tetapkan variabel lingkungan yang tersisa:
    export GOOGLE_CLOUD_LOCATION=us-central1
    export GOOGLE_GENAI_USE_VERTEXAI=true
    
    Peringatan: Variabel lingkungan tidak dipertahankan di seluruh sesi terminal baru. Jika membuka tab terminal baru, Anda harus menjalankan kembali perintah ekspor ini.

3. 🕵️ Agen Peneliti

Agen Peneliti

Peneliti adalah seorang spesialis. Satu-satunya tugasnya adalah menemukan informasi. Untuk melakukannya, alat ini memerlukan akses ke alat: Google Penelusuran.

Mengapa harus memisahkan Peneliti?

Pelajari Lebih Dalam: Mengapa tidak hanya satu agen yang melakukan semuanya?

Agen kecil yang fokus lebih mudah dievaluasi dan di-debug. Jika risetnya buruk, Anda akan melakukan iterasi pada perintah Peneliti. Jika pemformatan kursus buruk, Anda dapat melakukan iterasi pada Pembuat Konten. Dalam perintah "lakukan semuanya" yang monolitik, memperbaiki satu hal sering kali merusak hal lain.

  1. Jika Anda bekerja di Cloud Shell, jalankan perintah berikut untuk membuka editor Cloud Shell:
    cloudshell workspace .
    
    Jika Anda bekerja di lingkungan lokal, buka IDE favorit Anda.
  2. Buka agents/researcher/agent.py.
  3. Anda akan melihat kerangka dengan TODO.
  4. Tambahkan kode berikut untuk menentukan agen researcher:
    # ... existing imports ...
    
    # Define the Researcher Agent
    researcher = Agent(
        name="researcher",
        model=MODEL,
        description="Gathers information on a topic using Google Search.",
        instruction="""
        You are an expert researcher. Your goal is to find comprehensive and accurate information on the user's topic.
        Use the `google_search` tool to find relevant information.
        Summarize your findings clearly.
        If you receive feedback that your research is insufficient, use the feedback to refine your next search.
        """,
        tools=[google_search],
    )
    
    root_agent = researcher
    

Konsep Utama: Penggunaan Alat

Perhatikan bahwa kita meneruskan tools=[google_search]. ADK menangani kompleksitas dalam mendeskripsikan alat ini ke LLM. Saat model memutuskan bahwa ia memerlukan informasi, model akan membuat panggilan alat terstruktur, ADK akan mengeksekusi fungsi Python google_search, dan mengirimkan hasilnya kembali ke model.

4. ⚖️ Agen Hakim

Agen Penilaian

Peneliti bekerja keras, tetapi LLM bisa jadi malas. Kami memerlukan Penilai untuk meninjau pekerjaan tersebut. Hakim menerima riset dan menampilkan penilaian Lulus/Tidak Lulus terstruktur.

Output Terstruktur

Pembahasan Mendalam: Untuk mengotomatiskan alur kerja, kita memerlukan output yang dapat diprediksi. Ulasan teks yang bertele-tele sulit diuraikan secara terprogram. Dengan menerapkan skema JSON (menggunakan Pydantic), kita memastikan bahwa Judge menampilkan boolean pass atau fail yang dapat diandalkan oleh kode kita.

  1. Buka agents/judge/agent.py.
  2. Tentukan skema JudgeFeedback dan agen judge.
    # 1. Define the Schema
    class JudgeFeedback(BaseModel):
        """Structured feedback from the Judge agent."""
        status: Literal["pass", "fail"] = Field(
            description="Whether the research is sufficient ('pass') or needs more work ('fail')."
        )
        feedback: str = Field(
            description="Detailed feedback on what is missing. If 'pass', a brief confirmation."
        )
    
    # 2. Define the Agent
    judge = Agent(
        name="judge",
        model=MODEL,
        description="Evaluates research findings for completeness and accuracy.",
        instruction="""
        You are a strict editor.
        Evaluate the 'research_findings' against the user's original request.
        If the findings are missing key info, return status='fail'.
        If they are comprehensive, return status='pass'.
        """,
        output_schema=JudgeFeedback,
        # Disallow delegation because it should only output the schema
        disallow_transfer_to_parent=True,
        disallow_transfer_to_peers=True,
    )
    
    root_agent = judge
    

Konsep Utama: Membatasi Perilaku Agen

Kami menetapkan disallow_transfer_to_parent=True dan disallow_transfer_to_peers=True. Hal ini memaksa Hakim untuk hanya menampilkan JudgeFeedback terstruktur. Agen ini tidak dapat memutuskan untuk "melakukan chat" dengan pengguna atau mendelegasikan tugas kepada agen lain. Hal ini menjadikannya komponen deterministik dalam alur logika kita.

5. 🧪 Pengujian secara Terpisah

Sebelum menghubungkannya, kita dapat memverifikasi bahwa setiap agen berfungsi. ADK memungkinkan Anda menjalankan agen satu per satu.

Konsep Utama: Runtime Interaktif

adk run meluncurkan lingkungan ringan tempat Anda menjadi "pengguna". Hal ini memungkinkan Anda menguji petunjuk dan penggunaan alat agen secara terpisah. Jika agen gagal di sini (misalnya, tidak dapat menggunakan Google Penelusuran), agen pasti akan gagal dalam orkestrasi.

  1. Jalankan Peneliti secara interaktif. Perhatikan bahwa kita mengarah ke direktori agen tertentu:
    # This runs the researcher agent in interactive mode
    uv run adk run agents/researcher
    
  2. Di perintah chat, ketik:
    Find the population of Tokyo in 2020
    
    Model harus menggunakan alat Google Penelusuran dan menampilkan jawabannya.Catatan: Jika Anda melihat error yang menunjukkan bahwa project, lokasi, dan penggunaan Vertex belum ditetapkan, pastikan project ID Anda telah ditetapkan dan jalankan perintah berikut:
    export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project)
    export GOOGLE_CLOUD_LOCATION=us-central1
    export GOOGLE_GENAI_USE_VERTEXAI=true
    
  3. Keluar dari percakapan (Ctrl+C).
  4. Jalankan Judge secara interaktif:
    uv run adk run agents/judge
    
  5. Di perintah chat, simulasikan input:
    Topic: Tokyo. Findings: Tokyo is a city.
    
    Hal ini akan menampilkan status='fail' karena temuan terlalu singkat.

6. ✍️ Agen Pembuat Konten

Pembuat Konten

Content Builder adalah penulis kreatif. Tim ini akan mengambil riset yang disetujui dan mengubahnya menjadi kursus.

  1. Buka agents/content_builder/agent.py.
  2. Tentukan agen content_builder.
    content_builder = Agent(
        name="content_builder",
        model=MODEL,
        description="Transforms research findings into a structured course.",
        instruction="""
        You are an expert course creator.
        Take the approved 'research_findings' and transform them into a well-structured, engaging course module.
    
        **Formatting Rules:**
        1. Start with a main title using a single `#` (H1).
        2. Use `##` (H2) for main section headings.
        3. Use bullet points and clear paragraphs.
        4. Maintain a professional but engaging tone.
    
        Ensure the content directly addresses the user's original request.
        """,
    )
    root_agent = content_builder
    

Konsep Utama: Penerapan Konteks

Anda mungkin bertanya: "Bagaimana Pembuat Konten mengetahui apa yang ditemukan Peneliti?" Di ADK, agen dalam pipeline berbagi session.state. Nanti, di Orchestrator, kita akan mengonfigurasi Peneliti dan Penilai untuk menyimpan outputnya ke status bersama ini. Perintah Pembuat Konten secara efektif memiliki akses ke histori ini.

7. 🎻 Orkestrator

Agen Orchestrator

Orchestrator adalah pengelola tim multi-agen kami. Tidak seperti agen spesialis (Peneliti, Penilai, Pembuat Konten) yang melakukan tugas tertentu, tugas Orchestrator adalah mengoordinasikan alur kerja dan memastikan informasi mengalir dengan benar di antara mereka.

🌐 Arsitektur: Agent-to-Agent (A2A)

Arsitektur A2A

Di lab ini, kita akan membangun sistem terdistribusi. Daripada menjalankan semua agen dalam satu proses Python, kita men-deploy-nya sebagai microservice independen. Hal ini memungkinkan setiap agen diskalakan secara terpisah dan gagal tanpa membuat seluruh sistem error.

Untuk mewujudkannya, kami menggunakan protokol Agent-to-Agent (A2A).

Protokol A2A

Pembahasan Mendalam: Dalam sistem produksi, agen berjalan di server yang berbeda (atau bahkan cloud yang berbeda). Protokol A2A menciptakan cara standar bagi agen untuk saling menemukan dan berkomunikasi melalui HTTP. RemoteA2aAgent adalah klien ADK untuk protokol ini.

  1. Buka agents/orchestrator/agent.py.
  2. Cari komentar # TODO: Define Remote Agents atau bagian untuk definisi agen jarak jauh.
  3. Tambahkan kode berikut untuk menentukan koneksi. Pastikan untuk menempatkan setelah impor dan sebelum definisi agen lainnya.
    # ... existing code ...
    
    # Connect to the Researcher (Localhost port 8001)
    researcher_url = os.environ.get("RESEARCHER_AGENT_CARD_URL", "http://localhost:8001/a2a/agent/.well-known/agent-card.json")
    researcher = RemoteA2aAgent(
        name="researcher",
        agent_card=researcher_url,
        description="Gathers information using Google Search.",
        # IMPORTANT: Save the output to state for the Judge to see
        after_agent_callback=create_save_output_callback("research_findings"),
        # IMPORTANT: Use authenticated client for communication
        httpx_client=create_authenticated_client(researcher_url)
    )
    
    # Connect to the Judge (Localhost port 8002)
    judge_url = os.environ.get("JUDGE_AGENT_CARD_URL", "http://localhost:8002/a2a/agent/.well-known/agent-card.json")
    judge = RemoteA2aAgent(
        name="judge",
        agent_card=judge_url,
        description="Evaluates research.",
        after_agent_callback=create_save_output_callback("judge_feedback"),
        httpx_client=create_authenticated_client(judge_url)
    )
    
    # Content Builder (Localhost port 8003)
    content_builder_url = os.environ.get("CONTENT_BUILDER_AGENT_CARD_URL", "http://localhost:8003/a2a/agent/.well-known/agent-card.json")
    content_builder = RemoteA2aAgent(
        name="content_builder",
        agent_card=content_builder_url,
        description="Builds the course.",
        httpx_client=create_authenticated_client(content_builder_url)
    )
    

8. 🛑 Pemeriksa Eskalasi

Loop memerlukan cara untuk berhenti. Jika Hakim mengatakan "Lulus", kita harus segera keluar dari loop dan beralih ke Pembuat Konten.

Logika Kustom dengan BaseAgent

Pembahasan Mendalam: Tidak semua agen menggunakan LLM. Terkadang Anda memerlukan logika Python sederhana. BaseAgent memungkinkan Anda menentukan agen yang hanya menjalankan kode. Dalam hal ini, kita memeriksa status sesi dan menggunakan EventActions(escalate=True) untuk memberi sinyal LoopAgent agar berhenti.

  1. Masih di agents/orchestrator/agent.py.
  2. Temukan placeholder EscalationChecker TODO.
  3. Ganti dengan implementasi berikut:
    class EscalationChecker(BaseAgent):
        """Checks the judge's feedback and escalates (breaks the loop) if it passed."""
    
        async def _run_async_impl(
            self, ctx: InvocationContext
        ) -> AsyncGenerator[Event, None]:
            # Retrieve the feedback saved by the Judge
            feedback = ctx.session.state.get("judge_feedback")
            print(f"[EscalationChecker] Feedback: {feedback}")
    
            # Check for 'pass' status
            is_pass = False
            if isinstance(feedback, dict) and feedback.get("status") == "pass":
                is_pass = True
            # Handle string fallback if JSON parsing failed
            elif isinstance(feedback, str) and '"status": "pass"' in feedback:
                is_pass = True
    
            if is_pass:
                # 'escalate=True' tells the parent LoopAgent to stop looping
                yield Event(author=self.name, actions=EventActions(escalate=True))
            else:
                # Continue the loop
                yield Event(author=self.name)
    
    escalation_checker = EscalationChecker(name="escalation_checker")
    

Konsep Utama: Alur Kontrol melalui Peristiwa

Agen tidak hanya berkomunikasi dengan teks, tetapi juga dengan Peristiwa. Dengan menghasilkan peristiwa dengan escalate=True, agen ini mengirimkan sinyal ke induknya (LoopAgent). LoopAgent diprogram untuk menangkap sinyal ini dan menghentikan loop.

9. 🔁 Siklus Riset

Loop Riset

Kita memerlukan loop umpan balik: Riset -> Menilai -> (Gagal) -> Riset -> ...

  1. Masih di agents/orchestrator/agent.py.
  2. Tambahkan definisi research_loop. Tempatkan setelah class EscalationChecker dan instance escalation_checker.
    research_loop = LoopAgent(
        name="research_loop",
        description="Iteratively researches and judges until quality standards are met.",
        sub_agents=[researcher, judge, escalation_checker],
        max_iterations=3,
    )
    

Konsep Utama: LoopAgent

LoopAgent berganti-ganti sub_agents secara berurutan.

  1. researcher: Menemukan data.
  2. judge: Mengevaluasi data.
  3. escalation_checker: Memutuskan apakah akan yield Event(escalate=True). Jika escalate=True terjadi, loop akan berhenti lebih awal. Jika tidak, proses akan dimulai ulang di peneliti (hingga max_iterations).

10. 🔗 Pipeline Akhir

Pipeline Akhir

Terakhir, gabungkan semuanya.

  1. Masih di agents/orchestrator/agent.py.
  2. Tentukan root_agent di bagian bawah file. Pastikan ini menggantikan placeholder root_agent = None yang ada.
    root_agent = SequentialAgent(
        name="course_creation_pipeline",
        description="A pipeline that researches a topic and then builds a course from it.",
        sub_agents=[research_loop, content_builder],
    )
    

Konsep Utama: Komposisi Hierarkis

Perhatikan bahwa research_loop itu sendiri adalah agen (LoopAgent). Kita memperlakukannya seperti sub-agen lainnya di SequentialAgent. Komposisi ini memungkinkan Anda membangun logika yang kompleks dengan menyusun pola sederhana (loop di dalam urutan, urutan di dalam perute, dll.).

11. 💻 Jalankan Secara Lokal

Sebelum menjalankan semuanya, mari kita lihat cara ADK menyimulasikan lingkungan terdistribusi secara lokal.

Pembahasan Mendalam: Cara Kerja Pengembangan Lokal

Dalam arsitektur microservice, setiap agen berjalan sebagai servernya sendiri. Saat men-deploy, Anda akan memiliki 4 layanan Cloud Run yang berbeda. Mensimulasikan hal ini secara lokal bisa menyulitkan jika Anda harus membuka 4 tab terminal dan menjalankan 4 perintah.

Skrip ini memulai proses uvicorn untuk Peneliti (port 8001), Penilai (8002), dan Pembuat Konten (8003). Aplikasi ini menetapkan variabel lingkungan seperti RESEARCHER_AGENT_CARD_URL dan meneruskannya ke Orchestrator (port 8004). Inilah cara kita akan mengonfigurasinya di cloud nanti.

Aplikasi Berjalan

  1. Jalankan skrip orkestrasi:
    ./run_local.sh
    
    Ini memulai 4 proses terpisah.
  2. Uji:
    • Jika menggunakan Cloud Shell: Klik tombol Web Preview (kanan atas terminal) -> Preview on port 8080 -> Change port ke 8000.
    • Jika dijalankan secara lokal: Buka http://localhost:8000 di browser Anda.
    • Perintah: "Buat kursus tentang sejarah kopi."
    • Amati: Orchestrator akan memanggil Peneliti. Outputnya diteruskan ke Hakim. Jika Hakim gagal, loop akan berlanjut.
    Pemecahan masalah:
    • "Internal Server Error" / Error Autentikasi: Jika Anda melihat error autentikasi (misalnya, terkait dengan google-auth), pastikan Anda telah menjalankan gcloud auth application-default login jika berjalan di mesin lokal. Di Cloud Shell, pastikan variabel lingkungan GOOGLE_CLOUD_PROJECT Anda disetel dengan benar.
    • Error Terminal: Jika perintah gagal di jendela terminal baru, jangan lupa untuk mengekspor ulang variabel lingkungan Anda (GOOGLE_CLOUD_PROJECT, dll.).
  3. Menguji Agen secara Terpisah: Meskipun sistem lengkap sedang berjalan, Anda dapat menguji agen tertentu dengan menargetkan port-nya secara langsung. Hal ini berguna untuk men-debug komponen tertentu tanpa memicu seluruh rantai.
    • Khusus Peneliti (Port 8001): http://localhost:8001
    • Judge Only (Port 8002): http://localhost:8002
    • Content Builder Only (Port 8003): http://localhost:8003
    • Orchestrator (Port 8004): http://localhost:8004 (Akses langsung ke logika Orchestrator)

12. 🚀 Deploy ke Cloud Run

Validasi terbaik adalah menjalankan di cloud. Kita akan men-deploy setiap agen sebagai layanan terpisah.

Memahami Konfigurasi Deployment

Saat men-deploy agen ke Cloud Run, kami meneruskan beberapa variabel lingkungan untuk mengonfigurasi perilaku dan konektivitasnya:

  • GOOGLE_CLOUD_PROJECT: Memastikan agen menggunakan project Google Cloud yang benar untuk panggilan Vertex AI dan logging.
  • GOOGLE_GENAI_USE_VERTEXAI: Memberi tahu framework agen (ADK) untuk menggunakan Vertex AI dalam inferensi model, bukan memanggil Gemini API secara langsung.
  • [AGENT]_AGENT_CARD_URL: Hal ini sangat penting untuk Orchestrator. Pernyataan ini memberi tahu Orchestrator tempat menemukan agen jarak jauh. Dengan menyetelnya ke URL Cloud Run yang di-deploy (khususnya jalur kartu agen), kita memungkinkan Orchestrator menemukan dan berkomunikasi dengan Peneliti, Penilai, dan Pembuat Konten melalui internet.
  1. Men-deploy Peneliti:
    gcloud run deploy researcher \
      --source agents/researcher/ \
      --region us-central1 \
      --allow-unauthenticated \
      --labels dev-tutorial=prod-ready-1 \
      --set-env-vars GOOGLE_CLOUD_PROJECT=$GOOGLE_CLOUD_PROJECT \
      --set-env-vars GOOGLE_GENAI_USE_VERTEXAI="true"
    
    Ambil URL:
    RESEARCHER_URL=$(gcloud run services describe researcher --region us-central1 --format='value(status.url)')
    echo $RESEARCHER_URL
    
  2. Men-deploy Judge:
    gcloud run deploy judge \
      --source agents/judge/ \
      --region us-central1 \
      --allow-unauthenticated \
      --labels dev-tutorial=prod-ready-1 \
      --set-env-vars GOOGLE_CLOUD_PROJECT=$GOOGLE_CLOUD_PROJECT \
      --set-env-vars GOOGLE_GENAI_USE_VERTEXAI="true"
    
    Ambil URL:
    JUDGE_URL=$(gcloud run services describe judge --region us-central1 --format='value(status.url)')
    echo $JUDGE_URL
    
  3. Deploy Content Builder:
    gcloud run deploy content-builder \
      --source agents/content_builder/ \
      --region us-central1 \
      --allow-unauthenticated \
      --labels dev-tutorial=prod-ready-1 \
      --set-env-vars GOOGLE_CLOUD_PROJECT=$GOOGLE_CLOUD_PROJECT \
      --set-env-vars GOOGLE_GENAI_USE_VERTEXAI="true"
    
    Ambil URL:
    CONTENT_BUILDER_URL=$(gcloud run services describe content-builder --region us-central1 --format='value(status.url)')
    echo $CONTENT_BUILDER_URL
    
  4. Deploy Orchestrator: Gunakan variabel lingkungan yang diambil untuk mengonfigurasi Orchestrator.
    gcloud run deploy orchestrator \
      --source agents/orchestrator/ \
      --region us-central1 \
      --allow-unauthenticated \
      --labels dev-tutorial=prod-ready-1 \
      --set-env-vars RESEARCHER_AGENT_CARD_URL=$RESEARCHER_URL/a2a/agent/.well-known/agent-card.json \
      --set-env-vars JUDGE_AGENT_CARD_URL=$JUDGE_URL/a2a/agent/.well-known/agent-card.json \
      --set-env-vars CONTENT_BUILDER_AGENT_CARD_URL=$CONTENT_BUILDER_URL/a2a/agent/.well-known/agent-card.json \
      --set-env-vars GOOGLE_CLOUD_PROJECT=$GOOGLE_CLOUD_PROJECT \
      --set-env-vars GOOGLE_GENAI_USE_VERTEXAI="true"
    
    Ambil URL:
    ORCHESTRATOR_URL=$(gcloud run services describe orchestrator --region us-central1 --format='value(status.url)')
    echo $ORCHESTRATOR_URL
    
  5. Deploy Frontend:
    gcloud run deploy course-creator \
        --source app \
        --region us-central1 \
        --allow-unauthenticated \
        --labels dev-tutorial=prod-ready-1 \
        --set-env-vars AGENT_SERVER_URL=$ORCHESTRATOR_URL \
        --set-env-vars GOOGLE_CLOUD_PROJECT=$GOOGLE_CLOUD_PROJECT
    
  6. Uji Deployment Jarak Jauh: Buka URL Orchestrator yang di-deploy. Sekarang, aplikasi ini berjalan sepenuhnya di cloud, memanfaatkan infrastruktur serverless Google untuk menskalakan agen Anda.Petunjuk: Anda akan menemukan semua layanan mikro dan URL-nya di antarmuka Cloud Run

13. Ringkasan

Selamat! Anda telah berhasil membangun dan men-deploy sistem multi-agen terdistribusi yang siap produksi.

Yang telah kami capai

  • Menguraikan Tugas yang Kompleks: Alih-alih menggunakan satu perintah besar, kami membagi tugas menjadi beberapa peran khusus (Peneliti, Penilai, Pembuat Konten).
  • Menerapkan Kontrol Kualitas: Kami menggunakan LoopAgent dan Judge terstruktur untuk memastikan hanya informasi berkualitas tinggi yang mencapai langkah terakhir.
  • Dibuat untuk Produksi: Dengan menggunakan protokol Agent-to-Agent (A2A) dan Cloud Run, kami membuat sistem di mana setiap agen adalah microservice yang independen dan dapat diskalakan. Cara ini jauh lebih andal daripada menjalankan semuanya dalam satu skrip Python.
  • Orkestrasi: Kami menggunakan SequentialAgent dan LoopAgent untuk menentukan pola alur kontrol yang jelas.

Langkah Berikutnya

Setelah memiliki dasar-dasarnya, Anda dapat memperluas sistem ini:

  • Menambahkan lebih banyak alat: Beri Peneliti akses ke dokumen atau API internal.
  • Meningkatkan Kualitas Penilaian: Tambahkan kriteria yang lebih spesifik atau bahkan langkah "Human in the Loop".
  • Ganti Model: Coba gunakan model yang berbeda untuk agen yang berbeda (misalnya, model yang lebih cepat untuk Penilai, model yang lebih kuat untuk Penulis Konten).

Sekarang Anda siap membangun alur kerja agentik yang kompleks dan andal di Google Cloud.