Đêm 11 giờ, khi hầu hết mọi người đã ngủ, hệ thống chăm sóc khách hàng AI của một trang thương mại điện tử Việt Nam đang đối mặt với cơn bão truy cập. Đó là thời điểm Sale Flash 11.11 vừa bắt đầu — hàng nghìn khách hàng truy cập đồng thời, mỗi người đều cần tư vấn sản phẩm, theo dõi đơn hàng, và giải đáp thắc mắc. Và rồi, dòng chữ kinh hoàng xuất hiện: HTTP 429 — Too Many Requests.

Tôi đã từng ở đó. Không phải một lần, mà nhiều lần — với cả hệ thống RAG doanh nghiệp xử lý hàng triệu tài liệu, lẫn các dự án cá nhân của lập trình viên freelance. Lỗi 429 không chỉ là một thông báo khó chịu; nó là tín hiệu cho thấy kiến trúc của bạn đang bị quá tải ở một điểm nào đó.

Bài viết này sẽ đưa bạn đi từ việc hiểu nguyên nhân gốc rễ của lỗi 429 trên nền tảng HolySheep AI, đến việc triển khai các giải pháp có thể sao chép và chạy ngay lập tức. Đặc biệt, với mức giá chỉ từ $0.42/MTok (DeepSeek V3.2) và độ trễ dưới 50ms, HolySheep là lựa chọn tối ưu để xây dựng hệ thống AI scale mà không lo về chi phí.

Tại sao lỗi 429 xảy ra — Phân tích chuyên sâu

Trước khi đi vào giải pháp, chúng ta cần hiểu "con quái vật" 429 thực sự là gì. HTTP 429 là mã trạng thái cho biết client đã gửi quá nhiều request trong một khoảng thời gian ngắn, vượt quá giới hạn rate limit mà server cho phép.

Đối với API AI, có ba loại giới hạn chính:

Chiến lược xử lý lỗi 429 trong thực tế

1. Triển khai Exponential Backoff thông minh

Đây là chiến lược "chờ đợi có chiến lược" — khi gặp lỗi 429, hệ thống sẽ chờ một khoảng thời gian ngày càng tăng trước khi thử lại, thay vì spam request gây tắc nghẽn nghiêm trọng hơn.

# HolySheep AI - Client với Exponential Backoff và Rate Limiting
import time
import requests
from datetime import datetime, timedelta
from collections import deque
import threading

