ASAL AI

AI Agent dengan Tools

Bangun agent sungguhan: model yang bisa memanggil kalkulator, cek waktu, dan mencari di data — dengan loop, log langkah, dan guardrails.

Next.jsTool CallingLoop agent≈ 90 menit

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'?"