Xin chào, mình là Minh — Technical Writer tại HolySheep AI. Trong bài viết này, mình sẽ chia sẻ tất cả những gì mình đã học được về cách lưu trữ log API một cách an toàn, tuân thủ quy định và tiết kiệm chi phí. Bài viết hướng đến người hoàn toàn mới với API, nên mình sẽ giải thích từng khái niệm thật dễ hiểu.
Tại sao Log API lại quan trọng đến vậy?
Khi bạn gọi API AI (ví dụ: gửi một câu hỏi cho chatbot), hệ thống sẽ ghi lại toàn bộ "hành trình" của request đó: ai gọi, gọi lúc nào, gửi gì, nhận gì, có lỗi không. Những bản ghi này gọi là log.
Mình đã từng làm việc với một startup phải đối mặt với audit từ khách hàng doanh nghiệp. Họ yêu cầu chứng minh dữ liệu được xử lý đúng cách trong 2 năm. Cả team đã phải vất vả重建 hệ thống log từ đầu. Tin mình đi — bạn không muốn rơi vào tình huống đó.
3 lý do chính bạn cần quan tâm đến log:
- Tuân thủ pháp luật — GDPR, CCPA, các quy định ngành tài chính/y tế
- Debug và troubleshooting — Khi có lỗi, log là "hộp đen" duy nhất để tìm nguyên nhân
- An toàn bảo mật — Phát hiện truy cập bất thường, xác minh gian lận
Kiến trúc Lưu trữ Log cơ bản cho người mới
Mình sẽ xây dựng một hệ thống đơn giản sử dụng HolySheep AI làm ví dụ. HolySheep là nền tảng mình đang dùng vì:
- Tỷ giá ¥1 = $1 — tiết kiệm 85%+ so với các nhà cung cấp khác
- Hỗ trợ WeChat/Alipay — thuận tiện cho người dùng Việt Nam
- Độ trễ <50ms — nhanh hơn nhiều đối thủ
- Nhận tín dụng miễn phí khi đăng ký tại đây
Code mẫu: Ghi log API Call cơ bản
Đầu tiên, mình sẽ tạo một script Python đơn giản để gọi API và lưu log. Mình sẽ dùng HolySheheep AI với base URL chuẩn:
# File: api_logger.py
Hướng dẫn lưu log API cho người mới bắt đầu
import requests
import json
import sqlite3
from datetime import datetime
from typing import Dict, Any
===== CẤU HÌNH HOLYSHEEP AI =====
BASE_URL = "https://api.holysheep.ai/v1"
API_KEY = "YOUR_HOLYSHEEP_API_KEY" # Thay bằng key của bạn
class APILogger:
"""
Class đơn giản để ghi log mọi API call.
Phù hợp cho người mới bắt đầu.
"""
def __init__(self, db_path: str = "api_logs.db"):
self.db_path = db_path
self._init_database()
def _init_database(self):
"""Khởi tạo database SQLite để lưu log"""
conn = sqlite3.connect(self.db_path)
cursor = conn.cursor()
# Bảng log chính - lưu trữ mọi request/response
cursor.execute('''
CREATE TABLE IF NOT EXISTS api_logs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp TEXT NOT NULL,
request_id TEXT UNIQUE,
endpoint TEXT NOT NULL,
method TEXT NOT NULL,
request_headers TEXT,
request_body TEXT,
response_status INTEGER,
response_body TEXT,
response_time_ms REAL,
error_message TEXT,
cost_usd REAL,
created_at TEXT DEFAULT CURRENT_TIMESTAMP
)
''')
# Bảng tuân thủ - theo dõi chu kỳ lưu trữ
cursor.execute('''
CREATE TABLE IF NOT EXISTS retention_policy (
id INTEGER PRIMARY KEY AUTOINCREMENT,
policy_name TEXT NOT NULL,
retention_days INTEGER NOT NULL,
applicable_endpoints TEXT,
last_cleanup TEXT,
created_at TEXT DEFAULT CURRENT_TIMESTAMP
)
''')
conn.commit()
conn.close()
print(f"✅ Database khởi tạo tại: {self.db_path}")
def call_api(self, endpoint: str, method: str = "POST",
headers: Dict = None, data: Dict = None) -> Dict[str, Any]:
"""
Gọi API và tự động ghi log mọi thứ.
"""
start_time = datetime.now()
request_id = f"req_{int(start_time.timestamp() * 1000)}"
# Mặc định headers cho HolySheep
if headers is None:
headers = {}
headers["Authorization"] = f"Bearer {API_KEY}"
headers["X-Request-ID"] = request_id
log_entry = {
"timestamp": start_time.isoformat(),
"request_id": request_id,
"endpoint": endpoint,
"method": method,
"request_headers": json.dumps(headers, ensure_ascii=False),
"request_body": json.dumps(data, ensure_ascii=False) if data else None,
}
try:
url = f"{BASE_URL}{endpoint}"
if method == "POST":
response = requests.post(url, headers=headers, json=data, timeout=30)
else:
response = requests.get(url, headers=headers, timeout=30)
end_time = datetime.now()
response_time_ms = (end_time - start_time).total_seconds() * 1000
log_entry.update({
"response_status": response.status_code,
"response_body": response.text[:5000], # Giới hạn 5000 ký tự
"response_time_ms": round(response_time_ms, 2),
})
# Ước tính chi phí dựa trên response
# HolySheep: DeepSeek V3.2 chỉ $0.42/MTok
log_entry["cost_usd"] = self._estimate_cost(response.text)
except Exception as e:
log_entry["error_message"] = str(e)
log_entry["response_status"] = 0
log_entry["response_time_ms"] = 0
# Lưu vào database
self._save_log(log_entry)
return log_entry
def _estimate_cost(self, response_text: str) -> float:
"""Ước tính chi phí dựa trên số tokens"""
# Ước tính: 1 token ≈ 4 ký tự tiếng Anh, 2 ký tự tiếng Việt
approx_tokens = len(response_text) / 3
# Giá DeepSeek V3.2 trên HolySheep
price_per_million = 0.42
return (approx_tokens / 1_000_000) * price_per_million
def _save_log(self, log_entry: Dict):
"""Lưu một log entry vào database"""
conn = sqlite3.connect(self.db_path)
cursor = conn.cursor()
cursor.execute('''
INSERT INTO api_logs (
timestamp, request_id, endpoint, method,
request_headers, request_body, response_status,
response_body, response_time_ms, error_message, cost_usd
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
''', (
log_entry["timestamp"],
log_entry["request_id"],
log_entry["endpoint"],
log_entry["method"],
log_entry["request_headers"],
log_entry["request_body"],
log_entry.get("response_status"),
log_entry.get("response_body"),
log_entry.get("response_time_ms"),
log_entry.get("error_message"),
log_entry.get("cost_usd"),
))
conn.commit()
conn.close()
===== SỬ DỤNG =====
if __name__ == "__main__":
logger = APILogger("my_api_logs.db")
# Ví dụ: Gọi chat completion API của HolySheep
response = logger.call_api(
endpoint="/chat/completions",
method="POST",
data={
"model": "deepseek-v3.2",
"messages": [
{"role": "user", "content": "Xin chào, hãy giới thiệu về HolySheep AI"}
],
"max_tokens": 500
}
)
print(f"✅ Request ID: {response['request_id']}")
print(f"⏱️ Response time: {response['response_time_ms']}ms")
print(f"💰 Chi phí ước tính: ${response['cost_usd']:.4f}")
Code mẫu: Chính sách tự động xóa log theo quy định
Đây là phần quan trọng nhất — tự động xóa log sau khi hết thời hạn lưu trữ. Mình đã implement tính năng này sau khi khách hàng yêu cầu audit:
# File: retention_manager.py
Quản lý chính sách giữ lại log tự động
import sqlite3
from datetime import datetime, timedelta
from typing import List, Dict, Optional
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class RetentionManager:
"""
Quản lý chính sách giữ lại log tự động.
Đảm bảo tuân thủ các quy định về dữ liệu.
"""
# Các chính sách giữ lại phổ biến (tùy chỉnh theo nhu cầu)
RETENTION_POLICIES = {
"gdpr_standard": {
"name": "GDPR Standard",
"retention_days": 365,
"description": "Chuẩn GDPR - 1 năm",
"high_risk": False
},
"financial_audit": {
"name": "Financial Audit",
"retention_days": 2555, # 7 năm
"description": "Yêu cầu kiểm toán tài chính",
"high_risk": True
},
"security_incident": {
"name": "Security Incident",
"retention_days": 1825, # 5 năm
"description": "Log bảo mật - phát hiện xâm nhập",
"high_risk": True
},
"pii_sensitive": {
"name": "PII Sensitive Data",
"retention_days": 90, # 3 tháng
"description": "Dữ liệu cá nhân nhạy cảm - xóa sớm",
"high_risk": True
},
"default": {
"name": "Default Policy",
"retention_days": 180, # 6 tháng
"description": "Chính sách mặc định",
"high_risk": False
}
}
def __init__(self, db_path: str = "api_logs.db"):
self.db_path = db_path
def setup_policies(self):
"""Thiết lập các chính sách giữ lại vào database"""
conn = sqlite3.connect(self.db_path)
cursor = conn.cursor()
for policy_key, policy_data in self.RETENTION_POLICIES.items():
cursor.execute('''
INSERT OR REPLACE INTO retention_policy
(id, policy_name, retention_days, applicable_endpoints, created_at)
VALUES (
(SELECT id FROM retention_policy WHERE policy_name = ?),
?, ?, NULL, CURRENT_TIMESTAMP
)
''', (policy_data["name"], policy_data["name"], policy_data["retention_days"]))
conn.commit()
conn.close()
logger.info("✅ Đã thiết lập các chính sách giữ lại")
def cleanup_old_logs(self, policy_name: str = "Default Policy",
dry_run: bool = False) -> Dict:
"""
Xóa log cũ theo chính sách.
Args:
policy_name: Tên chính sách áp dụng
dry_run: True = chỉ đếm, False = xóa thật
Returns:
Dict với số lượng log sẽ/xóa
"""
conn = sqlite3.connect(self.db_path)
cursor = conn.cursor()
# Lấy số ngày giữ lại từ policy
cursor.execute('''
SELECT retention_days FROM retention_policy
WHERE policy_name = ?
''', (policy_name,))
result = cursor.fetchone()
if not result:
logger.warning(f"Không tìm thấy policy: {policy_name}, dùng mặc định 180 ngày")
retention_days = 180
else:
retention_days = result[0]
cutoff_date = datetime.now() - timedelta(days=retention_days)
# Đếm log sẽ xóa
cursor.execute('''
SELECT COUNT(*) FROM api_logs
WHERE timestamp < ?
''', (cutoff_date.isoformat(),))
count_to_delete = cursor.fetchone()[0]
if dry_run:
logger.info(f"🔍 [DRY RUN] Sẽ xóa {count_to_delete} log cũ hơn {retention_days} ngày")
return {"dry_run": True, "count": count_to_delete}
# Thực hiện xóa
cursor.execute('''
DELETE FROM api_logs
WHERE timestamp < ?
''', (cutoff_date.isoformat(),))
deleted_count = cursor.rowcount
conn.commit()
# Cập nhật last_cleanup
cursor.execute('''
UPDATE retention_policy
SET last_cleanup = CURRENT_TIMESTAMP
WHERE policy_name = ?
''', (policy_name,))
conn.commit()
conn.close()
logger.info(f"🗑️ Đã xóa {deleted_count} log cũ hơn {retention_days} ngày")
return {
"dry_run": False,
"deleted_count": deleted_count,
"retention_days": retention_days,
"cutoff_date": cutoff_date.isoformat()
}
def get_compliance_report(self) -> List[Dict]:
"""
Tạo báo cáo tuân thủ - rất hữu ích khi audit.
"""
conn = sqlite3.connect(self.db_path)
cursor = conn.cursor()
# Thống kê tổng quan
cursor.execute('''
SELECT
COUNT(*) as total_logs,
COUNT(CASE WHEN response_status = 200 THEN 1 END) as success_count,
COUNT(CASE WHEN error_message IS NOT NULL THEN 1 END) as error_count,
MIN(timestamp) as oldest_log,
MAX(timestamp) as newest_log,
SUM(cost_usd) as total_cost_usd
FROM api_logs
''')
stats = cursor.fetchone()
# Thống kê theo endpoint
cursor.execute('''
SELECT
endpoint,
COUNT(*) as call_count,
AVG(response_time_ms) as avg_response_time,
SUM(cost_usd) as endpoint_cost
FROM api_logs
GROUP BY endpoint
ORDER BY call_count DESC
''')
endpoints = cursor.fetchall()
conn.close()
return {
"report_date": datetime.now().isoformat(),
"total_logs": stats[0],
"success_rate": f"{(stats[1]/stats[0]*100):.2f}%" if stats[0] > 0 else "N/A",
"error_count": stats[2],
"oldest_log": stats[3],
"newest_log": stats[4],
"total_cost_usd": f"${stats[5]:.4f}" if stats[5] else "$0.00",
"by_endpoint": [
{
"endpoint": e[0],
"call_count": e[1],
"avg_response_ms": f"{e[2]:.2f}",
"cost_usd": f"${e[3]:.4f}" if e[3] else "$0.00"
}
for e in endpoints
]
}
===== SỬ DỤNG =====
if __name__ == "__main__":
manager = RetentionManager("my_api_logs.db")
# Thiết lập policies
manager.setup_policies()
# Chạy cleanup với dry_run trước
result = manager.cleanup_old_logs(policy_name="Default Policy", dry_run=True)
print(f"📊 Log sẽ xóa: {result['count']}")
# Nếu okay, chạy thật
# manager.cleanup_old_logs(policy_name="Default Policy", dry_run=False)
# Tạo báo cáo tuân thủ
report = manager.get_compliance_report()
print(f"\n📋 BÁO CÁO TUÂN THỦ")
print(f"Tổng log: {report['total_logs']}")
print(f"Tỷ lệ thành công: {report['success_rate']}")
print(f"Tổng chi phí: {report['total_cost_usd']}")
Code mẫu nâng cao: Mã hóa log trước khi lưu
Đây là bước mình thường bỏ qua khi mới bắt đầu, nhưng nó cực kỳ quan trọng. Dữ liệu API có thể chứa thông tin nhạy cảm:
# File: secure_logger.py
Mã hóa log trước khi lưu - tăng cường bảo mật
import sqlite3
import hashlib
import json
from datetime import datetime
from cryptography.fernet import Fernet
from typing import Dict, Optional
import base64
class SecureAPILogger:
"""
Logger với mã hóa dữ liệu nhạy cảm.
Đảm bảo log không thể đọc được nếu database bị lộ.
"""
def __init__(self, db_path: str = "secure_logs.db",
encryption_key: Optional[bytes] = None):
self.db_path = db_path
self.encryption_key = encryption_key or Fernet.generate_key()
self.cipher = Fernet(self.encryption_key)
self._init_database()
# In key ra để lưu vào biến môi trường (CHỈ DEMO)
print(f"🔐 Encryption key (lưu vào .env): {self.encryption_key.decode()}")
def _init_database(self):
"""Khởi tạo database với bảng đã mã hóa"""
conn = sqlite3.connect(self.db_path)
cursor = conn.cursor()
# Bảng log với cột encrypted_data
cursor.execute('''
CREATE TABLE IF NOT EXISTS secure_api_logs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
log_hash TEXT UNIQUE NOT NULL,
encrypted_data BLOB NOT NULL,
iv BLOB NOT NULL,
timestamp TEXT NOT NULL,
created_at TEXT DEFAULT CURRENT_TIMESTAMP
)
''')
# Bảng metadata (không mã hóa - dùng để query nhanh)
cursor.execute('''
CREATE TABLE IF NOT EXISTS log_metadata (
id INTEGER PRIMARY KEY AUTOINCREMENT,
log_hash TEXT NOT NULL,
endpoint TEXT NOT NULL,
response_status INTEGER,
response_time_ms REAL,
cost_usd REAL,
FOREIGN KEY (log_hash) REFERENCES secure_api_logs(log_hash)
)
''')
conn.commit()
conn.close()
def _encrypt_data(self, data: str) -> tuple:
"""Mã hóa dữ liệu và trả về ciphertext + IV"""
data_bytes = data.encode('utf-8')
encrypted = self.cipher.encrypt(data_bytes)
return encrypted, self.encryption_key[:16]
def _decrypt_data(self, encrypted_data: bytes, iv: bytes) -> str:
"""Giải mã dữ liệu"""
decrypted = self.cipher.decrypt(encrypted_data)
return decrypted.decode('utf-8')
def _generate_hash(self, data: str) -> str:
"""Tạo hash unique cho mỗi log entry"""
return hashlib.sha256(data.encode()).hexdigest()
def save_log(self, log_data: Dict) -> str:
"""
Lưu log đã mã hóa vào database.
"""
# Tạo hash unique
log_json = json.dumps(log_data, sort_keys=True, ensure_ascii=False)
log_hash = self._generate_hash(log_json + datetime.now().isoformat())
# Mã hóa dữ liệu
encrypted_data, iv = self._encrypt_data(log_json)
conn = sqlite3.connect(self.db_path)
cursor = conn.cursor()
try:
# Lưu dữ liệu đã mã hóa
cursor.execute('''
INSERT INTO secure_api_logs
(log_hash, encrypted_data, iv, timestamp)
VALUES (?, ?, ?, ?)
''', (log_hash, encrypted_data, iv, log_data.get("timestamp")))
# Lưu metadata (không mã hóa)
cursor.execute('''
INSERT INTO log_metadata
(log_hash, endpoint, response_status, response_time_ms, cost_usd)
VALUES (?, ?, ?, ?, ?)
''', (
log_hash,
log_data.get("endpoint"),
log_data.get("response_status"),
log_data.get("response_time_ms"),
log_data.get("cost_usd")
))
conn.commit()
except sqlite3.IntegrityError:
print(f"⚠️ Log đã tồn tại: {log_hash}")
finally:
conn.close()
return log_hash
def get_log(self, log_hash: str) -> Optional[Dict]:
"""
Đọc log đã giải mã bằng hash.
"""
conn = sqlite3.connect(self.db_path)
cursor = conn.cursor()
cursor.execute('''
SELECT encrypted_data, iv
FROM secure_api_logs
WHERE log_hash = ?
''', (log_hash,))
result = cursor.fetchone()
conn.close()
if result:
encrypted_data, iv = result
decrypted = self._decrypt_data(encrypted_data, iv)
return json.loads(decrypted)
return None
def search_logs(self, endpoint: str = None,
min_response_time: float = None) -> list:
"""
Tìm kiếm log qua metadata (không cần giải mã).
"""
conn = sqlite3.connect(self.db_path)
cursor = conn.cursor()
query = "SELECT log_hash FROM log_metadata WHERE 1=1"
params = []
if endpoint:
query += " AND endpoint = ?"
params.append(endpoint)
if min_response_time:
query += " AND response_time_ms >= ?"
params.append(min_response_time)
cursor.execute(query, params)
hashes = cursor.fetchall()
conn.close()
# Giải mã từng kết quả
return [self.get_log(h[0]) for h in hashes]
def get_total_cost(self) -> float:
"""Tính tổng chi phí từ metadata (nhanh, không cần giải mã)"""
conn = sqlite3.connect(self.db_path)
cursor = conn.cursor()
cursor.execute("SELECT SUM(cost_usd) FROM log_metadata")
result = cursor.fetchone()
conn.close()
return result[0] if result[0] else 0.0
===== DEMO SỬ DỤNG =====
if __name__ == "__main__":
# Khởi tạo logger bảo mật
secure_logger = SecureAPILogger("secure_logs.db")
# Lưu log mẫu
sample_log = {
"timestamp": datetime.now().isoformat(),
"endpoint": "/v1/chat/completions",
"request_body": {
"model": "deepseek-v3.2",
"messages": [{"role": "user", "content": "Xin chào!"}]
},
"response_status": 200,
"response_time_ms": 45.2,
"cost_usd": 0.00015
}
log_hash = secure_logger.save_log(sample_log)
print(f"✅ Đã lưu log với hash: {log_hash[:16]}...")
# Đọc lại log
retrieved = secure_logger.get_log(log_hash)
print(f"✅ Đã đọc log: {retrieved['endpoint']}")
# Tính tổng chi phí
total = secure_logger.get_total_cost()
print(f"💰 Tổng chi phí: ${total:.4f}")
Bảng giá HolySheep AI 2026 — So sánh tiết kiệm
Mình sử dụng HolySheep vì tỷ giá ¥1 = $1 giúp tiết kiệm đáng kể:
| Model | Giá gốc (≈) | HolySheep | 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 | $10/MTok | $2.50/MTok | 75% |
| DeepSeek V3.2 | $2.80/MTok | $0.42/MTok | 85% |
Đặc biệt, DeepSeek V3.2 chỉ $0.42/MTok — lý tưởng cho hệ thống log cần gọi API thường xuyên.
Lỗi thường gặp và cách khắc phục
Qua quá trình triển khai hệ thống log cho nhiều dự án, mình đã gặp những lỗi phổ biến sau:
Lỗi 1: Database bị khóa khi ghi log đồng thời
# ❌ SAI: Gây lỗi "database is locked"
import sqlite3
from concurrent.futures import ThreadPoolExecutor
def bad_logging():
def write_log(data):
conn = sqlite3.connect("logs.db")
cursor = conn.cursor()
cursor.execute("INSERT INTO logs VALUES (?)", (data,))
conn.commit() # Commit riêng từng lần = khóa liên tục
conn.close()
with ThreadPoolExecutor(max_workers=10) as executor:
executor.map(write_log, range(100))
✅ ĐÚNG: Sử dụng connection pool hoặc WAL mode
import sqlite3
import threading
from queue import Queue
from concurrent.futures import ThreadPoolExecutor
class ThreadSafeLogger:
def __init__(self, db_path: str = "logs.db"):
self.db_path = db_path
self._local = threading.local()
self._queue = Queue()
self._start_background_writer()
def _get_connection(self):
"""Mỗi thread có connection riêng"""
if not hasattr(self._local, 'conn'):
self._local.conn = sqlite3.connect(
self.db_path,
check_same_thread=False,
timeout=30.0
)
# Bật WAL mode - cho phép đọc/ghi song song
self._local.conn.execute("PRAGMA journal_mode=WAL")
return self._local.conn
def log(self, data: str):
"""Đưa vào queue thay vì ghi trực tiếp"""
self._queue.put(data)
def _start_background_writer(self):
"""Background thread ghi log"""
def writer():
conn = sqlite3.connect(self.db_path)
conn.execute("PRAGMA journal_mode=WAL")
cursor = conn.cursor()
batch = []
while True:
try:
# Lấy log từ queue với timeout
item = self._queue.get(timeout=1)
batch.append(item)
# Ghi theo batch (5 item hoặc 1 giây)
if len(batch) >= 5 or self._queue.empty():
cursor.executemany(
"INSERT INTO logs VALUES (?)",
[(x,) for x in batch]
)
conn.commit()
batch = []
except Exception:
if batch:
cursor.executemany(
"INSERT INTO logs VALUES (?)",
[(x,) for x in batch]
)
conn.commit()
break
thread = threading.Thread(target=writer, daemon=True)
thread.start()
Cách sử dụng
logger = ThreadSafeLogger("logs.db")
for i in range(100):
logger.log(f"Log entry {i}")
Lỗi 2: Chi phí API vượt kiểm soát vì không giới hạn log
# ❌ SAI: Không giới hạn số lần gọi API cho việc logging
class BadAPIClient:
def __init__(self):
self.usage_count = 0
def process_user_query(self, user_id: str):
# Mỗi query gọi API validation → phí gấp đôi!
if self._validate_with_api(user_id): # ← Gọi API #1
result = self._call_main_api(user_id) # ← Gọi API #2
self.usage_count += 2
✅ ĐÚNG: Cache kết quả validation, batch log
from functools import lru_cache
from datetime import datetime, timedelta
import time
class SmartAPILogger:
def __init__(self, base_url: str = "https://api.holysheep.ai/v1",
api_key: str = "YOUR_HOLYSHEEP_API_KEY"):
self.base_url = base_url
self.api_key = api_key
self.log_buffer = []
self.buffer_size = 100
self.last_flush = datetime.now()
self.flush_interval = 60 # giây
@lru_cache(maxsize=1000, ttl=3600)
def _validate_user_cached(self, user_id: str) -> bool:
"""Cache kết quả validation 1 giờ"""
# Thực tế gọi API validation ở đây
return True
def _batch_log(self, entries: list):
"""Ghi log theo batch - giảm số lần gọi API"""
payload = {
"model": "deepseek-v3.2",
"messages": [
{
"role": "user",
"content": f"Process batch log: {json.dumps(entries)}"
}
],
"max_tokens": 50
}
headers = {
"Authorization": f"Bearer {
Tài nguyên liên quan
Bài viết liên quan