Là một senior backend engineer đã triển khai hệ thống xử lý hàng triệu request AI mỗi ngày, tôi hiểu rõ nỗi đau khi gặp phải rate limiting, chi phí quá cao, và độ trễ không kiểm soát được. Trong bài viết này, tôi sẽ chia sẻ cách tôi giải quyết tất cả những vấn đề đó bằng một kiến trúc queuing thông minh kết hợp với HolySheep AI — giải pháp tiết kiệm 85%+ chi phí với độ trễ dưới 50ms.

Bảng So Sánh: HolySheep vs API Chính Thức vs Dịch Vụ Relay

Tiêu chí HolySheep AI API Chính Thức Dịch Vụ Relay
Chi phí GPT-4.1 $8/MTok $60/MTok $45-55/MTok
Chi phí Claude Sonnet 4.5 $15/MTok $90/MTok $70-80/MTok
Chi phí DeepSeek V3.2 $0.42/MTok $2.50/MTok $1.80-2.20/MTok
Độ trễ trung bình <50ms 150-300ms 100-200ms
Thanh toán WeChat/Alipay/VNPay Thẻ quốc tế Hạn chế
Tín dụng miễn phí Có ($5-20) $5 Ít hoặc không
Rate limit 3000 RPM 500 RPM 1000-2000 RPM

Tại Sao Cần Request Queuing Và Scheduling?

Khi xây dựng ứng dụng AI production, bạn sẽ gặp phải:

Giải pháp? Xây dựng một Smart Queue System với priority scheduling — điều mà tôi đã triển khai thành công cho 3 startup AI tại Việt Nam.

Kiến Trúc Hệ Thống

Đây là kiến trúc tôi đã áp dụng thực tế với HolySheep AI:

┌─────────────────────────────────────────────────────────────────────┐
│                        CLIENT LAYER                                  │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐            │
│  │  Web App │  │ Mobile   │  │  Batch   │  │ Webhook  │            │
│  │  (High)  │  │  (High)  │  │ (Medium) │  │  (Low)   │            │
└──┴────┬─────┴──┴────┬─────┴──┴────┬─────┴──┴────┬─────┴────────────┘
         │             │             │             │
         └─────────────┴──────┬──────┴─────────────┘
                              │
                    ┌─────────▼─────────┐
                    │   API GATEWAY     │
                    │  (Rate Limiter)   │
                    └─────────┬─────────┘
                              │
         ┌────────────────────┼────────────────────┐
         │                    │                    │
┌────────▼────────┐ ┌─────────▼─────────┐ ┌───────▼────────┐
│   PRIORITY      │ │    SCHEDULER      │ │   FALLBACK     │
│   QUEUE         │ │    (Cron-based)   │ │   HANDLER      │
│  ┌───────────┐  │ │  ┌─────────────┐  │ │                │
│  │ HIGH      │  │ │  │ Peak Hours │  │ │ Retry với      │
│  │ (VIP/Paid)│  │ │  │ Throttling │  │ │ exponential    │
│  ├───────────┤  │ │  └─────────────┘  │ │ backoff        │
│  │ MEDIUM    │  │ │  ┌─────────────┐  │ │                │
│  │ (Standard)│  │ │  │ Off-peak   │  │ │ Circuit        │
│  ├───────────┤  │ │  │ Burst Mode │  │ │ Breaker        │
│  │ LOW       │  │ │  └─────────────┘  │ │                │
│  │ (Free)    │  │ │                   │ │ Dead Letter    │
│  └───────────┘  │ └───────────────────┘ │ Queue         │
└──────────────────┴───────────────────────┴────────────────┘
                              │
                    ┌─────────▼─────────┐
                    │  HOLYSHEEP API    │
                    │  api.holysheep.ai │
                    └───────────────────┘

Triển Khai Chi Tiết Với Python

1. Cài Đặt Dependencies

# requirements.txt
redis==5.0.1
rq==1.15.1
openai==1.12.0
celery==5.3.4
httpx==0.26.0
pydantic==2.5.3
python-dotenv==1.0.0
# Cài đặt và khởi động Redis (Docker)
docker run -d --name redis-ai \
  -p 6379:6379 \
  -v redis-data:/data \
  redis:7-alpine \
  redis-server --appendonly yes

2. Cấu Hình HolySheep API Client

# config.py
import os
from dataclasses import dataclass
from typing import Optional
from openai import AsyncOpenAI

