Khi tôi lần đầu tiếp xúc với API trả về kết quả AI, câu hỏi lớn nhất của tôi là: "Làm sao để xử lý khi AI trả về một lượng dữ liệu khổng lồ?" Câu trả lời nằm ở kỹ thuật Pagination - một khái niệm tưởng chừng phức tạp nhưng thực ra rất dễ hiểu khi bạn nắm được nguyên lý cốt lõi.

Pagination là gì và tại sao bạn cần nó?

Giả sử bạn yêu cầu AI tạo một bài viết 10.000 từ hoặc dịch một cuốn sách dày. API không thể trả về toàn bộ nội dung cùng một lúc vì:

Đây là lý do Pagination ra đời - nó chia nhỏ kết quả thành các trang (pages) để bạn có thể lấy từng phần một cách có kiểm soát.

Cách hoạt động của Pagination trong HolySheep AI

HolyShehe AI sử dụng cơ chế pagination tiêu chuẩn công nghiệp với hai tham số chính:

Khi bạn đăng ký tại đây và sử dụng API của HolySheep, mọi endpoint trả về danh sách đều hỗ trợ pagination ngay từ đầu. Điều đặc biệt là HolySheep AI có độ trễ dưới 50ms - nhanh hơn đáng kể so với nhiều nhà cung cấp khác.

Hướng dẫn từng bước triển khai Pagination

Bước 1: Cài đặt thư viện HTTP

Trước tiên, bạn cần một công cụ để gọi API. Tôi khuyên dùng thư viện requests cho Python vì nó trực quan và dễ hiểu nhất:

# Cài đặt thư viện requests
pip install requests

Bước 2: Triển khai hàm lấy dữ liệu với Pagination

Đây là phần quan trọng nhất. Tôi sẽ chia sẻ code hoàn chỉnh mà tôi đã sử dụng thực tế trong dự án của mình:

import requests

Cấu hình HolySheep API

BASE_URL = "https://api.holysheep.ai/v1" API_KEY = "YOUR_HOLYSHEEP_API_KEY" def lay_danh_sach_model(gioi_han=10, cursor=None): """ Lấy danh sách model với pagination - gioi_han: Số model muốn lấy (mặc định 10) - cursor: ID của model cuối cùng đã lấy (None nếu là lần đầu) """ headers = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" } # Xây dựng query parameters params = {"limit": gioi_han} if cursor: params["after"] = cursor # Gọi API response = requests.get( f"{BASE_URL}/models", headers=headers, params=params ) # Kiểm tra lỗi if response.status_code != 200: print(f"Lỗi {response.status_code}: {response.text}") return None, None data = response.json() # Trích xuất dữ liệu và cursor cho trang tiếp theo models = data.get("data", []) has_more = data.get("has_more", False) next_cursor = models[-1]["id"] if has_more and models else None return models, next_cursor

Ví dụ sử dụng

models, cursor = lay_danh_sach_model(gioi_han=5) print(f"Đã lấy {len(models)} models") if cursor: print(f"Có thêm dữ liệu. Cursor tiếp theo: {cursor}")

Bước 3: Tự động lấy tất cả dữ liệu qua nhiều trang

Trong thực tế, bạn thường cần lấy tất cả dữ liệu mà không biết trước có bao nhiêu trang. Đây là hàm tôi dùng để lấy toàn bộ lịch sử API calls của mình:

