- 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?
| Model | Cost in/out (USD/M) | Speed (t/s) | Quality | Strength |
|---|---|---|---|---|
| Claude Opus 4.7 | 15 / 75 | 50-70 | Cao nhất | Refactor, design |
| Claude Sonnet 4.6 | 3 / 15 | 80-120 | Cao | Code daily |
| GPT-4o | 5 / 15 | 80 | Cao | General |
| Gemini 2.0 Flash | 0.5 / 3 | 150 | Tốt | Vision, fast |
| DeepSeek V3 | 0.3 / 1.2 | 100 | Tốt | Math, code |
| Llama 3.3 (Groq) | 0.6 / 0.8 | 250 | Trung bình | Speed |
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 --version3. 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.db4. 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 kwargs5. 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 blog6. 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 standard7. 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 model9. 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/day10. So sánh cost trước và sau routing
| Setup | Cost/tháng | Quality |
|---|---|---|
| Opus only (3M token in / 800K out) | ~105 USD | 10/10 |
| Sonnet only | ~21 USD | 9/10 |
| RouteLLM mix | ~30 USD | 9.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: 60Khi 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.
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.
- Cách setup Gemini Antigravity IDE + VPS làm dev environment hoàn chỉnh
- Async workflow Antigravity: giao task agent, đóng laptop, sáng nhận kết quả
- Gemini 3 Pro vs Gemini 3 Ultra cho coding: khi nào cần Ultra
- Antigravity IDE + remote VPS: workflow đầy đủ cho hacker
- Gemini Antigravity IDE vs Cursor vs VS Code Copilot: dev VN chọn cái nào
- Antigravity vs Windsurf vs Cursor: top 3 AI IDE 2026 cho VN



