Tool schema & dispatch: kontrak JSON yang menentukan kualitas
A1 — Loop & Tool Calling
Tool calling adalah kontrak JSON: model menulis {"name": "...", "args": {...}}, kamu yang mengeksekusi. Kualitas agent 80% ditentukan dua hal ini.
Schema: deskripsi menentukan segalanya
nameunik,snake_case, nama kerja (verb+objek):cari_dokumen, bukanfunc1.description: kapan dipakai + contoh singkat. "Cari dokumen internal berdasarkan kata kunci; pakai saat user menyebut 'cek dokumen/buku/arsip'" — model jarang salah pilih.parameters: JSON Schema ketat.integervsnumberbeda;requiredeksplisit;enumuntuk nilai terbatas.
Dispatch: map nama → fungsi
const tools: Record<string, ToolFn> = {
cari_dokumen: cariDokumenImpl,
hitung_harga: hitungHargaImpl,
};
const call = resp.toolCalls[0];
const fn = tools[call.name];
if (!fn) {
riwayat.push({ role: "tool", content: `Tool tak dikenal: ${call.name}` });
continue;
}
let result;
try {
result = await fn(call.args);
} catch (err) {
result = { error: String(err) }; // error balik ke model, bukan crash
}
riwayat.push({ role: "tool", toolCallId: call.id, content: JSON.stringify(result) });
Aturan emas
- Error tool dikembalikan ke model sebagai hasil (model bisa memperbaiki), kecuali error keamanan.
- Hasil tool yang masuk konteks harus JSON kecil dan terstruktur; ringkas dulu hasil besar.
- Jangan pernah
evalargumen; validasi dengan schema (zod) sebelum eksekusi.
Tugas: tulis schema JSON lengkap untuk tool cari_jadwal(ruangan, hari) dan pesan_ruangan(id) — termasuk deskripsi dan required — lalu jelaskan satu baris apa jadinya kalau deskripsinya "fungsi pembantu".
A1