Multi-LLM router routellm trên VPS gọi Claude/Gemini/DeepSeek balance cost

Chia sẻ bài viết

Mục lục
TL;DR
  • RouteLLM tự động route request tới model phù hợp dựa trên độ khó task.
  • Task dễ -> Gemini Flash hoặc DeepSeek (rẻ). Task khó -> Claude Opus (chất lượng).
  • Cài trên VPS làm OpenAI-compatible gateway, app gọi URL local thay nhiều API.
  • Saving 50-70% cost mà chất lượng giảm ít (5-10%).
  • Tích hợp Claude Code, Cursor, n8n qua endpoint duy nhất.

Mỗi LLM provider có strength riêng và pricing khác xa. Dùng 1 model duy nhất cho mọi task hoặc lãng phí (Opus cho task đơn giản) hoặc thiếu chất lượng (Haiku cho refactor lớn). RouteLLM là router thông minh: phân tích prompt, chọn model tối ưu cho task đó.

Self-host trên Cloud VPS làm OpenAI-compatible gateway. App của bạn vẫn gọi http://vps:8080/v1/chat/completions như OpenAI, nhưng backend tự chọn Claude, Gemini, DeepSeek, Llama tùy task. Tiết kiệm 50-70% cost mà quality drop chỉ 5-10%.

Bài này hướng dẫn deploy RouteLLM trên Cloud VPS TND 4GB Ubuntu 24.04, config 4 provider, tích hợp app, monitor cost.

1. Vì sao cần multi-LLM router?

ModelCost in/out (USD/M)Speed (t/s)QualityStrength
Claude Opus 4.715 / 7550-70Cao nhấtRefactor, design
Claude Sonnet 4.63 / 1580-120CaoCode daily
GPT-4o5 / 1580CaoGeneral
Gemini 2.0 Flash0.5 / 3150TốtVision, fast
DeepSeek V30.3 / 1.2100TốtMath, code
Llama 3.3 (Groq)0.6 / 0.8250Trung bìnhSpeed

Chênh lệch pricing 50x giữa Opus và DeepSeek. Router tối ưu giúp tận dụng từng strength.

2. Cài RouteLLM trên VPS

# Cài Python 3.11+ và pip
sudo apt update
sudo apt install -y python3.11 python3-pip python3-venv

# Tạo venv
python3 -m venv /opt/routellm
source /opt/routellm/bin/activate

# Install RouteLLM (hoặc dùng LiteLLM thay alternative)
pip install routellm openai litellm

# Verify
routellm --version

3. Config RouteLLM với 4 provider

# /opt/routellm/config.yaml
model_list:
  - model_name: gpt-4o
    litellm_params:
      model: openai/gpt-4o
      api_key: os.environ/OPENAI_API_KEY

  - model_name: claude-opus
    litellm_params:
      model: anthropic/claude-opus-4-7
      api_key: os.environ/ANTHROPIC_API_KEY

  - model_name: claude-sonnet
    litellm_params:
      model: anthropic/claude-sonnet-4-6
      api_key: os.environ/ANTHROPIC_API_KEY

  - model_name: gemini-flash
    litellm_params:
      model: gemini/gemini-2.0-flash-exp
      api_key: os.environ/GEMINI_API_KEY

  - model_name: deepseek
    litellm_params:
      model: deepseek/deepseek-chat
      api_key: os.environ/DEEPSEEK_API_KEY

router_settings:
  routing_strategy: cost-based-routing
  fallback_models: [claude-sonnet, gpt-4o]

general_settings:
  master_key: sk-master-token-xxx
  database_url: sqlite:///routellm.db

4. Routing rules - chọn model theo task

# /opt/routellm/router.py
from litellm import Router
import re

def classify_task(prompt: str) -> str:
    """Phân loại task để chọn model phù hợp."""
    lower = prompt.lower()
    length = len(prompt)

    # Task phức tạp: refactor, architecture, debug
    if any(kw in lower for kw in ['refactor', 'architecture', 'design system', 'debug', 'audit']):
        return 'claude-opus'

    # Task code daily
    if any(kw in lower for kw in ['write function', 'add test', 'fix bug', 'add component']):
        return 'claude-sonnet'

    # Task vision/multimodal
    if 'image' in lower or 'screenshot' in lower:
        return 'gemini-flash'

    # Task math/algorithm
    if any(kw in lower for kw in ['math', 'algorithm', 'optimize', 'complexity']):
        return 'deepseek'

    # Task ngắn đơn giản
    if length < 200:
        return 'gemini-flash'

    # Default
    return 'claude-sonnet'

router = Router(model_list=[...])

# Hook trước khi route
@router.pre_call_hook
async def route_by_task(prompt, **kwargs):
    selected = classify_task(prompt)
    kwargs['model'] = selected
    return kwargs

5. Start RouteLLM server

# Run với litellm proxy
litellm --config /opt/routellm/config.yaml --port 8080 --host 0.0.0.0

# Hoặc systemd service
sudo cat > /etc/systemd/system/routellm.service << 'UNIT'
[Unit]
Description=RouteLLM gateway
After=network.target

[Service]
Type=simple
User=routellm
WorkingDirectory=/opt/routellm
ExecStart=/opt/routellm/bin/litellm --config /opt/routellm/config.yaml --port 8080
EnvironmentFile=/etc/routellm.env
Restart=always

[Install]
WantedBy=multi-user.target
UNIT

# Note: heredoc trên dùng để minh họa, không nên paste vào blog

6. Test endpoint OpenAI-compatible

