पाठ 15 / 27

Error प्रकार और कौन-से Retry करें

Status codes को कार्रवाइयों से जोड़ें।

अस्थायी को retry करें, स्थायी को ठीक करें

HTTP status codes बताते हैं क्या करना है। 400 अमान्य अनुरोध (आपके अनुरोध में bug, जैसे ग़ायब max_tokens या ग़लत message सूची): retry न करें, कोड ठीक करें। 401/403 authentication या अनुमति की समस्या: retry न करें, key और पहुँच जाँचें। 404 अज्ञात मॉडल या endpoint। 413 अनुरोध बहुत बड़ा। 429 rate limited (प्रति मिनट बहुत अधिक requests या tokens) और 5xx server errors या अत्यधिक भार: अस्थायी, प्रतीक्षा के बाद retry करें (retry-after header हो तो मानें)। Network timeouts और टूटे कनेक्शन भी retry योग्य हैं। आधिकारिक SDKs इनमें से कुछ को पहले से स्वतः retry करते हैं (backoff के साथ retries की छोटी डिफ़ॉल्ट संख्या) और RateLimitError, BadRequestError और APIConnectionError जैसे typed exceptions उठाते हैं, जिनमें status code और error body होते हैं।

विफलता की अपेक्षा रखें, शालीनता से उबरें

Networks और rate limits विफल होते हैं; errors वर्गीकृत करें, सही वाले backoff के साथ retry करें, और शालीनता से घटें।

चार औज़ार: वर्गीकृत करें, retry, सीमा, fallback।
चित्र 5.1 — वर्गीकृत करें, retry, सीमा और fallback।

Retries और typed errors, चलाकर

मैंने यह Python virtual environment में anthropic 1.11.0 और openai 3.22.1 SDKs के साथ छोटे स्थानीय stand-in server (testing विषय में दिखाया, mock.py नाम से सहेजा) के विरुद्ध चलाया। Server तैयार उत्तर लौटाता है, इसलिए कोई key, network या असली मॉडल शामिल नहीं: यह साबित करता है कि SDK requests कैसे बनाता और उत्तर कैसे सँभालता है, यह नहीं कि असली मॉडल क्या कहता। Stand-in server एक बार 429 देता है। max_retries=2 के साथ SDK ख़ुद retry करता है और दूसरे अनुरोध पर सफल होता है। max_retries=0 के साथ वही 429 एक अनुरोध के बाद RateLimitError उठाता है। ग़ायब max_tokens (0 रखा) 400 लौटाता है जो server के संदेश के साथ BadRequestError उठाता है, और OpenAI SDK 429 पर अपना RateLimitError उठाता है।

import mock, anthropic, openai
srv = mock.start(); base = f"http://127.0.0.1:{srv.server_address[1]}"      # local stand-in server, not a real API

body = dict(model="demo-model", max_tokens=50, messages=[{"role": "user", "content": "Hi"}])

mock.STATE["log"].clear(); mock.STATE["fail_next"] = 1                # server answers 429 once
ok = anthropic.Anthropic(api_key="k", base_url=base, max_retries=2).messages.create(**body)
print("with retries=2 : succeeded after", len(mock.STATE["log"]), "requests ->", ok.content[0].text[:5])

mock.STATE["log"].clear(); mock.STATE["fail_next"] = 1
try:
    anthropic.Anthropic(api_key="k", base_url=base, max_retries=0).messages.create(**body)
except anthropic.RateLimitError as e:
    print("with retries=0 : RateLimitError", e.status_code, "after", len(mock.STATE["log"]), "request")

try:
    anthropic.Anthropic(api_key="k", base_url=base).messages.create(**{**body, "max_tokens": 0})
except anthropic.BadRequestError as e:
    print("bad request    :", e.status_code, "-", e.body["error"]["message"])

mock.STATE["fail_next"] = 1
try:
    openai.OpenAI(api_key="k", base_url=base + "/v1", max_retries=0).chat.completions.create(
        model="demo-model", messages=[{"role": "user", "content": "Hi"}])
except openai.RateLimitError as e:
    print("openai 429     :", type(e).__name__, e.status_code)

Output:

with retries=2 : succeeded after 2 requests -> Paris
with retries=0 : RateLimitError 429 after 1 request
bad request    : 400 - max_tokens: Field required
openai 429     : RateLimitError 429

Request id log करें

Providers response headers या error body में request id लौटाते हैं। उसे log करें ताकि support विफल call का पीछा कर सके।

त्वरित जाँच: किस error को retry नहीं करना चाहिए?

  • 400 अमान्य अनुरोध
  • 429 rate limited
  • 503 अत्यधिक भार
  • टूटा कनेक्शन
Answer

400 अमान्य अनुरोध — ग़लत बने अनुरोध को दोहराना फिर विफल होता है; अनुरोध ठीक करें।