AI Agent dengan Tools
Bangun agent sungguhan: model yang bisa memanggil kalkulator, cek waktu, dan mencari di data — dengan loop, log langkah, dan guardrails.
Kamu akan membangun inti dari setiap agent: loop reason → act → observe. Versi live-nya bisa dicoba di playground tool-calling — sekarang kamu bangun versi produksinya sendiri.
1. Definisikan tools (skema OpenAI)
const tools = [
{
type: "function",
function: {
name: "hitung",
description: "Hitung ekspresi matematika. Contoh: '1200*12/3'.",
parameters: {
type: "object",
properties: { ekspresi: { type: "string" } },
required: ["ekspresi"],
},
},
},
{
type: "function",
function: {
name: "waktu_sekarang",
description: "Waktu saat ini di zona Asia/Jakarta.",
parameters: { type: "object", properties: {} },
},
},
];
Deskripsi = 50% keberhasilan (materi tool calling).
2. Implementasi fungsi aslinya (di server kamu)
const implementations = {
hitung: (args: { ekspresi: string }) => {
if (!/^[-+*/(). 0-9]+$/.test(args.ekspresi))
return "ERROR: ekspresi tidak valid";
// evaluasi aman di sini (parser aritmetika, bukan eval!)
return String(hitungAman(args.ekspresi));
},
waktu_sekarang: () =>
new Intl.DateTimeFormat("id-ID", {
timeZone: "Asia/Jakarta",
dateStyle: "full", timeStyle: "short",
}).format(new Date()),
};
Catatan keamanan: JANGAN pakai eval. Parser aritmetika sendiri atau pustaka mathjs.evaluate dengan scope kosong.
3. Loop agent
async function jalankanAgent(tugas: string, maksLangkah = 6) {
const messages = [
{ role: "system", content: "Kamu asisten yang menyelesaikan tugas dengan tools. Selesaikan langkah demi langkah." },
{ role: "user", content: tugas },
];
for (let langkah = 0; langkah < maksLangkah; langkah++) {
const res = await panggilAI({ messages, tools });
messages.push(res.message);
if (!res.message.tool_calls) return res.message.content; // selesai
for (const call of res.message.tool_calls) {
const fn = implementations[call.function.name];
let hasil = "Tool tidak dikenal";
if (fn) {
try {
hasil = fn(JSON.parse(call.function.arguments));
} catch (e) { hasil = "ERROR: " + (e as Error).message; }
}
logLangkah(call.function.name, hasil); // tampilkan di UI
messages.push({
role: "tool",
tool_call_id: call.id,
content: String(hasil),
});
}
}
return "Berhenti: melebihi batas langkah.";
}
4. Guardrails wajib
maksLangkah— agent tanpa rem akan berputar membakar kuota.- Validasi argumen JSON sebelum eksekusi.
- Whitelist tool — implementasi yang tidak terdaftar tidak pernah dijalankan.
- Aksi berdampak nyata (kirim email, tulis DB) wajib konfirmasi user dulu.
5. UI
Tampilkan tiga kolom: percakapan, log tool-call (nama + argumen + hasil), dan status langkah. Transparansi itu yang membuat agent bisa di-debug dan dipercaya.
Tantangan
Tambahkan tool cari_produk(nama) yang membaca CSV inventori, lalu tugasnya: "berapa total nilai stok produk yang mengandung kata 'kopi'?"