Rate Limits: לטפל ב-429.
429 Too Many Requests - למה, מתי, ואיך לכתוב קוד שלא ייתקע בייצור.
- למה האפליקציה שלכם תיתקע יום אחד עם 429
- איך מזהים את הסיבה - בקשות, טוקנים, או בו-זמנית
- איך כותבים קוד עמיד שלא נופל כשמגיעים לתקרה
אם אתם בונים אפליקציה על ה-API של קלוד, יום אחד תפגשו את 429 Too Many Requests. אנתרופיק מטילה מגבלות על כמה בקשות מותר לשלוח בדקה, כמה טוקנים מותר לשלוח בדקה, וכמה טוקנים מותר לקבל בדקה - כל אחת בנפרד.
המדריך הזה עובר על מה גורם ל-429, איך לזהות איזו מגבלה נפגעה, ואיך לכתוב קוד שלא ייתקע בייצור כשהתעבורה תעלה.
שישה צעדים
≈ 8 דקותשלושה סוגי מגבלות
אנתרופיק מודדת שלושה דברים שונים בכל דקה:
- RPM (Requests Per Minute) - כמה קריאות ל-API מותר לבצע בדקה.
- ITPM (Input Tokens Per Minute) - סך טוקני הקלט שעוברים בדקה אחת.
- OTPM (Output Tokens Per Minute) - סך טוקני הפלט שחוזרים בדקה אחת.
כל אחת מהמגבלות נמדדת בנפרד. אפשר להיתקע על RPM גם אם הטוקנים בכמות סבירה - או להיתקע על ITPM גם אם מספר הבקשות נמוך.
להבין את התשובה של 429
כשהשרת חוזר עם 429, התשובה כוללת כותרות שעוזרות להבין מה קרה ומתי אפשר לנסות שוב:
HTTP/1.1 429 Too Many Requests retry-after: 12 anthropic-ratelimit-requests-limit: 50 anthropic-ratelimit-requests-remaining: 0 anthropic-ratelimit-requests-reset: 2026-05-24T13:45:00Z anthropic-ratelimit-input-tokens-limit: 50000 anthropic-ratelimit-input-tokens-remaining: 15000 anthropic-ratelimit-output-tokens-limit: 10000 anthropic-ratelimit-output-tokens-remaining: 0
בדוגמה הזו, output tokens הם המגבלה שנפגעה - remaining: 0. הכותרת retry-after אומרת כמה שניות להמתין.
לממש exponential backoff
הפתרון הסטנדרטי: אם קיבלתם 429, חכו, ונסו שוב. במקום להמתין זמן קבוע, השתמשו ב-exponential backoff - הזמן בין ניסיונות גדל בהדרגה.
async function callWithRetry(payload, maxRetries = 5) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
const res = await fetch(API_URL, payload);
if (res.status !== 429) return res;
const retryAfter = res.headers.get("retry-after");
const wait = retryAfter
? parseInt(retryAfter, 10) * 1000
: Math.min(1000 * Math.pow(2, attempt), 30000);
await new Promise(r => setTimeout(r, wait));
}
throw new Error("Rate limit exceeded after retries");
}הקוד נשען על retry-after כשהוא קיים, ונופל אחורה ל-backoff מעריכי (1, 2, 4, 8, 16 שניות, מקסימום 30) אם אין.
לכוון את הקצב מראש
Retry זה תיקון, לא מניעה. אם האפליקציה מנסה לשלוח 100 בקשות בדקה כשהמגבלה היא 50 - חצי מהבקשות יתחילו עם retry. הפתרון: להגביל את הקצב מצד הלקוח.
ספריות כמו bottleneck ל-Node או aiolimiter ל-Python נותנות לכם להגדיר מקסימום בקשות לשנייה, והן מפיקות תור פנימי שמכבד את המגבלה. עדיף להמתין 200 מילישניות מאשר לקבל 429 ולחכות 60 שניות.
להעלות את הדרגה
המגבלות תלויות בדרגת השימוש שלכם בקונסולה של אנתרופיק. כל חשבון מתחיל בדרגה 1 ועולה אוטומטית ככל שמשתמשים. אפשר גם לבקש העלאה ידנית.
- Tier 1 - 50 בקשות לדקה, 50K טוקני קלט, 10K פלט.
- Tier 2 - 1,000 בקשות לדקה, 100K קלט, 20K פלט.
- Tier 3-4 - הרבה יותר, ועולה ידנית.
המספרים מעודכנים בקונסולה. בקשת העלאה ידנית בדרך כלל מאושרת תוך 1-2 ימי עסקים אם יש לכם היסטוריית שימוש סבירה.
לפזר עומס על פני זמן
לא כל משימה דורשת תשובה מיידית. אם יש לכם פעולה רקעית - תיוג של 10,000 מסמכים, סיכום של ארכיון - אל תשלחו את הכל בבת אחת.
- Batch API - לעיבוד אצוות, מחיר חצי, תשובה תוך 24 שעות.
- תור פנימי - לשמור משימות במסד נתונים ולעבד אותן בקצב קבוע ברקע.
- שעות שפל - אם הביקוש שלכם מתרכז בשעות מסוימות, שמרו עבודות לא דחופות לשעות אחרות.
שלוש מלכודות נפוצות
דברים שמייצרים 429 מיותרretry בלי גבול
לולאה אינסופית של retry על 429 לא תפתור כלום - היא רק תבזבז זמן. הציבו תקרה (5-10 ניסיונות) ואז תכשלו במפורש.
קריאות מקבילות בלי מגבלה
10 משתמשים שמשגרים בקשות במקביל = 10 בקשות בו-זמנית. ללא ניהול תור, התקרה תיפגע מהר מאוד. מגבילי קצב הם חובה.
retry על כל שגיאה
לא כל שגיאה צריכה retry. 400 (בקשה לא תקינה) ו-401 (אימות נכשל) יחזרו תמיד. רק 429 ו-5xx מצדיקים retry.
להמשיך לבנות עמיד
עוד נושאים בקטגוריית לבנות שמשתלבים בעיצוב מערכת יציבה