# Error प्रकार और कौन-से Retry करें — Claude API / OpenAI API की बुनियाद

Source: https://www.geekswithgeeks.com/hi/llm-apis/r-errors

> 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।](assets/figures/llm-apis/section-5-map.svg) — चित्र 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` उठाता है।

```python
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 का पीछा कर सके।

**Quiz:** किस error को retry नहीं करना चाहिए?

- [x] 400 अमान्य अनुरोध
- [ ] 429 rate limited
- [ ] 503 अत्यधिक भार
- [ ] टूटा कनेक्शन

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