Giới thiệu
Khi tôi bắt đầu hành trình xây dựng hệ thống AI production vào năm 2023, một trong những thách thức lớn nhất không phải là viết code — mà là quản lý chi phí API. Đội ngũ 8 người của tôi đã tiêu tốn hơn **$12,000/tháng** cho các cuộc gọi API chính thức, và đó mới chỉ là giai đoạn MVP. Khi sản phẩm scale lên 10x, con số đó sẽ là $120,000 — một con số không thể chấp nhận được với startup như chúng tôi.
Bài viết này là playbook thực chiến về cách tôi thiết kế **API Key轮换机制 (cơ chế xoay vòng API Key)** trên nền tảng trung chuyển, giúp đội ngũ tiết kiệm **85% chi phí** mà vẫn duy trì uptime 99.9%. Tất cả các ví dụ code đều sử dụng
HolySheep AI — nền tảng trung chuyển mà tôi tin tưởng sau khi thử nghiệm nhiều giải pháp khác nhau.
---
Vì sao cần API Key轮换机制?
Bối cảnh thực tế
Với một ứng dụng AI có lưu lượng lớn, việc phụ thuộc vào một API Key duy nhất gặp nhiều rủi ro:
- **Rate limiting**: Một key duy nhất có giới hạn requests/phút
- **Single point of failure**: Key hết hạn hoặc bị revoke = ứng dụng chết
- **Không tận dụng được tier giảm giá**: Nhiều provider có volume discount
- **Khó track chi phí**: Không thể phân bổ chi phí theo feature/team
Giải pháp: Multi-Key Rotation
Thay vì dùng 1 key, chúng ta sử dụng **pool of keys** với logic xoay vòng thông minh:
┌─────────────────────────────────────────────────────┐
│ API Request Flow │
├─────────────────────────────────────────────────────┤
│ │
│ Client Request │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ Key Pool │ ←──── Key #1: 45% quota used │
│ │ │ ←──── Key #2: 12% quota used │
│ │ [Key #1] │ ←──── Key #3: 78% quota used │
│ │ [Key #2] │ ←──── Key #4: 3% quota used ★ │
│ │ [Key #3] │ │
│ │ [Key #4] │ │
│ └─────────────┘ │
│ │ │
│ ▼ │
│ Load Balancer + Health Check │
│ │ │
│ ▼ │
│ ┌─────────────────────────────┐ │
│ │ HolySheep API Gateway │ │
│ │ base_url: api.holysheep.ai│ │
│ └─────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────┘
---
Triển khai HolySheep: Từ pain points đến solution
Đánh giá chi phí trước và sau migration
| Model | Provider chính thức | HolySheep AI | Tiết kiệm |
|-------|---------------------|--------------|-----------|
| GPT-4.1 | $30/MTok | **$8/MTok** | 73% |
| Claude Sonnet 4.5 | $45/MTok | **$15/MTok** | 67% |
| Gemini 2.5 Flash | $7.50/MTok | **$2.50/MTok** | 67% |
| DeepSeek V3.2 | $1.20/MTok | **$0.42/MTok** | 65% |
Với lưu lượng 50 triệu tokens/tháng (con số thực tế của đội tôi sau 6 tháng):
- **Chi phí cũ**: ~$2,500/tháng
- **Chi phí mới với HolySheep**: ~$375/tháng
- **Tiết kiệm**: **$2,125/tháng = $25,500/năm**
Các bước migration chi tiết
#### Bước 1: Thiết lập project và cài đặt SDK
# Tạo virtual environment
python3 -m venv venv_hsheep
source venv_hsheep/bin/activate
Cài đặt dependencies
pip install requests redis python-dotenv aiohttp
#### Bước 2: Tạo Key Pool Manager với logic xoay vòng
"""
HolySheep AI Key Pool Manager
Tự động xoay vòng API keys với health check và fallback
"""
import requests
import time
import threading
from dataclasses import dataclass, field
from typing import List, Optional, Dict
from datetime import datetime, timedelta
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
@dataclass
class APIKeyConfig:
"""Cấu hình cho một API Key"""
key: str
name: str
max_requests_per_minute: int = 60
current_requests: int = 0
last_reset: datetime = field(default_factory=datetime.now)
error_count: int = 0
is_healthy: bool = True
latency_p99_ms: float = 0.0
class HolySheepKeyPool:
"""
Key Pool Manager cho HolySheep AI
Hỗ trợ xoay vòng thông minh, health check và retry logic
"""
BASE_URL = "https://api.holysheep.ai/v1"
def __init__(self, keys: List[str]):
self.keys = [APIKeyConfig(key=k, name=f"Key-{i+1}") for i, k in enumerate(keys)]
self.lock = threading.Lock()
self.redis_client = None # Optional: dùng Redis cho distributed systems
# Metrics
self.total_requests = 0
self.failed_requests = 0
self.cost_saved_usd = 0.0
def _get_available_key(self) -> Optional[APIKeyConfig]:
"""
Chọn key có quota cao nhất và đang healthy
Thuật toán: Weighted random dựa trên remaining quota
"""
with self.lock:
available_keys = [k for k in self.keys if k.is_healthy and k.error_count < 3]
if not available_keys:
logger.error("Không có key khả dụng!")
return None
# Sắp xếp theo remaining quota (descending)
available_keys.sort(
key=lambda k: (k.max_requests_per_minute - k.current_requests),
reverse=True
)
# Chọn key có quota cao nhất
selected = available_keys[0]
selected.current_requests += 1
return selected
def _reset_counters_if_needed(self):
"""Reset counters mỗi phút"""
with self.lock:
for key in self.keys:
if (datetime.now() - key.last_reset).total_seconds() >= 60:
key.current_requests = 0
key.last_reset = datetime.now()
def _check_key_health(self, key: APIKeyConfig) -> bool:
"""Health check bằng cách gọi API nhẹ (models list)"""
try:
start = time.time()
response = requests.get(
f"{self.BASE_URL}/models",
headers={"Authorization": f"Bearer {key.key}"},
timeout=5
)
latency_ms = (time.time() - start) * 1000
key.latency_p99_ms = latency_ms
key.is_healthy = response.status_code == 200
if response.status_code == 401:
logger.warning(f"Key {key.name} có vấn đề authentication!")
key.error_count += 10
return key.is_healthy
except Exception as e:
logger.error(f"Health check failed cho {key.name}: {e}")
key.error_count += 1
key.is_healthy = False
return False
def chat_completion(
self,
messages: List[Dict],
model: str = "gpt-4.1",
temperature: float = 0.7,
max_tokens: int = 1000
) -> Dict:
"""
Gọi HolySheep Chat Completion API với automatic key rotation
"""
self._reset_counters_if_needed()
self.total_requests += 1
# Retry với các key khác nhau
tried_keys = set()
max_retries = len(self.keys)
for attempt in range(max_retries):
key = self._get_available_key()
if not key:
raise Exception("Tất cả các keys đều không khả dụng")
if key.key in tried_keys:
continue
tried_keys.add(key.key)
try:
start_time = time.time()
response = requests.post(
f"{self.BASE_URL}/chat/completions",
headers={
"Authorization": f"Bearer {key.key}",
"Content-Type": "application/json"
},
json={
"model": model,
"messages": messages,
"temperature": temperature,
"max_tokens": max_tokens
},
timeout=30
)
latency_ms = (time.time() - start_time) * 1000
if response.status_code == 200:
result = response.json()
logger.info(f"✓ Request thành công với {key.name} | Latency: {latency_ms:.1f}ms")
return result
elif response.status_code == 429:
# Rate limited - thử key khác
logger.warning(f"Rate limited với {key.name}, thử key khác...")
key.current_requests = key.max_requests_per_minute
continue
elif response.status_code == 401:
key.error_count += 10
logger.error(f"Key {key.name} bị revoke, đánh dấu unhealthy")
continue
else:
key.error_count += 1
logger.error(f"Lỗi {response.status_code} với {key.name}: {response.text}")
except requests.exceptions.Timeout:
key.error_count += 1
logger.error(f"Timeout với {key.name}")
continue
except Exception as e:
key.error_count += 1
logger.error(f"Exception với {key.name}: {e}")
continue
self.failed_requests += 1
raise Exception(f"Tất cả {max_retries} keys đều thất bại sau retry")
def get_stats(self) -> Dict:
"""Lấy thống kê usage"""
return {
"total_requests": self.total_requests,
"failed_requests": self.failed_requests,
"success_rate": f"{(self.total_requests - self.failed_requests) / max(self.total_requests, 1) * 100:.2f}%",
"keys_status": [
{
"name": k.name,
"healthy": k.is_healthy,
"error_count": k.error_count,
"latency_ms": k.latency_p99_ms
}
for k in self.keys
]
}
============================================================
VÍ DỤ SỬ DỤNG
============================================================
if __name__ == "__main__":
# Khởi tạo với nhiều HolySheep API Keys
# Lấy keys từ: https://www.holysheep.ai/dashboard/api-keys
holy_keys = [
"YOUR_HOLYSHEEP_API_KEY_1",
"YOUR_HOLYSHEEP_API_KEY_2",
"YOUR_HOLYSHEEP_API_KEY_3"
]
pool = HolySheepKeyPool(keys=holy_keys)
# Test request
response = pool.chat_completion(
messages=[
{"role": "system", "content": "Bạn là trợ lý AI tiếng Việt hữu ích."},
{"role": "user", "content": "Giải thích API Key轮换机制 là gì?"}
],
model="gpt-4.1",
max_tokens=500
)
print(f"Response: {response['choices'][0]['message']['content']}")
print(f"Usage: {response['usage']}")
print(f"Stats: {pool.get_stats()}")
#### Bước 3: Async version cho high-throughput systems
"""
HolySheep Async Key Pool - Dành cho systems có lưu lượng cao
Sử dụng aiohttp cho concurrent requests
"""
import asyncio
import aiohttp
import time
from typing import List, Dict, Optional
from dataclasses import dataclass
import logging
logger = logging.getLogger(__name__)
@dataclass
class AsyncKeyState:
key: str
semaphore: asyncio.Semaphore
rate_limit: int
current_usage: int = 0
last_window_reset: float = 0.0
consecutive_errors: int = 0
is_banned: bool = False
class HolySheepAsyncPool:
"""
Async Key Pool với rate limiting thông minh
Phù hợp cho batch processing, web servers có traffic cao
"""
BASE_URL = "https://api.holysheep.ai/v1"
def __init__(self, keys: List[str], requests_per_minute: int = 60):
self.key_states = [
AsyncKeyState(
key=k,
semaphore=asyncio.Semaphore(requests_per_minute),
rate_limit=requests_per_minute
)
for k in keys
]
self.session: Optional[aiohttp.ClientSession] = None
async def __aenter__(self):
self.session = aiohttp.ClientSession()
return self
async def __aexit__(self, *args):
if self.session:
await self.session.close()
async def _acquire_slot(self, state: AsyncKeyState) -> bool:
"""Acquire a rate limit slot cho key này"""
current_time = time.time()
# Reset window mỗi 60 giây
if current_time - state.last_window_reset >= 60:
state.current_usage = 0
state.last_window_reset = current_time
if state.current_usage >= state.rate_limit:
wait_time = 60 - (current_time - state.last_window_reset)
if wait_time > 0:
logger.info(f"Rate limit reached, waiting {wait_time:.1f}s...")
await asyncio.sleep(wait_time)
state.current_usage = 0
state.last_window_reset = time.time()
state.current_usage += 1
return True
async def chat_completion_async(
self,
messages: List[Dict],
model: str = "gpt-4.1",
timeout: int = 30
) -> Dict:
"""
Async chat completion với automatic key rotation
"""
errors = []
for state in self.key_states:
if state.is_banned:
continue
await self._acquire_slot(state)
try:
start = time.time()
async with self.session.post(
f"{self.BASE_URL}/chat/completions",
json={
"model": model,
"messages": messages,
"temperature": 0.7,
"max_tokens": 2000
},
headers={
"Authorization": f"Bearer {state.key}",
"Content-Type": "application/json"
},
timeout=aiohttp.ClientTimeout(total=timeout)
) as resp:
latency = (time.time() - start) * 1000
if resp.status == 200:
data = await resp.json()
logger.info(f"✓ Success | Key: {state.key[:15]}... | Latency: {latency:.0f}ms")
return data
elif resp.status == 429:
logger.warning(f"Rate limited on {state.key[:15]}...")
state.consecutive_errors += 1
if state.consecutive_errors >= 3:
state.is_banned = True
logger.error(f"Banning key {state.key[:15]}...")
continue
elif resp.status == 401:
state.is_banned = True
logger.error(f"Key {state.key[:15]} invalid, banning...")
continue
else:
error_text = await resp.text()
errors.append(f"Status {resp.status}: {error_text}")
state.consecutive_errors += 1
except asyncio.TimeoutError:
errors.append(f"Timeout on {state.key[:15]}")
state.consecutive_errors += 1
except Exception as e:
errors.append(f"{state.key[:15]}: {str(e)}")
state.consecutive_errors += 1
raise Exception(f"Tất cả keys đều thất bại. Errors: {errors}")
async def batch_chat(
self,
batch_messages: List[List[Dict]],
model: str = "gpt-4.1",
concurrency: int = 5
) -> List[Dict]:
"""
Xử lý batch requests với concurrency limit
"""
semaphore = asyncio.Semaphore(concurrency)
async def process_single(msgs: List[Dict], idx: int):
async with semaphore:
try:
result = await self.chat_completion_async(msgs, model)
return {"index": idx, "success": True, "data": result}
except Exception as e:
return {"index": idx, "success": False, "error": str(e)}
tasks = [process_single(msgs, i) for i, msgs in enumerate(batch_messages)]
results = await asyncio.gather(*tasks)
return list(results)
============================================================
VÍ DỤ SỬ DỤNG
============================================================
async def main():
"""Ví dụ batch processing với HolySheep"""
async with HolySheepAsyncPool(
keys=[
"YOUR_HOLYSHEEP_API_KEY_1",
"YOUR_HOLYSHEEP_API_KEY_2"
],
requests_per_minute=120 # Tăng limit vì có 2 keys
) as pool:
# Batch process 50 requests
batch = [
[{"role": "user", "content": f"Tạo content số {i}"}]
for i in range(50)
]
results = await pool.batch_chat(batch, concurrency=10)
success_count = sum(1 for r in results if r["success"])
print(f"✓ Batch hoàn thành: {success_count}/50 thành công")
# Benchmark
start = time.time()
test_response = await pool.chat_completion_async([
{"role": "user", "content": "Hello, đây là test latency"}
])
print(f"Latency: {(time.time() - start) * 1000:.0f}ms")
if __name__ == "__main__":
asyncio.run(main())
---
Health Check và Monitoring
Endpoint kiểm tra trạng thái
"""
Prometheus-style metrics exporter cho HolySheep Key Pool
Tích hợp với Grafana dashboards
"""
from flask import Flask, jsonify
import threading
from datetime import datetime
import json
app = Flask(__name__)
key_pool = None
@app.route("/metrics")
def metrics():
"""Export Prometheus-format metrics"""
stats = key_pool.get_stats()
metrics_output = []
metrics_output.append(f"# HELP holy_sheep_requests_total Total requests")
metrics_output.append(f"# TYPE holy_sheep_requests_total counter")
metrics_output.append(f"holy_sheep_requests_total {stats['total_requests']}")
metrics_output.append(f"# HELP holy_sheep_requests_failed Failed requests")
metrics_output.append(f"# TYPE holy_sheep_requests_failed counter")
metrics_output.append(f"holy_sheep_requests_failed {stats['failed_requests']}")
for key_stat in stats['keys_status']:
labels = f'key="{key_stat["name"]}"'
metrics_output.append(f'holy_sheep_key_healthy{{{labels}}} {int(key_stat["healthy"])}')
metrics_output.append(f'holy_sheep_key_errors{{{labels}}} {key_stat["error_count"]}')
metrics_output.append(f'holy_sheep_key_latency_ms{{{labels}}} {key_stat["latency_ms"]}')
return "\n".join(metrics_output), 200, {"Content-Type": "text/plain"}
@app.route("/health")
def health():
"""Health check endpoint cho Load Balancer"""
stats = key_pool.get_stats()
healthy_keys = sum(1 for k in stats['keys_status'] if k['healthy'])
if healthy_keys >= 1:
return jsonify({
"status": "healthy",
"healthy_keys": healthy_keys,
"total_keys": len(stats['keys_status']),
"timestamp": datetime.now().isoformat()
})
else:
return jsonify({
"status": "unhealthy",
"healthy_keys": 0,
"total_keys": len(stats['keys_status']),
"timestamp": datetime.now().isoformat()
}), 503
@app.route("/stats")
def stats():
"""Chi tiết stats cho debugging"""
return jsonify(key_pool.get_stats())
if __name__ == "__main__":
app.run(host="0.0.0.0", port=9090)
---
Rollback Plan chi tiết
Kịch bản rollback cần thiết khi nào?
| Trigger | Threshold | Action |
|---------|-----------|--------|
| Tất cả keys fail liên tục | >5 phút | Rollback về provider chính thức |
| Latency tăng đột biến | P99 > 5000ms | Check và có thể disable HolySheep |
| Error rate cao | >5% trong 5 phút | Investigate trước khi rollback |
| Cost spike bất thường | >200% so với baseline | Pause và audit |
Code rollback mechanism
"""
Automatic Rollback Manager
Tự động fallback về provider chính thức khi HolySheep gặp vấn đề
"""
import requests
from enum import Enum
from typing import Callable
import logging
from datetime import datetime, timedelta
logger = logging.getLogger(__name__)
class Provider(Enum):
HOLYSHEEP = "holysheep"
FALLBACK = "fallback" # Provider chính thức
class RollbackManager:
"""
Quản lý failover tự động giữa HolySheep và provider fallback
"""
def __init__(self, fallback_fn: Callable):
self.current_provider = Provider.HOLYSHEEP
self.fallback_fn = fallback_fn
self.holysheep_pool = None
# Thresholds
self.error_threshold = 0.05 # 5% error rate
self.latency_threshold_ms = 5000
self.consecutive_failures = 0
self.max_consecutive_failures = 10
# Metrics
self.total_calls = 0
self.holysheep_calls = 0
self.fallback_calls = 0
self.errors = []
def set_holysheep_pool(self, pool):
self.holysheep_pool = pool
def _should_fallback(self, error: Exception, latency_ms: float) -> bool:
"""Quyết định có nên fallback không"""
self.consecutive_failures += 1
if self.consecutive_failures >= self.max_consecutive_failures:
logger.warning(f"⚠️ {self.consecutive_failures} consecutive failures - triggering fallback")
return True
if latency_ms > self.latency_threshold_ms:
logger.warning(f"⚠️ High latency: {latency_ms}ms - monitoring")
return False
def call_with_fallback(
self,
messages: list,
model: str = "gpt-4.1",
**kwargs
):
"""
Gọi API với automatic fallback
"""
self.total_calls += 1
# Thử HolySheep trước
if self.current_provider == Provider.HOLYSHEEP and self.holysheep_pool:
try:
import time
start = time.time()
result = self.holysheep_pool.chat_completion(
messages=messages,
model=model,
**kwargs
)
latency_ms = (time.time() - start) * 1000
self.holysheep_calls += 1
self.consecutive_failures = 0
return {
"provider": "holysheep",
"data": result,
"latency_ms": latency_ms
}
except Exception as e:
logger.error(f" HolySheep error: {e}")
if self._should_fallback(e, 0):
self._switch_to_fallback()
# Fallback sang provider chính thức
self.fallback_calls += 1
logger.info("→ Using fallback provider")
return {
"provider": "fallback",
"data": self.fallback_fn(messages, model, **kwargs),
"latency_ms": None
}
def _switch_to_fallback(self):
"""Chuyển sang fallback"""
self.current_provider = Provider.FALLBACK
logger.critical("🔴 SWITCHED TO FALLBACK PROVIDER")
def _try_restore_holysheep(self):
"""Thử khôi phục HolySheep sau 5 phút"""
self.current_provider = Provider.HOLYSHEEP
logger.info("🟢 Attempting to restore HolySheep")
def get_metrics(self) -> dict:
return {
"total_calls": self.total_calls,
"holysheep_calls": self.holysheep_calls,
"fallback_calls": self.fallback_calls,
"current_provider": self.current_provider.value,
"fallback_rate": f"{self.fallback_calls / max(self.total_calls, 1) * 100:.2f}%",
"consecutive_failures": self.consecutive_failures
}
Ví dụ sử dụng
def official_api_fallback(messages, model, **kwargs):
"""
Fallback function - sử dụng API chính thức khi HolySheep down
CHỈ dùng khi thực sự cần thiết (chi phí cao hơn 5-7x)
"""
# IMPORT KHI CẦN - không hardcode ở đây
# from openai import OpenAI
# client = OpenAI(api_key=os.environ["OFFICIAL_API_KEY"])
# return client.chat.completions.create(model=model, messages=messages, **kwargs)
pass
rollback_mgr = RollbackManager(fallback_fn=official_api_fallback)
rollback_mgr.set_holysheep_pool(pool) # Pool từ ví dụ trước
---
ROI Analysis thực tế
So sánh chi phí 12 tháng
Giả định: 100 triệu tokens/tháng, tăng trưởng 20%/tháng
Tháng | Tokens | HolySheep | Provider chính thức | Tiết kiệm
-------|--------------|----------------|---------------------|----------
Tháng 1| 100M | $375 | $2,500 | $2,125
Tháng 3| 144M | $540 | $3,600 | $3,060
Tháng 6| 249M | $934 | $6,225 | $5,291
Tháng 12| 619M | $2,322 | $15,475 | $13,153
-------|--------------|----------------|---------------------|----------
Tổng | 2,400M | $8,996 | $60,000 | $51,004
Setup và maintenance cost
| Hạng mục | Chi phí |
|----------|---------|
| Development (Key Pool) | 40 giờ x $50 = $2,000 |
| Monitoring setup | 8 giờ x $50 = $400 |
| Monthly maintenance | 2 giờ x $50 = $100/tháng |
| **Tổng năm đầu** | **$2,000 + $400 + $1,200 = $3,600** |
Net savings năm đầu
Tổng tiết kiệm: $51,004
Chi phí setup: -$3,600
─────────────────────────────
Net savings: $47,404
ROI: 1,317%
Payback period: 26 ngày
---
Lỗi thường gặp và cách khắc phục
1. Lỗi 401 Unauthorized - Invalid API Key
**Nguyên nhân**: API key không đúng hoặc đã bị revoke trên dashboard.
**Mã khắc phục**:
def handle_401_error(key_name: str, response_text: str):
"""
Xử lý lỗi 401 - Invalid API Key
"""
print(f"❌ Key '{key_name}' bị reject với lỗi 401")
print(f"Chi tiết: {response_text}")
# Bước 1: Kiểm tra key có đúng format không
# HolySheep keys thường có prefix "hs_" hoặc "sk-"
# Bước 2: Kiểm tra key có bị revoke trên dashboard
# Truy cập: https://www.holysheep.ai/dashboard/api-keys
# Bước 3: Tạo key mới nếu cần
# POST /v1/keys/create (yêu cầu API key admin)
# Bước 4: Cập nhật key vào pool
return {
"action": "REPLACE_KEY",
"old_key": key_name,
"reason": "401_INVALID",
"solution": "Tạo API key mới từ HolySheep dashboard"
}
2. Lỗi 429 Rate Limited - Quota exceeded
**Nguyên nhân**: Vượt quá rate limit của plan hiện tại hoặc của key cụ thể.
**Mã khắc phục**:
import time
from typing import Optional
class RateLimitHandler:
"""
Xử lý rate limiting với exponential backoff
"""
def __init__(self):
self.backoff_seconds = 1
self.max_backoff = 60
def handle_429(self, response_headers: dict) -> float:
"""
Parse Retry-After header và tính toán backoff
"""
# Thử đọc Retry-After header
retry_after = response_headers.get("Retry-After") or \
response_headers.get("X-RateLimit-Reset")
if retry_after:
if retry_after.isdigit():
# Unix timestamp
wait_time = max(0, int(retry_after) - time.time())
else:
# Seconds
wait_time = int(retry_after)
else:
# Exponential backoff nếu không có header
wait_time = self.backoff_seconds
self.backoff_seconds = min(self.backoff_seconds * 2, self.max_backoff)
print(f"⏳ Rate limited, chờ {wait_time}s...")
time.sleep(wait_time)
return wait_time
def reset_backoff(self):
"""Reset backoff sau khi request thành công"""
self.backoff_seconds = 1
Sử dụng trong request loop
rate_handler = RateLimitHandler()
def make_request_with_retry():
max_retries = 5
for attempt in range(max_retries):
response = requests.post(url, headers=headers, json=data)
if response.status_code == 200:
rate_handler.reset_backoff()
return response.json()
elif response.status_code == 429:
wait_time = rate_handler.handle_429(response.headers)
continue
else:
raise Exception(f"Lỗi {response.status_code}: {response.text}")
raise Exception("Max retries exceeded")
3. Lỗi Timeout - Request quá chậm
**Nguyên nhân**: Model busy, network issues, hoặc request quá lớn.
**Mã khắc phục**:
```python
import signal
from functools import wraps
class TimeoutException(Exception):
pass
def timeout_handler(signum, frame):
raise TimeoutException("Request timed out!")
def with_timeout(seconds: int):
"""
Decorator để timeout requests
"""
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(seconds)
try:
result = func(*args, **kwargs)
finally:
signal.alarm(0) # Cancel alarm
return result
return wrapper
return decorator
class TimeoutRequester:
"""
Request với timeout thông minh
"""
# Timeout theo model và request size
TIMEOUTS = {
"gpt-4.1": 30,
"
Tài nguyên liên quan
Bài viết liên quan