@dataclass
class HolySheepConfig:
    """Cấu hình HolySheep AI - Tỷ giá ¥1=$1, tiết kiệm 85%+"""
    base_url: str = "https://api.holysheep.ai/v1"
    api_key: str = os.getenv("HOLYSHEEP_API_KEY", "YOUR_HOLYSHEEP_API_KEY")
    timeout: float = 30.0
    max_retries: int = 3
    max_rpm: int = 2800  # Buffer 10% so với limit 3000 RPM
    max_tpm: int = 2800000  # Token per minute
    
class HolySheepClient:
    """Async client với built-in retry và rate limiting"""
    
    def __init__(self, config: Optional[HolySheepConfig] = None):
        self.config = config or HolySheepConfig()
        self._client = AsyncOpenAI(
            base_url=self.config.base_url,
            api_key=self.config.api_key,
            timeout=self.config.timeout,
            max_retries=self.config.max_retries,
            http_client=None  # Sẽ dùng httpx với custom transport
        )
        self._rate_limiter = TokenBucketLimiter(
            rpm=self.config.max_rpm,
            tpm=self.config.max_tpm
        )
    
    async def chat_completion(
        self,
        messages: list,
        model: str = "gpt-4.1",
        priority: int = 1,
        **kwargs
    ) -> dict:
        """
        Gửi request với rate limiting tự động
        
        Args:
            messages: List message theo OpenAI format
            model: Model name (gpt-4.1, claude-sonnet-4.5, deepseek-v3.2)
            priority: 1=HIGH, 2=MEDIUM, 3=LOW
            **kwargs: Các param khác như temperature, max_tokens
        """
        # Tính estimated tokens
        estimated_tokens = self._estimate_tokens(messages)
        
        # Chờ nếu cần thiết (rate limiting)
        await self._rate_limiter.acquire(estimated_tokens, priority)
        
        try:
            response = await self._client.chat.completions.create(
                model=model,
                messages=messages,
                **kwargs
            )
            return {
                "id": response.id,
                "model": response.model,
                "content": response.choices[0].message.content,
                "usage": {
                    "prompt_tokens": response.usage.prompt_tokens,
                    "completion_tokens": response.usage.completion_tokens,
                    "total_tokens": response.usage.total_tokens
                },
                "latency_ms": (response.created - response.id.split('-')[0]) * 1000
            }
        except Exception as e:
            # Log và retry với backoff
            await self._handle_error(e, messages, model, priority)
            raise


class TokenBucketLimiter:
    """Token bucket algorithm cho rate limiting chính xác"""
    
    def __init__(self, rpm: int, tpm: int):
        self.rpm_bucket = rpm / 60  # Tokens per second
        self.tpm_bucket = tpm / 60
        self.last_refill = asyncio.get_event_loop().time()
        self._lock = asyncio.Lock()
    
    async def acquire(self, tokens: int, priority: int):
        """Acquire tokens với priority weighting"""
        # Priority cao hơn = ít delay hơn
        delay_multiplier = {1: 0.5, 2: 1.0, 3: 2.0}.get(priority, 1.0)
        
        async with self._lock:
            current_time = asyncio.get_event_loop().time()
            elapsed = current_time - self.last_refill
            
            # Refill buckets
            rpm_available = self.rpm_bucket * elapsed
            tpm_available = self.tpm_bucket * elapsed
            
            # Tính required delay
            required_tokens = max(1, tokens / delay_multiplier)
            delay = max(0, (required_tokens - min(rpm_available, tpm_available)))
            
            if delay > 0:
                await asyncio.sleep(delay * 0.1)  # Granularity 100ms

3. Request Queue Với Priority Scheduling

# queue_manager.py
import json
import asyncio
from enum import IntEnum
from typing import Optional, Callable
from dataclasses import dataclass, asdict
from datetime import datetime, timedelta
import redis.asyncio as redis
from rq import Queue
import hashlib

class Priority(IntEnum):
    """3 cấp độ ưu tiên - đảm bảo VIP không bị block"""
    HIGH = 1      # Paid/VIP users - xử lý ngay
    MEDIUM = 2    # Standard users
    LOW = 3       # Free tier / batch jobs