def lay_tat_ca_du_lieu(max_pages=100):
    """
    Tự động lấy tất cả dữ liệu qua nhiều trang
    - max_pages: Giới hạn số lần gọi API để tránh vòng lặp vô hạn
    """
    tat_ca_du_lieu = []
    cursor = None
    so_trang = 0
    
    while so_trang < max_pages:
        so_trang += 1
        
        # Gọi API với cursor hiện tại
        headers = {
            "Authorization": f"Bearer {API_KEY}",
        }
        params = {"limit": 50}  # Lấy 50 item mỗi lần
        if cursor:
            params["after"] = cursor
        
        response = requests.get(
            f"{BASE_URL}/history",
            headers=headers,
            params=params
        )
        
        if response.status_code != 200:
            print(f"Lỗi ở trang {so_trang}: {response.status_code}")
            break
        
        du_lieu = response.json()
        items = du_lieu.get("data", [])
        
        if not items:
            print(f"Không còn dữ liệu ở trang {so_trang}. Dừng lại.")
            break
        
        # Thêm vào danh sách tổng
        tat_ca_du_lieu.extend(items)
        print(f"Trang {so_trang}: Đã thêm {len(items)} items (Tổng: {len(tat_ca_du_lieu)})")
        
        # Cập nhật cursor cho lần gọi tiếp theo
        cursor = items[-1]["id"]
    
    return tat_ca_du_lieu

Lấy toàn bộ lịch sử

lich_su = lay_tat_ca_du_lieu() print(f"Tổng cộng đã lấy: {len(lich_su)} records")

Bước 4: Xử lý response có cấu trúc phức tạp hơn

Khi làm việc với chat completions (tạo nội dung chat), response có cấu trúc riêng. Dưới đây là cách tôi xử lý streaming response với pagination:

def gui_yeu_cau_va_xu_ly_streaming(model="deepseek-v3.2", gioi_han_token=2000):
    """
    Gửi yêu cầu đến AI với kiểm soát độ dài output
    HolySheep AI pricing: DeepSeek V3.2 chỉ $0.42/MTok - tiết kiệm 85%+ so với GPT-4.1 ($8/MTok)
    """
    headers = {
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json"
    }
    
    payload = {
        "model": model,
        "messages": [
            {"role": "user", "content": "Liệt kê 50 công dụng của AI trong giáo dục"}
        ],
        "max_tokens": gioi_han_token,  # Giới hạn số token trả về
        "stream": True  # Bật streaming để nhận từng phần
    }
    
    response = requests.post(
        f"{BASE_URL}/chat/completions",
        headers=headers,
        json=payload,
        stream=True  # Quan trọng: phải có stream=True
    )
    
    if response.status_code != 200:
        print(f"Lỗi: {response.status_code}")
        return
    
    # Xử lý streaming response
    noi_dung_hoan_chinh = ""
    so_token = 0
    
    for line in response.iter_lines():
        if line:
            # Parse SSE (Server-Sent Events) format
            text = line.decode('utf-8')
            if text.startswith("data: "):
                if text == "data: [DONE]":
                    break
                # Xử lý JSON chunk ở đây
                # (code xử lý chunk thực tế)
                pass
    
    print(f"Hoàn thành! Tổng token: {so_token}")
    print(f"Nội dung (500 ký tự đầu): {noi_dung_hoan_chinh[:500]}...")

Chạy thử

gui_yeu_cau_va_xu_ly_streaming(model="deepseek-v3.2")

Ví dụ thực tế: Ứng dụng vào Dashboard theo dõi chi phí

Tôi đã xây dựng một dashboard đơn giản để theo dõi chi phí API hàng ngày. Điểm mấu chốt là dùng pagination để lấy đầy đủ dữ liệu lịch sử:

import json
from datetime import datetime