class HolySheepAIClient:
    def __init__(self, api_key: str, base_url: str = "https://api.holysheep.ai/v1"):
        self.api_key = api_key
        self.base_url = base_url
        self.headers = {
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json"
        }
        
        # Rate limiting tracking
        self.request_timestamps = deque(maxlen=60)  # Lưu timestamp 60 request gần nhất
        self.tokens_used = 0
        self.token_window_start = datetime.now()
        self.tpm_limit = 150000  # 150K tokens/phút (tùy gói subscription)
        self.rpm_limit = 500      # 500 requests/phút
        
        # Thread lock cho concurrency safety
        self._lock = threading.Lock()
    
    def _check_rate_limit(self, estimated_tokens: int) -> bool:
        """Kiểm tra và cập nhật rate limit"""
        now = datetime.now()
        
        with self._lock:
            # Reset token counter sau 1 phút
            if (now - self.token_window_start).total_seconds() >= 60:
                self.tokens_used = 0
                self.token_window_start = now
            
            # Kiểm tra TPM
            if self.tokens_used + estimated_tokens > self.tpm_limit:
                return False
            
            # Kiểm tra RPM (chỉ cho phép 1 request/125ms để đảm bảo ≤480 RPM)
            if self.request_timestamps:
                oldest = self.request_timestamps[0]
                if (now - oldest).total_seconds() < 1.25:
                    return False
            
            return True
    
    def _calculate_backoff(self, attempt: int, retry_after: int = None) -> float:
        """Tính toán thời gian chờ exponential backoff"""
        if retry_after:
            return retry_after
        
        # Exponential backoff: 1s, 2s, 4s, 8s, 16s... với jitter
        base_delay = min(2 ** attempt, 32)  # Tối đa 32 giây
        import random
        jitter = random.uniform(0, 0.5)  # Thêm jitter 0-0.5s
        return base_delay + jitter
    
    def chat_completion(self, messages: list, model: str = "gpt-4.1", 
                        max_tokens: int = 1000, max_retries: int = 5) -> dict:
        """
        Gửi request chat completion với xử lý lỗi 429 thông minh
        """
        url = f"{self.base_url}/chat/completions"
        payload = {
            "model": model,
            "messages": messages,
            "max_tokens": max_tokens
        }
        
        estimated_tokens = sum(len(str(m)) for m in messages) + max_tokens
        
        for attempt in range(max_retries):
            # Kiểm tra rate limit trước khi gửi
            if not self._check_rate_limit(estimated_tokens):
                wait_time = 60 - (datetime.now() - self.token_window_start).total_seconds()
                if wait_time > 0:
                    print(f"[Rate Limit] Chờ {wait_time:.1f}s trước khi thử lại...")
                    time.sleep(wait_time)
                continue
            
            try:
                with self._lock:
                    self.request_timestamps.append(datetime.now())
                    self.tokens_used += estimated_tokens
                
                response = requests.post(
                    url, 
                    headers=self.headers, 
                    json=payload,
                    timeout=30
                )
                
                if response.status_code == 429:
                    # Parse Retry-After header nếu có
                    retry_after = int(response.headers.get('Retry-After', 0))
                    wait_time = self._calculate_backoff(attempt, retry_after)
                    print(f"[429 Too Many Requests] Lần thử {attempt + 1}/{max_retries}, "
                          f"chờ {wait_time:.2f}s...")
                    time.sleep(wait_time)
                    continue
                
                response.raise_for_status()
                return response.json()
                
            except requests.exceptions.RequestException as e:
                if attempt == max_retries - 1:
                    raise Exception(f"Lỗi sau {max_retries} lần thử: {str(e)}")
                wait_time = self._calculate_backoff(attempt)
                print(f"[Lỗi {type(e).__name__}] Thử lại sau {wait_time:.2f}s...")
                time.sleep(wait_time)
        
        raise Exception("Đã vượt quá số lần thử tối đa")

Ví dụ sử dụng

if __name__ == "__main__": client = HolySheepAIClient(api_key="YOUR_HOLYSHEEP_API_KEY") messages = [ {"role": "system", "content": "Bạn là trợ lý AI hỗ trợ khách hàng thương mại điện tử."}, {"role": "user", "content": "Tôi muốn đổi size áo từ M sang L được không?"} ] try: response = client.chat_completion(messages, model="gpt-4.1") print("Kết quả:", response['choices'][0]['message']['content']) except Exception as e: print(f"Lỗi: {e}")

2. Batch Processing với Token Budgeting

Đối với hệ thống RAG doanh nghiệp hoặc xử lý batch lớn, việc quản lý token budget là then chốt. Dưới đây là một implementation hoàn chỉnh với token bucketing strategy.

# HolySheep AI - Batch Processing với Token Bucket Rate Limiter
import asyncio
import aiohttp
import time
from typing import List, Dict, Any
from dataclasses import dataclass, field
from collections import defaultdict
import json

@dataclass
class TokenBucket:
    """Token Bucket cho phép burst nhưng duy trì rate limit trung bình"""
    capacity: int  # Dung lượng bucket (số tokens tối đa)
    refill_rate: float  # Tốc độ refill (tokens/giây)
    current_tokens: float = field(init=False)
    last_refill: float = field(init=False)
    
    def __post_init__(self):
        self.current_tokens = float(self.capacity)
        self.last_refill = time.time()
    
    def _refill(self):
        """Refill bucket dựa trên thời gian trôi qua"""
        now = time.time()
        elapsed = now - self.last_refill
        refill_amount = elapsed * self.refill_rate
        self.current_tokens = min(self.capacity, self.current_tokens + refill_amount)
        self.last_refill = now
    
    def consume(self, tokens: int, wait: bool = True) -> float:
        """
        Tiêu thụ tokens từ bucket
        Returns: Thời gian chờ (0 nếu thành công ngay)
        """
        self._refill()
        
        if self.current_tokens >= tokens:
            self.current_tokens -= tokens
            return 0
        
        if not wait:
            return -1  # Indicate not enough tokens
        
        # Tính thời gian chờ để có đủ tokens
        tokens_needed = tokens - self.current_tokens
        wait_time = tokens_needed / self.refill_rate
        return wait_time

