Kembali ke Blog

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

Dahono AI12 Agustus 202691 views
Cara Membangun Smart AI Gateway dengan Node.js dan Load Balancing Otomatis untuk LLM

Halo devs! Saat ini, mengandalkan satu model Large Language Model (LLM) saja seringkali tidak cukup untuk aplikasi production. Entah karena masalah rate limit, lonjakan latensi, atau perubahan harga dari provider seperti OpenAI, Anthropic, atau Cohere, kita butuh sistem yang lebih tangguh.

Di artikel teknis kali ini, kita akan membahas cara membangun Smart AI Gateway sederhana menggunakan Node.js dan Express. Gateway ini akan bertindak sebagai pintu gerbang tunggal (single entry point) yang mendistribusikan request ke berbagai provider LLM secara cerdas dan melakukan fallback otomatis jika terjadi error.


Mengapa Kita Butuh AI Gateway Sendiri?

Sebelum masuk ke kode, mari kita pahami masalah utamanya:

  1. Vendor Lock-in: Terikat pada satu API saja berbahaya jika layanan mereka down.
  2. Rate Limiting: Aplikasi skala besar sering mentok di batas requests per minute (RPM).
  3. Cost Optimization: Rute request sederhana ke model yang lebih murah (misal: GPT-3.5 atau Claude Instant), dan request kompleks ke model yang lebih pintar (GPT-4).

Langkah 1: Inisialisasi Proyek Node.js

Pertama-tama, buat direktori baru dan instal dependensi yang kita butuhkan. Kita akan menggunakan express untuk server dan axios untuk melakukan HTTP request ke LLM provider.

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

Buat file .env untuk menyimpan kunci API Anda:

PORT=3000
PRIMARY_API_KEY=sk-openai-your-key-here
BACKUP_API_KEY=sk-anthropic-your-key-here

Langkah 2: Menulis Logika Load Balancing & Fallback

Buat file bernama server.js. Di sini kita akan membuat endpoint /v1/chat/completions yang akan mencoba menghubungi provider utama terlebih dahulu. Jika gagal atau timeout, sistem otomatis mengalihkan ke provider cadangan (fallback).

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

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

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

// Fungsi helper untuk memanggil OpenAI
async function callOpenAI(messages) {
  const response = await axios.post(
    'https://api.openai.com/v1/chat/completions',
    {
      model: 'gpt-3.5-turbo',
      messages: messages,
    },
    {
      headers: {
        'Authorization': `Bearer ${process.env.PRIMARY_API_KEY}`,
        'Content-Type': 'application/json',
      },
      timeout: 5000, // 5 detik timeout
    }
  );
  return response.data;
}

// Fungsi helper untuk memanggil Anthropic Claude sebagai backup
async function callAnthropic(messages) {
  // Konversi format pesan sederhana untuk contoh ini
  const response = await axios.post(
    'https://api.anthropic.com/v1/messages',
    {
      model: 'claude-3-haiku-20240307',
      max_tokens: 1024,
      messages: messages,
    },
    {
      headers: {
        'x-api-key': process.env.BACKUP_API_KEY,
        'anthropic-version': '2023-06-01',
        'Content-Type': 'application/json',
      },
    }
  );
  
  // Normalisasi respons agar mirip OpenAI
  return {
    choices: [
      {
        message: {
          role: 'assistant',
          content: response.data.content[0].text
        }
      }
    ]
  };
}

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

  if (!messages) {
    return res.status(400).json({ error: 'Messages field is required' });
  }

  console.log('[Gateway] Mencoba mengirim request ke Primary Provider (OpenAI)...');
  
  try {
    const data = await callOpenAI(messages);
    return res.json({ provider: 'openai', ...data });
  } catch (primaryError) {
    console.warn('[Gateway Warning] Primary provider gagal. Melakukan failover ke Backup...');
    
    try {
      const backupData = await callAnthropic(messages);
      return res.json({ provider: 'anthropic-backup', ...backupData });
    } catch (backupError) {
      console.error('[Gateway Error] Semua provider gagal!');
      return.status(500).json({ 
        error: 'All LLM providers are currently unavailable', 
        details: backupError.message 
      });
    }
  }
});

app.listen(PORT, () => {
  console.log(`Smart AI Gateway berjalan di port ${PORT}`);
});

Langkah 3: Menguji Gateway Anda

Jalankan server Node.js Anda dengan perintah:

node server.js

Kemudian, Anda bisa mengirimkan payload uji coba menggunakan curl atau Postman:

curl -X POST http://localhost:3000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
  "messages": [
    {"role": "user", "content": "Halo, berikan tips singkat optimasi database SQL."}
  ] 
}'

Jika kunci OpenAI valid, Anda akan mendapat respons dari OpenAI. Coba ubah PRIMARY_API_KEY di .env menjadi salah, dan lihat bagaimana gateway secara mulus mengalihkan trafik ke Anthropic tanpa membuat aplikasi utama Anda crash!


Ingin Solusi yang Lebih Scalable dan Enterprise-Ready?

Membangun AI Gateway sendiri sangat bagus untuk tahap prototyping. Namun, ketika Anda menghadapi jutaan token, kebutuhan streaming response (SSE), manajemen rate-limit tingkat lanjut per pengguna, hingga logging dan analytics yang kompleks, membangun dari nol akan memakan banyak waktu.

Jika Anda ingin solusi siap pakai yang berperforma tinggi tanpa repot mengurus infrastruktur routernya sendiri, Anda bisa langsung meluncur ke Dahono Router. Platform AI Gateway kami dirancang khusus untuk mengatur manajemen, scaling, dan load balancing multi-LLM secara instan dan aman untuk kebutuhan enterprise.

Selamat mencoba kodenya, dan semoga aplikasi AI Anda semakin tangguh!

Tags:

AI gatewayNode.jsload balancing LLMOpenAI APIAnthropicDahono Routerfailover API