def tao_bao_cao_chi_phi():
    """Tạo báo cáo chi phí API từ HolySheep AI"""
    
    # Lấy tất cả lịch sử với pagination
    lich_su = lay_tat_ca_du_lieu(max_pages=50)
    
    # Phân tích chi phí
    chi_phi_theo_model = {}
    tong_chi_phi = 0
    
    for item in lich_su:
        model = item.get("model", "unknown")
        chi_phi = item.get("usage", {}).get("cost", 0)
        
        if model not in chi_phi_theo_model:
            chi_phi_theo_model[model] = {"so_lan": 0, "tong_token": 0, "chi_phi": 0}
        
        chi_phi_theo_model[model]["so_lan"] += 1
        chi_phi_theo_model[model]["tong_token"] += item.get("usage", {}).get("total_tokens", 0)
        chi_phi_theo_model[model]["chi_phi"] += chi_phi
        tong_chi_phi += chi_phi
    
    # In báo cáo
    print("=" * 60)
    print(f"BÁO CÁO CHI PHÍ HOLYSHEEP AI - {datetime.now().strftime('%Y-%m-%d %H:%M')}")
    print("=" * 60)
    print(f"Tổng chi phí: ${tong_chi_phi:.4f}")
    print(f"Tổng API calls: {len(lich_su)}")
    print("-" * 60)
    
    for model, stats in sorted(chi_phi_theo_model.items(), key=lambda x: -x[1]["chi_phi"]):
        print(f"Model: {model}")
        print(f"  - Số lần gọi: {stats['so_lan']}")
        print(f"  - Tổng token: {stats['tong_token']:,}")
        print(f"  - Chi phí: ${stats['chi_phi']:.4f}")
        print()

Tạo báo cáo

tao_bao_cao_chi_phi()

Bảng so sánh giá khi sử dụng Pagination hiệu quả

Một trong những lợi ích lớn nhất của pagination là kiểm soát chi phí. Khi bạn giới hạn số token trả về (max_tokens), bạn chỉ trả tiền cho những gì mình cần:

Model Giá gốc/MTok HolySheep AI/MTok Tiết kiệm
GPT-4.1 $60.00 $8.00 86%
Claude Sonnet 4.5 $45.00 $15.00 66%
Gemini 2.5 Flash $7.50 $2.50 66%
DeepSeek V3.2 $2.80 $0.42 85%

Như bạn thấy, HolySheep AI cung cấp mức giá cực kỳ cạnh tranh. Đặc biệt với DeepSeek V3.2 - chỉ $0.42/MTok - bạn có thể chạy hàng ngàn lần pagination mà không lo về chi phí.

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

Qua quá trình sử dụng thực tế, tôi đã gặp và xử lý nhiều lỗi pagination. Dưới đây là 5 lỗi phổ biến nhất kèm giải pháp đã được kiểm chứng:

Lỗi 1: Infinite loop - Vòng lặp vô hạn

Mô tả lỗi: Script chạy mãi không dừng, lặp đi lặp lại cùng một cursor.

Nguyên nhân: Server trả về has_more=true nhưng dữ liệu không thay đổi hoặc cursor không hợp lệ.

# ❌ CODE SAI - Gây infinite loop
def lay_du_lieu_sai():
    cursor = None
    while True:
        data = goi_api(cursor=cursor)
        if data:
            xu_ly(data)
            cursor = data[-1]["id"]  # Có thể cursor không đổi!
        if not data:
            break

✅ CODE ĐÚNG - Có kiểm soát

def lay_du_lieu_dung(): cursor = None cursor_truoc = None so_lan_lap = 0 gioi_han_lap = 100 # An toàn while so_lan_lap < gioi_han_lap: so_lan_lap += 1 data = goi_api(cursor=cursor) if not data: print("Đã lấy hết dữ liệu!") break # Kiểm tra cursor có thay đổi không if cursor == cursor_truoc and cursor is not None: print("CẢNH BÁO: Cursor không thay đổi - Dừng để tránh infinite loop") break xu_ly(data) cursor_truoc = cursor cursor = data[-1]["id"] if len(data) > 0 else None print(f"Hoàn thành sau {so_lan_lap} lần gọi API")

Lỗi 2: 401 Unauthorized - API Key không hợp lệ

Mô tả lỗi: Nhận được phản hồi {"error": {"message": "Invalid API key", "type": "invalid_request_error"}}.

Nguyên nhân: API key bị sai, hết hạn, hoặc chưa được đặt đúng cách.

