Sửa lỗi cohere.TooManyRequestsError 429: Vượt Giới Hạn Rate Limit Trial Key Cohere

beginner🧠 AI Tools2026-06-20| Python 3.8+, cohere-python SDK v5.x, mọi hệ điều hành (Linux/macOS/Windows), Cohere Trial API key

Error Message

cohere.errors.too_many_requests_error.TooManyRequestsError: status_code: 429, body: You are using a Trial key, which is limited to 10 API calls / minute. Upgrade to a Production key to increase your rate limit.
#cohere#rate-limit#429#trial-key#api

Lỗi Gặp Phải

cohere.errors.too_many_requests_error.TooManyRequestsError: status_code: 429, body: You are using a Trial key, which is limited to 10 API calls / minute. Upgrade to a Production key to increase your rate limit.

Mười lần gọi mỗi phút. Đó là giới hạn cứng của Cohere Trial key, và SDK sẽ ném ra TooManyRequestsError ngay khi bạn vượt qua ngưỡng đó — không tự động retry, không có thời gian ân hạn, chỉ là một lỗi 429.

Nguyên Nhân

Cohere Trial key giới hạn bạn ở đúng 10 lần gọi API mỗi phút. Lần gọi thứ mười một sẽ nhận về HTTP 429 ngay lập tức. Các nguyên nhân thường gặp:

  • Lặp qua danh sách đầu vào và gọi co.embed() hoặc co.chat() mà không có độ trễ nào
  • Các lần gọi async song song với asyncio được kích hoạt cùng một lúc
  • Chạy script nhiều lần liên tiếp trong quá trình phát triển
  • Xử lý hàng loạt gửi tất cả các mục trong một vòng lặp liên tục

Cách Sửa Từng Bước

Cách 1 — Thêm sleep đơn giản giữa các lần gọi (sửa nhanh nhất)

Danh sách nhỏ, không vội? Thêm độ trễ 6 giây giữa các lần gọi. Phép tính này cho ra đúng 10 lần gọi mỗi phút — chạm đúng giới hạn của Trial key.

import cohere
import time

co = cohere.ClientV2("YOUR_API_KEY")

texts = ["text one", "text two", "text three"]  # dữ liệu đầu vào của bạn

for text in texts:
    response = co.embed(
        texts=[text],
        model="embed-english-v3.0",
        input_type="search_document",
    )
    print(response.embeddings)
    time.sleep(6)  # 10 calls/min = 1 lần gọi mỗi 6 giây

Cách 2 — Retry với exponential backoff (khuyến nghị cho code gần production)

Thay vì để lỗi 429 làm crash script, hãy bắt lỗi và retry với thời gian chờ tăng dần. Bắt đầu từ 10 giây và nhân đôi mỗi lần thử: 10s → 20s → 40s → 80s → 160s.

import cohere
import time
from cohere.errors import TooManyRequestsError

co = cohere.ClientV2("YOUR_API_KEY")

def embed_with_retry(text: str, max_retries: int = 5) -> list:
    wait = 10  # giây
    for attempt in range(max_retries):
        try:
            response = co.embed(
                texts=[text],
                model="embed-english-v3.0",
                input_type="search_document",
            )
            return response.embeddings[0]
        except TooManyRequestsError:
            if attempt == max_retries - 1:
                raise
            print(f"Rate limited. Waiting {wait}s before retry {attempt + 1}/{max_retries}...")
            time.sleep(wait)
            wait *= 2  # exponential backoff: 10s → 20s → 40s
    return []

# Sử dụng
result = embed_with_retry("Hello, world")
print(result)

Cách 3 — Gộp đầu vào vào một lần gọi duy nhất

Đây là đòn bẩy lớn nhất bạn có thể dùng: endpoint embed chấp nhận toàn bộ danh sách văn bản trong một lần gọi. Truyền 50 văn bản vào một lần gọi co.embed() duy nhất tiêu tốn cùng 1 đơn vị quota như khi chỉ truyền 1 văn bản. Hãy gửi tất cả cùng lúc thay vì lặp từng mục một.

import cohere

co = cohere.ClientV2("YOUR_API_KEY")

texts = [
    "First document to embed",
    "Second document to embed",
    "Third document to embed",
    # ... lên đến hàng trăm văn bản trong một lần gọi
]

response = co.embed(
    texts=texts,
    model="embed-english-v3.0",
    input_type="search_document",
)