class HolySheepBatchProcessor:
    """
    Xử lý batch requests với token bucketing thông minh
    Tối ưu cho hệ thống RAG doanh nghiệp
    """
    
    def __init__(self, api_key: str, tpm_limit: int = 150000):
        self.api_key = api_key
        self.base_url = "https://api.holysheep.ai/v1"
        self.headers = {
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json"
        }
        
        # Token bucket với refill rate = 2500 tokens/giây (150K/60s)
        self.bucket = TokenBucket(
            capacity=tpm_limit,
            refill_rate=tpm_limit / 60.0
        )
        
        self.semaphore = asyncio.Semaphore(10)  # Max 10 concurrent requests
        self.results = []
        self.errors = []
    
    async def _estimate_tokens(self, text: str) -> int:
        """Ước tính tokens (approx: 1 token ≈ 4 chars)"""
        return len(text) // 4 + 100  # Thêm buffer cho overhead
    
    async def _process_single(self, session: aiohttp.ClientSession, 
                               item: Dict, semaphore: asyncio.Semaphore) -> Dict:
        """Xử lý một item đơn lẻ"""
        async with semaphore:
            messages = item.get("messages", [])
            model = item.get("model", "gpt-4.1")
            max_tokens = item.get("max_tokens", 1000)
            
            # Ước tính tokens cần thiết
            estimated_tokens = sum(await self._estimate_tokens(str(m)) for m in messages)
            estimated_tokens += max_tokens
            
            # Chờ đủ tokens trong bucket
            wait_time = self.bucket.consume(estimated_tokens, wait=True)
            if wait_time > 0:
                await asyncio.sleep(wait_time)
            
            payload = {
                "model": model,
                "messages": messages,
                "max_tokens": max_tokens
            }
            
            url = f"{self.base_url}/chat/completions"
            
            for retry in range(3):
                try:
                    async with session.post(url, json=payload, headers=self.headers, 
                                           timeout=aiohttp.ClientTimeout(total=30)) as resp:
                        if resp.status == 429:
                            retry_after = int(resp.headers.get('Retry-After', 60))
                            await asyncio.sleep(retry_after)
                            continue
                        
                        data = await resp.json()
                        
                        if resp.status != 200:
                            self.errors.append({
                                "item": item.get("id"),
                                "error": data.get("error", {}).get("message", "Unknown error")
                            })
                            return {"id": item.get("id"), "error": True}
                        
                        # Trừ tokens thực tế từ bucket
                        actual_tokens = data.get("usage", {}).get("total_tokens", estimated_tokens)
                        self.bucket.current_tokens = max(0, self.bucket.current_tokens - actual_tokens)
                        
                        self.results.append({
                            "id": item.get("id"),
                            "response": data["choices"][0]["message"]["content"],
                            "usage": data.get("usage")
                        })
                        return {"id": item.get("id"), "success": True}
                
                except asyncio.TimeoutError:
                    if retry == 2:
                        self.errors.append({"item": item.get("id"), "error": "Timeout"})
                        return {"id": item.get("id"), "error": True}
            
            return {"id": item.get("id"), "error": True}
    
    async def process_batch(self, items: List[Dict]) -> Dict:
        """
        Xử lý batch items với rate limiting tối ưu
        """
        connector = aiohttp.TCPConnector(limit=20)
        async with aiohttp.ClientSession(connector=connector) as session:
            tasks = [
                self._process_single(session, item, self.semaphore)
                for item in items
            ]
            
            results = await asyncio.gather(*tasks, return_exceptions=True)
            
            return {
                "processed": len(self.results),
                "errors": len(self.errors),
                "success_rate": f"{len(self.results)/len(items)*100:.1f}%",
                "results": self.results[:10],  # Trả về 10 kết quả đầu
                "error_summary": self.errors[:5]  # Trả về 5 lỗi đầu
            }

Ví dụ sử dụng cho hệ thống RAG