# ❌ CÁCH SAI
headers = {
    "Authorization": API_KEY,  # Thiếu "Bearer "
}

✅ CÁCH ĐÚNG

def kiem_tra_api_key(): api_key = "YOUR_HOLYSHEEP_API_KEY" # Kiểm tra format API key if not api_key or len(api_key) < 20: print("API Key có vẻ ngắn hoặc rỗng!") return False headers = { "Authorization": f"Bearer {api_key}", # PHẢI có "Bearer " phía trước "Content-Type": "application/json" } # Test bằng cách gọi endpoint đơn giản response = requests.get( "https://api.holysheep.ai/v1/models", headers=headers ) if response.status_code == 401: print("❌ API Key không hợp lệ!") print("Vui lòng kiểm tra:") print("1. API Key đã được sao chép đúng chưa?") print("2. API Key còn hiệu lực không?") print("3. Đã đăng ký tài khoản tại https://www.holysheep.ai/register chưa?") return False elif response.status_code == 200: print("✅ API Key hợp lệ!") return True return False

Lỗi 3: 429 Rate Limit - Quá nhiều yêu cầu

Mô tả lỗi: Nhận được {"error": {"message": "Rate limit exceeded", "type": "rate_limit_error"}}.

Nguyên nhân: Gọi API quá nhanh, vượt quá giới hạn cho phép.

import time

✅ XỬ LÝ RATE LIMIT VỚI EXPONENTIAL BACKOFF

def goi_api_co_xu_ly_rate_limit(url, headers, params, so_lan_thu_toi_da=5): """ Gọi API với tự động retry khi gặp rate limit """ thoi_gian_cho = 1 # Bắt đầu với 1 giây for lan_thu in range(so_lan_thu_toi_da): try: response = requests.get(url, headers=headers, params=params) if response.status_code == 200: return response.json() elif response.status_code == 429: # Rate limit - chờ và thử lại print(f"⚠️ Rate limit! Chờ {thoi_gian_cho} giây...") time.sleep(thoi_gian_cho) thoi_gian_cho *= 2 # Tăng gấp đôi thời gian chờ (exponential backoff) continue else: print(f"Lỗi không xác định: {response.status_code}") return None except requests.exceptions.RequestException as e: print(f"Yêu cầu thất bại: {e}") time.sleep(thoi_gian_cho) thoi_gian_cho *= 2 print(f"Đã thử {so_lan_thu_toi_da} lần nhưng không thành công") return None

Sử dụng khi lấy nhiều trang

def lay_du_lieu_voi_rate_limit_handling(): cursor = None tat_ca_data = [] while True: params = {"limit": 50} if cursor: params["after"] = cursor data = goi_api_co_xu_ly_rate_limit( "https://api.holysheep.ai/v1/history", headers={"Authorization": f"Bearer {API_KEY}"}, params=params ) if not data or not data.get("data"): break tat_ca_data.extend(data["data"]) cursor = data["data"][-1]["id"] if data.get("has_more") else None if not cursor: break # Chờ 0.5 giây giữa các lần gọi để tránh rate limit time.sleep(0.5) return tat_ca_data

Lỗi 4: KeyError 'data' - Response có cấu trúc không như mong đợi

Mô tả lỗi: Python báo lỗi KeyError: 'data' khi cố truy cập response.

Nguyên nhân: API trả về error object thay vì data object, hoặc cấu trúc response khác.