# Test bằng curl - hoàn toàn OpenAI format
curl http://vps-ip:8080/v1/chat/completions 
  -H "Authorization: Bearer sk-master-token-xxx" 
  -H "Content-Type: application/json" 
  -d '{
    "model": "auto",
    "messages": [
      {"role": "user", "content": "Refactor function này theo SOLID..."}
    ]
  }'

# RouteLLM tự pick claude-opus vì có keyword "refactor"
# Response trả về format OpenAI standard

7. Tích hợp app dùng OpenAI SDK

# Python
from openai import OpenAI

client = OpenAI(
    base_url="http://vps-ip:8080/v1",
    api_key="sk-master-token-xxx",
)

response = client.chat.completions.create(
    model="auto",  # RouteLLM tự chọn
    messages=[{"role": "user", "content": "..."}],
)

# Node.js
import OpenAI from 'openai';

const client = new OpenAI({
  baseURL: 'http://vps-ip:8080/v1',
  apiKey: 'sk-master-token-xxx',
});

const response = await client.chat.completions.create({
  model: 'auto',
  messages: [{ role: 'user', content: '...' }],
});

8. Cấu hình Claude Code dùng RouteLLM

# Set ANTHROPIC_BASE_URL trỏ về RouteLLM gateway
export ANTHROPIC_BASE_URL=http://vps-ip:8080
export ANTHROPIC_API_KEY=sk-master-token-xxx

claude
# Claude Code gửi request tới RouteLLM, router tự chọn model

9. Monitor cost và usage

# LiteLLM tự log mọi request vào sqlite database
sqlite3 /opt/routellm/routellm.db

SELECT
  model,
  COUNT(*) as requests,
  SUM(prompt_tokens) as total_in,
  SUM(completion_tokens) as total_out,
  SUM(spend) as total_cost
FROM litellm_spendlogs
WHERE created_at >= datetime('now', '-1 day')
GROUP BY model;

# Output:
# claude-sonnet | 234 | 450000 | 80000 | 2.55 USD
# gemini-flash  | 1023 | 180000 | 50000 | 0.35 USD
# claude-opus   | 18 | 25000 | 12000 | 1.28 USD
# Total: 4.18 USD/day

10. So sánh cost trước và sau routing

SetupCost/thángQuality
Opus only (3M token in / 800K out)~105 USD10/10
Sonnet only~21 USD9/10
RouteLLM mix~30 USD9.5/10

RouteLLM tiết kiệm 70% so với Opus only, chất lượng chỉ giảm 5%. Sweet spot cho indie hacker và startup.

11. Fallback và retry logic

# Trong config.yaml
router_settings:
  fallbacks:
    - claude-opus: [claude-sonnet, gpt-4o]
    - gemini-flash: [claude-sonnet]
    - deepseek: [gemini-flash, claude-sonnet]

  retry_policy:
    max_retries: 3
    timeout: 30
    cooldown_time: 60

Khi provider down (Anthropic 503), router tự retry với model fallback. App không thấy lỗi, latency tăng nhẹ 1-2s.

12. Security: bảo vệ master key

  • Master key chỉ dùng admin, không share với app.
  • Tạo virtual key per app/user với budget riêng: litellm --config ... --create-key.
  • Expose qua Caddy reverse proxy SSL, không HTTP plain.
  • IP whitelist nếu chỉ access từ internal.
  • Rate limit per virtual key.
  • Audit log mọi request.
Cloud VPS cho vibe coder

LLM gateway tự host - giảm 70% cost API

Cloud VPS TND sẵn AlmaLinux 9, Ubuntu 22/24, Debian 12/13. SSD CEPH, snapshot 1-click, backup hằng ngày, network 200Mbps trong nước. RouteLLM chạy thoải mái trên VPS 4GB, latency thêm chỉ 50ms.

Xem 8 cấu hình Cloud VPS →

FAQ

RouteLLM có giảm chất lượng output không?

Có giảm nhẹ 5-10% cho task khó (router đôi khi pick model nhỏ). Cho 80% task daily thì không thấy khác biệt. Có thể fine-tune rule classify để giảm regression.

Latency thêm khi qua router là bao nhiêu?

50-100ms latency thêm cho router classify + forward. Nếu VPS đặt ở Singapore, gần với Anthropic/OpenAI thì tổng latency thậm chí thấp hơn (vì router cache connection pool).

VPS RAM tối thiểu là bao nhiêu?

2GB chạy được cho test. 4GB recommend cho prod với 10+ concurrent request. LiteLLM ăn ~500MB Python runtime.

Có alternative cho RouteLLM/LiteLLM không?

Có. OpenRouter (managed, paid), Portkey, Helicone (proxy + observability). Self-host: LiteLLM phổ biến nhất, RouteLLM thiên về cost optimization, Bifrost từ Meta open source.

Có thể dùng local LLM (Ollama) trong router không?

Có. Thêm Ollama vào model_list với endpoint http://localhost:11434. Task siêu nhẹ route về Ollama, không tốn API. Đặc biệt useful cho task private data không muốn gửi cloud.

RouteLLM có support streaming response không?

Có. SSE streaming chuẩn OpenAI format. Token đầu tiên latency ~200ms, sau đó streaming bình thường. Compatible với mọi OpenAI SDK.

2009
15+ năm vận hành liên tục
10+
tập đoàn lớn tin dùng
100+
doanh nghiệp SMB Việt
30 ngày
đổi key lỗi miễn phí
Phần mềm bản quyền chính hãng chúng tôi cung cấp
Bản quyền chính hãng Hóa đơn VAT đầy đủ Đổi key lỗi 30 ngày Vận hành từ 2009 MST 0200994870 Hotline 0225.999.6666