async def demo_rag_batch_processing(): processor = HolySheepBatchProcessor(api_key="YOUR_HOLYSHEEP_API_KEY") # Mô phỏng 100 truy vấn RAG từ tài liệu doanh nghiệp batch_items = [ { "id": f"doc_{i}", "messages": [ {"role": "system", "content": "Bạn là chuyên gia phân tích tài liệu kỹ thuật."}, {"role": "user", "content": f"Tóm tắt nội dung chính của tài liệu số {i} về quy trình sản xuất."} ], "model": "deepseek-v3.2", # Chỉ $0.42/MTok! "max_tokens": 500 } for i in range(100) ] start_time = time.time() result = await processor.process_batch(batch_items) elapsed = time.time() - start_time print(f"Hoàn thành trong {elapsed:.2f}s") print(f"Xử lý thành công: {result['processed']}/{len(batch_items)}") print(f"Tỷ lệ thành công: {result['success_rate']}") print(f"Tổng chi phí ước tính: ${result['processed'] * 0.5 * 0.00042:.2f}") # ~500 tokens × $0.42/MTok if __name__ == "__main__": asyncio.run(demo_rag_batch_processing())

3. Monitoring Dashboard cho Production

Để chủ động phát hiện và ngăn chặn lỗi 429 trước khi chúng ảnh hưởng người dùng, việc monitoring là không thể thiếu.

# HolySheep AI - Production Monitoring với Prometheus Metrics
from flask import Flask, jsonify, request
import time
import logging
from functools import wraps
from collections import defaultdict
from threading import Lock
import prometheus_client
from prometheus_client import Counter, Histogram, Gauge, generate_latest

Prometheus metrics

REQUEST_COUNT = Counter( 'holysheep_requests_total', 'Total requests to HolySheep API', ['endpoint', 'status_code'] ) REQUEST_LATENCY = Histogram( 'holysheep_request_latency_seconds', 'Request latency in seconds', ['endpoint', 'model'] ) RATE_LIMIT_REMAINING = Gauge( 'holysheep_rate_limit_remaining', 'Remaining rate limit quota', ['tier'] ) ERROR_COUNT = Counter( 'holysheep_errors_total', 'Total errors by type', ['error_type', 'model'] ) BATCH_PROCESSING_TIME = Histogram( 'holysheep_batch_processing_seconds', 'Batch processing time', ['batch_size', 'model'] ) class RateLimitMonitor: """ Giám sát và cảnh báo sớm về rate limit usage """ def __init__(self): self.window_size = 60 # 1 phút self.request_history = defaultdict(list) self.token_usage_history = defaultdict(list) self._lock = Lock() # Cấu hình tier limits (tùy gói subscription) self.tier_limits = { "free": {"rpm": 60, "tpm": 30000}, "pro": {"rpm": 500, "tpm": 150000}, "enterprise": {"rpm": 5000, "tpm": 1500000} } def record_request(self, tier: str, tokens: int, success: bool, latency: float): """Ghi nhận request để monitor""" now = time.time() with self._lock: # Clean old entries self._cleanup_old_entries(now) # Record new entries self.request_history[tier].append(now) self.token_usage_history[tier].append(tokens) # Update Prometheus gauges remaining_rpm = self._get_remaining_rpm(tier) remaining_tpm = self._get_remaining_tpm(tier) RATE_LIMIT_REMAINING.labels(tier=tier).set(min(remaining_rpm, remaining_tpm)) def _cleanup_old_entries(self, now: float): """Xóa entries cũ hơn window_size""" cutoff = now - self.window_size for tier in self.request_history: self.request_history[tier] = [ t for t in self.request_history[tier] if t > cutoff ] self.token_usage_history[tier] = [ (t, tokens) for t, tokens in self.token_usage_history[tier] if t > cutoff ] def _get_remaining_rpm(self, tier: str) -> int: """Tính remaining RPM""" current_count = len(self.request_history[tier]) limit = self.tier_limits.get(tier, {}).get("rpm", 60) return max(0, limit - current_count) def _get_remaining_tpm(self, tier: str) -> int: """Tính remaining TPM""" current_tokens = sum( tokens for _, tokens in self.token_usage_history[tier] ) limit = self.tier_limits.get(tier, {}).get("tpm", 30000) return max(0, limit - current_tokens) def get_health_status(self, tier: str) -> dict: """Lấy health status của một tier""" remaining_rpm = self._get_remaining_rpm(tier) remaining_tpm = self._get_remaining_tpm(tier) rpm_limit = self.tier_limits.get(tier, {}).get("rpm", 60) tpm_limit = self.tier_limits.get(tier, {}).get("tpm", 30000) rpm_usage_pct = (1 - remaining_rpm/rpm_limit) * 100 tpm_usage_pct = (1 - remaining_tpm/tpm_limit) * 100 status = "healthy" warning_message = None if rpm_usage_pct > 80 or tpm_usage_pct > 80: status = "warning" warning_message = f"RPM usage: {rpm_usage_pct:.1f}%, TPM usage: {tpm_usage_pct:.1f}%" if rpm_usage_pct > 95 or tpm_usage_pct > 95: status = "critical" warning_message = f"Sắp vượt rate limit! RPM: {rpm_usage_pct:.1f}%, TPM: {tpm_usage_pct:.1f}%" return { "status": status, "tier": tier, "rpm": { "used": rpm_limit - remaining_rpm, "limit": rpm_limit, "remaining": remaining_rpm, "usage_percent": rpm_usage_pct }, "tpm": { "used": tpm_limit - remaining_tpm, "limit": tpm_limit, "remaining": remaining_tpm, "usage_percent": tpm_usage_pct }, "warning": warning_message, "timestamp": time.time() }

