Linear atau grafik: cara mengatur banyak agen tanpa loop abadi

Satu agen dengan dua puluh tools gampang kacau. Begitu beberapa agen saling revisi, kamu butuh grafik yang boleh muter dan angka yang bikin dia berhenti.

Kasih satu agen dua puluh tools dan system prompt sepanjang novel, hasil pertamanya biasanya kelihatan meyakinkan. Yang bikin repot muncul belakangan: agen mulai salah pilih tool, lupa apa yang dia baca tiga langkah sebelumnya, lalu mengarang langkah yang nggak pernah ada di instruksi. Nggak ada error merah, cuma hasil yang makin lama makin ngawur.

Begitu tugasnya naik kelas (nulis kode backend, nyusun unit test, audit keamanan, benerin yang gagal kompilasi, minta persetujuan manusia sebelum deploy), beban segitu jelas kebablasan buat satu kepala. Yang wajar: pecah jadi beberapa agen dengan peran sempit. Ada Coder Agent, Reviewer Agent, Tester Agent, Deployment Agent. Prompt-nya pendek, tools-nya sedikit, tanggung jawabnya jelas.

Yang belum selesai justru pertanyaan sesudahnya: siapa yang ngatur giliran? Kalau semua agen dilepas ngobrol bebas, yang jadi pembatas cuma tagihan token yang kamu bayar. Kalau diatur rantai kaku, revisi jadi mustahil.

Poin Penting

  • Graf asiklik nggak punya tempat untuk revisi balik, jadi alur yang butuh putaran review harus pakai graf siklus dengan routing kondisional.
  • recursion_limit menghitung super-step, bukan jumlah putaran review, dan nilai bawaannya 10007 di LangGraph 1.2.16. Batas revisi yang kamu mau tetap harus dipasang sendiri di dalam state.
  • Checkpoint disimpan di batas super-step, sehingga node yang dilanjutkan jalan ulang dari awal fungsi dan side effect-nya wajib idempoten.
  • AutoGen dinyatakan diarsipkan per 16 Oktober 2026 tanpa perbaikan bug maupun keamanan; penerusnya Microsoft Agent Framework, yang workflow-nya fungsional maupun berbasis graf.

Rantai linear mentok di revisi pertama

Workflow engine generasi awal memakai model rantai: agen A bikin draf, agen B meninjau, agen C merilis. Apache Airflow termasuk kubu ini. Alurnya DAG, jadi boleh bercabang banyak, tapi nggak boleh muter. Selama semuanya maju ke depan, model begini emang bersih dan gampang dilacak.

Proses review di dunia nyata jarang sebegitu rapi. Reviewer menemukan celah, kode dikembalikan ke coder, coder memperbaiki, lalu balik lagi ke reviewer. Putaran kayak gini normal, biasanya dua sampai tiga kali sebelum kode dianggap bersih.

Di dalam DAG, putaran balik itu secara definisi nggak ada. Namanya aja asiklik. Kalau dipaksa pakai while di Python dengan state yang dioper-oper sebagai variabel biasa, tiga hal langsung hilang: state-nya gampang berubah tanpa jejak, riwayat siapa mengubah apa ikut lenyap, dan kalau worker-nya mati di tengah jalan, kita kehilangan titik untuk melanjutkan.

Grafik cuma butuh empat bagian

Paradigma yang sekarang dipakai LangGraph sebenarnya sederhana:

  • Nodes: unit kerja terisolasi. Bisa panggilan LLM dengan prompt khusus, bisa fungsi Python biasa.
  • Edges: jalur dari satu node ke node berikutnya.
  • Conditional edges: fungsi kecil yang membaca state dan memutuskan alurnya belok ke mana. Review APPROVED? Lurus ke deploy. Masih ada catatan? Balik ke coder.
  • Shared state: satu objek dengan skema ketat (biasanya TypedDict atau model Pydantic). Tiap node mengembalikan potongan yang dia ubah, lalu reducer menggabungkannya.

Empat bahan itu cukup buat kita menggambarkan alur yang muter, bercabang, dan berhenti sendiri.

Ping-pong yang nggak pernah berhenti

Skenario paling mahal: coder mengirim kode dengan bug, reviewer menolak, coder mengubah baris yang salah, reviewer menolak lagi. Putaran ini bisa jalan puluhan kali tanpa ada yang sadar, dan tagihannya baru kelihatan besok pagi 💸