@dataclass
class QueuedRequest:
    """Request được đưa vào queue"""
    request_id: str
    user_id: str
    priority: Priority
    model: str
    messages: list
    created_at: float
    scheduled_at: Optional[float] = None
    retry_count: int = 0
    max_retries: int = 3
    metadata: Optional[dict] = None

class AIRequestQueue:
    """
    Queue system với priority scheduling
    - HIGH: Xử lý ngay lập tức
    - MEDIUM: Chờ đến khi queue HIGH empty
    - LOW: Chờ off-peak hoặc queue empty
    """
    
    def __init__(self, redis_url: str = "redis://localhost:6379/0"):
        self.redis = redis.from_url(redis_url, decode_responses=True)
        self.queues = {
            Priority.HIGH: Queue("ai_high", connection=self.redis),
            Priority.MEDIUM: Queue("ai_medium", connection=self.redis),
            Priority.LOW: Queue("ai_low", connection=self.redis)
        }
        self.dlq = Queue("ai_dlq", connection=self.redis)  # Dead Letter Queue
        self._scheduler_running = False
    
    def _generate_request_id(self, user_id: str, content_hash: str) -> str:
        """Tạo unique request ID"""
        timestamp = datetime.utcnow().strftime("%Y%m%d%H%M%S")
        raw = f"{user_id}:{content_hash}:{timestamp}"
        return hashlib.sha256(raw.encode()).hexdigest()[:16]
    
    async def enqueue(
        self,
        user_id: str,
        model: str,
        messages: list,
        priority: Priority = Priority.MEDIUM,
        scheduled_at: Optional[datetime] = None,
        metadata: Optional[dict] = None
    ) -> str:
        """Đưa request vào queue với priority tương ứng"""
        
        content_hash = hashlib.md5(
            json.dumps(messages, sort_keys=True).encode()
        ).hexdigest()
        
        request_id = self._generate_request_id(user_id, content_hash)
        
        queued_request = QueuedRequest(
            request_id=request_id,
            user_id=user_id,
            priority=priority,
            model=model,
            messages=messages,
            created_at=datetime.utcnow().timestamp(),
            scheduled_at=scheduled_at.timestamp() if scheduled_at else None,
            metadata=metadata or {}
        )
        
        # Serialize và lưu vào Redis
        queue_key = f"queue:{priority.name.lower()}"
        await self.redis.hset(
            queue_key,
            request_id,
            json.dumps(asdict(queued_request))
        )
        
        # Thêm vào sorted set để maintain order
        score = scheduled_at.timestamp() if scheduled_at else datetime.utcnow().timestamp()
        await self.redis.zadd(
            f"schedule:{priority.name.lower()}",
            {request_id: score}
        )
        
        return request_id
    
    async def dequeue(self, priority: Priority, block: bool = True) -> Optional[QueuedRequest]:
        """Lấy request từ queue theo priority"""
        queue_key = f"queue:{priority.name.lower()}"
        
        # Ưu tiên lấy từ HIGH trước
        if priority == Priority.MEDIUM:
            high_count = await self.redis.zcard("schedule:high")
            if high_count > 0:
                return None  # HIGH queue còn việc
        
        # Get next scheduled request
        schedule_key = f"schedule:{priority.name.lower()}"
        now = datetime.utcnow().timestamp()
        
        if block:
            # Blocking pop với timeout
            result = await self.redis.zrangebyscore(
                schedule_key,
                min="-inf",
                max=now,
                start=0,
                num=1
            )
        else:
            result = await self.redis.zrangebyscore(
                schedule_key,
                min="-inf",
                max=now,
                start=0,
                num=1
            )
        
        if not result:
            return None
        
        request_id = result[0]
        
        # Remove from schedule
        await self.redis.zrem(schedule_key, request_id)
        
        # Get full request data
        data = await self.redis.hget(queue_key, request_id)
        if not data:
            return None
        
        return QueuedRequest(**json.loads(data))
    
    async def schedule_batch(
        self,
        requests: list[dict],
        off_peak_hours: tuple = (1, 6),  # 1AM - 6AM
        spread_minutes: int = 30
    ):
        """Schedule batch job vào off-peak hours để tiết kiệm cost"""
        start_hour, end_hour = off_peak_hours
        
        # Tính toán thời điểm bắt đầu
        now = datetime.utcnow()
        if start_hour <= now.hour < end_hour:
            start_time = now.replace(
                hour=start_hour, minute=0, second=0
            ) + timedelta(days=1)
        else:
            start_time = now.replace(hour=end_hour, minute=0, second=0)
        
        # Spaced scheduling để tránh burst
        interval = spread_minutes / len(requests)
        
        for i, req in enumerate(requests):
            scheduled_time = start_time + timedelta(minutes=i * interval)
            
            await self.enqueue(
                user_id=req["user_id"],
                model=req["model"],
                messages=req["messages"],
                priority=Priority.LOW,
                scheduled_at=scheduled_time,
                metadata={"batch_id": req.get("batch_id")}
            )