for i, embedding in enumerate(response.embeddings):
    print(f"Text {i}: {len(embedding)} dimensions")

Mỗi lần gọi co.embed() được tính là một lần gọi API bất kể bạn truyền vào bao nhiêu văn bản (trong giới hạn token). Nghĩa là 100 văn bản chỉ tốn 1 đơn vị quota thay vì 100. Hãy dùng cách này trước khi nghĩ đến sleep hay retry.

Cách 4 — Dùng token bucket / rate limiter

Đang chạy code async hoặc pipeline phức tạp hơn? Thư viện ratelimit cho phép bạn khai báo giới hạn một lần dưới dạng decorator và không cần lo nữa.

pip install ratelimit
import cohere
from ratelimit import limits, sleep_and_retry

co = cohere.ClientV2("YOUR_API_KEY")

CALLS_PER_MINUTE = 9  # giữ dưới 10 để có khoảng đệm an toàn
ONE_MINUTE = 60

@sleep_and_retry
@limits(calls=CALLS_PER_MINUTE, period=ONE_MINUTE)
def rate_limited_chat(message: str) -> str:
    response = co.chat(
        model="command-r-plus",
        messages=[{"role": "user", "content": message}],
    )
    return response.message.content[0].text

# Giờ bạn có thể gọi hàm này trong vòng lặp mà không lo bị 429
for msg in ["What is Python?", "Explain APIs", "What is embeddings?"]:
    print(rate_limited_chat(msg))

Cách 5 — Nâng cấp lên Production key

Cần thông lượng thực sự? Trial key sẽ không đáp ứng được. Truy cập dashboard.cohere.comAPI Keys → tạo Production key. Production key hỗ trợ hàng nghìn lần gọi mỗi phút tùy theo gói của bạn — bắt buộc phải có cho bất kỳ thứ gì ngoài phạm vi kiểm thử nội bộ.

Xác Nhận Đã Sửa Xong

Dán đoạn smoke test này để kiểm tra xem cách sửa của bạn có thực sự hoạt động không. Nó gửi 12 lần gọi — vượt hai lần so với giới hạn mỗi phút — với khoảng cách 6 giây giữa mỗi lần:

# Smoke test — 12 lần gọi ở tốc độ 10/phút để kiểm tra rate limiter
import cohere
import time
from cohere.errors import TooManyRequestsError

co = cohere.ClientV2("YOUR_API_KEY")

success = 0
for i in range(12):
    try:
        co.embed(
            texts=[f"test text {i}"],
            model="embed-english-v3.0",
            input_type="search_document",
        )
        success += 1
        time.sleep(6)  # khoảng cách 6s = 10 lần gọi/phút
    except TooManyRequestsError as e:
        print(f"Still rate limited at call {i}: {e}")
        break

print(f"{success}/12 calls succeeded")

Khi thấy 12/12 calls succeeded nghĩa là bạn đã xử lý xong.

Mẹo Hay

  • Kiểm tra loại key trước: Vào dashboard.cohere.com → API Keys. Trial key được gắn nhãn "Trial". Nếu key của bạn đã hiển thị "Production" mà vẫn bị 429, có nguyên nhân khác đang gây ra giới hạn này.
  • Gộp batch trước khi dùng sleep: Luôn thử gộp nhiều văn bản vào một lần gọi co.embed() trước khi dùng time.sleep(). Một lần gọi với 100 văn bản hiệu quả hơn nhiều so với 100 lần gọi với mỗi lần một văn bản.
  • Nhắm 9 lần gọi/phút, không phải 10: Để dư một lần gọi làm khoảng đệm, phòng trường hợp lệch đồng hồ và các request nền mà code của bạn có thể kích hoạt ngầm.
  • Ghi log thời gian chờ trong lúc phát triển: In ra thông báo trước mỗi lần time.sleep(). Các vòng lặp vô tình sẽ lộ ra ngay — thay vì script lặng lẽ treo máy, bạn sẽ thấy chính xác khi nào nó đang tự điều tiết.
  • Xem lại xem bạn có thực sự cần chat không: Các endpoint rerank và chat tốn nhiều quota hơn mỗi lần gọi. Nếu bạn đang chạm giới hạn, hãy xem liệu batch embeddings có thể thay thế những gì bạn đang làm không — chúng xử lý nhiều văn bản trên mỗi đơn vị quota.

Related Error Notes