2025 telah menjadi tahun di mana semua orang membicarakan AI agent, dan tahun di mana sebagian besar proyek AI agent gagal di produksi. Saya telah membangun dua alur kerja agent — satu untuk aplikasi fitness AI Gymbro dan satu sebagai eksperimen otomatisasi DevOps di Commsult. Kebenaran jujur: sebagian besar hype AI agent adalah tentang demo yang bekerja sempurna dalam kondisi terkontrol dan rusak saat pengguna nyata berinteraksi.
Survei Developer Stack Overflow 2025 menemukan bahwa 42% developer telah bereksperimen dengan AI agent, tetapi hanya 18% yang melaporkan menggunakannya dalam beban kerja produksi. Kesenjangan antara eksperimentasi dan produksi adalah nyata, dan itu terutama masalah rekayasa, bukan masalah kemampuan model.
Untuk fitur perencanaan latihan AI Gymbro saya, saya mulai dengan setup multi-agent: satu agent untuk pemilihan latihan, satu untuk periodisasi, satu untuk sintesis preferensi pengguna. Setelah dua minggu, saya menyatukannya menjadi satu agent dengan jendela konteks besar. Pendekatan multi-agent menambahkan latensi 3-4 detik dan biaya 40% lebih banyak token tanpa peningkatan kualitas yang terukur.
Setiap alur kerja agent membutuhkan tiga hal: logika retry untuk kegagalan sementara, timeout keras agar agent yang macet tidak menggantung pengguna tanpa batas, dan perilaku fallback saat agent tidak dapat menyelesaikan tugas. Setup produksi saya: 3 retry dengan exponential backoff, timeout keras 30 detik per giliran agent.
Production AI Agent Architecture (2025)
User Request
│
▼
┌─────────────────────────────────────┐
│ Orchestration Layer (Node.js) │
│ - State management │
│ - Retry logic (3x exp backoff) │
│ - 30s hard timeout per turn │
└──────────────┬──────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ Plan-Validate-Execute Pattern │
│ │
│ 1. Generate Plan (LLM call) │
│ → [{tool, args}, ...] │
│ 2. Validate Plan (schema check) │
│ → Catch bad tool names early │
│ 3. Execute Steps (sequential) │
│ → Each step: tool + error hdlr │
└──────────────┬──────────────────────┘
│
┌───────┼───────┐
▼ ▼ ▼
Tool A Tool B Tool C
│ │ │
└───────┼───────┘
│
▼
┌─────────────────────────────────────┐
│ Observability (Langfuse) │
│ - Trace ID per session │
│ - Token counts per call │
│ - Tool success/failure rate │
└─────────────────────────────────────┘Pola alur kerja agent paling andal yang saya temukan untuk 2025 adalah pendekatan 'Plan then Execute': pertama panggil LLM untuk membuat rencana terstruktur (array JSON dari langkah-langkah dengan nama alat dan input), validasi rencana terhadap schema sebelum mengeksekusi, kemudian eksekusi setiap langkah secara berurutan dengan penanganan error penuh.
Kualitas alat Anda menentukan kualitas agent Anda. Alat yang dirancang dengan baik memiliki cakupan yang sempit, pesan error yang jelas, dan memvalidasi inputnya sendiri sebelum eksekusi. Aturan desain alat saya: setiap alat mengembalikan respons JSON terstruktur dengan field 'success', alat error selalu menyertakan 'error_code' dan 'suggestion'.
Saya menggunakan logging terstruktur dengan correlation ID yang mencakup seluruh giliran agent. Langfuse (open-source) sangat baik untuk ini — ia menangkap data trace dari panggilan LLM dan eksekusi alat dan menyediakan UI untuk menelusuri sesi.
// Plan-then-Execute agent pattern — TypeScript
interface AgentStep {
tool: string
args: Record<string, unknown>
}
async function runAgent(userMessage: string, tools: Tool[]) {
// Step 1: Generate plan
const planResponse = await llm.generate({
prompt: `Given the tools available, create a step-by-step plan to: ${userMessage}
Return ONLY a JSON array: [{"tool": "tool_name", "args": {...}}, ...]`,
responseFormat: "json",
})
// Step 2: Validate plan
const steps: AgentStep[] = JSON.parse(planResponse)
const validTools = new Set(tools.map(t => t.name))
for (const step of steps) {
if (!validTools.has(step.tool)) {
throw new Error(`Unknown tool: ${step.tool}`)
}
}
// Step 3: Execute steps
const results: unknown[] = []
for (const step of steps) {
try {
const tool = tools.find(t => t.name === step.tool)!
const result = await tool.execute(step.args)
results.push({ step, result, success: true })
} catch (error) {
results.push({ step, error: String(error), success: false })
break // Stop on first failure
}
}
return results
}Alur kerja agent paling andal di 2025 menyertakan pos pemeriksaan strategis di mana agent berhenti dan meminta pengguna untuk mengonfirmasi sebelum melanjutkan. Untuk operasi destruktif atau mahal, selalu implementasikan langkah konfirmasi.
Beberapa model bisa terjebak dalam loop pemanggilan alat — memanggil alat yang sama berulang kali. Selalu implementasikan penghitung pemanggilan alat per sesi dan batalkan agent setelah jumlah panggilan maksimum (saya menggunakan 20).
Arsitektur yang berfungsi di produksi: lapisan orkestrasi tipis (Node.js), satu panggilan LLM utama per giliran pengguna, set 8-12 alat sempit dan bertipe kuat, penegakan output terstruktur via tool use/JSON mode, pola plan-validate-execute, dan observabilitas penuh via Langfuse.
Kasus penggunaan di mana agent memberikan nilai nyata: agregasi data dan pembuatan laporan, pemrosesan formulir dan dokumen, otomatisasi alur kerja internal, dan pembuatan konten yang dipersonalisasi dengan memori. Kasus penggunaan yang masih berjuang: apa pun yang memerlukan alat eksternal dengan API yang tidak stabil, transaksi keuangan multi-langkah, dan apa pun di mana mode kegagalan bersifat katastrofik.