Jadi gimana cara ngeremnya? Mitigasinya dua lapis. Lapis pertama di runtime: recursion_limit. Satu hal yang sering salah kutip di tutorial: angka ini menghitung super-step (tiap node yang jalan), bukan jumlah putaran review. Nilai bawaannya juga bukan 25 lagi. Angka bawaannya kok jadi 10007? Angka itu pindah tiga kali: 25 di 1.0.0, 10000 di 1.0.6 sampai 1.1.x, lalu 10007 sejak 1.2.0. Di LangGraph 1.2.16 yang kupakai di sini, DEFAULT_RECURSION_LIMIT isinya 10007, dan bisa ditimpa lewat variabel lingkungan LANGGRAPH_DEFAULT_RECURSION_LIMIT atau config waktu invoke.

Waktu dicoba pakai graf yang muter tanpa syarat berhenti, GraphRecursionError baru muncul setelah 10007 langkah. Graf kosong begini selesai dalam dua detik, tapi dua detik itu percuma kalau tiap langkahnya panggilan LLM. Jadi angka 25 yang dulu jadi bawaan sekarang harus kamu pasang sendiri. Itu memang yang kamu mau.

Lapis kedua di level desain: penghitung di dalam state, misalnya iterasi <= 3. Lewat dari itu, alurnya dialihkan ke node eskalasi untuk manusia. Ini nggak bisa diganti recursion_limit, karena angka itu cuma bilang "sudah terlalu banyak langkah", bukan "reviewnya gagal tiga kali, berhenti".

AutoGen punya bentuk pengaman yang mirip, cuma namanya lain. Group chat tanpa termination_condition memang jalan terus, dan dokumentasinya bilang begitu apa adanya. Yang biasa dipakai max_turns atau TextMentionTermination.

Konteks yang membengkak

Bahaya kedua kelihatan sepele nih: tiap agen menambahkan seluruh riwayat obrolan ke state. Setelah sepuluh putaran, context window-nya tuh penuh percakapan mentah yang udah nggak relevan, dan biaya tiap panggilan ikut naik terus.

Obatnya pruning di reducer: yang disimpan cuma artefak terakhir (file kode versi terbaru, ringkasan catatan review), bukan transkrip lengkap. Ini keputusan desain dari awal, bukan saklar yang bisa dinyalakan belakangan.

Checkpoint: kenapa agen bisa di-pause

Framework grafik modern menyimpan snapshot state tiap kali eksekusi pindah node. Snapshot itu diikat ke thread_id dan checkpoint_id di database persisten: PostgresSaver buat Postgres, RedisSaver buat Redis, InMemorySaver buat main-main di lokal.

Dari situ tiga hal jadi mungkin. Kalau container-nya restart di tengah kerjaan empat puluh menit, eksekusi lanjut dari checkpoint terakhir. Kalau mau minta persetujuan manusia sebelum node rilis, alurnya dibekukan lewat interrupt, state disimpan, dan grafnya nunggu sinyal. Buat debugging, kita bisa baca ulang state lama, menyuntingnya, lalu menjalankan ulang dari titik itu.

Satu detail yang jarang disebut: checkpoint disimpan di batas super-step, bukan di tengah fungsi. Konsekuensinya, kalau eksekusi berhenti lalu dilanjutkan, node yang kena jalan ulang dari awal fungsi. Jadi side effect-nya wajib idempoten. Kirim email dua kali, potong saldo dua kali, itu bukan teori, itu yang beneran kejadian kalau node-nya nggak disiapkan.

Kodenya, versi yang jalan sekarang

Sekarang kita lihat kodenya. Ini graf revisi dengan pengaman. Reviewer-nya sengaja pakai aturan tetap, bukan LLM, biar bisa diuji tanpa API key.

PYTHON
from typing import TypedDict, Literal
from langgraph.graph import StateGraph, START, END
from langgraph.checkpoint.memory import InMemorySaver

class TimState(TypedDict):
    tugas: str
    draf: str
    catatan_review: str
    iterasi: int

MAKS_REVISI = 3

def coder(state: TimState) -> dict:
    iterasi = state.get("iterasi", 0) + 1
    print(f"[coder] menulis draf ke-{iterasi}")
    return {"draf": f"def bayar(): return True  # versi {iterasi}", "iterasi": iterasi}

def reviewer(state: TimState) -> dict:
    lolos = state["iterasi"] >= 2   # di produksi ini panggilan LLM
    print(f"[reviewer] draf ke-{state['iterasi']} -> {'lolos' if lolos else 'ditolak'}")
    return {"catatan_review": "APPROVED" if lolos else "belum ada error handling"}

def deploy(state: TimState) -> dict:
    print("[deploy] disetujui, lanjut rilis")
    return {}

def eskalasi(state: TimState) -> dict:
    print("[eskalasi] batas revisi habis, lempar ke manusia")
    return {}

