+4

Một trick nhỏ giúp tăng số lượng request có thể gửi đến Gemini API

Chào các bạn! Hôm nay mình muốn chia sẻ một trick nhỏ mà khá hiệu quả để tăng số lượng request có thể gửi đến Gemini API. (Hy vọng mấy bác Google không đọc được bài này 😄 )

Vấn Đề với Rate Limit

Khi làm việc với Gemini API, chắc hẳn nhiều bạn đã từng gặp thông báo rate limit kiểu như:

"Rate limit exceeded. Please try again later." 😅

Rate limit của Gemini API khá... khiêm tốn. Đang chạy ngon lành thì bị block, đợi một hồi mới chạy tiếp được. Với các ứng dụng production, đây là vấn đề khá đau đầu.

Giải Pháp: Multiple API Keys Handler

Sau vài lần "vật lộn" với rate limit, mình đã nghĩ ra một giải pháp đơn giản: Tại sao không dùng nhiều API key cùng lúc và sử dụng nhiều model của gemini?

Triển khai

1. Cài đặt

pip install google-generativeai
export GEMINI_API_KEYS=["AIza...1","AIza..2", ...]

Download file từ gemini_handler.py trên github: sorry anh em vì mình chưa viết thành pip library do "lười"

2. Code mẫu đầy đủ

from gemini_handler import GeminiHandler, GenerationConfig, Strategy, KeyRotationStrategy
import os

# Configure generation parameters
generation_config = GenerationConfig(
    temperature=0.7,     # Độ sáng tạo thấp để output ổn định
    top_p=0.95,         # Nucleus sampling
    top_k=40,           # Số tokens được consider
    max_output_tokens=8192,
    response_mime_type="text/plain"
)

# Get API keys từ environment
api_keys = os.getenv('GEMINI_API_KEYS')
if not api_keys:
    raise ValueError("GEMINI_API_KEYS environment variable is not set")

# Khởi tạo handler
handler = GeminiHandler(
    api_keys=api_keys,
    content_strategy=Strategy.FALLBACK,    
    key_strategy=KeyRotationStrategy.SMART_COOLDOWN,
    system_instruction="Bạn là chuyên gia chém gió, nhiệm vụ của bạn là tư vấn chủ đề tình cảm giúp tôi.",
    generation_config=generation_config  
)

# Generate content
response = handler.generate_content(
    prompt="Làm sao tán được nàng?",
    model_name="gemini-exp-1206",
    return_stats=True  # Get key usage stats
)

# Process response
if response['success']:
    print(response['text'])
else:
    print(f"Generation failed: {response['error']}")

# Monitor usage
stats = handler.get_key_stats()
for key_index, key_stats in stats.items():
    print(f"\nKey {key_index}:")
    print(f"  Uses: {key_stats['uses']}")
    print(f"  Failures: {key_stats['failures']}")

3. Giải thích Code

  • Generation Config: Cấu hình các parameters cho model generation như temperature, top_p...

  • Content Strategy:

content_strategy=Strategy.FALLBACK  # hoặc ROUND_ROBIN, RETRY
  1. ROUND_ROBIN: Xoay vòng qua các models để phân phối tải
  2. FALLBACK: Tự động chuyển model khác khi gặp lỗi
  3. RETRY: Thử lại với cùng model, sử dụng exponential backoff
  • Key Rotation Strategy:
key_strategy=KeyRotationStrategy.SMART_COOLDOWN  # hoặc SEQUENTIAL, ROUND_ROBIN, LEAST_USED
  1. SEQUENTIAL: Sử dụng key theo thứ tự, đơn giản
  2. ROUND_ROBIN: Phân phối đều request cho tất cả keys
  3. LEAST_USED: Ưu tiên key ít được sử dụng
  4. SMART_COOLDOWN: Quản lý thông minh dựa trên cooldown time và failure rate

Recommendation: Kết hợp FALLBACK với SMART_COOLDOWN.

handler = GeminiHandler(
    api_keys=api_keys,
    content_strategy=Strategy.FALLBACK,
    key_strategy=KeyRotationStrategy.SMART_COOLDOWN  
)
  • Monitoring: Track usage và performance của từng key

Lợi ích

  1. Tối ưu Usage

    • Tăng throughput với multiple keys
    • Giảm downtime nhờ fallback
    • Quản lý chi phí hiệu quả
  2. Robust Error Handling

    • Auto retry khi fail
    • Fallback thông minh
    • Rate limit detection
  3. Easy Monitoring

    • Track từng key
    • Measure performance
    • Early warning system

Kết luận

Rate Limit Handler giúp bạn tối ưu hóa việc sử dụng Gemini API trong production. Thư viện cung cấp giải pháp toàn diện cho các vấn đề phổ biến khi làm việc với API.

Source code được open source trên GitHub. Contributions are welcome!

Happy coding! 🚀


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí