Обработка ошибок
При сбое запроса Claudexia возвращает ответ об ошибке с подробностями. Формат зависит от используемого эндпоинта.
Формат ошибок Anthropic
Ошибки от /v1/messages:
json
{
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "max_tokens: Field required"
}
}Формат ошибок OpenAI
Ошибки от /v1/chat/completions:
json
{
"error": {
"message": "Invalid API key provided.",
"type": "authentication_error",
"code": "invalid_api_key"
}
}Распространённые коды ошибок
| HTTP-статус | Тип ошибки | Описание |
|---|---|---|
400 | invalid_request_error | Тело запроса некорректно или отсутствуют обязательные поля (например, max_tokens, messages). |
401 | authentication_error | Неверный или отсутствующий API-ключ. Убедитесь, что ключ начинается с sk_cdx_. |
403 | permission_error | Запрошенная модель недоступна на вашем тарифе, или ваш IP-адрес заблокирован. |
429 | rate_limit_error | Превышен лимит запросов. Подождите и повторите после времени, указанного в заголовке Retry-After. |
500 | api_error | Внутренняя ошибка сервера. Это ошибка на нашей стороне — повторите запрос или обратитесь в поддержку. |
529 | overloaded_error | API временно перегружен. Повторите с экспоненциальной задержкой. |
Стратегия повторов
Мы рекомендуем следующий подход к повторам:
- 429 и 529 — повторяйте с экспоненциальной задержкой от 1 секунды: 1с, 2с, 4с, 8с, максимум 60с. Учитывайте заголовок Retry-After.
- 500 — повторите до 3 раз с задержкой 1 секунду. Если ошибка сохраняется, скорее всего это временная проблема.
- 400, 401, 403 — не повторяйте. Исправьте запрос или проверьте API-ключ и разрешения.
python
import time
import requests
def call_api(payload, max_retries=3):
for attempt in range(max_retries):
response = requests.post(
"https://api.claudexia.tech/v1/messages",
headers={
"x-api-key": "sk_cdx_YOUR_KEY",
"anthropic-version": "2023-06-01",
"Content-Type": "application/json",
},
json=payload,
)
if response.status_code == 200:
return response.json()
if response.status_code in (429, 529):
wait = int(response.headers.get("Retry-After", 2 ** attempt))
time.sleep(wait)
continue
if response.status_code >= 500:
time.sleep(1)
continue
# 4xx client errors — don't retry
response.raise_for_status()
raise Exception("Max retries exceeded")