def arah_setelah_review(state: TimState) -> Literal["coder", "deploy", "eskalasi"]:
    if state["catatan_review"] == "APPROVED":
        return "deploy"
    if state["iterasi"] >= MAKS_REVISI:
        return "eskalasi"
    return "coder"

builder = StateGraph(TimState)
builder.add_node("coder", coder)
builder.add_node("reviewer", reviewer)
builder.add_node("deploy", deploy)
builder.add_node("eskalasi", eskalasi)

builder.add_edge(START, "coder")
builder.add_edge("coder", "reviewer")
builder.add_conditional_edges("reviewer", arah_setelah_review, ["coder", "deploy", "eskalasi"])
builder.add_edge("deploy", END)
builder.add_edge("eskalasi", END)

app = builder.compile(checkpointer=InMemorySaver())

config = {"configurable": {"thread_id": "tugas-1"}}
app.invoke({"tugas": "tulis endpoint pembayaran"}, config)
print("state akhir:", app.get_state(config).values)

Outputnya, dijalankan pakai LangGraph 1.2.16 dan Python 3.12:

TEXT
[coder] menulis draf ke-1
[reviewer] draf ke-1 -> ditolak
[coder] menulis draf ke-2
[reviewer] draf ke-2 -> lolos
[deploy] disetujui, lanjut rilis
state akhir: {'tugas': 'tulis endpoint pembayaran', 'draf': 'def bayar(): return True  # versi 2', 'catatan_review': 'APPROVED', 'iterasi': 2}

Kalau reviewer-nya kamu buat selalu menolak, putarannya berhenti di iterasi ketiga dan alurnya pindah ke node eskalasi. Itu inti pengamannya: grafnya tetap boleh muter, tapi ada angka yang bilang kapan harus berhenti.

Satu catatan biar nggak bingung waktu baca tutorial lama: MemorySaver masih bisa diimpor, tapi sekarang cuma alias dari InMemorySaver. Dua-duanya jalan, yang satunya ketinggalan zaman.

Terus AutoGen?

AutoGen sering disebut sebaris dengan LangGraph, padahal bentuknya beda. AutoGen lebih dekat ke percakapan terstruktur: beberapa agen dengan peran, satu termination condition yang menentukan kapan berhenti. Kamu nggak mendefinisikan grafnya sendiri.

Statusnya yang perlu kamu tahu: sejak 16 Oktober 2026 proyeknya menyatakan diri diarsipkan. Ini lebih tegas daripada sekadar berhenti dapat fitur baru, karena Microsoft menyatakan nggak menyediakan perbaikan bug, perbaikan keamanan, apalagi dukungan untuk proyek ini. Rilis terakhirnya, 0.7.5, masih bisa di-install dari PyPI, tapi jangan harap ada tambalan sesudahnya.

Penggantinya Microsoft Agent Framework, dibangun tim inti AutoGen dan Semantic Kernel. Bagian workflow-nya menyediakan dua gaya sekaligus, fungsional dan berbasis graf, dan per Oktober 2026 paket Python-nya sudah rilis stabil (agent-framework 1.22.0).

Satu catatan biar presisi: yang diarsipkan itu proyeknya, bukan repo GitHub-nya. Halamannya masih bisa dibuka dan masih bisa di-star sampai sekarang. Dan ini klaim yang paling cepat basi dari seluruh artikel ini, jadi cek tanggalnya sendiri sebelum mengutip.

Jadi linear atau grafik?

Kalau alurnya memang lurus dan nggak ada yang perlu dikembalikan, rantai linear cukup, dan grafik cuma nambah bagian yang harus dirawat. Grafik baru bernilai begitu ada revisi, percabangan, dan manusia yang harus menyetujui di tengah jalan.

Jadi, semua harus pindah ke graf? Nggak juga sih. Sistem multi-agen yang waras bukan berarti beberapa model dibiarkan ngobrol bebas. Yang bikin dia waras: peran yang sempit, state dengan skema, batas putaran yang eksplisit (kamu yang pilih angkanya), dan checkpoint yang bikin kerjanya bisa dilanjutkan kapan saja ⚙️

Kalau giliran agenmu mulai muter tanpa ujung, yang pertama dicek bukan modelnya, tapi apakah ada angka yang membatasi putarannya. Sisanya cuma soal rapi-rapi state dan sabar baca trace. Semoga tagihanmu nggak kaget di akhir bulan 😄

Biar makin jago ngoding.

Yuk gabung bareng temen-temen developer lainnya buat dapet update teknologi, tips, dan tutorial santai tiap minggu.

Biar Nggak Kudet

Update teknologi, tips ngoding, dan insight santai langsung ke email kamu tiap minggu.

Santai, anti spam. Bisa berhenti langganan kapan aja.

Baca Selanjutnya

Lihat semua

© 2026 Inva.dev.