# ✅ XỬ LÝ AN TOÀN VỚI .GET()
def goi_api_an_toan(endpoint, params=None):
    """
    Gọi API với xử lý lỗi toàn diện
    """
    try:
        response = requests.get(
            f"https://api.holysheep.ai/v1/{endpoint}",
            headers={"Authorization": f"Bearer {API_KEY}"},
            params=params or {},
            timeout=30  # Timeout 30 giây
        )
        
        # Parse JSON an toàn
        try:
            data = response.json()
        except json.JSONDecodeError:
            print(f"Lỗi parse JSON. Status: {response.status_code}")
            print(f"Response thực tế: {response.text[:200]}")
            return None
        
        # Kiểm tra có lỗi từ API không
        if "error" in data:
            print(f"API Error: {data['error']}")
            return None
        
        # Trả về data với giá trị mặc định nếu không có
        return data.get("data", [])
    
    except requests.exceptions.Timeout:
        print("❌ Timeout! Server không phản hồi sau 30 giây")
        return None
    
    except requests.exceptions.ConnectionError:
        print("❌ Không thể kết nối! Kiểm tra internet của bạn")
        return None
    
    except Exception as e:
        print(f"❌ Lỗi không xác định: {type(e).__name__}: {e}")
        return None

Sử dụng

du_lieu = goi_api_an_toan("models", {"limit": 10}) if du_lieu is not None: print(f"Đã lấy {len(du_lieu)} models") else: print("Không lấy được dữ liệu")

Lỗi 5: MemoryError - Quá nhiều dữ liệu được lưu trữ

Mô tả lỗi: Script chạy hết RAM và bị crash khi lấy quá nhiều dữ liệu.

Nguyên nhân: Lưu trữ tất cả dữ liệu vào RAM thay vì xử lý từng phần.

# ❌ CÁCH GÂY MEMORY ERROR
def lay_tat_ca_voi_memory_error():
    tat_ca = []  # Lưu tất cả vào RAM
    cursor = None
    
    while True:
        data = goi_api(cursor=cursor)
        tat_ca.extend(data)  # Memory tăng dần!
        cursor = data[-1]["id"] if data else None
        if not cursor:
            break
    
    # Khi tat_ca quá lớn -> MemoryError
    return tat_ca

✅ CÁCH TỐI ƯU - Xử lý từng phần (Streaming/Generator)

def lay_du_lieu_streaming(): """ Sử dụng generator để xử lý dữ liệu từng phần Không lưu trữ tất cả vào RAM """ cursor = None while True: data = goi_api(cursor=cursor, limit=100) if not data: break # YIELD: Trả về từng phần nhỏ thay vì lưu vào RAM for item in data: yield item cursor = data[-1]["id"] if data else None if not cursor: break

Sử dụng với generator - tiết kiệm RAM

print("Xử lý dữ liệu theo dòng (streaming):") dem = 0 for item in lay_du_lieu_streaming(): # Xử lý từng item ngay khi nhận được xu_ly_item(item) dem += 1 # In tiến độ mỗi 100 items if dem % 100 == 0: print(f"Đã xử lý {dem} items...") print(f"Tổng cộng: {dem} items")

Mẹo tối ưu hóa Pagination

Qua kinh nghiệm thực chiến, đây là những best practices tôi áp dụng:

Kết luận

Pagination là kỹ thuật nền tảng mà bất kỳ developer nào làm việc với AI API đều phải nắm vững. Qua bài viết này, bạn đã học được cách triển khai pagination từ cơ bản đến nâng cao, cùng với 5 lỗi thường gặp và cách khắc phục chúng.

Điều quan trọng nhất tôi rút ra được sau hơn 1 năm làm việc với AI API: Luôn luôn xử lý lỗi một cách chủ động. Một script có pagination hoàn hảo nhưng không xử lý lỗi rate limit hay API key hết hạn sẽ không bao giờ chạy ổn định trong production.

Nếu bạn đang tìm kiếm một nhà cung cấp AI API với mức giá tiết kiệm (DeepSeek V3.2 chỉ $0.42/MTok), hỗ trợ WeChat/Alipay, độ trễ dưới 50ms và tín dụng miễn phí khi đăng ký - HolySheep AI là lựa chọn đáng cân nhắc.

👉 Đăng ký HolySheep AI — nhận tín dụng miễn phí khi đăng ký