Di balik trik sulap AI agent
Banyak orang membicarakan AI agent seolah-olah mereka adalah entitas otonom yang punya kesadaran sendiri di cloud. Tapi kalau kamu singkirkan library orkestrasi yang berat, framework multi-agent yang rumit, dan istilah marketing yang berlebihan, sebenarnya apa sih yang terjadi di balik layar?
Untuk membuktikannya, saya membangun mini-harness: coding agent otonom yang ditulis dari nol hanya dalam sekitar 180 baris TypeScript tanpa framework apa pun. Cuma pakai SDK resmi Anthropic, beberapa tool filesystem dan web sederhana, serta sebuah loop sederhana.
Membangunnya dari nol langsung menghilangkan rasa mistisnya. Agent itu bukan sihir; ia cuma pola arsitektur yang berdiri di atas beberapa prinsip yang mengejutkan simpel.
1. Memori itu cuma sebuah array
Ada miskonsepsi umum bahwa agent punya otak internal yang rumit atau state neural misterius selama session berjalan.
Kenyataannya, memori session itu hanyalah sebuah array di memori:
const history: MessageParam[] = []
Tiap prompt dari kamu, tiap jawaban dari model, dan tiap output dari tool langsung di-push ke satu array itu. Kapan pun agent perlu "berpikir", seluruh isi array tersebut dikirim ulang lewat HTTP ke model.
Saat kamu ketik /reset di terminal, kode di baliknya cuma menjalankan history.length = 0. Agent-nya tidak mengalami proses pembersihan memori yang canggih; dia cuma langsung amnesia total dalam sekejap. Bukan modelnya yang mengingat kamu — melainkan riwayat prompt-nya.
2. Error itu data, bukan bencana
Dalam software engineering biasa, saat fungsi menghadapi masalah — misalnya file tidak ditemukan atau request HTTP gagal — respons standarnya adalah melempar exception (throw).
Di dalam loop agent, melempar exception itu fatal. Kalau prosesnya crash hanya gara-gara typo nama file, seluruh session interaktifmu langsung mati.
Solusinya ternyata sangat simpel: perlakukan error sebagai data biasa. Kalau read_file gagal menemukan file, jangan throw. Cukup return string biasa: "ERROR: file not found: config.json".
LLM akan menerima string ini di putaran berikutnya sebagai hasil eksekusi tool. Karena model paham bahasa manusia, dia akan membaca error tersebut, menganalisis apa yang salah, lalu menyesuaikan langkahnya: "Oh, config.json ternyata nggak ada, coba saya list dulu isi foldernya." Ketahanan agent tidak butuh algoritma retry yang rumit; cukup berikan kegagalan itu kembali ke model sebagai konteks baru.
3. Katalog tool adalah pagar pembatas
Dari mana model tahu apa saja yang boleh dan bisa dia lakukan?
Bukan lewat izin akses sistem operasi yang sakti, melainkan lewat katalog JSON schema yang kamu berikan. Model hanya bisa meminta tool yang memang kamu daftarkan secara eksplisit di definisi prompt-nya. Kalau kamu cuma memberinya read_file, write_file, list_files, dan web_fetch, ya itulah seluruh alam semestanya.
Model tidak pernah mengeksekusi tool itu sendiri secara langsung. Dia hanya membuat blok JSON terstruktur yang bilang: "Saya mau panggil read_file dengan path: package.json". Kodemu yang membaca permintaan itu, menjalankannya secara lokal, lalu mengembalikan hasilnya. Agent selalu bekerja di dalam batasan katalog yang kamu tentukan.
4. Pahami loop-nya sebelum adopsi framework
Framework AI modern seperti LangChain, CrewAI, atau AutoGen menawarkan seabrek fitur. Tapi saat kamu mulai belajar langsung dari sana, abstraksinya justru menutupi mekanisme aslinya. Kamu akhirnya lebih banyak menghabiskan waktu men-debug class bawaan framework ketimbang memahami bagaimana model sebenarnya berinteraksi dengan tool.
Menulis harness minimal dari nol hanya memakan waktu beberapa jam, tapi efeknya benar-benar membuka mata. Kamu jadi melihat bahwa inti dari sebuah agent hanyalah:
- Sebuah input prompt.
- Loop yang mengecek: "Apakah model minta menjalankan tool, atau tugasnya sudah selesai?"
- Kalau minta tool, jalankan fungsinya, masukkan hasilnya ke riwayat, lalu ulangi.
Keseluruhan loop-nya, dari ujung ke ujung:
user turn ──▶ history[] ──▶ ask() ──▶ [ Claude Model ]
▲ │
│ stream (SSE) │ tool_use
▼ ▼
tool_result[] ◀── runTool() ◀── (Promise.all)
└────────── loop until stop_reason !== "tool_use" ──────────┘
Begitu kamu paham fondasi sederhananya, kamu tidak lagi melihat AI agent sebagai kotak hitam yang ajaib — melainkan sebagai software biasa yang bisa kamu bongkar, pahami, dan kendalikan sepenuhnya.