สคริปต์ที่ส่งงานให้ LLM ทีละร้อยชิ้นทำงานได้ดีตอนทดสอบสิบชิ้น พอรันจริงกลับล้มกลางทางด้วย 429 Too Many Requests หรือ coding agent ที่ทั้งทีมใช้ API key ขององค์กรเดียวกัน หยุดชะงักพร้อมกันตอนบ่าย ทั้งสองอาการมาจากเรื่องเดียวกันคือ rate limit
Rate limit คืออะไร มีกี่แบบ
Rate limit คือเพดานที่ผู้ให้บริการ API กำหนดว่าบัญชีหนึ่งใช้งานได้มากแค่ไหนต่อช่วงเวลา นับทั้งจำนวนคำขอและจำนวน token ถ้ามิติใดมิติหนึ่งเต็มก่อน คำขอถัดไปจะถูกปฏิเสธด้วย 429 จนกว่าโควตาจะคืนกลับมา
เอกสารของ Anthropic อธิบายว่า Claude API ใช้ token bucket คือโควตาค่อยๆ เติมกลับต่อเนื่อง ไม่ได้รีเซ็ตทีเดียวทุกต้นนาที และ limit 60 RPM อาจบังคับจริงเป็น 1 คำขอต่อวินาที การยิงคำขอรวดเดียวจึงโดน 429 ได้แม้ยอดรวมทั้งนาทียังไม่ถึง
| ชนิด | นับอะไร | เจ้าที่ใช้ (ณ พฤศจิกายน 2569) |
|---|---|---|
| RPM | จำนวนคำขอต่อนาที | OpenAI, Claude, Gemini |
| TPM | token ต่อนาที Claude แยกเป็น ITPM (input) กับ OTPM (output) | OpenAI, Claude, Gemini |
| RPD / TPD | คำขอหรือ token ต่อวัน RPD ของ Gemini รีเซ็ตเที่ยงคืนเวลาแปซิฟิก | OpenAI, Gemini |
| Concurrency | คำขอที่ค้างอยู่พร้อมกัน | DeepSeek (2,500 สำหรับ deepseek-flash และ 500 สำหรับ deepseek-v4-pro) |
| วงเงินรายเดือน | ยอดใช้ต่อเดือนตาม tier หรือที่ตั้งเอง | OpenAI, Claude, Gemini |
limit ผูกกับองค์กร โปรเจกต์ หรือบัญชี ไม่ใช่ API key การแจก key ให้หลายคนในทีมจึงไม่ได้เพิ่มเพดาน ทุกคนใช้ถังเดียวกัน
Error 429 Too Many Requests แปลว่าอะไร
Error 429 Too Many Requests คือ HTTP status ที่ API ตอบเมื่อคำขอเกินเพดานของบัญชี แต่ 429 ไม่ได้มีแบบเดียว ต้องอ่าน type และ code ในเนื้อ error ก่อนตัดสินใจว่าจะรอแล้วลองใหม่ หรือต้องไปแก้ที่บัญชี
| ข้อความหรือ code | หมายถึง | ลองใหม่ได้ไหม |
|---|---|---|
OpenAI 429 Rate limit reached และ Claude rate_limit_error ที่มี retry-after | ส่งเร็วหรือมากเกิน RPM/TPM | ได้ รอตาม header |
OpenAI slow_down | อัตราการใช้เพิ่มขึ้นเร็วเกินไป แม้ยังไม่เกิน RPM/TPM | ได้ ลดความเร็วแล้วค่อยๆ เพิ่ม |
Gemini 429 RESOURCE_EXHAUSTED | เกิน RPM, TPM, RPD หรือเพดานการใช้จ่ายตาม tier ของบัญชี | ได้ ถ้าเป็นเพดานต่อนาที |
OpenAI credit_balance_exhausted, organization_spend_limit_exceeded | เครดิตหมดหรือถึงวงเงิน | ไม่ได้ ต้องเติมเครดิตหรือปรับวงเงิน |
Claude enforced_spend_limit_reached | ถึงวงเงินรายเดือนของ tier ไม่มี retry-after | ไม่ได้ จนต้นเดือนถัดไปหรือขอขยับ tier |
Claude ยังมี acceleration limit ที่ทำให้เจอ 429 เมื่อการใช้งานขององค์กรพุ่งขึ้นกะทันหัน ทางแก้คือเพิ่มปริมาณงานทีละขั้น ส่วน 529 overloaded_error ของ Claude และ 503 ของ OpenAI ไม่ใช่ rate limit ของคุณ แต่เป็นสัญญาณว่าฝั่งผู้ให้บริการรับงานไม่ไหวชั่วคราว
อธิบายด้วยภาพ
เพดาน 2,000,000 ITPM รับ agent ได้กี่รอบต่อนาที
- context ต่อรอบ80,000token ที่ agent ส่งทุกรอบ
- ไม่มี cache25 รอบ2,000,000 ÷ 80,000
- cache hit 90%8,000token ที่ยังนับเข้า ITPM ต่อรอบ
- เมื่อ cache ติด250 รอบ2,000,000 ÷ 8,000 ต่อนาที
เพดานของ claude-sonnet-5-5 ใน Start tier ณ พฤศจิกายน 2569 ITPM ของ Claude คิดเฉพาะ input ที่ไม่ได้อ่านจาก cache
ดู rate limit ที่เหลือจาก response header อย่างไร
ทุกคำตอบจาก OpenAI และ Claude มี header บอกเพดาน จำนวนที่เหลือ และเวลาที่โควตาจะคืน อ่านค่าพวกนี้เพื่อชะลอเองก่อนชน 429 ได้ ชื่อ header ของสองเจ้าไม่เหมือนกัน
| ผู้ให้บริการ | header | หมายเหตุ |
|---|---|---|
| OpenAI | x-ratelimit-limit-requests, x-ratelimit-remaining-requests, x-ratelimit-reset-requests และชุด -tokens เดียวกัน | มีชุด x-ratelimit-*-project-tokens สำหรับเพดานระดับโปรเจกต์ |
| Claude | anthropic-ratelimit-requests-*, anthropic-ratelimit-input-tokens-*, anthropic-ratelimit-output-tokens-* ลงท้ายด้วย -limit, -remaining, -reset | เวลา reset เป็นรูปแบบ RFC 3339 |
| ทั้งสองเจ้า | retry-after | จำนวนวินาทีขั้นต่ำที่ควรรอก่อนลองใหม่ |
ดู header ด้วย curl แบบเร็วๆ
curl -s -D - -o /dev/null https://api.openai.com/v1/chat/completions \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"gpt-6-luna","messages":[{"role":"user","content":"ping"}]}' \
| grep -i -E "ratelimit|retry-after"DeepSeek ไม่มีเพดานต่อนาทีแบบเจ้าอื่น แต่นับจำนวนคำขอที่ค้างพร้อมกันต่อบัญชี ระหว่างที่คำขอรอ เซิร์ฟเวอร์จะส่งบรรทัดว่างหรือคอมเมนต์ : keep-alive มาเรื่อยๆ ถ้าเขียนตัวอ่าน HTTP เองต้องข้ามบรรทัดพวกนี้ และถ้ารอ 10 นาทีแล้วยังไม่เริ่มประมวลผล เซิร์ฟเวอร์จะตัดการเชื่อมต่อ
แก้ 429 ด้วย retry แบบ exponential backoff อย่างไร
Exponential backoff คือการรอแล้วลองใหม่ โดยเพิ่มเวลารอเป็นเท่าตัวทุกครั้งที่ยังล้ม และสุ่มเวลา (jitter) เพื่อไม่ให้หลาย worker ยิงกลับพร้อมกัน ถ้าคำตอบมี retry-after ให้รอตามนั้นก่อน และต้องจำกัดจำนวนครั้ง เพราะเอกสารของ OpenAI ระบุว่าคำขอที่ล้มก็ถูกนับเข้า limit ต่อนาทีด้วย
import random, time
from openai import OpenAI, RateLimitError
client = OpenAI(max_retries=0) # ปิด retry ในตัว แล้วคุมเอง
NO_RETRY = {"credit_balance_exhausted", "organization_spend_limit_exceeded",
"project_spend_limit_exceeded", "organization_usage_limit_exceeded"}
def ask(messages, attempts=6, base=1.0, cap=60.0):
for i in range(attempts):
try:
return client.chat.completions.create(model="gpt-6-luna", messages=messages)
except RateLimitError as e:
if e.code in NO_RETRY or i == attempts - 1:
raise # วงเงินหมด หรือครบจำนวนครั้งแล้ว
ra = e.response.headers.get("retry-after")
delay = float(ra) if ra else random.uniform(0, min(cap, base * 2 ** i))
time.sleep(delay)โค้ดนี้ลองได้ 6 ครั้ง มีช่วงรอ 5 ช่วง ช่วงที่ i สุ่มระหว่าง 0 ถึง min(60, 2^i) วินาที ช่วงแรกไม่เกิน 1 วินาที ช่วงที่ห้าไม่เกิน 16 วินาที รวมไม่เกิน 31 วินาทีถ้าไม่มี retry-after ครบแล้วยังไม่ผ่านให้โยน error ขึ้นไปให้คิวจัดการต่อ
ลดโอกาสโดน 429 ตั้งแต่ต้นทำอย่างไร
retry แก้อาการ แต่ถ้าจะไม่ให้ชนบ่อย ต้องคุมปริมาณงานที่ส่งออกไป วิธีที่ได้ผลจริงคือจำกัดงานพร้อมกัน ลด token ต่อคำขอ ส่งงานที่ไม่รีบผ่าน Batch API และขยับ tier เมื่อจำเป็น
จำกัดงานพร้อมกัน ใช้ semaphore หรือคิวให้ worker ส่งได้ทีละไม่กี่งาน
python import asyncio sem = asyncio.Semaphore(4) # ส่งพร้อมกันไม่เกิน 4 งาน async def run(task): async with sem: return await call_llm(task)ตั้ง
max_tokensให้พอดี OpenAI ประเมิน TPM จากค่าที่มากกว่าระหว่างmax_tokensกับ token ที่ประเมินจากคำขอ ตั้งเผื่อมากไปก็เปลืองโควตาเปล่าๆใช้ prompt caching ITPM ของ Claude คิดเฉพาะ input ที่ไม่ได้อ่านจาก cache ส่วนต้นที่ cache ติดจึงไม่กินโควตา (ดู Prompt caching และ KV cache)
งานที่ไม่รีบส่งเป็น batch Batch API ของ OpenAI และ Claude มีโควตาแยก และคิดราคาครึ่งเดียว (ราคาเทียบไว้ใน ราคา LLM API 2026)
ขยับ tier ทุกเจ้าเพิ่มเพดานตามประวัติการจ่ายเงิน
| ผู้ให้บริการ | tier (ณ พฤศจิกายน 2569) | ขยับขึ้นอย่างไร |
|---|---|---|
| OpenAI | Free, Build, Launch, Grow | อัตโนมัติตามยอดซื้อเครดิตสะสม $5, $100 และ $500 |
| Claude | Evaluation, Start, Build, Scale, Custom | ตามประวัติการใช้ ขอเพิ่มได้ในหน้า Rate limits ของ Console |
| Gemini | Free, Tier 1, Tier 2, Tier 3 | ผูกบัญชี billing แล้วตามยอดจ่ายสะสม $100 กับ $1,000 และระยะเวลา |
| DeepSeek | ไม่มี tier | ขอเพิ่ม concurrency ได้ เอกสารระบุว่าไม่มีค่าใช้จ่าย |
ทำไม coding agent ชน rate limit บ่อย
coding agent ชน rate limit บ่อยเพราะแต่ละรอบส่ง context ทั้งก้อน หลายหมื่นถึงแสน token ต่อคำขอ เพดานที่เต็มก่อนจึงมักเป็น token ต่อนาที ไม่ใช่จำนวนคำขอ และยิ่งแตก sub-agent ทำงานขนานกัน ทุกตัวก็ดึงจากถังเดียวกัน
ลองคิดด้วยเพดานของ claude-sonnet-5-5 ใน Start tier ณ พฤศจิกายน 2569 คือ 4,000 RPM, 2,000,000 ITPM และ 400,000 OTPM ถ้า agent ส่ง context 80,000 token ต่อรอบโดยไม่มี cache ทั้งองค์กรจะทำได้ราว 25 รอบต่อนาที ทีม 5 คนที่แต่ละคนเปิด sub-agent 3 ตัวจะชนเพดานได้ง่าย แต่ถ้า 90% ของ context อ่านจาก cache ส่วนที่นับเหลือ 8,000 token ต่อรอบ เพดานเดียวกันรับได้ราว 250 รอบต่อนาที
สิ่งที่ช่วยได้คือให้ agent แต่ละตัวเห็นเฉพาะไฟล์ที่จำเป็น คุมจำนวน sub-agent ที่รันพร้อมกัน และแยก workspace หรือโปรเจกต์ให้งานอัตโนมัติไม่แย่งโควตากับคนที่นั่งทำงาน ส่วนคนที่ใช้ Claude Code ผ่านแพ็ก Pro หรือ Max เพดานรอบ 5 ชั่วโมงและรายสัปดาห์เป็นคนละระบบกับ rate limit ของ API อ่านต่อที่ Claude Code ติด limit ทำอย่างไร
buzzAI จำกัดการใช้งานอย่างไร
buzzAI เป็น API แบบเหมาจ่ายสำหรับ coding agent ใช้กับ Claude Code, Codex CLI และเครื่องมือที่ตั้ง base URL แบบ OpenAI-compatible ได้ ไม่คิดค่า token และไม่มีโควตารายวันหรือรายสัปดาห์ สิ่งที่จำกัดแทนคือจำนวน agent ที่รันพร้อมกัน ขนาด context ตามแพ็ก และคิวในช่วงที่คนใช้เยอะ
แพ็ก Personal รัน agent ได้ทีละ 1 ตัว ถ้าเครื่องมือของคุณแตก sub-agent ก็ยังใช้ได้ แต่ sub-agent จะผลัดกันทำงานทีละตัว แพ็กบริษัทรันได้ 1–8 ตัวพร้อมกันพร้อม context 256K และในเวลาทำการ จันทร์–ศุกร์ 08:00–20:00 น. แพ็กบริษัทและ slot ที่จองไว้ได้คิวก่อน แพ็ก Personal จึงอาจต้องรอ ตอนนี้ API ยังไม่เปิดให้ใช้ทั่วไป กดขอร่วมทดสอบได้ที่หน้าแรก แล้วเราจะส่ง API key ทางอีเมลเมื่อมีผู้สมัครครบโควต้าที่กำหนด ดูแพ็กทั้งหมดได้ที่หน้าราคา
คำถามที่พบบ่อย
Error 429 กับ 529 หรือ 503 ต่างกันอย่างไร?
429 แปลว่าบัญชีหรือองค์กรของคุณใช้เกินเพดานของตัวเอง ส่วน 529 overloaded_error ของ Claude และ 503 server_is_overloaded ของ OpenAI แปลว่าฝั่งผู้ให้บริการรับงานไม่ไหวชั่วคราว ทั้งสองแบบรอแล้วลองใหม่ได้ แต่แบบหลังไม่ได้เกี่ยวกับ tier ของคุณ
สร้าง API key หลายอันช่วยเพิ่ม rate limit ได้ไหม?
ไม่ได้ OpenAI ตั้ง limit ระดับองค์กรและโปรเจกต์ Claude ตั้งระดับองค์กรและแบ่งย่อยตาม workspace ได้ Gemini ตั้งต่อโปรเจกต์ ส่วน DeepSeek นับต่อบัญชีไม่ว่าจะใช้ key ไหน
ตั้ง max_tokens สูงๆ มีผลกับ rate limit ไหม?
กับ OpenAI มีผล เพราะระบบประเมิน TPM จากค่าที่มากกว่าระหว่าง max_tokens กับจำนวน token ที่ประเมินจากคำขอ จึงควรตั้งใกล้ความยาวที่ต้องการจริง ส่วน Claude นับ OTPM จาก output ที่สร้างจริงเท่านั้น
SDK ทางการ retry ให้อัตโนมัติไหม?
SDK ทางการของทั้ง OpenAI และ Anthropic retry ให้ 2 ครั้งโดยค่าเริ่มต้นเมื่อเจอ 429 หรือ error ฝั่งเซิร์ฟเวอร์ ปรับได้ด้วย max_retries ถ้าเขียน retry เองให้ตั้งเป็น 0 เพื่อไม่ให้ลองซ้อนกันสองชั้น
แหล่งอ้างอิง
ข้อมูล ณ วันที่อัปเดต แพ็ก โควตา และคำสั่งของแต่ละเครื่องมือเปลี่ยนได้บ่อย ก่อนใช้งานจริงควรตรวจกับเอกสารทางการที่ลิงก์ไว้ในแหล่งอ้างอิง