Flask app với monitoring

app = Flask(__name__) monitor = RateLimitMonitor() def track_request(model: str): """Decorator để track request metrics""" def decorator(f): @wraps(f) def wrapper(*args, **kwargs): start_time = time.time() tier = kwargs.get('tier', 'free') try: response = f(*args, **kwargs) latency = time.time() - start_time REQUEST_COUNT.labels(endpoint=f.__name__, status_code=200).inc() REQUEST_LATENCY.labels(endpoint=f.__name__, model=model).observe(latency) monitor.record_request(tier, tokens=1000, success=True, latency=latency) return response except Exception as e: latency = time.time() - start_time error_type = type(e).__name__ REQUEST_COUNT.labels(endpoint=f.__name__, status_code=500).inc() ERROR_COUNT.labels(error_type=error_type, model=model).inc() return {"error": str(e)}, 500 return wrapper return decorator @app.route('/api/chat', methods=['POST']) @track_request(model='gpt-4.1') def chat_endpoint(tier: str = 'free'): """Endpoint chat với monitoring""" data = request.get_json() messages = data.get('messages', []) # TODO: Gọi HolySheep API ở đây # import requests # response = requests.post( # "https://api.holysheep.ai/v1/chat/completions", # headers={"Authorization": f"Bearer {api_key}"}, # json={"model": "gpt-4.1", "messages": messages} # ) return jsonify({"status": "ok", "message": "Request processed"}) @app.route('/api/monitor/health') def health_check(): """Endpoint kiểm tra health và rate limit status""" tier = request.args.get('tier', 'pro') health = monitor.get_health_status(tier) status_code = 200 if health['status'] == 'critical': status_code = 503 # Service Unavailable return jsonify(health), status_code @app.route('/metrics') def metrics(): """Prometheus metrics endpoint""" return generate_latest(), 200, {'Content-Type': 'text/plain; charset=utf-8'} if __name__ == '__main__': logging.basicConfig(level=logging.INFO) app.run(host='0.0.0.0', port=5000)

Lỗi thường gặp và cách khắc phục

Lỗi 1: 429 ngay khi bắt đầu — "Cold Start Burst"

Mô tả lỗi: Ngay sau khi khởi động service hoặc sau khi downtime, hệ thống gửi một lượng lớn request cùng lúc để "warm up", gây ra lỗi 429 ngay lập tức.

Nguyên nhân gốc: Không có cơ chế rate limiting phía client, tất cả workers cùng start đồng thời.

Giải pháp:

# Giải pháp: Warm-up có kiểm soát với staggered startup
import asyncio
import random

