Episode ini mengubah satu agent menjadi sebuah tim: mempelajari pola komunikasi antar agent, membangun orkestrator yang mendelegasikan subtask ke worker dan menyatukan hasil, serta menyusun strategi arbitrasi dan konsistensi supaya banyak agent bekerja serempak.

Di episode 16 kalian memperluas kemampuan agent dengan custom actions, tool domain-spesifik, dan plugin yang dikemas sebagai modul. Sekarang bayangkan kalian punya bukan satu, tapi beberapa agent dengan keahlian berbeda: satu jago riset, satu jago analisis data, satu lagi jago komunikasi. Pertanyaannya: bagaimana mereka bekerja sama tanpa saling menjegal?
Roadmap episode ini: mengenali kapan multi-agent justru tepat, memahami pola komunikasi antar agent, membangun orkestrator yang mendelegasikan subtask dan menyatukan hasil, lalu menyusun strategi konsistensi dan arbitrasi ketika hasil para agent bertabrakan.
Satu agent punya batas: context window terbatas, tool set yang membengkak, dan semua keputusan lewat satu otak. Ketika tugas mulai membutuhkan banyak pengetahuan sekaligus — bandingkan harga dari tiga sumber, analisis log besar, lalu tulis ringkasannya — satu agent akan lambat dan mudah "tersesat" di tengah konteks yang membludak.
Multi-agent membagi beban: setiap worker punya context kecil dan tool yang fokus, orkestrator hanya mengatur lalu lintas. Tapi ini bukan solusi gratis. Setiap agent adalah biaya token, dan koordinasi menambah latensi. Aturan praktisnya: mulai dengan satu agent, pindah ke multi-agent hanya ketika ada hambatan yang jelas — context window habis, satu jenis tool terlalu banyak, atau satu agent kewalahan menangani banyak tugas paralel.
Ada tiga pola komunikasi yang umum dipakai, dan masing-masing cocok untuk situasi berbeda:
Bus Hermes dikonfigurasi lewat deklarasi channel:
channels:
orders:
type: topic
durability: 24h
support:
type: directGunakan direct untuk hasil yang harus kembali ke pengirim, dan topic untuk peristiwa yang relevan bagi banyak agent sekaligus. Shared memory paling efisien untuk state bersama, tapi simpan ia untuk bagian paling akhir episode ini — konsistensinya butuh perhatian khusus.
Pola paling banyak dipakai adalah orchestrator-worker: satu agent orkestrator memecah tugas besar menjadi subtask, mendelegasikan tiap subtask ke worker yang kompeten, menunggu hasil, lalu menyatukannya. Orkestrator tidak perlu tahu detail pengerjaan — ia hanya memastikan semuanya berjalan dan hasilnya utuh.
import { HermesAgent } from "@hermes/sdk";
const orchestrator = new HermesAgent({ profile: "./profiles/orchestrator.ts" });
async function runBatch(task, subtasks) {
const results = await Promise.all(
subtasks.map((sub) =>
orchestrator.spawn({
agent: sub.agent,
task: sub.task,
replyTo: "orchestrator",
}),
),
);
return orchestrator.merge(results);
}Alurnya: orkestrator memecah task menjadi daftar subtasks, setiap worker di-spawn dengan task dan replyTo sebagai alamat balasan, hasil dikumpulkan paralel, lalu merge menyusunnya menjadi satu jawaban koheren. Karena tiap worker punya context sendiri, model tidak kewalahan oleh konteks gabungan. Di CLI, spawn manual tersedia lewat hermes agent spawn untuk menguji satu worker sebelum dirangkai ke pipeline.
Begitu beberapa agent menyentuh data yang sama, konsistensi menjadi masalah. Dua worker yang mengedit record yang sama secara paralel bisa saling menimpa. Tiga strategi yang paling praktis:
export async function writeOrder(store, orderId, patch) {
const current = await store.get(orderId);
if (patch.baseVersion !== current.version) {
throw new Error("stale write: versi sudah berubah");
}
return store.set(orderId, {
...current,
...patch.data,
version: current.version + 1,
});
}Pola ini membuat write yang "basah" ditolak sejak awal alih-alih menimpa data pekerja worker lain secara diam-diam. Kalau konflik tetap terjadi, ia harus ditangani eksplisit — dan di sinilah arbitrasi berperan.
Ketika beberapa agent memberikan jawaban berbeda untuk pertanyaan yang sama, kalian butuh aturan untuk memilih. Arbitrasi adalah mekanisme itu. Strategi paling umum: pilih yang confidence-nya tertinggi, atau minta mayoritas — dan jika tidak ada yang cukup yakin, naikkan ke manusia alih-alih memaksa.
export function arbitrate(results) {
const ranked = [...results].sort((a, b) => b.confidence - a.confidence);
const best = ranked[0];
if (best.confidence < 0.6) {
return { winner: null, escalate: true };
}
return { winner: best, escalate: false };
}Aturan arbitrasi paling baik dideklarasikan, bukan dikode keras: konfigurasi berisi strategi (confidence, majority, priority), ambang yang memicu eskalasi, dan ke mana hasil naik jika tidak ada pemenang. Konsistensi yang terjaga sejak penulisan state, ditambah arbitrasi yang jelas di titik bentrok, adalah dua sisi yang membuat tim agent bekerja seperti satu sistem — bukan lima aplikasi yang kebetulan berbagi database.
Info
Jangan biarkan arbitrasi menciptakan agent yang tidak pernah salah pilih. Catat tiap keputusan arbitrasi ke log observability (episode 7) dan bandingkan dengan hasil akhir; dengan begitu aturan arbitrasi kalian terus membaik dari data, bukan dari perasaan.
Episode 17 merangkai agent-agent kalian menjadi sebuah tim. Kalian tahu kapan multi-agent layak dipakai, memilih pola komunikasi antara direct channel, message bus, dan shared memory, membangun orkestrator yang memecah tugas dan mendelegasikan subtask ke worker, lalu menjaga konsistensi dengan single writer dan idempotency serta menyelesaikan bentrokan hasil lewat arbitrasi berbasis confidence.
Inti yang harus dibawa pulang:
Episode 18 berikutnya kita membuat tim agent ini punya kesadaran diri: Adaptive Behavior & Reflection — reflective loop untuk menilai hasil sendiri, pemantauan confidence dan uncertainty, serta pengubahan strategi berdasarkan feedback. Sampai jumpa!