class SmartScheduler:
    """
    Scheduler thông minh - tự động điều chỉnh based on:
    - Current load
    - Time of day
    - API rate limits
    - Cost optimization
    """
    
    def __init__(self, queue: AIRequestQueue, holy_sheep_client):
        self.queue = queue
        self.client = holy_sheep_client
        self._running = False
    
    async def start(self):
        """Khởi động scheduler loop"""
        self._running = True
        
        while self._running:
            try:
                # Kiểm tra load và chọn priority phù hợp
                load = await self._get_current_load()
                
                if load < 0.5:
                    # Low load: xử lý tất cả
                    priority = Priority.HIGH
                elif load < 0.8:
                    # Medium load: ưu tiên HIGH
                    priority = Priority.HIGH
                else:
                    # High load: chỉ HIGH
                    priority = Priority.HIGH
                
                # Thử dequeue
                request = await self.queue.dequeue(priority, block=False)
                
                if request:
                    await self._process_request(request)
                
                # Check off-peak burst
                if self._is_off_peak():
                    await self._process_off_peak_batch()
                
                await asyncio.sleep(0.1)  # 100ms loop
                
            except Exception as e:
                await self._handle_scheduler_error(e)
    
    async def _get_current_load(self) -> float:
        """Tính load hiện tại (0.0 - 1.0)"""
        # Sample từ Redis
        high_load = await self.queue.redis.zcard("schedule:high")
        medium_load = await self.queue.redis.zcard("schedule:medium")
        low_load = await self.queue.redis.zcard("schedule:low")
        
        total = high_load + medium_load + low_load
        if total == 0:
            return 0.0
        
        # Weighted calculation
        weighted = (high_load * 1.0 + medium_load * 0.5 + low_load * 0.2)
        max_capacity = 1000  # Concurrent processing capacity
        
        return min(1.0, weighted / max_capacity)
    
    def _is_off_peak(self) -> bool:
        """Kiểm tra giờ thấp điểm (để burst processing)"""
        hour = datetime.utcnow().hour
        return hour >= 1 and hour <= 6  # 1AM - 6AM
    
    async def _process_off_peak_batch(self):
        """Xử lý batch jobs trong off-peak với chi phí thấp hơn"""
        batch_size = 100
        for _ in range(batch_size):
            request = await self.queue.dequeue(Priority.LOW, block=False)
            if not request:
                break
            await self._process_request(request)

4. Retry Logic Với Exponential Backoff

# retry_handler.py
import asyncio
import logging
from datetime import datetime, timedelta
from typing import Optional, Callable
from dataclasses import dataclass
import httpx

logger = logging.getLogger(__name__)

@dataclass
class RetryConfig:
    """Cấu hình retry strategy"""
    max_retries: int = 3
    base_delay: float = 1.0  # seconds
    max_delay: float = 60.0
    exponential_base: float = 2.0
    jitter: bool = True

class RetryHandler:
    """
    Retry handler với exponential backoff và circuit breaker
    Đặc biệt hữu ích khi HolySheep API có maintenance hoặc rate limit
    """
    
    def __init__(self, config: Optional[RetryConfig] = None):
        self.config = config or RetryConfig()
        self._circuit_open = False
        self._circuit_open_time: Optional[datetime] = None
        self._failure_count = 0
        self._failure_threshold = 5
        self._recovery_timeout = 300  # 5 minutes
    
    async def execute_with_retry(
        self,
        func: Callable,
        *args,
        priority: int = 2,
        **kwargs
    ):
        """Execute function với retry logic tích hợp"""
        
        last_exception = None
        
        for attempt in range(self.config.max_retries + 1):
            try:
                # Check circuit breaker
                if self._is_circuit_open():
                    raise CircuitBreakerOpenError(
                        f"Circuit breaker open. Retry after "
                        f"{(self._recovery_timeout - self._elapsed_open_time()):.0f}s"
                    )
                
                result = await func(*args, **kwargs)
                
                # Success - reset failure count
                self._failure_count = 0
                return result
                
            except CircuitBreakerOpenError:
                raise
                
            except (httpx.HTTPStatusError, httpx.TimeoutException) as e:
                last_exception = e
                
                # Check if retryable
                if not self._is_retryable(e):
                    logger.error(f"Non-retryable error: {e}")
                    raise
                
                self._failure_count += 1
                
                # Update circuit breaker
                if self._failure_count >= self._failure_threshold:
                    self._trip_circuit_breaker()
                
                # Calculate delay với exponential backoff
                if attempt < self.config.max_retries:
                    delay = self._calculate_delay(attempt, priority)
                    logger.warning(
                        f"Attempt {attempt + 1} failed: {e}. "
                        f"Retrying in {delay:.2f}s..."
                    )
                    await asyncio.sleep(delay)
                    
            except Exception as e:
                logger.error(f"Unexpected error: {e}")
                raise
        
        # All retries exhausted
        raise MaxRetriesExceededError(
            f"Max retries ({self.config.max_retries}) exceeded. "
            f"Last error: {last_exception}"
        )
    
    def _is_retryable(self, error: Exception) -> bool:
        """Xác định error có nên retry hay không"""
        retryable_statuses = {429, 500, 502, 503, 504}
        retryable_codes = {
            "rate_limit_exceeded",
            "api_server_overloaded",
            "timeout"
        }
        
        if isinstance(error, httpx.HTTPStatusError):
            return error.response.status_code in retryable_statuses
        
        if isinstance(error, httpx.TimeoutException):
            return True
        
        if hasattr(error, "code") and error.code in retryable_codes:
            return True
        
        return False
    
    def _calculate_delay(self, attempt: int, priority: int) -> float:
        """
        Tính delay với exponential backoff
        Priority cao = delay ngắn hơn
        """
        base = self.config.base_delay * (self.config.exponential_base ** attempt)
        
        # Cap at max delay
        delay = min(base, self.config.max_delay)
        
        # Priority adjustment
        priority_multiplier = {1: 0.5, 2: 1.0, 3: 1.5}.get(priority, 1.0)
        delay *= priority_multiplier
        
        # Add jitter để tránh thundering herd
        if self.config.jitter:
            import random
            jitter_range = delay * 0.1
            delay += random.uniform(-jitter_range, jitter_range)
        
        return max(0.1, delay)
    
    def _is_circuit_open(self) -> bool:
        """Check if circuit breaker is open"""
        if not self._circuit_open:
            return False
        
        # Check if recovery timeout has passed
        if self._elapsed_open_time() >= self._recovery_timeout:
            self._circuit_open = False
            logger.info("Circuit breaker closed - entering half-open state")
            return False
        
        return True
    
    def _trip_circuit_breaker(self):
        """Mở circuit breaker"""
        self._circuit_open = True
        self._circuit_open_time = datetime.utcnow()
        logger.error(
            f"Circuit breaker tripped! Will retry after "
            f"{self._recovery_timeout}s"
        )
    
    def _elapsed_open_time(self) -> float:
        """Tính thời gian circuit đã open"""
        if not self._circuit_open_time:
            return 0
        return (datetime.utcnow() - self._circuit_open_time).total_seconds()


class CircuitBreakerOpenError(Exception):
    """Exception khi circuit breaker mở"""
    pass

class MaxRetriesExceededError(Exception):
    """Exception khi exceeded max retries"""
    pass

5. Ví Dụ Sử Dụng Hoàn Chỉnh

# main.py - Ví dụ sử dụng đầy đủ
import asyncio
import logging
from datetime import datetime

Setup logging

logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) logger = logging.getLogger(__name__) async def main(): """Ví dụ sử dụng AI Queue System với HolySheep""" # Khởi tạo client from config import HolySheepClient, HolySheepConfig from queue_manager import AIRequestQueue, Priority from retry_handler import RetryHandler, RetryConfig # Cấu hình HolySheep - Tỷ giá ¥1=$1, rẻ hơn 85%+ config = HolySheepConfig( api_key="YOUR_HOLYSHEEP_API_KEY", # Thay bằng key thật max_rpm=2800 ) client = HolySheepClient(config) queue = AIRequestQueue("redis://localhost:6379/0") retry_handler = RetryHandler(RetryConfig(max_retries=3)) # === Ví dụ 1: Request ưu tiên cao (VIP user) === vip_request_id = await queue.enqueue( user_id="vip_user_123", model="gpt-4.1", # $8/MTok thay vì $60/MTok messages=[ {"role": "system", "content": "Bạn là assistant chuyên nghiệp."}, {"role": "user", "content": "Phân tích dashboard analytics này"} ], priority=Priority.HIGH ) logger.info(f"VIP request queued: {vip_request_id}") # === Ví dụ 2: Batch job vào off-peak === batch_requests = [ { "user_id": "batch_job_001", "model": "deepseek-v3.2", # Chỉ $0.42/MTok - cực rẻ! "messages": [{"role": "user", "content": f"Summarize document {i}"}], "batch_id": "doc_summarization_001" } for i in range(100) ] await queue.schedule_batch( requests=batch_requests, off_peak_hours=(1, 6), spread_minutes=60 ) logger.info(f"Scheduled {len(batch_requests)} batch requests for off-peak") # === Ví dụ 3: Xử lý request với retry === async def process_ai_request(request_id: str): """Hàm xử lý request từ queue""" # Lấy request từ queue request = await queue.redis.hget( f"queue:{Priority.HIGH.name.lower()}", request_id ) if not request: return # Xử lý với retry result = await retry_handler.execute_with_retry( client.chat_completion, messages=json.loads(request)["messages"], model=json.loads(request)["model"], priority=Priority.HIGH.value ) logger.info(f"Processed {request_id}: {result['usage']['total_tokens']} tokens") return result # === Benchmark với HolySheep === start = datetime.utcnow() # Test 100 requests concurrent tasks = [ queue.enqueue( user_id=f"test_user_{i}", model="gpt-4.1", messages=[{"role": "user", "content": f"Test request {i}"}], priority=Priority.MEDIUM ) for i in range(100) ] request_ids = await asyncio.gather(*tasks) elapsed = (datetime.utcnow() - start).total_seconds() logger.info(f"Enqueued 100 requests in {elapsed:.2f}s") logger.info(f"Throughput: {100/elapsed:.1f} requests/second") # Cleanup await client._client.close() if __name__ == "__main__": asyncio.run(main())

Tối Ưu Chi Phí Với Smart Scheduling

Qua thực chiến triển khai cho nhiều dự án, tôi đã tối ưu được chi phí AI xuống 85%+ bằng các chiến lược sau:

Chiến Lược 1: Off-Peak Scheduling

# Tự động schedule batch jobs vào giờ thấp điểm

HolySheep không tính premium cho giờ cao điểm

OFF_PEAK_CONFIG = { "hours": [1, 2, 3, 4, 5, 6], # 1AM - 6AM "discount_multiplier": 1.0, # Giá y nguyên "capacity_boost": 1.5 # Process 50% more }

So sánh chi phí:

GPT-4.1 qua HolySheep: $8/MTok

GPT-4.1 qua OpenAI (peak): $60/MTok

Tiết kiệm: (60-8)/60 = 86.7%

Chiến Lược 2: Model Routing Thông Minh

# Routing request đến model phù hợp
MODEL_ROUTING = {
    # Simple queries -> DeepSeek V3.2 ($0.42/MTok)
    "simple": {
        "keywords": ["thời tiết", "ngày giờ", "định nghĩa", "từ điển"],
        "model": "deepseek-v3.2",
        "max_tokens": 500,
        "estimated_cost_per_1k": 0.00042  # $0.42/MTok
    },
    
    # Complex analysis -> Claude Sonnet 4.5 ($15/MTok)
    "complex": {
        "keywords": ["phân tích", "so sánh", "đánh giá", "tổng hợp"],
        "model": "claude-sonnet-4.5",
        "max_tokens": 4000,
        "estimated_cost_per_1k": 0.015  # $15/MTok
    },
    
    # Creative/Reasoning -> GPT-4.1 ($8/MTok)
    "creative": {
        "keywords": ["viết", "sáng tạo", "code", "lập trình"],
        "model": "gpt-4.1",
        "max_tokens": 8000,
        "estimated_cost_per_1k": 0.008  # $8/MTok
    }
}

def route_to_model(query: str) -> tuple:
    """Route query đến model phù hợp nhất"""
    query_lower = query.lower()