class ControlledWarmUp:
    """
    Khởi động workers có kiểm soát để tránh burst request
    """
    
    def __init__(self, workers: int, base_delay: float = 2.0, jitter: float = 1.0):
        self.workers = workers
        self.base_delay = base_delay
        self.jitter = jitter
    
    async def staggered_start(self, worker_id: int, task_fn):
        """
        Mỗi worker chờ một khoảng thời gian ngẫu nhiên trước khi bắt đầu
        """
        # Worker 0 start ngay, worker 1 chờ 2-3s, worker 2 chờ 4-6s...
        delay = (worker_id * self.base_delay) + random.uniform(0, self.jitter * worker_id)
        
        print(f"Worker {worker_id}: Chờ {delay:.2f}s trước khi start...")
        await asyncio.sleep(delay)
        
        # Warm-up request nhẹ trước khi xử lý chính
        await self._warmup_request(worker_id)
        
        print(f"Worker {worker_id}: Sẵn sàng xử lý!")
        await task_fn()
    
    async def _warmup_request(self, worker_id: int):
        """Gửi request warm-up đơn giản để establish connection"""
        try:
            # Warm-up với model nhẹ
            warmup_payload = {
                "model": "deepseek-v3.2",  # Model rẻ nhất để warm-up
                "messages": [{"role": "user", "content": "ping"}],
                "max_tokens": 1
            }
            
            # Sử dụng session reuse cho better connection pooling
            async with aiohttp.ClientSession() as session:
                async with session.post(
                    "https://api.holysheep.ai/v1/chat/completions",
                    json=warmup_payload,
                    headers={"Authorization": f"Bearer YOUR_HOLYSHEEP_API_KEY"},
                    timeout=aiohttp.ClientTimeout(total=5)
                ) as resp:
                    if resp.status == 200:
                        print(f"Worker {worker_id}: Warm-up thành công")
                    else:
                        print(f"Worker {worker_id}: Warm-up trả về {resp.status}")
                        
        except Exception as e:
            print(f"Worker {worker_id}: Warm-up lỗi (không ảnh hưởng) - {e}")
    
    async def start_all(self, task_fn):
        """Start tất cả workers với staggered delay"""
        tasks = [
            self.staggered_start(i, task_fn)
            for i in range(self.workers)
        ]
        await asyncio.gather(*tasks)

Sử dụng

async def worker_task(worker_id: int): """Task chính của mỗi worker""" print(f"Worker {worker_id} đang xử lý...") await asyncio.sleep(10)

Khởi động 5 workers với staggered delay

warmup = ControlledWarmUp(workers=5, base_delay=3.0, jitter=1.5) asyncio.run(warmup.start_all(worker_task))

Lỗi 2: 429 không liên tục — "Token Leak"

Mô tả lỗi: Lỗi 429 xuất hiện không đều đặn, đôi khi ngay cả khi số lượng request không nhiều. Đặc biệt xảy ra khi xử lý văn bản dài hoặc response có nhiều tokens.

Nguyên nhân gốc: TPM (Tokens Per Minute) bị vượt do không theo dõi token count chính xác, đặc biệt với các prompt/system message dài.

Giải pháp:

# Giải pháp: Token-aware request scheduler với accurate counting
import tiktoken  # Hoặc dùng approximate: num_tokens_from_string

class TokenAwareScheduler:
    """
    Scheduler thông minh đếm tokens chính xác trước khi gửi request
    """
    
    def __init__(self, tpm_limit: int = 150000, safety_margin: float = 0.9):
        self.tpm_limit = tpm_limit
        self.safety_limit = int(tpm_limit * safety_margin)
        self.current_window_tokens = 0
        self.window_start = time.time()
        self.pending_tokens = []
        self.lock = asyncio.Lock()
        
        # Cache encoding để reuse
        self._encoding = None
    
    def _get_encoding(self):
        """Lazy load encoding model"""
        if self._encoding is None:
            # Sử dụng cl100k_base cho GPT-4/GPT-3.5 models
            self._encoding = tiktoken.get_encoding("cl100k_base")
        return self._encoding
    
    def count_tokens(self, text: str) -> int:
        """Đếm tokens chính xác cho văn bản"""
        encoding = self._get_encoding()
        return len(encoding.encode(text))
    
    def count_messages_tokens(self, messages: list, max_response_tokens: int = 1000) -> int:
        """
        Đếm tổng tokens cho messages list (theo OpenAI format)
        """
        encoding = self._get_encoding()
        tokens_per_message = 4  # Overhead cho format
        tokens = 0
        
        for message in messages:
            tokens += tokens_per_message
            tokens += self.count_tokens(message.get("content", ""))
            tokens += self.count_tokens(message.get("role", ""))
        
        tokens += 3  # Assistant message overhead
        tokens += max_response_tokens  # Reserve cho response
        
        return tokens