# 5. Code Snippet Thực Tế (Multi-key Groq Fallback)

Dưới đây là cơ chế **Round-Robin Multi-key** lõi giúp Ultra Description chạy batch 500+ sản phẩm liên tục mà không bị nghẽn do giới hạn Rate Limit của Groq:

```python
GROQ_API_KEYS = ["gsk_key1...", "gsk_key2...", "gsk_key3..."]
_groq_key_index = 0

def _next_groq_key() -> str:
    global _groq_key_index
    key = GROQ_API_KEYS[_groq_key_index % len(GROQ_API_KEYS)]
    _groq_key_index += 1
    return key

async def _call_ai_with_fallback(messages: list, model: str) -> str:
    fallback_chain = [model, "openai/gpt-oss-120b", "openai/gpt-oss-20b", "qwen/qwen3-32b"]
    
    while True:
        for groq_model in fallback_chain:
            # Thử từng API key (round-robin)
            for _ in range(len(GROQ_API_KEYS)):
                api_key = _next_groq_key()
                resp = await client.post(
                    "https://api.groq.com/openai/v1/chat/completions",
                    headers={"Authorization": f"Bearer {api_key}"},
                    json={"model": groq_model, "messages": messages}
                )
                
                if resp.status_code == 200:
                    return resp.json()["choices"][0]["message"]["content"]
                elif resp.status_code == 429:
                    # Rate limit -> Chuyển sang key tiếp theo lập tức
                    continue 
                else:
                    break # Lỗi khác -> Chuyển model tiếp theo
            else:
                # Hết sạch key cho model này -> Nghỉ 4s
                await asyncio.sleep(4)
                continue
                
        # Toàn bộ model & keys bị rate limit -> nghỉ dài
        await asyncio.sleep(5)
```