Kembali ke Blog

Cara Membangun Smart AI Gateway dengan Node.js dan Load Balancing LLM

Dahono AI14 Agustus 202699 views
Cara Membangun Smart AI Gateway dengan Node.js dan Load Balancing LLM

Halo para developer dan tech enthusiast! Selamat datang kembali di blog Dahono.

Saat ini, mengintegrasikan Model Bahasa Besar (LLM) seperti GPT-4o atau Claude 3.5 Sonnet ke dalam aplikasi produksi bukan lagi hal yang sulit. Tantangan sebenarnya muncul ketika aplikasi Anda mulai berskala besar: bagaimana cara menangani rate limit, lonjakan trafik, dan memastikan layanan tetap berjalan (high availability) ketika salah satu provider AI mengalami down?

Jawabannya adalah dengan membangun AI Gateway. Pada artikel praktis ini, kita akan membahas cara membangun AI Gateway sederhana menggunakan Node.js dan Express, lengkap dengan mekanisme load balancing dan failover dasar.


Mengapa Kita Butuh AI Gateway?

Bayangkan aplikasi Anda mengirim ribuan request ke satu provider LLM. Tiba-tiba, provider tersebut mengalami gangguan server. Tanpa AI Gateway, aplikasi Anda akan langsung error dan mengecewakan pengguna. Dengan AI Gateway di tengah-tengah arsitektur Anda, request dapat dialihkan secara otomatis ke backup provider (misalnya dari OpenAI ke Anthropic Claude) tanpa disadari oleh pengguna.

Prasyarat

Sebelum kita mulai menulis kode, pastikan Anda telah menyiapkan:

  • Node.js (versi 18 ke atas)
  • Pemahaman dasar tentang Express.js dan fetch API
  • API Key dari minimal dua provider (misal: OpenAI dan Anthropic)

Langkah 1: Inisialisasi Proyek Node.js

Buat direktori baru untuk proyek Anda, laluinisialisasi proyek Node.js:

mkdir smart-ai-gateway
cd smart-ai-gateway
npm init -y
npm install express dotenv

Buat file .env di root direktori untuk menyimpan kunci API Anda:

PORT=3000
OPENAI_API_KEY=sk-your-openai-key-here
ANTHROPIC_API_KEY=sk-your-anthropic-key-here

Langkah 2: Membuat Logika Load Balancer dan Failover

Buat file bernama server.js. Di sini kita akan membuat router cerdas yang bertugas mengecek ketersediaan provider utama sebelum beralih ke provider cadangan.

const express = require('express');
require('dotenv').config();

const app = express();
app.use(express.json());

const PORT = process.env.PORT || 3000;

// Fungsi helper untuk memanggil OpenAI
async function callOpenAI(prompt) {
  const response = await fetch('https://api.openai.com/v1/chat/completions', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${process.env.OPENAI_API_KEY}`
    },
    body: JSON.stringify({
      model: 'gpt-4o-mini',
      messages: [{ role: 'user', content: prompt }]
    })
  });

  if (!response.ok) throw new Error('OpenAI API Error');
  const data = await response.json();
  return { provider: 'OpenAI', result: data.choices[0].message.content };
}

// Fungsi helper untuk memanggil Anthropic Claude sebagai failover
async function callAnthropic(prompt) {
  const response = await fetch('https://api.anthropic.com/v1/messages', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'x-api-key': process.env.ANTHROPIC_API_KEY,
      'anthropic-version': '2023-06-01'
    },
    body: JSON.stringify({
      model: 'claude-3-5-sonnet-20241022',
      max_tokens: 1024,
      messages: [{ role: 'user', content: prompt }]
    })
  });

  if (!response.ok) throw new Error('Anthropic API Error');
  const data = await response.json();
  return { provider: 'Anthropic', result: data.content[0].text };
}

// Endpoint Gateway
app.post('/v1/chat', async (req, res) => {
  const { prompt } = req.body;

  if (!prompt) {
    return res.status(400).json({ error: 'Prompt is required' });
  }

  try {
    console.log('Mencoba mengirim request ke OpenAI (Primary)...');
    const response = await callOpenAI(prompt);
    return res.json({ success: true, ...response });
  } catch (openaiError) {
    console.warn('OpenAI gagal, mengalihkan ke Anthropic (Failover)...');
    
    try {
      const response = await callAnthropic(prompt);
      return res.json({ success: true, ...response });
    } catch (anthropicError) {
      console.error('Semua provider AI gagal!');
      return res.status(500).json({
        success: false,
        error: 'Semua LLM provider sedang mengalami gangguan.'
      });
    }
  }
});

app.listen(PORT, () => {
  console.log(`AI Gateway berjalan di http://localhost:${PORT}`);
});

Langkah 3: Menguji Gateway Anda

Jalankan server Node.js Anda dengan perintah:

node server.js

Sekarang, Anda bisa melakukan tes menggunakan curl atau Postman ke http://localhost:3000/v1/chat:

curl -X POST http://localhost:3000/v1/chat \
-H "Content-Type: application/json" \
-d '{"prompt": "Halo, berikan sambutan singkat untuk developer Indonesia!"}'

Jika OpenAI berjalan normal, Anda akan mendapatkan respons dari OpenAI. Jika Anda sengaja merusak OPENAI_API_KEY, sistem akan otomatis melakukan fallback ke Anthropic Claude!


Ingin Solusi yang Lebih Siap Produksi (Enterprise-Grade)?

Membuat gateway sederhana sendiri memang menyenangkan untuk bahan belajar. Namun, untuk kebutuhan production berskala besar, Anda memerlukan fitur lanjutan seperti semantic caching, manajemen token rate limiting per pengguna, load balancing multi-region, dan analitik biaya secara real-time.

Daripada membangun dan merawat infrastruktur AI Gateway dari nol, Anda bisa langsung memanfaatkan Dahono Router—solusi AI Gateway andal kami yang dirancang khusus untuk mengelola, mengamankan, dan menskalakan interaksi LLM Anda dengan latensi minimal.

Selamat mencoba, semoga kode di atas bermanfaat untuk arsitektur aplikasi AI Anda selanjutnya!

Tags:

AI GatewayNode.jsLoad Balancing LLMOpenAI APIAnthropicDahono RouterTutorial AI